diff --git a/package-lock.json b/package-lock.json index 3c8993e34..0e231caab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2067,9 +2067,9 @@ "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz", + "integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==", "requires": { "commander": "^2.20.0", "source-map": "~0.6.1", diff --git a/tools/cdata.js b/tools/cdata.js index c40994ab2..ce4f9c63c 100644 --- a/tools/cdata.js +++ b/tools/cdata.js @@ -263,120 +263,60 @@ writeChunks( name: "PAGE_settings", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_wifi.htm", name: "PAGE_settings_wifi", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_leds.htm", name: "PAGE_settings_leds", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_dmx.htm", name: "PAGE_settings_dmx", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_ui.htm", name: "PAGE_settings_ui", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_sync.htm", name: "PAGE_settings_sync", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_time.htm", name: "PAGE_settings_time", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_sec.htm", name: "PAGE_settings_sec", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_um.htm", name: "PAGE_settings_um", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_2D.htm", name: "PAGE_settings_2D", method: "gzip", filter: "html-minify", - mangle: (str) => - str - .replace( - /function GetV().*\<\/script\>/gms, - "" - ) }, { file: "settings_pin.htm", diff --git a/usermods/Animated_Staircase/Animated_Staircase.h b/usermods/Animated_Staircase/Animated_Staircase.h index 5aa64631d..3cf349ca5 100644 --- a/usermods/Animated_Staircase/Animated_Staircase.h +++ b/usermods/Animated_Staircase/Animated_Staircase.h @@ -103,25 +103,24 @@ class Animated_Staircase : public Usermod { void updateSegments() { mainSegmentId = strip.getMainSegmentId(); - WS2812FX::Segment* segments = strip.getSegments(); - for (int i = 0; i < MAX_NUM_SEGMENTS; i++, segments++) { - if (!segments->isActive()) { + for (int i = 0; i < strip.getSegmentsNum(); i++) { + Segment &seg = strip.getSegment(i); + if (!seg.isActive()) { maxSegmentId = i - 1; break; } - if (i >= onIndex && i < offIndex) { - segments->setOption(SEG_OPTION_ON, 1, i); + seg.setOption(SEG_OPTION_ON, true); // We may need to copy mode and colors from segment 0 to make sure // changes are propagated even when the config is changed during a wipe // segments->mode = mainsegment.mode; // segments->colors[0] = mainsegment.colors[0]; } else { - segments->setOption(SEG_OPTION_ON, 0, i); + seg.setOption(SEG_OPTION_ON, false); } // Always mark segments as "transitional", we are animating the staircase - segments->setOption(SEG_OPTION_TRANSITIONAL, 1, i); + seg.setOption(SEG_OPTION_TRANSITIONAL, true); } colorUpdated(CALL_MODE_DIRECT_CHANGE); } @@ -290,13 +289,13 @@ class Animated_Staircase : public Usermod { } } else { // Restore segment options - WS2812FX::Segment* segments = strip.getSegments(); - for (int i = 0; i < MAX_NUM_SEGMENTS; i++, segments++) { - if (!segments->isActive()) { + for (int i = 0; i < strip.getSegmentsNum(); i++) { + Segment &seg = strip.getSegment(i); + if (!seg.isActive()) { maxSegmentId = i - 1; break; } - segments->setOption(SEG_OPTION_ON, 1, i); + seg.setOption(SEG_OPTION_ON, true); } colorUpdated(CALL_MODE_DIRECT_CHANGE); DEBUG_PRINTLN(F("Animated Staircase disabled.")); diff --git a/usermods/BME280_v2/README.md b/usermods/BME280_v2/README.md index 216ca6300..b8718e0e3 100644 --- a/usermods/BME280_v2/README.md +++ b/usermods/BME280_v2/README.md @@ -1,40 +1,90 @@ -Hello! I have written a v2 usermod for the BME280/BMP280 sensor based on the [existing v1 usermod](https://github.com/Aircoookie/WLED/blob/master/usermods/Wemos_D1_mini%2BWemos32_mini_shield/usermod_bme280.cpp). It is not just a refactor, there are many changes which I made to fit my use case, and I hope they will fit the use cases of others as well! Most notably, this usermod is *just* for the BME280 and does not control a display like in the v1 usermod designed for the WeMos shield. +# Usermod BME280 +This Usermod is designed to read a `BME280` or `BMP280` sensor and output the following: +- Temperature +- Humidity (`BME280` only) +- Pressure +- Heat Index (`BME280` only) +- Dew Point (`BME280` only) -- Requires libraries `BME280@~3.0.0` (by [finitespace](https://github.com/finitespace/BME280)) and `Wire`. Please add these under `lib_deps` in your `platform.ini` (or `platform_override.ini`). -- Data is published over MQTT so make sure you've enabled the MQTT sync interface. +Configuration is all completed via the Usermod menu. There are no settings to set in code! The following settings can be configured in the Usermod Menu: +- Temperature Decimals (number of decimal places to output) +- Humidity Decimals +- Pressure Decimals +- Temperature Interval (how many seconds between reads of temperature and humidity) +- Pressure Interval +- Publish Always (turn off to only publish changes, on to publish whether or not value changed) +- Use Celsius (turn off to use Farenheit) +- Home Assistant Discovery (turn on to sent MQTT Discovery entries for Home Assistant) +- SCL/SDA GPIO Pins + +Dependencies +- Libraries + - `BME280@~3.0.0` (by [finitespace](https://github.com/finitespace/BME280)) + - `Wire` + - These must be added under `lib_deps` in your `platform.ini` (or `platform_override.ini`). +- Data is published over MQTT - make sure you've enabled the MQTT sync interface. - This usermod also writes to serial (GPIO1 on ESP8266). Please make sure nothing else listening on the serial TX pin of your board will get confused by log messages! -To enable, compile with `USERMOD_BME280` defined (i.e. `platformio_override.ini`) +In addition to outputting via MQTT, you can read the values from the Info Screen on the dashboard page of the device's web interface. + +Methods also exist to read the read/calculated values from other WLED modules through code. +- `getTemperatureC()` +- `getTemperatureF()` +- `getHumidity()` +- `getPressure()` +- `getDewPointC()` +- `getDewPointF()` +- `getHeatIndexC()` +- `getHeatIndexF()` + +# Complilation + +To enable, compile with `USERMOD_BME280` defined (e.g. in `platformio_override.ini`) ```ini +[env:usermod_bme280_d1_mini] +extends = env:d1_mini build_flags = ${common.build_flags_esp8266} -D USERMOD_BME280 -``` -or define `USERMOD_BME280` in `my_config.h` -```c++ -#define USERMOD_BME280 +lib_deps = + ${esp8266.lib_deps} + BME280@~3.0.0 + Wire ``` -Changes include: -- Adjustable measure intervals - - Temperature and pressure have separate intervals due to pressure not frequently changing at any constant altitude -- Adjustment of number of decimal places in published sensor values - - Separate adjustment for temperature, humidity and pressure values - - Values are rounded to the specified number of decimal places -- Pressure measured in units of hPa instead of Pa -- Calculation of heat index (apparent temperature) and dew point - - These, along with humidity measurements, are disabled if the sensor is a BMP280 -- 16x oversampling of sensor during measurement -- Values are only published if they are different from the previous value -- Values are published on startup (continually until the MQTT broker acknowledges a successful publication) -Adjustments are made through preprocessor definitions at the start of the class definition. - -MQTT topics are as follows: +# MQTT +MQTT topics are as follows (`` is set in MQTT section of Sync Setup menu): Measurement type | MQTT topic --- | --- Temperature | `/temperature` Humidity | `/humidity` Pressure | `/pressure` Heat index | `/heat_index` -Dew point | `/dew_point` \ No newline at end of file +Dew point | `/dew_point` + +If you are using Home Assistant, and `Home Assistant Discovery` is turned on, Home Assistant should automatically detect a new device, provided you have the MQTT integration installed. The device is seperate from the main WLED device and will contain sensors for Pressure, Humidity, Temperature, Dew Point and Heat Index. + +# Revision History +Jul 2022 +- Added Home Assistant Discovery +- Added API interface to output data +- Removed compile-time variables +- Added usermod menu interface +- Added value outputs to info screen +- Updated `readme.md` +- Registered usermod +- Implemented PinManager for usermod +- Implemented reallocation of pins without reboot + +Apr 2021 +- Added `Publish Always` option + +Dec 2020 +- Ported to V2 Usermod format +- Customisable `measure intervals` +- Customisable number of `decimal places` in published sensor values +- Pressure measured in units of hPa instead of Pa +- Calculation of heat index (apparent temperature) and dew point +- `16x oversampling` of sensor during measurement +- Values only published if they are different from the previous value \ No newline at end of file diff --git a/usermods/BME280_v2/usermod_bme280.h b/usermods/BME280_v2/usermod_bme280.h index 82eb08871..742066f7b 100644 --- a/usermods/BME280_v2/usermod_bme280.h +++ b/usermods/BME280_v2/usermod_bme280.h @@ -1,3 +1,6 @@ +// force the compiler to show a warning to confirm that this file is included +#warning **** Included USERMOD_BME280 version 2.0 **** + #pragma once #include "wled.h" @@ -9,43 +12,30 @@ class UsermodBME280 : public Usermod { private: -// User-defined configuration -#define Celsius // Show temperature mesaurement in Celcius. Comment out for Fahrenheit -#define TemperatureDecimals 1 // Number of decimal places in published temperaure values -#define HumidityDecimals 2 // Number of decimal places in published humidity values -#define PressureDecimals 2 // Number of decimal places in published pressure values -#define TemperatureInterval 5 // Interval to measure temperature (and humidity, dew point if available) in seconds -#define PressureInterval 300 // Interval to measure pressure in seconds -#define PublishAlways 0 // Publish values even when they have not changed + + // 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 + 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 -// Sanity checks -#if !defined(TemperatureDecimals) || TemperatureDecimals < 0 - #define TemperatureDecimals 0 -#endif -#if !defined(HumidityDecimals) || HumidityDecimals < 0 - #define HumidityDecimals 0 -#endif -#if !defined(PressureDecimals) || PressureDecimals < 0 - #define PressureDecimals 0 -#endif -#if !defined(TemperatureInterval) || TemperatureInterval < 0 - #define TemperatureInterval 1 -#endif -#if !defined(PressureInterval) || PressureInterval < 0 - #define PressureInterval TemperatureInterval -#endif -#if !defined(PublishAlways) - #define PublishAlways 0 -#endif - -#ifdef ARDUINO_ARCH_ESP32 // ESP32 boards - uint8_t SCL_PIN = 22; - uint8_t SDA_PIN = 21; -#else // ESP8266 boards - uint8_t SCL_PIN = 5; - uint8_t SDA_PIN = 4; - //uint8_t RST_PIN = 16; // Uncoment for Heltec WiFi-Kit-8 -#endif + // set the default pins based on the architecture, these get overridden by Usermod menu settings + #ifdef ARDUINO_ARCH_ESP32 // ESP32 boards + #define HW_PIN_SCL 22 + #define HW_PIN_SDA 21 + #else // ESP8266 boards + #define HW_PIN_SCL 5 + #define HW_PIN_SDA 4 + //uint8_t RST_PIN = 16; // Uncoment for Heltec WiFi-Kit-8 + #endif + int8_t ioPin[2] = {HW_PIN_SCL, HW_PIN_SDA}; // I2C pins: SCL, SDA...defaults to Arch hardware pins but overridden at setup() + bool initDone = false; // BME280 sensor settings BME280I2C::Settings settings{ @@ -75,6 +65,7 @@ private: float sensorHeatIndex; float sensorDewPoint; float sensorPressure; + String tempScale; // Track previous sensor values float lastTemperature; float lastHumidity; @@ -82,43 +73,122 @@ private: float lastDewPoint; float lastPressure; + // 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; + // Read the BME280/BMP280 Sensor (which one runs depends on whether Celsius or Farenheit being set in Usermod Menu) void UpdateBME280Data(int SensorType) { float _temperature, _humidity, _pressure; - #ifdef Celsius + + if (UseCelsius) { BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); EnvironmentCalculations::TempUnit envTempUnit(EnvironmentCalculations::TempUnit_Celsius); - #else + BME280::PresUnit presUnit(BME280::PresUnit_hPa); + + bme.read(_pressure, _temperature, _humidity, tempUnit, presUnit); + + sensorTemperature = _temperature; + sensorHumidity = _humidity; + sensorPressure = _pressure; + tempScale = "°C"; + if (sensorType == 1) + { + sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit); + sensorDewPoint = EnvironmentCalculations::DewPoint(_temperature, _humidity, envTempUnit); + } + } else { BME280::TempUnit tempUnit(BME280::TempUnit_Fahrenheit); EnvironmentCalculations::TempUnit envTempUnit(EnvironmentCalculations::TempUnit_Fahrenheit); - #endif - BME280::PresUnit presUnit(BME280::PresUnit_hPa); + BME280::PresUnit presUnit(BME280::PresUnit_hPa); - bme.read(_pressure, _temperature, _humidity, tempUnit, presUnit); + bme.read(_pressure, _temperature, _humidity, tempUnit, presUnit); - sensorTemperature = _temperature; - sensorHumidity = _humidity; - sensorPressure = _pressure; - if (sensorType == 1) - { - sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit); - sensorDewPoint = EnvironmentCalculations::DewPoint(_temperature, _humidity, envTempUnit); + sensorTemperature = _temperature; + sensorHumidity = _humidity; + sensorPressure = _pressure; + tempScale = "°F"; + if (sensorType == 1) + { + sensorHeatIndex = EnvironmentCalculations::HeatIndex(_temperature, _humidity, envTempUnit); + sensorDewPoint = EnvironmentCalculations::DewPoint(_temperature, _humidity, envTempUnit); + } } } + // 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"); + + 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); + } + } + + // Create an MQTT Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop. + void _createMqttSensor(const String &name, const String &topic, const String &deviceClass, const String &unitOfMeasurement) + { + String t = String(F("homeassistant/sensor/")) + mqttClientID + F("/") + name + F("/config"); + + StaticJsonDocument<600> doc; + + doc[F("name")] = String(serverDescription) + " " + name; + doc[F("state_topic")] = topic; + doc[F("unique_id")] = String(mqttClientID) + name; + if (unitOfMeasurement != "") + doc[F("unit_of_measurement")] = unitOfMeasurement; + if (deviceClass != "") + doc[F("device_class")] = deviceClass; + doc[F("expire_after")] = 1800; + + JsonObject device = doc.createNestedObject(F("device")); // attach the sensor to the same device + device[F("name")] = serverDescription; + device[F("identifiers")] = "wled-sensor-" + String(mqttClientID); + device[F("manufacturer")] = F("WLED"); + device[F("model")] = F("FOSS"); + device[F("sw_version")] = versionString; + + String temp; + serializeJson(doc, temp); + DEBUG_PRINTLN(t); + DEBUG_PRINTLN(temp); + + mqtt->publish(t.c_str(), 0, true, temp.c_str()); + } + public: void setup() { - Wire.begin(SDA_PIN, SCL_PIN); + bool HW_Pins_Used = (ioPin[0]==HW_PIN_SCL && ioPin[1]==HW_PIN_SDA); // note whether architecture-based hardware SCL/SDA pins used + PinOwner po = PinOwner::UM_BME280; // defaults to being pinowner for SCL/SDA pins + PinManagerPinType pins[2] = { { ioPin[0], true }, { ioPin[1], true } }; // allocate pins + if (HW_Pins_Used) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins + if (!pinManager.allocateMultiplePins(pins, 2, po)) { sensorType=0; return; } + + Wire.begin(ioPin[1], ioPin[0]); if (!bme.begin()) { sensorType = 0; - Serial.println("Could not find BME280I2C sensor!"); + DEBUG_PRINTLN(F("Could not find BME280I2C sensor!")); } else { @@ -126,24 +196,25 @@ public: { case BME280::ChipModel_BME280: sensorType = 1; - Serial.println("Found BME280 sensor! Success."); + DEBUG_PRINTLN(F("Found BME280 sensor! Success.")); break; case BME280::ChipModel_BMP280: sensorType = 2; - Serial.println("Found BMP280 sensor! No Humidity available."); + DEBUG_PRINTLN(F("Found BMP280 sensor! No Humidity available.")); break; default: sensorType = 0; - Serial.println("Found UNKNOWN sensor! Error!"); + DEBUG_PRINTLN(F("Found UNKNOWN sensor! Error!")); } } + initDone=true; } void loop() { // BME280 sensor MQTT publishing // Check if sensor present and MQTT Connected, otherwise it will crash the MCU - if (sensorType != 0 && mqtt != nullptr) + if (sensorType != 0 && WLED_MQTT_CONNECTED) { // Timer to fetch new temperature, humidity and pressure data at intervals timer = millis(); @@ -154,9 +225,15 @@ public: UpdateBME280Data(sensorType); - float temperature = roundf(sensorTemperature * pow(10, TemperatureDecimals)) / pow(10, TemperatureDecimals); + 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) @@ -169,25 +246,25 @@ public: if (sensorType == 1) // Only if sensor is a BME280 { - humidity = roundf(sensorHumidity * pow(10, HumidityDecimals)) / pow(10, HumidityDecimals); - heatIndex = roundf(sensorHeatIndex * pow(10, TemperatureDecimals)) / pow(10, TemperatureDecimals); - dewPoint = roundf(sensorDewPoint * pow(10, TemperatureDecimals)) / pow(10, TemperatureDecimals); + humidity = roundf(sensorHumidity * powf(10, HumidityDecimals)) / powf(10, HumidityDecimals); + heatIndex = roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); + dewPoint = roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); if (humidity != lastHumidity || PublishAlways) { - String topic = String(mqttDeviceTopic) + "/humidity"; + String topic = String(mqttDeviceTopic) + F("/humidity"); mqtt->publish(topic.c_str(), 0, false, String(humidity, HumidityDecimals).c_str()); } if (heatIndex != lastHeatIndex || PublishAlways) { - String topic = String(mqttDeviceTopic) + "/heat_index"; + String topic = String(mqttDeviceTopic) + F("/heat_index"); mqtt->publish(topic.c_str(), 0, false, String(heatIndex, TemperatureDecimals).c_str()); } if (dewPoint != lastDewPoint || PublishAlways) { - String topic = String(mqttDeviceTopic) + "/dew_point"; + String topic = String(mqttDeviceTopic) + F("/dew_point"); mqtt->publish(topic.c_str(), 0, false, String(dewPoint, TemperatureDecimals).c_str()); } @@ -201,11 +278,11 @@ public: { lastPressureMeasure = timer; - float pressure = roundf(sensorPressure * pow(10, PressureDecimals)) / pow(10, PressureDecimals); + float pressure = roundf(sensorPressure * powf(10, PressureDecimals)) / powf(10, PressureDecimals); if (pressure != lastPressure || PublishAlways) { - String topic = String(mqttDeviceTopic) + "/pressure"; + String topic = String(mqttDeviceTopic) + F("/pressure"); mqttPressurePub = mqtt->publish(topic.c_str(), 0, true, String(pressure, PressureDecimals).c_str()); } @@ -213,4 +290,173 @@ public: } } } + + /* + * API calls te enable data exchange between WLED modules + */ + inline float getTemperatureC() { + if (UseCelsius) { + 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; + } else { + 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); + } else { + 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; + } else { + 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() { + if (UseCelsius) { + return ((float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals) -32) * 0.56f; + } else { + return (float)roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals); + } + } + + // Publish Sensor Information to Info Page + void addToJsonInfo(JsonObject &root) + { + JsonObject user = root[F("u")]; + if (user.isNull()) user = root.createNestedObject(F("u")); + + if (sensorType==0) //No Sensor + { + // if we sensor not detected, let the user know + JsonArray temperature_json = user.createNestedArray(F("BME/BMP280 Sensor")); + temperature_json.add(F("Not Found")); + } + else if (sensorType==2) //BMP280 + { + + JsonArray temperature_json = user.createNestedArray(F("Temperature")); + JsonArray pressure_json = user.createNestedArray(F("Pressure")); + temperature_json.add(roundf(sensorTemperature * powf(10, TemperatureDecimals))); + temperature_json.add(tempScale); + pressure_json.add(roundf(sensorPressure * powf(10, PressureDecimals))); + pressure_json.add(F("hPa")); + } + else if (sensorType==1) //BME280 + { + JsonArray temperature_json = user.createNestedArray(F("Temperature")); + JsonArray humidity_json = user.createNestedArray(F("Humidity")); + JsonArray pressure_json = user.createNestedArray(F("Pressure")); + JsonArray heatindex_json = user.createNestedArray(F("Heat Index")); + JsonArray dewpoint_json = user.createNestedArray(F("Dew Point")); + temperature_json.add(roundf(sensorTemperature * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals)); + temperature_json.add(tempScale); + humidity_json.add(roundf(sensorHumidity * powf(10, HumidityDecimals))); + humidity_json.add(F("%")); + pressure_json.add(roundf(sensorPressure * powf(10, PressureDecimals))); + pressure_json.add(F("hPa")); + heatindex_json.add(roundf(sensorHeatIndex * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals)); + heatindex_json.add(tempScale); + dewpoint_json.add(roundf(sensorDewPoint * powf(10, TemperatureDecimals)) / powf(10, TemperatureDecimals)); + dewpoint_json.add(tempScale); + } + return; + } + + // Save Usermod Config Settings + void addToConfig(JsonObject& root) + { + JsonObject top = root.createNestedObject(F("BME280/BMP280")); + top[F("TemperatureDecimals")] = TemperatureDecimals; + top[F("HumidityDecimals")] = HumidityDecimals; + top[F("PressureDecimals")] = PressureDecimals; + top[F("TemperatureInterval")] = TemperatureInterval; + top[F("PressureInterval")] = PressureInterval; + top[F("PublishAlways")] = PublishAlways; + top[F("UseCelsius")] = UseCelsius; + top[F("HomeAssistantDiscovery")] = HomeAssistantDiscovery; + JsonArray io_pin = top.createNestedArray(F("pin")); + for (byte i=0; i<2; i++) io_pin.add(ioPin[i]); + top[F("help4Pins")] = F("SCL,SDA"); // help for Settings page + DEBUG_PRINTLN(F("BME280 config saved.")); + } + + // Read Usermod Config Settings + bool readFromConfig(JsonObject& root) + { + // 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")]; + if (top.isNull()) { + DEBUG_PRINT(F("BME280/BMP280")); + DEBUG_PRINTLN(F(": No config found. (Using defaults.)")); + return false; + } + bool configComplete = !top.isNull(); + + // 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); + configComplete &= getJsonValue(top[F("PressureDecimals")], PressureDecimals, 0); + configComplete &= getJsonValue(top[F("TemperatureInterval")], TemperatureInterval, 30); + configComplete &= getJsonValue(top[F("PressureInterval")], PressureInterval, 30); + configComplete &= getJsonValue(top[F("PublishAlways")], PublishAlways, false); + configComplete &= getJsonValue(top[F("UseCelsius")], UseCelsius, true); + 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"))); + if (!initDone) { + // first run: reading from cfg.json + for (byte i=0; i<2; i++) ioPin[i] = newPin[i]; + DEBUG_PRINTLN(F(" config loaded.")); + } else { + DEBUG_PRINTLN(F(" config (re)loaded.")); + // changing parameters from settings page + bool pinsChanged = false; + for (byte i=0; i<2; i++) if (ioPin[i] != newPin[i]) { pinsChanged = true; break; } // check if any pins changed + if (pinsChanged) { //if pins changed, deallocate old pins and allocate new ones + PinOwner po = PinOwner::UM_BME280; + if (ioPin[0]==HW_PIN_SCL && ioPin[1]==HW_PIN_SDA) po = PinOwner::HW_I2C; // allow multiple allocations of HW I2C bus pins + pinManager.deallocateMultiplePins((const uint8_t *)ioPin, 2, po); // deallocate pins + for (byte i=0; i<2; i++) ioPin[i] = newPin[i]; + setup(); + } + // use "return !top["newestParameter"].isNull();" when updating Usermod with new features + return !top[F("pin")].isNull(); + } + + return configComplete; + } + + uint16_t getId() { + return USERMOD_ID_BME280; + } }; \ No newline at end of file diff --git a/usermods/EleksTube_IPS/TFTs.h b/usermods/EleksTube_IPS/TFTs.h index 0d52d46e4..e614704f5 100644 --- a/usermods/EleksTube_IPS/TFTs.h +++ b/usermods/EleksTube_IPS/TFTs.h @@ -355,7 +355,7 @@ public: // Color in grayscale bitmaps if Segment 1 exists // TODO If secondary and tertiary are black, color all in primary, // else color first three from Seg 1 color slots and last three from Seg 2 color slots - WS2812FX::Segment& seg1 = strip.getSegment(tubeSegment); + Segment& seg1 = strip.getSegment(tubeSegment); if (seg1.isActive()) { digitColor = strip.getPixelColor(seg1.start + digit); dimming = seg1.opacity; diff --git a/usermods/EleksTube_IPS/usermod_elekstube_ips.h b/usermods/EleksTube_IPS/usermod_elekstube_ips.h index 06c6ecc89..0f7d92e7e 100644 --- a/usermods/EleksTube_IPS/usermod_elekstube_ips.h +++ b/usermods/EleksTube_IPS/usermod_elekstube_ips.h @@ -63,7 +63,7 @@ class ElekstubeIPSUsermod : public Usermod { if (!toki.isTick()) return; updateLocalTime(); - WS2812FX::Segment& seg1 = strip.getSegment(tfts.tubeSegment); + Segment& seg1 = strip.getSegment(tfts.tubeSegment); if (seg1.isActive()) { bool update = false; if (seg1.opacity != lastBri) update = true; diff --git a/usermods/audioreactive/audio_reactive.h b/usermods/audioreactive/audio_reactive.h index 716013715..d067d14e4 100644 --- a/usermods/audioreactive/audio_reactive.h +++ b/usermods/audioreactive/audio_reactive.h @@ -132,7 +132,7 @@ static ArduinoFFT FFT = ArduinoFFT( vReal, vImag, samplesFFT, SAMP static arduinoFFT FFT = arduinoFFT(vReal, vImag, samplesFFT, SAMPLE_RATE); #endif -static TaskHandle_t FFT_Task; +static TaskHandle_t FFT_Task = nullptr; float fftAddAvg(int from, int to) { float result = 0.0f; @@ -1150,24 +1150,26 @@ class AudioReactive : public Usermod { uiDomString += F(""); infoArr.add(uiDomString); - infoArr = user.createNestedArray(F("Input level")); - uiDomString = F("
"); // - infoArr.add(uiDomString); + if (enabled) { + infoArr = user.createNestedArray(F("Input level")); + uiDomString = F("
"); // + infoArr.add(uiDomString); -#ifdef WLED_DEBUG - infoArr = user.createNestedArray(F("Sampling time")); - infoArr.add(sampleTime); - infoArr.add("ms"); - infoArr = user.createNestedArray(F("FFT time")); - infoArr.add(fftTime-sampleTime); - infoArr.add("ms"); -#endif + #ifdef WLED_DEBUG + infoArr = user.createNestedArray(F("Sampling time")); + infoArr.add(sampleTime); + infoArr.add("ms"); + infoArr = user.createNestedArray(F("FFT time")); + infoArr.add(fftTime-sampleTime); + infoArr.add("ms"); + #endif + } } @@ -1175,12 +1177,15 @@ class AudioReactive : public Usermod { * addToJsonState() can be used to add custom entries to the /json/state part of the JSON API (state object). * Values in the state object may be modified by connected clients */ - /* void addToJsonState(JsonObject& root) { - //root["user0"] = userVar0; + if (!initDone) return; // prevent crash on boot applyPreset() + JsonObject usermod = root[FPSTR(_name)]; + if (usermod.isNull()) { + usermod = root.createNestedObject(FPSTR(_name)); + } + usermod["on"] = enabled; } - */ /* @@ -1264,8 +1269,7 @@ class AudioReactive : public Usermod { JsonObject sync = top.createNestedObject("sync"); sync[F("port")] = audioSyncPort; - sync[F("send")] = (bool) (audioSyncEnabled & 0x01); - sync[F("receive")] = (bool) (audioSyncEnabled & 0x02); + sync[F("mode")] = audioSyncEnabled; } @@ -1305,13 +1309,8 @@ class AudioReactive : public Usermod { configComplete &= getJsonValue(top["cfg"][F("gain")], sampleGain); configComplete &= getJsonValue(top["cfg"][F("AGC")], soundAgc); - configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort); - - bool send = audioSyncEnabled & 0x01; - bool receive = audioSyncEnabled & 0x02; - configComplete &= getJsonValue(top["sync"][F("send")], send); - configComplete &= getJsonValue(top["sync"][F("receive")], receive); - audioSyncEnabled = send | (receive << 1); + configComplete &= getJsonValue(top["sync"][F("port")], audioSyncPort); + configComplete &= getJsonValue(top["sync"][F("mode")], audioSyncEnabled); return configComplete; } @@ -1331,6 +1330,10 @@ class AudioReactive : public Usermod { oappend(SET_F("addOption(dd,'Normal',1);")); oappend(SET_F("addOption(dd,'Vivid',2);")); oappend(SET_F("addOption(dd,'Lazy',3);")); + oappend(SET_F("dd=addDropdown('AudioReactive','sync:mode');")); + oappend(SET_F("addOption(dd,'Off',0);")); + oappend(SET_F("addOption(dd,'Send',1);")); + oappend(SET_F("addOption(dd,'Receive',2);")); oappend(SET_F("addInfo('AudioReactive:digitalmic:type',1,'requires reboot!');")); // 0 is field type, 1 is actual field oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',0,'I2S SD');")); oappend(SET_F("addInfo('AudioReactive:digitalmic:pin[]',1,'I2S WS');")); diff --git a/usermods/stairway_wipe_basic/stairway-wipe-usermod-v2.h b/usermods/stairway_wipe_basic/stairway-wipe-usermod-v2.h index 08d551be0..238ec7d9c 100644 --- a/usermods/stairway_wipe_basic/stairway-wipe-usermod-v2.h +++ b/usermods/stairway_wipe_basic/stairway-wipe-usermod-v2.h @@ -96,7 +96,7 @@ class StairwayWipeUsermod : public Usermod { resetTimebase(); //make sure wipe starts from beginning //set wipe direction - WS2812FX::Segment& seg = strip.getSegment(0); + Segment& seg = strip.getSegment(0); bool doReverse = (userVar0 == 2); seg.setOption(1, doReverse); diff --git a/usermods/stairway_wipe_basic/wled06_usermod.ino b/usermods/stairway_wipe_basic/wled06_usermod.ino index eeece4438..c1264ebfb 100644 --- a/usermods/stairway_wipe_basic/wled06_usermod.ino +++ b/usermods/stairway_wipe_basic/wled06_usermod.ino @@ -89,7 +89,7 @@ void startWipe() resetTimebase(); //make sure wipe starts from beginning //set wipe direction - WS2812FX::Segment& seg = strip.getSegment(0); + Segment& seg = strip.getSegment(0); bool doReverse = (userVar0 == 2); seg.setOption(1, doReverse); diff --git a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h index 34cace3cf..18435ca36 100644 --- a/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h +++ b/usermods/usermod_v2_rotary_encoder_ui_ALT/usermod_v2_rotary_encoder_ui_ALT.h @@ -251,6 +251,7 @@ private: * Sort either the modes or the palettes using quicksort. */ void re_sortModes(const char **modeNames, byte *indexes, int count, int numSkip) { + if (!modeNames) return; listBeingSorted = modeNames; qsort(indexes + numSkip, count - numSkip, sizeof(byte), re_qstringCmp); listBeingSorted = nullptr; @@ -527,13 +528,13 @@ public: effectCurrent = modes_alpha_indexes[effectCurrentIndex]; stateChanged = true; if (applyToAll) { - for (byte i=0; i 127) { + a = -127; + x -= 127; + } + + if (x < attdec) { //inc to max + return (int16_t) x * a / attdec; + } + else if (x < pulsewidth - attdec) { //max + return a; + } + else if (x < pulsewidth) { //dec to 0 + return (int16_t) (pulsewidth - x) * a / attdec; + } + return 0; +} + +// effect functions /* * No blinking. Just plain old static light. */ -uint16_t WS2812FX::mode_static(void) { - fill(SEGCOLOR(0)); +uint16_t mode_static(void) { + SEGMENT.fill(SEGCOLOR(0)); return (SEGMENT.getOption(SEG_OPTION_TRANSITIONAL)) ? FRAMETIME : 350; //update faster if in transition } static const char *_data_FX_MODE_STATIC PROGMEM = "Solid"; @@ -46,13 +85,13 @@ static const char *_data_FX_MODE_STATIC PROGMEM = "Solid"; * Alternate between color1 and color2 * if(strobe == true) then create a strobe effect */ -uint16_t WS2812FX::blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palette) { +uint16_t blink(uint32_t color1, uint32_t color2, bool strobe, bool do_palette) { uint32_t cycleTime = (255 - SEGMENT.speed)*20; uint32_t onTime = FRAMETIME; if (!strobe) onTime += ((cycleTime * SEGMENT.intensity) >> 8); cycleTime += FRAMETIME*2; - uint32_t it = now / cycleTime; - uint32_t rem = now % cycleTime; + uint32_t it = strip.now / cycleTime; + uint32_t rem = strip.now % cycleTime; bool on = false; if (it != SEGENV.step //new iteration, force on state for one frame, even if set time is too brief @@ -66,9 +105,9 @@ uint16_t WS2812FX::blink(uint32_t color1, uint32_t color2, bool strobe, bool do_ if (color == color1 && do_palette) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } - } else fill(color); + } else SEGMENT.fill(color); return FRAMETIME; } @@ -77,7 +116,7 @@ uint16_t WS2812FX::blink(uint32_t color1, uint32_t color2, bool strobe, bool do_ /* * Normal blinking. 50% on/off time. */ -uint16_t WS2812FX::mode_blink(void) { +uint16_t mode_blink(void) { return blink(SEGCOLOR(0), SEGCOLOR(1), false, true); } static const char *_data_FX_MODE_BLINK PROGMEM = "Blink@!,;!,!,;!"; @@ -86,8 +125,8 @@ static const char *_data_FX_MODE_BLINK PROGMEM = "Blink@!,;!,!,;!"; /* * Classic Blink effect. Cycling through the rainbow. */ -uint16_t WS2812FX::mode_blink_rainbow(void) { - return blink(color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), false, false); +uint16_t mode_blink_rainbow(void) { + return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), false, false); } static const char *_data_FX_MODE_BLINK_RAINBOW PROGMEM = "Blink Rainbow@Frequency,Blink duration;!,!,;!"; @@ -95,7 +134,7 @@ static const char *_data_FX_MODE_BLINK_RAINBOW PROGMEM = "Blink Rainbow@Frequenc /* * Classic Strobe effect. */ -uint16_t WS2812FX::mode_strobe(void) { +uint16_t mode_strobe(void) { return blink(SEGCOLOR(0), SEGCOLOR(1), true, true); } static const char *_data_FX_MODE_STROBE PROGMEM = "Strobe@!,;!,!,;!"; @@ -104,8 +143,8 @@ static const char *_data_FX_MODE_STROBE PROGMEM = "Strobe@!,;!,!,;!"; /* * Classic Strobe effect. Cycling through the rainbow. */ -uint16_t WS2812FX::mode_strobe_rainbow(void) { - return blink(color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), true, false); +uint16_t mode_strobe_rainbow(void) { + return blink(SEGMENT.color_wheel(SEGENV.call & 0xFF), SEGCOLOR(1), true, false); } static const char *_data_FX_MODE_STROBE_RAINBOW PROGMEM = "Strobe Rainbow@!,;,!,;!"; @@ -115,9 +154,9 @@ static const char *_data_FX_MODE_STROBE_RAINBOW PROGMEM = "Strobe Rainbow@!,;,!, * LEDs are turned on (color1) in sequence, then turned off (color2) in sequence. * if (bool rev == true) then LEDs are turned off in reverse order */ -uint16_t WS2812FX::color_wipe(bool rev, bool useRandomColors) { +uint16_t color_wipe(bool rev, bool useRandomColors) { uint32_t cycleTime = 750 + (255 - SEGMENT.speed)*150; - uint32_t perc = now % cycleTime; + uint32_t perc = strip.now % cycleTime; uint16_t prog = (perc * 65535) / cycleTime; bool back = (prog > 32767); if (back) { @@ -133,11 +172,11 @@ uint16_t WS2812FX::color_wipe(bool rev, bool useRandomColors) { SEGENV.step = 3; } if (SEGENV.step == 1) { //if flag set, change to new random color - SEGENV.aux1 = get_random_wheel_index(SEGENV.aux0); + SEGENV.aux1 = SEGMENT.get_random_wheel_index(SEGENV.aux0); SEGENV.step = 2; } if (SEGENV.step == 3) { - SEGENV.aux0 = get_random_wheel_index(SEGENV.aux1); + SEGENV.aux0 = SEGMENT.get_random_wheel_index(SEGENV.aux1); SEGENV.step = 0; } } @@ -148,19 +187,19 @@ uint16_t WS2812FX::color_wipe(bool rev, bool useRandomColors) { rem /= (SEGMENT.intensity +1); if (rem > 255) rem = 255; - uint32_t col1 = useRandomColors? color_wheel(SEGENV.aux1) : SEGCOLOR(1); + uint32_t col1 = useRandomColors? SEGMENT.color_wheel(SEGENV.aux1) : SEGCOLOR(1); for (uint16_t i = 0; i < SEGLEN; i++) { uint16_t index = (rev && back)? SEGLEN -1 -i : i; - uint32_t col0 = useRandomColors? color_wheel(SEGENV.aux0) : color_from_palette(index, true, PALETTE_SOLID_WRAP, 0); + uint32_t col0 = useRandomColors? SEGMENT.color_wheel(SEGENV.aux0) : SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0); if (i < ledIndex) { - setPixelColor(index, back? col1 : col0); + SEGMENT.setPixelColor(index, back? col1 : col0); } else { - setPixelColor(index, back? col0 : col1); - if (i == ledIndex) setPixelColor(index, color_blend(back? col0 : col1, back? col1 : col0, rem)); + SEGMENT.setPixelColor(index, back? col0 : col1); + if (i == ledIndex) SEGMENT.setPixelColor(index, color_blend(back? col0 : col1, back? col1 : col0, rem)); } } return FRAMETIME; @@ -170,7 +209,7 @@ uint16_t WS2812FX::color_wipe(bool rev, bool useRandomColors) { /* * Lights all LEDs one after another. */ -uint16_t WS2812FX::mode_color_wipe(void) { +uint16_t mode_color_wipe(void) { return color_wipe(false, false); } static const char *_data_FX_MODE_COLOR_WIPE PROGMEM = "Wipe@!,!;!,!,;!"; @@ -179,7 +218,7 @@ static const char *_data_FX_MODE_COLOR_WIPE PROGMEM = "Wipe@!,!;!,!,;!"; /* * Lights all LEDs one after another. Turns off opposite */ -uint16_t WS2812FX::mode_color_sweep(void) { +uint16_t mode_color_sweep(void) { return color_wipe(true, false); } static const char *_data_FX_MODE_COLOR_SWEEP PROGMEM = "Sweep@!,!;!,!,;!"; @@ -189,7 +228,7 @@ static const char *_data_FX_MODE_COLOR_SWEEP PROGMEM = "Sweep@!,!;!,!,;!"; * Turns all LEDs after each other to a random color. * Then starts over with another color. */ -uint16_t WS2812FX::mode_color_wipe_random(void) { +uint16_t mode_color_wipe_random(void) { return color_wipe(false, true); } static const char *_data_FX_MODE_COLOR_WIPE_RANDOM PROGMEM = "Wipe Random@!,;1,2,3;!"; @@ -198,7 +237,7 @@ static const char *_data_FX_MODE_COLOR_WIPE_RANDOM PROGMEM = "Wipe Random@!,;1,2 /* * Random color introduced alternating from start and end of strip. */ -uint16_t WS2812FX::mode_color_sweep_random(void) { +uint16_t mode_color_sweep_random(void) { return color_wipe(true, true); } static const char *_data_FX_MODE_COLOR_SWEEP_RANDOM PROGMEM = "Sweep Random"; @@ -208,10 +247,10 @@ static const char *_data_FX_MODE_COLOR_SWEEP_RANDOM PROGMEM = "Sweep Random"; * Lights all LEDs in one random color up. Then switches them * to the next random color. */ -uint16_t WS2812FX::mode_random_color(void) { +uint16_t mode_random_color(void) { uint32_t cycleTime = 200 + (255 - SEGMENT.speed)*50; - uint32_t it = now / cycleTime; - uint32_t rem = now % cycleTime; + uint32_t it = strip.now / cycleTime; + uint32_t rem = strip.now % cycleTime; uint16_t fadedur = (cycleTime * SEGMENT.intensity) >> 8; uint32_t fade = 255; @@ -227,11 +266,11 @@ uint16_t WS2812FX::mode_random_color(void) { if (it != SEGENV.step) //new color { SEGENV.aux1 = SEGENV.aux0; - SEGENV.aux0 = get_random_wheel_index(SEGENV.aux0); //aux0 will store our random color wheel index + SEGENV.aux0 = SEGMENT.get_random_wheel_index(SEGENV.aux0); //aux0 will store our random color wheel index SEGENV.step = it; } - fill(color_blend(color_wheel(SEGENV.aux1), color_wheel(SEGENV.aux0), fade)); + SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux1), SEGMENT.color_wheel(SEGENV.aux0), fade)); return FRAMETIME; } static const char *_data_FX_MODE_RANDOM_COLOR PROGMEM = "Random Colors@!,Fade time;1,2,3;!"; @@ -241,7 +280,7 @@ static const char *_data_FX_MODE_RANDOM_COLOR PROGMEM = "Random Colors@!,Fade ti * Lights every LED in a random color. Changes all LED at the same time * to new random colors. */ -uint16_t WS2812FX::dynamic(boolean smooth=false) { +uint16_t dynamic(boolean smooth=false) { if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed if(SEGENV.call == 0) { @@ -249,7 +288,7 @@ uint16_t WS2812FX::dynamic(boolean smooth=false) { } uint32_t cycleTime = 50 + (255 - SEGMENT.speed)*15; - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (it != SEGENV.step && SEGMENT.speed != 0) //new color { for (uint16_t i = 0; i < SEGLEN; i++) { @@ -260,11 +299,11 @@ uint16_t WS2812FX::dynamic(boolean smooth=false) { if (smooth) { for (uint16_t i = 0; i < SEGLEN; i++) { - blendPixelColor(i, color_wheel(SEGENV.data[i]),16); + SEGMENT.blendPixelColor(i, SEGMENT.color_wheel(SEGENV.data[i]),16); } } else { for (uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_wheel(SEGENV.data[i])); + SEGMENT.setPixelColor(i, SEGMENT.color_wheel(SEGENV.data[i])); } } return FRAMETIME; @@ -274,7 +313,7 @@ uint16_t WS2812FX::dynamic(boolean smooth=false) { /* * Original effect "Dynamic" */ -uint16_t WS2812FX::mode_dynamic(void) { +uint16_t mode_dynamic(void) { return dynamic(false); } static const char *_data_FX_MODE_DYNAMIC PROGMEM = "Dynamic@!,!;1,2,3;!"; @@ -283,7 +322,7 @@ static const char *_data_FX_MODE_DYNAMIC PROGMEM = "Dynamic@!,!;1,2,3;!"; /* * effect "Dynamic" with smoth color-fading */ -uint16_t WS2812FX::mode_dynamic_smooth(void) { +uint16_t mode_dynamic_smooth(void) { return dynamic(true); } static const char *_data_FX_MODE_DYNAMIC_SMOOTH PROGMEM = "Dynamic Smooth"; @@ -292,9 +331,9 @@ static const char *_data_FX_MODE_DYNAMIC_SMOOTH PROGMEM = "Dynamic Smooth"; /* * Does the "standby-breathing" of well known i-Devices. */ -uint16_t WS2812FX::mode_breath(void) { +uint16_t mode_breath(void) { uint16_t var = 0; - uint16_t counter = (now * ((SEGMENT.speed >> 3) +10)); + uint16_t counter = (strip.now * ((SEGMENT.speed >> 3) +10)); counter = (counter >> 2) + (counter >> 4); //0-16384 + 0-2048 if (counter < 16384) { if (counter > 8192) counter = 8192 - (counter - 8192); @@ -303,7 +342,7 @@ uint16_t WS2812FX::mode_breath(void) { uint8_t lum = 30 + var; for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), lum)); + SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), lum)); } return FRAMETIME; @@ -314,12 +353,12 @@ static const char *_data_FX_MODE_BREATH PROGMEM = "Breathe@!,;!,!;!"; /* * Fades the LEDs between two colors */ -uint16_t WS2812FX::mode_fade(void) { - uint16_t counter = (now * ((SEGMENT.speed >> 3) +10)); +uint16_t mode_fade(void) { + uint16_t counter = (strip.now * ((SEGMENT.speed >> 3) +10)); uint8_t lum = triwave16(counter) >> 8; for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), lum)); + SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), lum)); } return FRAMETIME; @@ -330,15 +369,15 @@ static const char *_data_FX_MODE_FADE PROGMEM = "Fade@!,;!,!,;!"; /* * Scan mode parent function */ -uint16_t WS2812FX::scan(bool dual) +uint16_t scan(bool dual) { uint32_t cycleTime = 750 + (255 - SEGMENT.speed)*150; - uint32_t perc = now % cycleTime; + uint32_t perc = strip.now % cycleTime; uint16_t prog = (perc * 65535) / cycleTime; uint16_t size = 1 + ((SEGMENT.intensity * SEGLEN) >> 9); uint16_t ledIndex = (prog * ((SEGLEN *2) - size *2)) >> 16; - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); int led_offset = ledIndex - (SEGLEN - size); led_offset = abs(led_offset); @@ -346,12 +385,12 @@ uint16_t WS2812FX::scan(bool dual) if (dual) { for (uint16_t j = led_offset; j < led_offset + size; j++) { uint16_t i2 = SEGLEN -1 -j; - setPixelColor(i2, color_from_palette(i2, true, PALETTE_SOLID_WRAP, (SEGCOLOR(2))? 2:0)); + SEGMENT.setPixelColor(i2, SEGMENT.color_from_palette(i2, true, PALETTE_SOLID_WRAP, (SEGCOLOR(2))? 2:0)); } } for (uint16_t j = led_offset; j < led_offset + size; j++) { - setPixelColor(j, color_from_palette(j, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(j, SEGMENT.color_from_palette(j, true, PALETTE_SOLID_WRAP, 0)); } return FRAMETIME; @@ -361,7 +400,7 @@ uint16_t WS2812FX::scan(bool dual) /* * Runs a single pixel back and forth. */ -uint16_t WS2812FX::mode_scan(void) { +uint16_t mode_scan(void) { return scan(false); } static const char *_data_FX_MODE_SCAN PROGMEM = "Scan@!,# of dots;!,!,;!"; @@ -370,7 +409,7 @@ static const char *_data_FX_MODE_SCAN PROGMEM = "Scan@!,# of dots;!,!,;!"; /* * Runs two pixel back and forth in opposite directions. */ -uint16_t WS2812FX::mode_dual_scan(void) { +uint16_t mode_dual_scan(void) { return scan(true); } static const char *_data_FX_MODE_DUAL_SCAN PROGMEM = "Scan Dual@!,# of dots;!,!,;!"; @@ -379,14 +418,14 @@ static const char *_data_FX_MODE_DUAL_SCAN PROGMEM = "Scan Dual@!,# of dots;!,!, /* * Cycles all LEDs at once through a rainbow. */ -uint16_t WS2812FX::mode_rainbow(void) { - uint16_t counter = (now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; +uint16_t mode_rainbow(void) { + uint16_t counter = (strip.now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; counter = counter >> 8; if (SEGMENT.intensity < 128){ - fill(color_blend(color_wheel(counter),WHITE,128-SEGMENT.intensity)); + SEGMENT.fill(color_blend(SEGMENT.color_wheel(counter),WHITE,128-SEGMENT.intensity)); } else { - fill(color_wheel(counter)); + SEGMENT.fill(SEGMENT.color_wheel(counter)); } return FRAMETIME; @@ -397,14 +436,14 @@ static const char *_data_FX_MODE_RAINBOW PROGMEM = "Colorloop@!,Saturation;1,2,3 /* * Cycles a rainbow over the entire string of LEDs. */ -uint16_t WS2812FX::mode_rainbow_cycle(void) { - uint16_t counter = (now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; +uint16_t mode_rainbow_cycle(void) { + uint16_t counter = (strip.now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; counter = counter >> 8; for(uint16_t i = 0; i < SEGLEN; i++) { //intensity/29 = 0 (1/16) 1 (1/8) 2 (1/4) 3 (1/2) 4 (1) 5 (2) 6 (4) 7 (8) 8 (16) uint8_t index = (i * (16 << (SEGMENT.intensity /29)) / SEGLEN) + counter; - setPixelColor(i, color_wheel(index)); + SEGMENT.setPixelColor(i, SEGMENT.color_wheel(index)); } return FRAMETIME; @@ -412,11 +451,40 @@ uint16_t WS2812FX::mode_rainbow_cycle(void) { static const char *_data_FX_MODE_RAINBOW_CYCLE PROGMEM = "Rainbow@!,Size;1,2,3;!"; +/* + * Alternating pixels running function. + */ +uint16_t running(uint32_t color1, uint32_t color2, bool theatre = false) { + uint8_t width = (theatre ? 3 : 1) + (SEGMENT.intensity >> 4); // window + uint32_t cycleTime = 50 + (255 - SEGMENT.speed); + uint32_t it = strip.now / cycleTime; + bool usePalette = color1 == SEGCOLOR(0); + + for(uint16_t i = 0; i < SEGLEN; i++) { + uint32_t col = color2; + if (usePalette) color1 = SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0); + if (theatre) { + if ((i % width) == SEGENV.aux0) col = color1; + } else { + int8_t pos = (i % (width<<1)); + if ((pos < SEGENV.aux0-width) || ((pos >= SEGENV.aux0) && (pos < SEGENV.aux0+width))) col = color1; + } + SEGMENT.setPixelColor(i,col); + } + + if (it != SEGENV.step) { + SEGENV.aux0 = (SEGENV.aux0 +1) % (theatre ? width : (width<<1)); + SEGENV.step = it; + } + return FRAMETIME; +} + + /* * Theatre-style crawling lights. * Inspired by the Adafruit examples. */ -uint16_t WS2812FX::mode_theater_chase(void) { +uint16_t mode_theater_chase(void) { return running(SEGCOLOR(0), SEGCOLOR(1), true); } static const char *_data_FX_MODE_THEATER_CHASE PROGMEM = "Theater@!,Gap size;!,!,;!"; @@ -426,8 +494,8 @@ static const char *_data_FX_MODE_THEATER_CHASE PROGMEM = "Theater@!,Gap size;!,! * Theatre-style crawling lights with rainbow effect. * Inspired by the Adafruit examples. */ -uint16_t WS2812FX::mode_theater_chase_rainbow(void) { - return running(color_wheel(SEGENV.step), SEGCOLOR(1), true); +uint16_t mode_theater_chase_rainbow(void) { + return running(SEGMENT.color_wheel(SEGENV.step), SEGCOLOR(1), true); } static const char *_data_FX_MODE_THEATER_CHASE_RAINBOW PROGMEM = "Theater Rainbow@!,Gap size;1,2,3;!"; @@ -435,9 +503,9 @@ static const char *_data_FX_MODE_THEATER_CHASE_RAINBOW PROGMEM = "Theater Rainbo /* * Running lights effect with smooth sine transition base. */ -uint16_t WS2812FX::running_base(bool saw, bool dual=false) { +uint16_t running_base(bool saw, bool dual=false) { uint8_t x_scale = SEGMENT.intensity >> 2; - uint32_t counter = (now * SEGMENT.speed) >> 9; + uint32_t counter = (strip.now * SEGMENT.speed) >> 9; for(uint16_t i = 0; i < SEGLEN; i++) { uint16_t a = i*x_scale - counter; @@ -452,14 +520,14 @@ uint16_t WS2812FX::running_base(bool saw, bool dual=false) { a = 255 - a; } uint8_t s = dual ? sin_gap(a) : sin8(a); - uint32_t ca = color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s); + uint32_t ca = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s); if (dual) { uint16_t b = (SEGLEN-1-i)*x_scale - counter; uint8_t t = sin_gap(b); - uint32_t cb = color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), t); + uint32_t cb = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), t); ca = color_blend(ca, cb, 127); } - setPixelColor(i, ca); + SEGMENT.setPixelColor(i, ca); } return FRAMETIME; } @@ -469,7 +537,7 @@ uint16_t WS2812FX::running_base(bool saw, bool dual=false) { * Running lights in opposite directions. * Idea: Make the gap width controllable with a third slider in the future */ -uint16_t WS2812FX::mode_running_dual(void) { +uint16_t mode_running_dual(void) { return running_base(false, true); } static const char *_data_FX_MODE_RUNNING_DUAL PROGMEM = "Running Dual"; @@ -478,7 +546,7 @@ static const char *_data_FX_MODE_RUNNING_DUAL PROGMEM = "Running Dual"; /* * Running lights effect with smooth sine transition. */ -uint16_t WS2812FX::mode_running_lights(void) { +uint16_t mode_running_lights(void) { return running_base(false); } static const char *_data_FX_MODE_RUNNING_LIGHTS PROGMEM = "Running@!,Wave width;!,!,;!"; @@ -487,7 +555,7 @@ static const char *_data_FX_MODE_RUNNING_LIGHTS PROGMEM = "Running@!,Wave width; /* * Running lights effect with sawtooth transition. */ -uint16_t WS2812FX::mode_saw(void) { +uint16_t mode_saw(void) { return running_base(true); } static const char *_data_FX_MODE_SAW PROGMEM = "Saw@!,Width;!,!,;!"; @@ -497,14 +565,14 @@ static const char *_data_FX_MODE_SAW PROGMEM = "Saw@!,Width;!,!,;!"; * Blink several LEDs in random colors on, reset, repeat. * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ -uint16_t WS2812FX::mode_twinkle(void) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); +uint16_t mode_twinkle(void) { + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); const uint16_t rows = SEGMENT.virtualHeight(); - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); uint32_t cycleTime = 20 + (255 - SEGMENT.speed)*5; - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (it != SEGENV.step) { uint16_t maxOn = map(SEGMENT.intensity, 0, 255, 1, cols*rows-1); // make sure at least one LED is on @@ -525,38 +593,38 @@ uint16_t WS2812FX::mode_twinkle(void) { uint32_t p = ((uint32_t)cols*rows * (uint32_t)PRNG16) >> 16; uint16_t j = p % cols; uint16_t k = p / cols; - uint32_t col = color_from_palette(map(p, 0, cols*rows, 0, 255), false, PALETTE_SOLID_WRAP, 0); - if (isMatrix) setPixelColorXY(j, k, col); - else setPixelColor(j, col); + uint32_t col = SEGMENT.color_from_palette(map(p, 0, cols*rows, 0, 255), false, PALETTE_SOLID_WRAP, 0); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, col); + else SEGMENT.setPixelColor(j, col); } return FRAMETIME; } -static const char *_data_FX_MODE_TWINKLE PROGMEM = "Twinkle@!,;!,!,;!"; +static const char *_data_FX_MODE_TWINKLE PROGMEM = "Twinkle@!,;!,!,;!;mp12=0"; //pixels /* * Dissolve function */ -uint16_t WS2812FX::dissolve(uint32_t color) { - bool wa = (SEGCOLOR(1) != 0 && _brightness < 255); //workaround, can't compare getPixel to color if not full brightness +uint16_t dissolve(uint32_t color) { + bool wa = (SEGCOLOR(1) != 0 && strip.getBrightness() < 255); //workaround, can't compare getPixel to color if not full brightness for (uint16_t j = 0; j <= SEGLEN / 15; j++) { if (random8() <= SEGMENT.intensity) { - for (uint8_t times = 0; times < 10; times++) //attempt to spawn a new pixel 5 times + for (size_t times = 0; times < 10; times++) //attempt to spawn a new pixel 5 times { uint16_t i = random16(SEGLEN); if (SEGENV.aux0) { //dissolve to primary/palette - if (getPixelColor(i) == SEGCOLOR(1) || wa) { + if (SEGMENT.getPixelColor(i) == SEGCOLOR(1) || wa) { if (color == SEGCOLOR(0)) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); - } else { setPixelColor(i, color); } + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + } else { SEGMENT.setPixelColor(i, color); } break; //only spawn 1 new pixel per frame per 50 LEDs } } else { //dissolve to secondary - if (getPixelColor(i) != SEGCOLOR(1)) { setPixelColor(i, SEGCOLOR(1)); break; } + if (SEGMENT.getPixelColor(i) != SEGCOLOR(1)) { SEGMENT.setPixelColor(i, SEGCOLOR(1)); break; } } } } @@ -575,7 +643,7 @@ uint16_t WS2812FX::dissolve(uint32_t color) { /* * Blink several LEDs on and then off */ -uint16_t WS2812FX::mode_dissolve(void) { +uint16_t mode_dissolve(void) { return dissolve(SEGCOLOR(0)); } static const char *_data_FX_MODE_DISSOLVE PROGMEM = "Dissolve@Repeat speed,Dissolve speed;!,!,;!"; @@ -584,8 +652,8 @@ static const char *_data_FX_MODE_DISSOLVE PROGMEM = "Dissolve@Repeat speed,Disso /* * Blink several LEDs on and then off in random colors */ -uint16_t WS2812FX::mode_dissolve_random(void) { - return dissolve(color_wheel(random8())); +uint16_t mode_dissolve_random(void) { + return dissolve(SEGMENT.color_wheel(random8())); } static const char *_data_FX_MODE_DISSOLVE_RANDOM PROGMEM = "Dissolve Rnd@Repeat speed,Dissolve speed;,!,;!"; @@ -594,12 +662,12 @@ static const char *_data_FX_MODE_DISSOLVE_RANDOM PROGMEM = "Dissolve Rnd@Repeat * Blinks one LED at a time. * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ -uint16_t WS2812FX::mode_sparkle(void) { +uint16_t mode_sparkle(void) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); } uint32_t cycleTime = 10 + (255 - SEGMENT.speed)*2; - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (it != SEGENV.step) { SEGENV.aux0 = random16(SEGLEN); // aux0 stores the random led index @@ -607,8 +675,8 @@ uint16_t WS2812FX::mode_sparkle(void) { SEGENV.step = it; } - if (isMatrix) setPixelColorXY(SEGENV.aux0, SEGENV.aux1, SEGCOLOR(0)); - else setPixelColor(SEGENV.aux0, SEGCOLOR(0)); + if (strip.isMatrix) SEGMENT.setPixelColorXY(SEGENV.aux0, SEGENV.aux1, SEGCOLOR(0)); + else SEGMENT.setPixelColor(SEGENV.aux0, SEGCOLOR(0)); return FRAMETIME; } static const char *_data_FX_MODE_SPARKLE PROGMEM = "Sparkle@!,;!,!,;!"; @@ -618,17 +686,17 @@ static const char *_data_FX_MODE_SPARKLE PROGMEM = "Sparkle@!,;!,!,;!"; * Lights all LEDs in the color. Flashes single col 1 pixels randomly. (List name: Sparkle Dark) * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ -uint16_t WS2812FX::mode_flash_sparkle(void) { +uint16_t mode_flash_sparkle(void) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } - if (now - SEGENV.aux0 > SEGENV.step) { + if (strip.now - SEGENV.aux0 > SEGENV.step) { if(random8((255-SEGMENT.intensity) >> 4) == 0) { - if (isMatrix) setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()-1), SEGCOLOR(1)); - else setPixelColor(random16(SEGLEN), SEGCOLOR(1)); //flash + if (strip.isMatrix) SEGMENT.setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()-1), SEGCOLOR(1)); + else SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1)); //flash } - SEGENV.step = now; + SEGENV.step = strip.now; SEGENV.aux0 = 255-SEGMENT.speed; } return FRAMETIME; @@ -640,19 +708,19 @@ static const char *_data_FX_MODE_FLASH_SPARKLE PROGMEM = "Sparkle Dark@!,!;Bg,Fx * Like flash sparkle. With more flash. * Inspired by www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/ */ -uint16_t WS2812FX::mode_hyper_sparkle(void) { +uint16_t mode_hyper_sparkle(void) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } - if (now - SEGENV.aux0 > SEGENV.step) { + if (strip.now - SEGENV.aux0 > SEGENV.step) { if(random8((255-SEGMENT.intensity) >> 4) == 0) { for(uint16_t i = 0; i < MAX(1, SEGLEN/3); i++) { - if (isMatrix) setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()), SEGCOLOR(1)); - else setPixelColor(random16(SEGLEN), SEGCOLOR(1)); + if (strip.isMatrix) SEGMENT.setPixelColorXY(random16(SEGLEN), random16(0,SEGMENT.virtualHeight()), SEGCOLOR(1)); + else SEGMENT.setPixelColor(random16(SEGLEN), SEGCOLOR(1)); } } - SEGENV.step = now; + SEGENV.step = strip.now; SEGENV.aux0 = 255-SEGMENT.speed; } return FRAMETIME; @@ -663,26 +731,26 @@ static const char *_data_FX_MODE_HYPER_SPARKLE PROGMEM = "Sparkle+@!,!;Bg,Fx,;!" /* * Strobe effect with different strobe count and pause, controlled by speed. */ -uint16_t WS2812FX::mode_multi_strobe(void) { +uint16_t mode_multi_strobe(void) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); } SEGENV.aux0 = 50 + 20*(uint16_t)(255-SEGMENT.speed); uint16_t count = 2 * ((SEGMENT.intensity / 10) + 1); if(SEGENV.aux1 < count) { if((SEGENV.aux1 & 1) == 0) { - fill(SEGCOLOR(0)); + SEGMENT.fill(SEGCOLOR(0)); SEGENV.aux0 = 15; } else { SEGENV.aux0 = 50; } } - if (now - SEGENV.aux0 > SEGENV.step) { + if (strip.now - SEGENV.aux0 > SEGENV.step) { SEGENV.aux1++; if (SEGENV.aux1 > count) SEGENV.aux1 = 0; - SEGENV.step = now; + SEGENV.step = strip.now; } return FRAMETIME; @@ -693,10 +761,10 @@ static const char *_data_FX_MODE_MULTI_STROBE PROGMEM = "Strobe Mega@!,!;!,!,;!" /* * Android loading circle */ -uint16_t WS2812FX::mode_android(void) { +uint16_t mode_android(void) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); } if (SEGENV.aux1 > ((float)SEGMENT.intensity/255.0)*(float)SEGLEN) @@ -724,22 +792,22 @@ uint16_t WS2812FX::mode_android(void) { if (a + SEGENV.aux1 < SEGLEN) { for(uint16_t i = a; i < a+SEGENV.aux1; i++) { - setPixelColor(i, SEGCOLOR(0)); + SEGMENT.setPixelColor(i, SEGCOLOR(0)); } } else { for(uint16_t i = a; i < SEGLEN; i++) { - setPixelColor(i, SEGCOLOR(0)); + SEGMENT.setPixelColor(i, SEGCOLOR(0)); } for(uint16_t i = 0; i < SEGENV.aux1 - (SEGLEN -a); i++) { - setPixelColor(i, SEGCOLOR(0)); + SEGMENT.setPixelColor(i, SEGCOLOR(0)); } } SEGENV.step = a; return 3 + ((8 * (uint32_t)(255 - SEGMENT.speed)) / SEGLEN); } -static const char *_data_FX_MODE_ANDROID PROGMEM = "Android@!,Width;!,!,;!"; +static const char *_data_FX_MODE_ANDROID PROGMEM = "Android@!,Width;!,!,;!;mp12=1"; //vertical /* @@ -747,8 +815,8 @@ static const char *_data_FX_MODE_ANDROID PROGMEM = "Android@!,Width;!,!,;!"; * color1 = background color * color2 and color3 = colors of two adjacent leds */ -uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool do_palette) { - uint16_t counter = now * ((SEGMENT.speed >> 2) + 1); +uint16_t chase(uint32_t color1, uint32_t color2, uint32_t color3, bool do_palette) { + uint16_t counter = strip.now * ((SEGMENT.speed >> 2) + 1); uint16_t a = counter * SEGLEN >> 16; bool chase_random = (SEGMENT.mode == FX_MODE_CHASE_RANDOM); @@ -756,9 +824,9 @@ uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool if (a < SEGENV.step) //we hit the start again, choose new color for Chase random { SEGENV.aux1 = SEGENV.aux0; //store previous random color - SEGENV.aux0 = get_random_wheel_index(SEGENV.aux0); + SEGENV.aux0 = SEGMENT.get_random_wheel_index(SEGENV.aux0); } - color1 = color_wheel(SEGENV.aux0); + color1 = SEGMENT.color_wheel(SEGENV.aux0); } SEGENV.step = a; @@ -774,40 +842,40 @@ uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool if (do_palette) { for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); } - } else fill(color1); + } else SEGMENT.fill(color1); //if random, fill old background between a and end if (chase_random) { - color1 = color_wheel(SEGENV.aux1); + color1 = SEGMENT.color_wheel(SEGENV.aux1); for (uint16_t i = a; i < SEGLEN; i++) - setPixelColor(i, color1); + SEGMENT.setPixelColor(i, color1); } //fill between points a and b with color2 if (a < b) { for (uint16_t i = a; i < b; i++) - setPixelColor(i, color2); + SEGMENT.setPixelColor(i, color2); } else { for (uint16_t i = a; i < SEGLEN; i++) //fill until end - setPixelColor(i, color2); + SEGMENT.setPixelColor(i, color2); for (uint16_t i = 0; i < b; i++) //fill from start until b - setPixelColor(i, color2); + SEGMENT.setPixelColor(i, color2); } //fill between points b and c with color2 if (b < c) { for (uint16_t i = b; i < c; i++) - setPixelColor(i, color3); + SEGMENT.setPixelColor(i, color3); } else { for (uint16_t i = b; i < SEGLEN; i++) //fill until end - setPixelColor(i, color3); + SEGMENT.setPixelColor(i, color3); for (uint16_t i = 0; i < c; i++) //fill from start until c - setPixelColor(i, color3); + SEGMENT.setPixelColor(i, color3); } return FRAMETIME; @@ -817,7 +885,7 @@ uint16_t WS2812FX::chase(uint32_t color1, uint32_t color2, uint32_t color3, bool /* * Bicolor chase, more primary color. */ -uint16_t WS2812FX::mode_chase_color(void) { +uint16_t mode_chase_color(void) { return chase(SEGCOLOR(1), (SEGCOLOR(2)) ? SEGCOLOR(2) : SEGCOLOR(0), SEGCOLOR(0), true); } static const char *_data_FX_MODE_CHASE_COLOR PROGMEM = "Chase@!,Width;!,!,!;!"; @@ -826,7 +894,7 @@ static const char *_data_FX_MODE_CHASE_COLOR PROGMEM = "Chase@!,Width;!,!,!;!"; /* * Primary running followed by random color. */ -uint16_t WS2812FX::mode_chase_random(void) { +uint16_t mode_chase_random(void) { return chase(SEGCOLOR(1), (SEGCOLOR(2)) ? SEGCOLOR(2) : SEGCOLOR(0), SEGCOLOR(0), false); } static const char *_data_FX_MODE_CHASE_RANDOM PROGMEM = "Chase Random@!,Width;!,,!;!"; @@ -835,46 +903,46 @@ static const char *_data_FX_MODE_CHASE_RANDOM PROGMEM = "Chase Random@!,Width;!, /* * Primary, secondary running on rainbow. */ -uint16_t WS2812FX::mode_chase_rainbow(void) { +uint16_t mode_chase_rainbow(void) { uint8_t color_sep = 256 / SEGLEN; if (color_sep == 0) color_sep = 1; // correction for segments longer than 256 LEDs uint8_t color_index = SEGENV.call & 0xFF; - uint32_t color = color_wheel(((SEGENV.step * color_sep) + color_index) & 0xFF); + uint32_t color = SEGMENT.color_wheel(((SEGENV.step * color_sep) + color_index) & 0xFF); return chase(color, SEGCOLOR(0), SEGCOLOR(1), false); } -static const char *_data_FX_MODE_CHASE_RAINBOW PROGMEM = "Chase Rainbow@!,Width;!,!,;0"; +static const char *_data_FX_MODE_CHASE_RAINBOW PROGMEM = "Chase Rainbow@!,Width;!,!,;"; /* * Primary running on rainbow. */ -uint16_t WS2812FX::mode_chase_rainbow_white(void) { +uint16_t mode_chase_rainbow_white(void) { uint16_t n = SEGENV.step; uint16_t m = (SEGENV.step + 1) % SEGLEN; - uint32_t color2 = color_wheel(((n * 256 / SEGLEN) + (SEGENV.call & 0xFF)) & 0xFF); - uint32_t color3 = color_wheel(((m * 256 / SEGLEN) + (SEGENV.call & 0xFF)) & 0xFF); + uint32_t color2 = SEGMENT.color_wheel(((n * 256 / SEGLEN) + (SEGENV.call & 0xFF)) & 0xFF); + uint32_t color3 = SEGMENT.color_wheel(((m * 256 / SEGLEN) + (SEGENV.call & 0xFF)) & 0xFF); return chase(SEGCOLOR(0), color2, color3, false); } -static const char *_data_FX_MODE_CHASE_RAINBOW_WHITE PROGMEM = "Rainbow Runner@!,Size;Bg,,;!"; +static const char *_data_FX_MODE_CHASE_RAINBOW_WHITE PROGMEM = "Rainbow Runner@!,Size;Bg,,;"; /* * Red - Amber - Green - Blue lights running */ -uint16_t WS2812FX::mode_colorful(void) { +uint16_t mode_colorful(void) { uint8_t numColors = 4; //3, 4, or 5 uint32_t cols[9]{0x00FF0000,0x00EEBB00,0x0000EE00,0x000077CC}; if (SEGMENT.intensity > 160 || SEGMENT.palette) { //palette or color if (!SEGMENT.palette) { numColors = 3; - for (uint8_t i = 0; i < 3; i++) cols[i] = SEGCOLOR(i); + for (size_t i = 0; i < 3; i++) cols[i] = SEGCOLOR(i); } else { uint16_t fac = 80; if (SEGMENT.palette == 52) {numColors = 5; fac = 61;} //C9 2 has 5 colors - for (uint8_t i = 0; i < numColors; i++) { - cols[i] = color_from_palette(i*fac, false, true, 255); + for (size_t i = 0; i < numColors; i++) { + cols[i] = SEGMENT.color_from_palette(i*fac, false, true, 255); } } } else if (SEGMENT.intensity < 80) //pastel (easter) colors @@ -884,10 +952,10 @@ uint16_t WS2812FX::mode_colorful(void) { cols[2] = 0x0077FF77; cols[3] = 0x0077F0F0; } - for (uint8_t i = numColors; i < numColors*2 -1; i++) cols[i] = cols[i-numColors]; + for (size_t i = numColors; i < numColors*2 -1U; i++) cols[i] = cols[i-numColors]; uint32_t cycleTime = 50 + (8 * (uint32_t)(255 - SEGMENT.speed)); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (it != SEGENV.step) { if (SEGMENT.speed > 0) SEGENV.aux0++; @@ -897,7 +965,7 @@ uint16_t WS2812FX::mode_colorful(void) { for (uint16_t i = 0; i < SEGLEN; i+= numColors) { - for (uint16_t j = 0; j < numColors; j++) setPixelColor(i + j, cols[SEGENV.aux0 + j]); + for (uint16_t j = 0; j < numColors; j++) SEGMENT.setPixelColor(i + j, cols[SEGENV.aux0 + j]); } return FRAMETIME; @@ -908,27 +976,27 @@ static const char *_data_FX_MODE_COLORFUL PROGMEM = "Colorful@!,Saturation;1,2,3 /* * Emulates a traffic light. */ -uint16_t WS2812FX::mode_traffic_light(void) { +uint16_t mode_traffic_light(void) { for(uint16_t i=0; i < SEGLEN; i++) - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1)); uint32_t mdelay = 500; for (int i = 0; i < SEGLEN-2 ; i+=3) { switch (SEGENV.aux0) { - case 0: setPixelColor(i, 0x00FF0000); mdelay = 150 + (100 * (uint32_t)(255 - SEGMENT.speed));break; - case 1: setPixelColor(i, 0x00FF0000); mdelay = 150 + (20 * (uint32_t)(255 - SEGMENT.speed)); setPixelColor(i+1, 0x00EECC00); break; - case 2: setPixelColor(i+2, 0x0000FF00); mdelay = 150 + (100 * (uint32_t)(255 - SEGMENT.speed));break; - case 3: setPixelColor(i+1, 0x00EECC00); mdelay = 150 + (20 * (uint32_t)(255 - SEGMENT.speed));break; + case 0: SEGMENT.setPixelColor(i, 0x00FF0000); mdelay = 150 + (100 * (uint32_t)(255 - SEGMENT.speed));break; + case 1: SEGMENT.setPixelColor(i, 0x00FF0000); mdelay = 150 + (20 * (uint32_t)(255 - SEGMENT.speed)); SEGMENT.setPixelColor(i+1, 0x00EECC00); break; + case 2: SEGMENT.setPixelColor(i+2, 0x0000FF00); mdelay = 150 + (100 * (uint32_t)(255 - SEGMENT.speed));break; + case 3: SEGMENT.setPixelColor(i+1, 0x00EECC00); mdelay = 150 + (20 * (uint32_t)(255 - SEGMENT.speed));break; } } - if (now - SEGENV.step > mdelay) + if (strip.now - SEGENV.step > mdelay) { SEGENV.aux0++; if (SEGENV.aux0 == 1 && SEGMENT.intensity > 140) SEGENV.aux0 = 2; //skip Red + Amber, to get US-style sequence if (SEGENV.aux0 > 3) SEGENV.aux0 = 0; - SEGENV.step = now; + SEGENV.step = strip.now; } return FRAMETIME; @@ -940,11 +1008,11 @@ static const char *_data_FX_MODE_TRAFFIC_LIGHT PROGMEM = "Traffic Light@!,;,!,;! * Sec flashes running on prim. */ #define FLASH_COUNT 4 -uint16_t WS2812FX::mode_chase_flash(void) { +uint16_t mode_chase_flash(void) { uint8_t flash_step = SEGENV.call % ((FLASH_COUNT * 2) + 1); for(uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } uint16_t delay = 10 + ((30 * (uint16_t)(255 - SEGMENT.speed)) / SEGLEN); @@ -952,8 +1020,8 @@ uint16_t WS2812FX::mode_chase_flash(void) { if(flash_step % 2 == 0) { uint16_t n = SEGENV.step; uint16_t m = (SEGENV.step + 1) % SEGLEN; - setPixelColor( n, SEGCOLOR(1)); - setPixelColor( m, SEGCOLOR(1)); + SEGMENT.setPixelColor( n, SEGCOLOR(1)); + SEGMENT.setPixelColor( m, SEGCOLOR(1)); delay = 20; } else { delay = 30; @@ -969,11 +1037,11 @@ static const char *_data_FX_MODE_CHASE_FLASH PROGMEM = "Chase Flash@!,;Bg,Fx,!;! /* * Prim flashes running, followed by random color. */ -uint16_t WS2812FX::mode_chase_flash_random(void) { +uint16_t mode_chase_flash_random(void) { uint8_t flash_step = SEGENV.call % ((FLASH_COUNT * 2) + 1); for(uint16_t i = 0; i < SEGENV.step; i++) { - setPixelColor(i, color_wheel(SEGENV.aux0)); + SEGMENT.setPixelColor(i, SEGMENT.color_wheel(SEGENV.aux0)); } uint16_t delay = 1 + ((10 * (uint16_t)(255 - SEGMENT.speed)) / SEGLEN); @@ -981,88 +1049,41 @@ uint16_t WS2812FX::mode_chase_flash_random(void) { uint16_t n = SEGENV.step; uint16_t m = (SEGENV.step + 1) % SEGLEN; if(flash_step % 2 == 0) { - setPixelColor( n, SEGCOLOR(0)); - setPixelColor( m, SEGCOLOR(0)); + SEGMENT.setPixelColor( n, SEGCOLOR(0)); + SEGMENT.setPixelColor( m, SEGCOLOR(0)); delay = 20; } else { - setPixelColor( n, color_wheel(SEGENV.aux0)); - setPixelColor( m, SEGCOLOR(1)); + SEGMENT.setPixelColor( n, SEGMENT.color_wheel(SEGENV.aux0)); + SEGMENT.setPixelColor( m, SEGCOLOR(1)); delay = 30; } } else { SEGENV.step = (SEGENV.step + 1) % SEGLEN; if (SEGENV.step == 0) { - SEGENV.aux0 = get_random_wheel_index(SEGENV.aux0); + SEGENV.aux0 = SEGMENT.get_random_wheel_index(SEGENV.aux0); } } return delay; } -static const char *_data_FX_MODE_CHASE_FLASH_RANDOM PROGMEM = "Chase Flash Rnd@!,;,Fx,;!"; - - -/* - * Alternating pixels running function. - */ -uint16_t WS2812FX::running(uint32_t color1, uint32_t color2, bool theatre) { - uint8_t width = (theatre ? 3 : 1) + (SEGMENT.intensity >> 4); // window - uint32_t cycleTime = 50 + (255 - SEGMENT.speed); - uint32_t it = now / cycleTime; - bool usePalette = color1 == SEGCOLOR(0); - - for(uint16_t i = 0; i < SEGLEN; i++) { - uint32_t col = color2; - if (usePalette) color1 = color_from_palette(i, true, PALETTE_SOLID_WRAP, 0); - if (theatre) { - if ((i % width) == SEGENV.aux0) col = color1; - } else { - int8_t pos = (i % (width<<1)); - if ((pos < SEGENV.aux0-width) || ((pos >= SEGENV.aux0) && (pos < SEGENV.aux0+width))) col = color1; - } - setPixelColor(i,col); - } - - if (it != SEGENV.step) { - SEGENV.aux0 = (SEGENV.aux0 +1) % (theatre ? width : (width<<1)); - SEGENV.step = it; - } - return FRAMETIME; -} +static const char *_data_FX_MODE_CHASE_FLASH_RANDOM PROGMEM = "Chase Flash Rnd@!,;,Fx,;0"; /* * Alternating color/sec pixels running. */ -uint16_t WS2812FX::mode_running_color(void) { +uint16_t mode_running_color(void) { return running(SEGCOLOR(0), SEGCOLOR(1)); } static const char *_data_FX_MODE_RUNNING_COLOR PROGMEM = "Chase 2@!,Width;!,!,;!"; -/* - * Alternating red/white pixels running. - */ -uint16_t WS2812FX::mode_candy_cane(void) { - return running(RED, WHITE); -} -static const char *_data_FX_MODE_CANDY_CANE PROGMEM = "Candy Cane@!,Width;;"; - - -/* - * Alternating orange/purple pixels running. - */ -uint16_t WS2812FX::mode_halloween(void) { - return running(PURPLE, ORANGE); -} -static const char *_data_FX_MODE_HALLOWEEN PROGMEM = "Halloween@!,Width;;"; - - /* * Random colored pixels running. ("Stream") */ -uint16_t WS2812FX::mode_running_random(void) { +uint16_t mode_running_random(void) { uint32_t cycleTime = 25 + (3 * (uint32_t)(255 - SEGMENT.speed)); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (SEGENV.call == 0) SEGENV.aux0 = random16(); // random seed for PRNG on start uint8_t zoneSize = ((255-SEGMENT.intensity) >> 4) +1; @@ -1084,7 +1105,7 @@ uint16_t WS2812FX::mode_running_random(void) { } z = 0; } - setPixelColor(i, color_wheel(PRNG16 >> 8)); + SEGMENT.setPixelColor(i, SEGMENT.color_wheel(PRNG16 >> 8)); z++; } @@ -1094,20 +1115,11 @@ uint16_t WS2812FX::mode_running_random(void) { static const char *_data_FX_MODE_RUNNING_RANDOM PROGMEM = "Stream"; -/* - * K.I.T.T. - */ -uint16_t WS2812FX::mode_larson_scanner(void){ - return larson_scanner(false); -} -static const char *_data_FX_MODE_LARSON_SCANNER PROGMEM = "Scanner"; - - -uint16_t WS2812FX::larson_scanner(bool dual) { - uint16_t counter = now * ((SEGMENT.speed >> 2) +8); +uint16_t larson_scanner(bool dual) { + uint16_t counter = strip.now * ((SEGMENT.speed >> 2) +8); uint16_t index = counter * SEGLEN >> 16; - fade_out(SEGMENT.intensity); + SEGMENT.fade_out(SEGMENT.intensity); if (SEGENV.step > index && SEGENV.step - index > SEGLEN/2) { SEGENV.aux0 = !SEGENV.aux0; @@ -1115,19 +1127,19 @@ uint16_t WS2812FX::larson_scanner(bool dual) { for (uint16_t i = SEGENV.step; i < index; i++) { uint16_t j = (SEGENV.aux0)?i:SEGLEN-1-i; - setPixelColor( j, color_from_palette(j, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor( j, SEGMENT.color_from_palette(j, true, PALETTE_SOLID_WRAP, 0)); } if (dual) { uint32_t c; if (SEGCOLOR(2) != 0) { c = SEGCOLOR(2); } else { - c = color_from_palette(index, true, PALETTE_SOLID_WRAP, 0); + c = SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0); } for (uint16_t i = SEGENV.step; i < index; i++) { uint16_t j = (SEGENV.aux0)?SEGLEN-1-i:i; - setPixelColor(j, c); + SEGMENT.setPixelColor(j, c); } } @@ -1136,24 +1148,43 @@ uint16_t WS2812FX::larson_scanner(bool dual) { } +/* + * K.I.T.T. + */ +uint16_t mode_larson_scanner(void){ + return larson_scanner(false); +} +static const char *_data_FX_MODE_LARSON_SCANNER PROGMEM = "Scanner@!,Fade rate;!,!,;!;mp12=0"; + + +/* + * Creates two Larson scanners moving in opposite directions + * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/DualLarson.h + */ +uint16_t mode_dual_larson_scanner(void){ + return larson_scanner(true); +} +static const char *_data_FX_MODE_DUAL_LARSON_SCANNER PROGMEM = "Scanner Dual@!,Fade rate;!,!,;!;mp12=0"; + + /* * Firing comets from one end. "Lighthouse" */ -uint16_t WS2812FX::mode_comet(void) { - uint16_t counter = now * ((SEGMENT.speed >>2) +1); +uint16_t mode_comet(void) { + uint16_t counter = strip.now * ((SEGMENT.speed >>2) +1); uint16_t index = (counter * SEGLEN) >> 16; if (SEGENV.call == 0) SEGENV.aux0 = index; - fade_out(SEGMENT.intensity); + SEGMENT.fade_out(SEGMENT.intensity); - setPixelColor( index, color_from_palette(index, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor( index, SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0)); if (index > SEGENV.aux0) { for (uint16_t i = SEGENV.aux0; i < index ; i++) { - setPixelColor( i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor( i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } } else if (index < SEGENV.aux0 && index < 10) { for (uint16_t i = 0; i < index ; i++) { - setPixelColor( i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor( i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } } SEGENV.aux0 = index++; @@ -1166,11 +1197,11 @@ static const char *_data_FX_MODE_COMET PROGMEM = "Lighthouse@!,Fade rate;!,!,!;! /* * Fireworks function. */ -uint16_t WS2812FX::mode_fireworks() { - const uint16_t width = isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); +uint16_t mode_fireworks() { + const uint16_t width = strip.isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); const uint16_t height = SEGMENT.virtualHeight(); - fade_out(0); + SEGMENT.fade_out(0); if (SEGENV.call == 0) { SEGENV.aux0 = UINT16_MAX; @@ -1179,19 +1210,19 @@ uint16_t WS2812FX::mode_fireworks() { bool valid1 = (SEGENV.aux0 < width*height); bool valid2 = (SEGENV.aux1 < width*height); uint32_t sv1 = 0, sv2 = 0; - if (valid1) sv1 = isMatrix ? getPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width) : getPixelColor(SEGENV.aux0); // get spark color - if (valid2) sv2 = isMatrix ? getPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width) : getPixelColor(SEGENV.aux1); - if (!SEGENV.step) blur(16); - if (valid1) { if (isMatrix) setPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width, sv1); else setPixelColor(SEGENV.aux0, sv1); } // restore spark color after blur - if (valid2) { if (isMatrix) setPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width, sv2); else setPixelColor(SEGENV.aux1, sv2); } // restore old spark color after blur + if (valid1) sv1 = strip.isMatrix ? SEGMENT.getPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width) : SEGMENT.getPixelColor(SEGENV.aux0); // get spark color + if (valid2) sv2 = strip.isMatrix ? SEGMENT.getPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width) : SEGMENT.getPixelColor(SEGENV.aux1); + if (!SEGENV.step) SEGMENT.blur(16); + if (valid1) { if (strip.isMatrix) SEGMENT.setPixelColorXY(SEGENV.aux0%width, SEGENV.aux0/width, sv1); else SEGMENT.setPixelColor(SEGENV.aux0, sv1); } // restore spark color after blur + if (valid2) { if (strip.isMatrix) SEGMENT.setPixelColorXY(SEGENV.aux1%width, SEGENV.aux1/width, sv2); else SEGMENT.setPixelColor(SEGENV.aux1, sv2); } // restore old spark color after blur for (uint16_t i=0; i> 1)) == 0) { uint16_t index = random16(width*height); uint16_t j = index % width, k = index / width; - uint32_t col = color_from_palette(random8(), false, false, 0); - if (isMatrix) setPixelColorXY(j, k, col); - else setPixelColor(index, col); + uint32_t col = SEGMENT.color_from_palette(random8(), false, false, 0); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, col); + else SEGMENT.setPixelColor(index, col); SEGENV.aux1 = SEGENV.aux0; // old spark SEGENV.aux0 = index; // remember where spark occured } @@ -1202,24 +1233,24 @@ static const char *_data_FX_MODE_FIREWORKS PROGMEM = "Fireworks@,Frequency=192;! //Twinkling LEDs running. Inspired by https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/Rain.h -uint16_t WS2812FX::mode_rain() +uint16_t mode_rain() { const uint16_t width = SEGMENT.virtualWidth(); const uint16_t height = SEGMENT.virtualHeight(); SEGENV.step += FRAMETIME; if (SEGENV.step > SPEED_FORMULA_L) { SEGENV.step = 1; - if (isMatrix) { - move(6,1); // move all pixels down + if (strip.isMatrix) { + SEGMENT.move(6,1); // move all pixels down SEGENV.aux0 = (SEGENV.aux0 % width) + (SEGENV.aux0 / width + 1) * width; SEGENV.aux1 = (SEGENV.aux1 % width) + (SEGENV.aux1 / width + 1) * width; } else { //shift all leds left - uint32_t ctemp = getPixelColor(0); + uint32_t ctemp = SEGMENT.getPixelColor(0); for(uint16_t i = 0; i < SEGLEN - 1; i++) { - setPixelColor(i, getPixelColor(i+1)); + SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); } - setPixelColor(SEGLEN -1, ctemp); // wrap around + SEGMENT.setPixelColor(SEGLEN -1, ctemp); // wrap around SEGENV.aux0++; // increase spark index SEGENV.aux1++; } @@ -1236,11 +1267,11 @@ static const char *_data_FX_MODE_RAIN PROGMEM = "Rain@!,Spawning rate=128;!,!,;" /* * Fire flicker function */ -uint16_t WS2812FX::mode_fire_flicker(void) { +uint16_t mode_fire_flicker(void) { uint32_t cycleTime = 40 + (255 - SEGMENT.speed); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (SEGENV.step == it) return FRAMETIME; - + byte w = (SEGCOLOR(0) >> 24); byte r = (SEGCOLOR(0) >> 16); byte g = (SEGCOLOR(0) >> 8); @@ -1250,9 +1281,9 @@ uint16_t WS2812FX::mode_fire_flicker(void) { for(uint16_t i = 0; i < SEGLEN; i++) { byte flicker = random8(lum); if (SEGMENT.palette == 0) { - setPixelColor(i, MAX(r - flicker, 0), MAX(g - flicker, 0), MAX(b - flicker, 0), MAX(w - flicker, 0)); + SEGMENT.setPixelColor(i, MAX(r - flicker, 0), MAX(g - flicker, 0), MAX(b - flicker, 0), MAX(w - flicker, 0)); } else { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0, 255 - flicker)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0, 255 - flicker)); } } @@ -1265,8 +1296,8 @@ static const char *_data_FX_MODE_FIRE_FLICKER PROGMEM = "Fire Flicker@!,!;!,,;!" /* * Gradient run base function */ -uint16_t WS2812FX::gradient_base(bool loading) { - uint16_t counter = now * ((SEGMENT.speed >> 2) + 1); +uint16_t gradient_base(bool loading) { + uint16_t counter = strip.now * ((SEGMENT.speed >> 2) + 1); uint16_t pp = counter * SEGLEN >> 16; if (SEGENV.call == 0) pp = 0; float val; //0.0 = sec 1.0 = pri @@ -1284,7 +1315,7 @@ uint16_t WS2812FX::gradient_base(bool loading) { val = MIN(abs(pp-i),MIN(abs(p1-i),abs(p2-i))); } val = (brd > val) ? val/brd * 255 : 255; - setPixelColor(i, color_blend(SEGCOLOR(0), color_from_palette(i, true, PALETTE_SOLID_WRAP, 1), val)); + SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(0), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1), val)); } return FRAMETIME; @@ -1294,7 +1325,7 @@ uint16_t WS2812FX::gradient_base(bool loading) { /* * Gradient run */ -uint16_t WS2812FX::mode_gradient(void) { +uint16_t mode_gradient(void) { return gradient_base(false); } static const char *_data_FX_MODE_GRADIENT PROGMEM = "Gradient@!,Spread=16;!,!,;!"; @@ -1303,17 +1334,17 @@ static const char *_data_FX_MODE_GRADIENT PROGMEM = "Gradient@!,Spread=16;!,!,;! /* * Gradient run with hard transition */ -uint16_t WS2812FX::mode_loading(void) { +uint16_t mode_loading(void) { return gradient_base(true); } static const char *_data_FX_MODE_LOADING PROGMEM = "Loading@!,Fade=16;!,!,;!"; //American Police Light with all LEDs Red and Blue -uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2) +uint16_t police_base(uint32_t color1, uint32_t color2) { uint16_t delay = 1 + (FRAMETIME<<3) / SEGLEN; // longer segments should change faster - uint32_t it = now / map(SEGMENT.speed, 0, 255, delay<<4, delay); + uint32_t it = strip.now / map(SEGMENT.speed, 0, 255, delay<<4, delay); uint16_t offset = it % SEGLEN; uint16_t width = ((SEGLEN*(SEGMENT.intensity+1))>>9); //max width is half the strip @@ -1321,26 +1352,26 @@ uint16_t WS2812FX::police_base(uint32_t color1, uint32_t color2) for (uint16_t i = 0; i < width; i++) { uint16_t indexR = (offset + i) % SEGLEN; uint16_t indexB = (offset + i + (SEGLEN>>1)) % SEGLEN; - setPixelColor(indexR, color1); - setPixelColor(indexB, color2); + SEGMENT.setPixelColor(indexR, color1); + SEGMENT.setPixelColor(indexB, color2); } return FRAMETIME; } //Police Lights Red and Blue -uint16_t WS2812FX::mode_police() -{ - fill(SEGCOLOR(1)); - return police_base(RED, BLUE); -} -static const char *_data_FX_MODE_POLICE PROGMEM = "Police@!,Width;,Bg,;0"; +//uint16_t mode_police() +//{ +// SEGMENT.fill(SEGCOLOR(1)); +// return police_base(RED, BLUE); +//} +//static const char *_data_FX_MODE_POLICE PROGMEM = "Police@!,Width;,Bg,;0"; //Police Lights with custom colors -uint16_t WS2812FX::mode_two_dots() +uint16_t mode_two_dots() { - fill(SEGCOLOR(2)); + SEGMENT.fill(SEGCOLOR(2)); uint32_t color2 = (SEGCOLOR(1) == SEGCOLOR(2)) ? SEGCOLOR(0) : SEGCOLOR(1); return police_base(SEGCOLOR(0), color2); @@ -1361,12 +1392,12 @@ typedef struct Flasher { #define FLASHERS_PER_ZONE 6 #define MAX_SHIMMER 92 -uint16_t WS2812FX::mode_fairy() { +uint16_t mode_fairy() { //set every pixel to a 'random' color from palette (using seed so it doesn't change between frames) - uint16_t PRNG16 = 5100 + _segment_index; + uint16_t PRNG16 = 5100 + strip.getCurrSegmentId(); for (uint16_t i = 0; i < SEGLEN; i++) { PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number - setPixelColor(i, color_from_palette(PRNG16 >> 8, false, false, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0)); } //amount of flasher pixels depending on intensity (0: none, 255: every LED) @@ -1377,7 +1408,7 @@ uint16_t WS2812FX::mode_fairy() { uint16_t dataSize = sizeof(flasher) * numFlashers; if (!SEGENV.allocateData(dataSize)) return FRAMETIME; //allocation failed Flasher* flashers = reinterpret_cast(SEGENV.data); - uint16_t now16 = now & 0xFFFF; + uint16_t now16 = strip.now & 0xFFFF; //Up to 11 flashers in one brightness zone, afterwards a new zone for every 6 flashers uint16_t zones = numFlashers/FLASHERS_PER_ZONE; @@ -1411,7 +1442,7 @@ uint16_t WS2812FX::mode_fairy() { } } if (stateTime > 255) stateTime = 255; //for flasher brightness calculation, fades in first 255 ms of state - //flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? 255-gamma8((510 - stateTime) >> 1) : gamma8((510 - stateTime) >> 1); + //flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? 255-SEGMENT.gamma8((510 - stateTime) >> 1) : SEGMENT.gamma8((510 - stateTime) >> 1); flasherBri[f - firstFlasher] = (flashers[f].stateOn) ? stateTime : 255 - (stateTime >> 0); flasherBriSum += flasherBri[f - firstFlasher]; } @@ -1423,10 +1454,10 @@ uint16_t WS2812FX::mode_fairy() { uint8_t bri = (flasherBri[f - firstFlasher] * globalPeakBri) / 255; PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number uint16_t flasherPos = f*flasherDistance; - setPixelColor(flasherPos, color_blend(SEGCOLOR(1), color_from_palette(PRNG16 >> 8, false, false, 0), bri)); + SEGMENT.setPixelColor(flasherPos, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), bri)); for (uint16_t i = flasherPos+1; i < flasherPos+flasherDistance && i < SEGLEN; i++) { PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number - setPixelColor(i, color_from_palette(PRNG16 >> 8, false, false, 0, globalPeakBri)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0, globalPeakBri)); } } } @@ -1436,15 +1467,15 @@ static const char *_data_FX_MODE_FAIRY PROGMEM = "Fairy"; /* - * Fairytwinkle. Like Colortwinkle, but starting from all lit and not relying on getPixelColor + * Fairytwinkle. Like Colortwinkle, but starting from all lit and not relying on strip.getPixelColor * Warning: Uses 4 bytes of segment data per pixel */ -uint16_t WS2812FX::mode_fairytwinkle() { +uint16_t mode_fairytwinkle() { uint16_t dataSize = sizeof(flasher) * SEGLEN; if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Flasher* flashers = reinterpret_cast(SEGENV.data); - uint16_t now16 = now & 0xFFFF; - uint16_t PRNG16 = 5100 + _segment_index; + uint16_t now16 = strip.now & 0xFFFF; + uint16_t PRNG16 = 5100 + strip.getCurrSegmentId(); uint16_t riseFallTime = 400 + (255-SEGMENT.speed)*3; uint16_t maxDur = riseFallTime/100 + ((255 - SEGMENT.intensity) >> 2) + 13 + ((255 - SEGMENT.intensity) >> 1); @@ -1471,26 +1502,26 @@ uint16_t WS2812FX::mode_fairytwinkle() { if (flashers[f].stateOn && flashers[f].stateDur > maxDur) flashers[f].stateDur = maxDur; //react more quickly on intensity change if (stateTime > riseFallTime) stateTime = riseFallTime; //for flasher brightness calculation, fades in first 255 ms of state uint8_t fadeprog = 255 - ((stateTime * 255) / riseFallTime); - uint8_t flasherBri = (flashers[f].stateOn) ? 255-gamma8(fadeprog) : gamma8(fadeprog); + uint8_t flasherBri = (flashers[f].stateOn) ? 255-strip.gamma8(fadeprog) : strip.gamma8(fadeprog); uint16_t lastR = PRNG16; uint16_t diff = 0; while (diff < 0x4000) { //make sure colors of two adjacent LEDs differ enough PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; //next 'random' number diff = (PRNG16 > lastR) ? PRNG16 - lastR : lastR - PRNG16; } - setPixelColor(f, color_blend(SEGCOLOR(1), color_from_palette(PRNG16 >> 8, false, false, 0), flasherBri)); + SEGMENT.setPixelColor(f, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(PRNG16 >> 8, false, false, 0), flasherBri)); } return FRAMETIME; } -static const char *_data_FX_MODE_FAIRYTWINKLE PROGMEM = "Fairy Twinkle"; +static const char *_data_FX_MODE_FAIRYTWINKLE PROGMEM = "Fairy Twinkle@;;;mp12=0"; //pixels /* * Tricolor chase function */ -uint16_t WS2812FX::tricolor_chase(uint32_t color1, uint32_t color2) { +uint16_t tricolor_chase(uint32_t color1, uint32_t color2) { uint32_t cycleTime = 50 + ((255 - SEGMENT.speed)<<1); - uint32_t it = now / cycleTime; // iterator + uint32_t it = strip.now / cycleTime; // iterator uint8_t width = (1 + (SEGMENT.intensity>>4)); // value of 1-16 for each colour uint8_t index = it % (width*3); @@ -1498,10 +1529,10 @@ uint16_t WS2812FX::tricolor_chase(uint32_t color1, uint32_t color2) { if (index > (width*3)-1) index = 0; uint32_t color = color1; - if (index > (width<<1)-1) color = color_from_palette(i, true, PALETTE_SOLID_WRAP, 1); + if (index > (width<<1)-1) color = SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 1); else if (index > width-1) color = color2; - setPixelColor(SEGLEN - i -1, color); + SEGMENT.setPixelColor(SEGLEN - i -1, color); } return FRAMETIME; } @@ -1510,7 +1541,7 @@ uint16_t WS2812FX::tricolor_chase(uint32_t color1, uint32_t color2) { /* * Tricolor chase mode */ -uint16_t WS2812FX::mode_tricolor_chase(void) { +uint16_t mode_tricolor_chase(void) { return tricolor_chase(SEGCOLOR(2), SEGCOLOR(0)); } static const char *_data_FX_MODE_TRICOLOR_CHASE PROGMEM = "Chase 3@!,Size;1,2,3;0"; @@ -1519,22 +1550,22 @@ static const char *_data_FX_MODE_TRICOLOR_CHASE PROGMEM = "Chase 3@!,Size;1,2,3; /* * ICU mode */ -uint16_t WS2812FX::mode_icu(void) { +uint16_t mode_icu(void) { uint16_t dest = SEGENV.step & 0xFFFF; uint8_t space = (SEGMENT.intensity >> 3) +2; - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); byte pindex = map(dest, 0, SEGLEN-SEGLEN/space, 0, 255); - uint32_t col = color_from_palette(pindex, false, false, 0); + uint32_t col = SEGMENT.color_from_palette(pindex, false, false, 0); - setPixelColor(dest, col); - setPixelColor(dest + SEGLEN/space, col); + SEGMENT.setPixelColor(dest, col); + SEGMENT.setPixelColor(dest + SEGLEN/space, col); if(SEGENV.aux0 == dest) { // pause between eye movements if(random8(6) == 0) { // blink once in a while - setPixelColor(dest, SEGCOLOR(1)); - setPixelColor(dest + SEGLEN/space, SEGCOLOR(1)); + SEGMENT.setPixelColor(dest, SEGCOLOR(1)); + SEGMENT.setPixelColor(dest + SEGLEN/space, SEGCOLOR(1)); return 200; } SEGENV.aux0 = random16(SEGLEN-SEGLEN/space); @@ -1549,8 +1580,8 @@ uint16_t WS2812FX::mode_icu(void) { dest--; } - setPixelColor(dest, col); - setPixelColor(dest + SEGLEN/space, col); + SEGMENT.setPixelColor(dest, col); + SEGMENT.setPixelColor(dest + SEGLEN/space, col); return SPEED_FORMULA_L; } @@ -1560,36 +1591,36 @@ static const char *_data_FX_MODE_ICU PROGMEM = "ICU"; /* * Custom mode by Aircoookie. Color Wipe, but with 3 colors */ -uint16_t WS2812FX::mode_tricolor_wipe(void) +uint16_t mode_tricolor_wipe(void) { uint32_t cycleTime = 1000 + (255 - SEGMENT.speed)*200; - uint32_t perc = now % cycleTime; + uint32_t perc = strip.now % cycleTime; uint16_t prog = (perc * 65535) / cycleTime; uint16_t ledIndex = (prog * SEGLEN * 3) >> 16; uint16_t ledOffset = ledIndex; for (uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 2)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 2)); } if(ledIndex < SEGLEN) { //wipe from 0 to 1 for (uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, (i > ledOffset)? SEGCOLOR(0) : SEGCOLOR(1)); + SEGMENT.setPixelColor(i, (i > ledOffset)? SEGCOLOR(0) : SEGCOLOR(1)); } } else if (ledIndex < SEGLEN*2) { //wipe from 1 to 2 ledOffset = ledIndex - SEGLEN; for (uint16_t i = ledOffset +1; i < SEGLEN; i++) { - setPixelColor(i, SEGCOLOR(1)); + SEGMENT.setPixelColor(i, SEGCOLOR(1)); } } else //wipe from 2 to 0 { ledOffset = ledIndex - SEGLEN*2; for (uint16_t i = 0; i <= ledOffset; i++) { - setPixelColor(i, SEGCOLOR(0)); + SEGMENT.setPixelColor(i, SEGCOLOR(0)); } } @@ -1603,9 +1634,9 @@ static const char *_data_FX_MODE_TRICOLOR_WIPE PROGMEM = "Tri Wipe@!,;1,2,3;0"; * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/TriFade.h * Modified by Aircoookie */ -uint16_t WS2812FX::mode_tricolor_fade(void) +uint16_t mode_tricolor_fade(void) { - uint16_t counter = now * ((SEGMENT.speed >> 3) +1); + uint16_t counter = strip.now * ((SEGMENT.speed >> 3) +1); uint32_t prog = (counter * 768) >> 16; uint32_t color1 = 0, color2 = 0; @@ -1629,13 +1660,13 @@ uint16_t WS2812FX::mode_tricolor_fade(void) for(uint16_t i = 0; i < SEGLEN; i++) { uint32_t color; if (stage == 2) { - color = color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), color2, stp); + color = color_blend(SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), color2, stp); } else if (stage == 1) { - color = color_blend(color1, color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), stp); + color = color_blend(color1, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 2), stp); } else { color = color_blend(color1, color2, stp); } - setPixelColor(i, color); + SEGMENT.setPixelColor(i, color); } return FRAMETIME; @@ -1647,14 +1678,14 @@ static const char *_data_FX_MODE_TRICOLOR_FADE PROGMEM = "Tri Fade"; * Creates random comets * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/MultiComet.h */ -uint16_t WS2812FX::mode_multi_comet(void) +uint16_t mode_multi_comet(void) { uint32_t cycleTime = 10 + (uint32_t)(255 - SEGMENT.speed); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; if (SEGENV.step == it) return FRAMETIME; if (!SEGENV.allocateData(sizeof(uint16_t) * 8)) return mode_static(); //allocation failed - fade_out(SEGMENT.intensity); + SEGMENT.fade_out(SEGMENT.intensity); uint16_t* comets = reinterpret_cast(SEGENV.data); @@ -1663,10 +1694,10 @@ uint16_t WS2812FX::mode_multi_comet(void) uint16_t index = comets[i]; if (SEGCOLOR(2) != 0) { - setPixelColor(index, i % 2 ? color_from_palette(index, true, PALETTE_SOLID_WRAP, 0) : SEGCOLOR(2)); + SEGMENT.setPixelColor(index, i % 2 ? SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0) : SEGCOLOR(2)); } else { - setPixelColor(index, color_from_palette(index, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0)); } comets[i]++; } else { @@ -1682,21 +1713,11 @@ uint16_t WS2812FX::mode_multi_comet(void) static const char *_data_FX_MODE_MULTI_COMET PROGMEM = "Multi Comet"; -/* - * Creates two Larson scanners moving in opposite directions - * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/DualLarson.h - */ -uint16_t WS2812FX::mode_dual_larson_scanner(void){ - return larson_scanner(true); -} -static const char *_data_FX_MODE_DUAL_LARSON_SCANNER PROGMEM = "Scanner Dual"; - - /* * Running random pixels ("Stream 2") * Custom mode by Keith Lord: https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/RandomChase.h */ -uint16_t WS2812FX::mode_random_chase(void) +uint16_t mode_random_chase(void) { if (SEGENV.call == 0) { SEGENV.step = RGBW32(random8(), random8(), random8(), 0); @@ -1704,7 +1725,7 @@ uint16_t WS2812FX::mode_random_chase(void) } uint16_t prevSeed = random16_get_seed(); // save seed so we can restore it at the end of the function uint32_t cycleTime = 25 + (3 * (uint32_t)(255 - SEGMENT.speed)); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; uint32_t color = SEGENV.step; random16_set_seed(SEGENV.aux0); @@ -1713,7 +1734,7 @@ uint16_t WS2812FX::mode_random_chase(void) uint8_t g = random8(6) != 0 ? (color >> 8 & 0xFF) : random8(); uint8_t b = random8(6) != 0 ? (color & 0xFF) : random8(); color = RGBW32(r, g, b, 0); - setPixelColor(i, r, g, b); + SEGMENT.setPixelColor(i, r, g, b); if (i == SEGLEN -1 && SEGENV.aux1 != (it & 0xFFFF)) { //new first color in next frame SEGENV.step = color; SEGENV.aux0 = random16_get_seed(); @@ -1739,7 +1760,7 @@ typedef struct Oscillator { /* / Oscillating bars of color, updated with standard framerate */ -uint16_t WS2812FX::mode_oscillate(void) +uint16_t mode_oscillate(void) { uint8_t numOscillators = 3; uint16_t dataSize = sizeof(oscillator) * numOscillators; @@ -1756,7 +1777,7 @@ uint16_t WS2812FX::mode_oscillate(void) } uint32_t cycleTime = 20 + (2 * (uint32_t)(255 - SEGMENT.speed)); - uint32_t it = now / cycleTime; + uint32_t it = strip.now / cycleTime; for(uint8_t i = 0; i < numOscillators; i++) { // if the counter has increased, move the oscillator by the random step @@ -1782,7 +1803,7 @@ uint16_t WS2812FX::mode_oscillate(void) color = (color == BLACK) ? SEGCOLOR(j) : color_blend(color, SEGCOLOR(j), 128); } } - setPixelColor(i, color); + SEGMENT.setPixelColor(i, color); } SEGENV.step = it; @@ -1792,7 +1813,7 @@ static const char *_data_FX_MODE_OSCILLATE PROGMEM = "Oscillate"; //TODO -uint16_t WS2812FX::mode_lightning(void) +uint16_t mode_lightning(void) { uint16_t ledstart = random16(SEGLEN); // Determine starting location of flash uint16_t ledlen = 1 + random16(SEGLEN -ledstart); // Determine length of flash (not to go beyond NUM_LEDS-1) @@ -1807,12 +1828,12 @@ uint16_t WS2812FX::mode_lightning(void) SEGENV.aux0 = 200; //200ms delay after leader } - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); if (SEGENV.aux1 > 3 && !(SEGENV.aux1 & 0x01)) { //flash on even number >2 for (int i = ledstart; i < ledstart + ledlen; i++) { - setPixelColor(i,color_from_palette(i, true, PALETTE_SOLID_WRAP, 0, bri)); + SEGMENT.setPixelColor(i,SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0, bri)); } SEGENV.aux1--; @@ -1838,7 +1859,7 @@ static const char *_data_FX_MODE_LIGHTNING PROGMEM = "Lightning"; // Pride2015 // Animated, ever-changing rainbows. // by Mark Kriegsman: https://gist.github.com/kriegsman/964de772d64c502760e5 -uint16_t WS2812FX::mode_pride_2015(void) +uint16_t mode_pride_2015(void) { uint16_t duration = 10 + SEGMENT.speed; uint16_t sPseudotime = SEGENV.step; @@ -1869,10 +1890,10 @@ uint16_t WS2812FX::mode_pride_2015(void) bri8 += (255 - brightdepth); CRGB newcolor = CHSV( hue8, sat8, bri8); - fastled_col = col_to_crgb(getPixelColor(i)); + fastled_col = CRGB(SEGMENT.getPixelColor(i)); nblend(fastled_col, newcolor, 64); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } SEGENV.step = sPseudotime; SEGENV.aux0 = sHue16; @@ -1882,15 +1903,15 @@ static const char *_data_FX_MODE_PRIDE_2015 PROGMEM = "Pride 2015@!,;;"; //eight colored dots, weaving in and out of sync with each other -uint16_t WS2812FX::mode_juggle(void){ - fade_out(SEGMENT.intensity); +uint16_t mode_juggle(void){ + SEGMENT.fade_out(SEGMENT.intensity); CRGB fastled_col; byte dothue = 0; for ( byte i = 0; i < 8; i++) { uint16_t index = 0 + beatsin88((128 + SEGMENT.speed)*(i + 7), 0, SEGLEN -1); - fastled_col = col_to_crgb(getPixelColor(index)); - fastled_col |= (SEGMENT.palette==0)?CHSV(dothue, 220, 255):ColorFromPalette(currentPalette, dothue, 255); - setPixelColor(index, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = CRGB(SEGMENT.getPixelColor(index)); + fastled_col |= (SEGMENT.palette==0)?CHSV(dothue, 220, 255):ColorFromPalette(strip.currentPalette, dothue, 255); + SEGMENT.setPixelColor(index, fastled_col.red, fastled_col.green, fastled_col.blue); dothue += 32; } return FRAMETIME; @@ -1898,23 +1919,23 @@ uint16_t WS2812FX::mode_juggle(void){ static const char *_data_FX_MODE_JUGGLE PROGMEM = "Juggle@!=16,Trail=240;!,!,;!"; -uint16_t WS2812FX::mode_palette() +uint16_t mode_palette() { uint16_t counter = 0; if (SEGMENT.speed != 0) { - counter = (now * ((SEGMENT.speed >> 3) +1)) & 0xFFFF; + counter = (strip.now * ((SEGMENT.speed >> 3) +1)) & 0xFFFF; counter = counter >> 8; } - bool noWrap = (paletteBlend == 2 || (paletteBlend == 0 && SEGMENT.speed == 0)); + bool noWrap = (strip.paletteBlend == 2 || (strip.paletteBlend == 0 && SEGMENT.speed == 0)); for (uint16_t i = 0; i < SEGLEN; i++) { uint8_t colorIndex = (i * 255 / SEGLEN) - counter; if (noWrap) colorIndex = map(colorIndex, 0, 255, 0, 240); //cut off blend at palette "end" - setPixelColor(i, color_from_palette(colorIndex, false, true, 255)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(colorIndex, false, true, 255)); } return FRAMETIME; } @@ -1949,12 +1970,12 @@ static const char *_data_FX_MODE_PALETTE PROGMEM = "Palette@!,;1,2,3;!"; // There are two main parameters you can play with to control the look and // feel of your fire: COOLING (used in step 1 above) (Speed = COOLING), and SPARKING (used // in step 3 above) (Effect Intensity = Sparking). -uint16_t WS2812FX::mode_fire_2012() +uint16_t mode_fire_2012() { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); - uint32_t it = now >> 5; //div 32 + uint32_t it = strip.now >> 5; //div 32 uint16_t q = cols>>2; // a quarter of flames if (!SEGENV.allocateData(cols*rows)) return mode_static(); //allocation failed @@ -1994,20 +2015,20 @@ uint16_t WS2812FX::mode_fire_2012() for (uint16_t f = 0; f < cols; f++) { // Step 4. Map from heat cells to LED colors for (uint16_t j = 0; j < rows; j++) { - CRGB color = ColorFromPalette(currentPalette, /*MIN(*/heat[j+rows*f]/*,240)*/, 255, LINEARBLEND); - if (isMatrix) setPixelColorXY(f, rows -j -1, color); - else setPixelColor(j, color); + CRGB color = ColorFromPalette(strip.currentPalette, /*MIN(*/heat[j+rows*f]/*,240)*/, 255, LINEARBLEND); + if (strip.isMatrix) SEGMENT.setPixelColorXY(f, rows -j -1, color); + else SEGMENT.setPixelColor(j, color); } } return FRAMETIME; } -static const char *_data_FX_MODE_FIRE_2012 PROGMEM = "Fire 2012@Cooling=120,Spark rate=64;1,2,3;!"; +static const char *_data_FX_MODE_FIRE_2012 PROGMEM = "Fire 2012 1D/2D@Cooling=120,Spark rate=64;1,2,3;!=35"; // ColorWavesWithPalettes by Mark Kriegsman: https://gist.github.com/kriegsman/8281905786e8b2632aeb // This function draws color waves with an ever-changing, // widely-varying set of parameters, using a color palette. -uint16_t WS2812FX::mode_colorwaves() +uint16_t mode_colorwaves() { uint16_t duration = 10 + SEGMENT.speed; uint16_t sPseudotime = SEGENV.step; @@ -2043,51 +2064,51 @@ uint16_t WS2812FX::mode_colorwaves() uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536; bri8 += (255 - brightdepth); - CRGB newcolor = ColorFromPalette(currentPalette, hue8, bri8); - fastled_col = col_to_crgb(getPixelColor(i)); + CRGB newcolor = ColorFromPalette(strip.currentPalette, hue8, bri8); + fastled_col = CRGB(SEGMENT.getPixelColor(i)); nblend(fastled_col, newcolor, 128); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } SEGENV.step = sPseudotime; SEGENV.aux0 = sHue16; return FRAMETIME; } -static const char *_data_FX_MODE_COLORWAVES PROGMEM = "Colorwaves"; +static const char *_data_FX_MODE_COLORWAVES PROGMEM = "Colorwaves@!,!;!,!,!;!=26"; // colored stripes pulsing at a defined Beats-Per-Minute (BPM) -uint16_t WS2812FX::mode_bpm() +uint16_t mode_bpm() { CRGB fastled_col; - uint32_t stp = (now / 20) & 0xFF; + uint32_t stp = (strip.now / 20) & 0xFF; uint8_t beat = beatsin8(SEGMENT.speed, 64, 255); for (uint16_t i = 0; i < SEGLEN; i++) { - fastled_col = ColorFromPalette(currentPalette, stp + (i * 2), beat - stp + (i * 10)); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, stp + (i * 2), beat - stp + (i * 10)); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } static const char *_data_FX_MODE_BPM PROGMEM = "Bpm@!=64,;1,2,3;!"; -uint16_t WS2812FX::mode_fillnoise8() +uint16_t mode_fillnoise8() { if (SEGENV.call == 0) SEGENV.step = random16(12345); CRGB fastled_col; for (uint16_t i = 0; i < SEGLEN; i++) { uint8_t index = inoise8(i * SEGLEN, SEGENV.step + i * SEGLEN); - fastled_col = ColorFromPalette(currentPalette, index, 255, LINEARBLEND); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, index, 255, LINEARBLEND); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } SEGENV.step += beatsin8(SEGMENT.speed, 1, 6); //10,1,4 return FRAMETIME; } -static const char *_data_FX_MODE_FILLNOISE8 PROGMEM = "Fill Noise"; +static const char *_data_FX_MODE_FILLNOISE8 PROGMEM = "Fill Noise@!,!;!,!,!;!=9"; -uint16_t WS2812FX::mode_noise16_1() +uint16_t mode_noise16_1() { uint16_t scale = 320; // the "zoom factor" for the noise CRGB fastled_col; @@ -2107,16 +2128,16 @@ uint16_t WS2812FX::mode_noise16_1() uint8_t index = sin8(noise * 3); // map LED color based on noise data - fastled_col = ColorFromPalette(currentPalette, index, 255, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, index, 255, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } -static const char *_data_FX_MODE_NOISE16_1 PROGMEM = "Noise 1"; +static const char *_data_FX_MODE_NOISE16_1 PROGMEM = "Noise 1@!,!;!,!,!;!=20"; -uint16_t WS2812FX::mode_noise16_2() +uint16_t mode_noise16_2() { uint16_t scale = 1000; // the "zoom factor" for the noise CRGB fastled_col; @@ -2132,16 +2153,16 @@ uint16_t WS2812FX::mode_noise16_2() uint8_t index = sin8(noise * 3); // map led color based on noise data - fastled_col = ColorFromPalette(currentPalette, index, noise, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, index, noise, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } -static const char *_data_FX_MODE_NOISE16_2 PROGMEM = "Noise 2"; +static const char *_data_FX_MODE_NOISE16_2 PROGMEM = "Noise 2@!,!;!,!,!;!=43"; -uint16_t WS2812FX::mode_noise16_3() +uint16_t mode_noise16_3() { uint16_t scale = 800; // the "zoom factor" for the noise CRGB fastled_col; @@ -2160,45 +2181,46 @@ uint16_t WS2812FX::mode_noise16_3() uint8_t index = sin8(noise * 3); // map led color based on noise data - fastled_col = ColorFromPalette(currentPalette, index, noise, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, index, noise, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } -static const char *_data_FX_MODE_NOISE16_3 PROGMEM = "Noise 3"; +static const char *_data_FX_MODE_NOISE16_3 PROGMEM = "Noise 3@!,!;!,!,!;!=35"; //https://github.com/aykevl/ledstrip-spark/blob/master/ledstrip.ino -uint16_t WS2812FX::mode_noise16_4() +uint16_t mode_noise16_4() { CRGB fastled_col; - uint32_t stp = (now * SEGMENT.speed) >> 7; + uint32_t stp = (strip.now * SEGMENT.speed) >> 7; for (uint16_t i = 0; i < SEGLEN; i++) { int16_t index = inoise16(uint32_t(i) << 12, stp); - fastled_col = ColorFromPalette(currentPalette, index); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, index); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } -static const char *_data_FX_MODE_NOISE16_4 PROGMEM = "Noise 4"; +static const char *_data_FX_MODE_NOISE16_4 PROGMEM = "Noise 4@!,!;!,!,!;!=26"; //based on https://gist.github.com/kriegsman/5408ecd397744ba0393e -uint16_t WS2812FX::mode_colortwinkle() +uint16_t mode_colortwinkle() { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); uint16_t dataSize = (cols*rows+7) >> 3; //1 bit per LED if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB fastled_col, prev; - fract8 fadeUpAmount = _brightness>28 ? 8 + (SEGMENT.speed>>2) : 68-_brightness, fadeDownAmount = _brightness>28 ? 8 + (SEGMENT.speed>>3) : 68-_brightness; + fract8 fadeUpAmount = strip.getBrightness()>28 ? 8 + (SEGMENT.speed>>2) : 68-strip.getBrightness(); + fract8 fadeDownAmount = strip.getBrightness()>28 ? 8 + (SEGMENT.speed>>3) : 68-strip.getBrightness(); for (uint16_t i = 0; i < rows*cols; i++) { uint16_t j = i % cols, k = i / cols; - fastled_col = col_to_crgb(isMatrix ? getPixelColorXY(j, k) : getPixelColor(i)); + fastled_col = CRGB(strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i)); prev = fastled_col; uint16_t index = i >> 3; uint8_t bitNum = i & 0x07; @@ -2213,35 +2235,35 @@ uint16_t WS2812FX::mode_colortwinkle() bitWrite(SEGENV.data[index], bitNum, false); } - if (isMatrix) setPixelColorXY(j, k, fastled_col); - else setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col); + else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); - uint32_t col = isMatrix ? getPixelColorXY(j, k) : getPixelColor(i); - if (col_to_crgb(col) == prev) { //fix "stuck" pixels + uint32_t col = strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i); + if (CRGB(col) == prev) { //fix "stuck" pixels fastled_col += fastled_col; - if (isMatrix) setPixelColorXY(j, k, fastled_col); - else setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col); + else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } } else { fastled_col.nscale8(255 - fadeDownAmount); - if (isMatrix) setPixelColorXY(j, k, fastled_col); - else setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col); + else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } } for (uint16_t j = 0; j <= rows*cols / 50; j++) { if (random8() <= SEGMENT.intensity) { - for (uint8_t times = 0; times < 5; times++) { //attempt to spawn a new pixel 5 times + for (size_t times = 0; times < 5; times++) { //attempt to spawn a new pixel 5 times uint16_t i = random16(rows*cols); uint16_t j = i % cols, k = i / cols; - uint32_t col = isMatrix ? getPixelColorXY(j, k) : getPixelColor(i); + uint32_t col = strip.isMatrix ? SEGMENT.getPixelColorXY(j, k) : SEGMENT.getPixelColor(i); if (col == 0) { - fastled_col = ColorFromPalette(currentPalette, random8(), 64, NOBLEND); + fastled_col = ColorFromPalette(strip.currentPalette, random8(), 64, NOBLEND); uint16_t index = i >> 3; uint8_t bitNum = i & 0x07; bitWrite(SEGENV.data[index], bitNum, true); - if (isMatrix) setPixelColorXY(j, k, fastled_col); - else setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, fastled_col); + else SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); break; //only spawn 1 new pixel per frame per 50 LEDs } } @@ -2249,11 +2271,11 @@ uint16_t WS2812FX::mode_colortwinkle() } return FRAMETIME_FIXED; } -static const char *_data_FX_MODE_COLORTWINKLE PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!"; +static const char *_data_FX_MODE_COLORTWINKLE PROGMEM = "Colortwinkles@Fade speed,Spawn speed;1,2,3;!;mp12=0"; //pixels //Calm effect, like a lake at night -uint16_t WS2812FX::mode_lake() { +uint16_t mode_lake() { uint8_t sp = SEGMENT.speed/10; int wave1 = beatsin8(sp +2, -64,64); int wave2 = beatsin8(sp +1, -64,64); @@ -2264,8 +2286,8 @@ uint16_t WS2812FX::mode_lake() { { int index = cos8((i*15)+ wave1)/2 + cubicwave8((i*23)+ wave2)/2; uint8_t lum = (index > wave3) ? index - wave3 : 0; - fastled_col = ColorFromPalette(currentPalette, map(index,0,255,0,240), lum, LINEARBLEND); - setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); + fastled_col = ColorFromPalette(strip.currentPalette, map(index,0,255,0,240), lum, LINEARBLEND); + SEGMENT.setPixelColor(i, fastled_col.red, fastled_col.green, fastled_col.blue); } return FRAMETIME; } @@ -2275,13 +2297,13 @@ static const char *_data_FX_MODE_LAKE PROGMEM = "Lake@!,;1,2,3;!"; // meteor effect // send a meteor from begining to to the end of the strip with a trail that randomly decays. // adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain -uint16_t WS2812FX::mode_meteor() { +uint16_t mode_meteor() { if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed byte* trail = SEGENV.data; byte meteorSize= 1+ SEGLEN / 10; - uint16_t counter = now * ((SEGMENT.speed >> 2) +8); + uint16_t counter = strip.now * ((SEGMENT.speed >> 2) +8); uint16_t in = counter * SEGLEN >> 16; // fade all leds to colors[1] in LEDs one step @@ -2290,7 +2312,7 @@ uint16_t WS2812FX::mode_meteor() { { byte meteorTrailDecay = 128 + random8(127); trail[i] = scale8(trail[i], meteorTrailDecay); - setPixelColor(i, color_from_palette(trail[i], false, true, 255)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(trail[i], false, true, 255)); } } @@ -2302,7 +2324,7 @@ uint16_t WS2812FX::mode_meteor() { } trail[index] = 240; - setPixelColor(index, color_from_palette(trail[index], false, true, 255)); + SEGMENT.setPixelColor(index, SEGMENT.color_from_palette(trail[index], false, true, 255)); } return FRAMETIME; @@ -2313,7 +2335,7 @@ static const char *_data_FX_MODE_METEOR PROGMEM = "Meteor@!,Trail length;!,!,;!" // smooth meteor effect // send a meteor from begining to to the end of the strip with a trail that randomly decays. // adapted from https://www.tweaking4all.com/hardware/arduino/adruino-led-strip-effects/#LEDStripEffectMeteorRain -uint16_t WS2812FX::mode_meteor_smooth() { +uint16_t mode_meteor_smooth() { if (!SEGENV.allocateData(SEGLEN)) return mode_static(); //allocation failed byte* trail = SEGENV.data; @@ -2329,7 +2351,7 @@ uint16_t WS2812FX::mode_meteor_smooth() { trail[i] += change; if (trail[i] > 245) trail[i] = 0; if (trail[i] > 240) trail[i] = 240; - setPixelColor(i, color_from_palette(trail[i], false, true, 255)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(trail[i], false, true, 255)); } } @@ -2339,7 +2361,7 @@ uint16_t WS2812FX::mode_meteor_smooth() { if(in + j >= SEGLEN) { index = (in + j - SEGLEN); } - setPixelColor(index, color_blend(getPixelColor(index), color_from_palette(240, false, true, 255), 48)); + SEGMENT.setPixelColor(index, color_blend(SEGMENT.getPixelColor(index), SEGMENT.color_from_palette(240, false, true, 255), 48)); trail[index] = 240; } @@ -2350,7 +2372,7 @@ static const char *_data_FX_MODE_METEOR_SMOOTH PROGMEM = "Meteor Smooth@!,Trail //Railway Crossing / Christmas Fairy lights -uint16_t WS2812FX::mode_railway() +uint16_t mode_railway() { uint16_t dur = 40 + (255 - SEGMENT.speed) * 10; uint16_t rampdur = (dur * SEGMENT.intensity) >> 8; @@ -2369,10 +2391,10 @@ uint16_t WS2812FX::mode_railway() if (SEGENV.aux0) pos = 255 - pos; for (uint16_t i = 0; i < SEGLEN; i += 2) { - setPixelColor(i, color_from_palette(255 - pos, false, false, 255)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(255 - pos, false, false, 255)); if (i < SEGLEN -1) { - setPixelColor(i + 1, color_from_palette(pos, false, false, 255)); + SEGMENT.setPixelColor(i + 1, SEGMENT.color_from_palette(pos, false, false, 255)); } } SEGENV.step += FRAMETIME; @@ -2397,7 +2419,7 @@ typedef struct Ripple { #else #define MAX_RIPPLES 100 #endif -uint16_t WS2812FX::ripple_base(bool rainbow) +uint16_t ripple_base(bool rainbow) { uint16_t maxRipples = min(1 + (SEGLEN >> 2), MAX_RIPPLES); // 56 max for 16 segment ESP8266 uint16_t dataSize = sizeof(ripple) * maxRipples; @@ -2420,9 +2442,9 @@ uint16_t WS2812FX::ripple_base(bool rainbow) } else { SEGENV.aux0--; } - fill(color_blend(color_wheel(SEGENV.aux0),BLACK,235)); + SEGMENT.fill(color_blend(SEGMENT.color_wheel(SEGENV.aux0),BLACK,235)); } else { - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); } //draw wave @@ -2433,7 +2455,7 @@ uint16_t WS2812FX::ripple_base(bool rainbow) { uint8_t rippledecay = (SEGMENT.speed >> 4) +1; //faster decay if faster propagation uint16_t rippleorigin = ripples[i].pos; - uint32_t col = color_from_palette(ripples[i].color, false, false, 255); + uint32_t col = SEGMENT.color_from_palette(ripples[i].color, false, false, 255); uint16_t propagation = ((ripplestate/rippledecay -1) * SEGMENT.speed); int16_t propI = propagation >> 8; uint8_t propF = propagation & 0xFF; @@ -2445,12 +2467,12 @@ uint16_t WS2812FX::ripple_base(bool rainbow) uint8_t mag = scale8(cubicwave8((propF>>2)+(v-left)*64), amp); if (v < SEGLEN && v >= 0) { - setPixelColor(v, color_blend(getPixelColor(v), col, mag)); + SEGMENT.setPixelColor(v, color_blend(SEGMENT.getPixelColor(v), col, mag)); } int16_t w = left + propI*2 + 3 -(v-left); if (w < SEGLEN && w >= 0) { - setPixelColor(w, color_blend(getPixelColor(w), col, mag)); + SEGMENT.setPixelColor(w, color_blend(SEGMENT.getPixelColor(w), col, mag)); } } ripplestate += rippledecay; @@ -2470,13 +2492,13 @@ uint16_t WS2812FX::ripple_base(bool rainbow) #undef MAX_RIPPLES -uint16_t WS2812FX::mode_ripple(void) { +uint16_t mode_ripple(void) { return ripple_base(false); } static const char *_data_FX_MODE_RIPPLE PROGMEM = "Ripple"; -uint16_t WS2812FX::mode_ripple_rainbow(void) { +uint16_t mode_ripple_rainbow(void) { return ripple_base(true); } static const char *_data_FX_MODE_RIPPLE_RAINBOW PROGMEM = "Ripple Rainbow"; @@ -2492,7 +2514,7 @@ static const char *_data_FX_MODE_RIPPLE_RAINBOW PROGMEM = "Ripple Rainbow"; // incandescent bulbs change color as they get dim down. #define COOL_LIKE_INCANDESCENT 1 -CRGB WS2812FX::twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat) +CRGB twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat) { // Overall twinkle speed (changed) uint16_t ticks = ms / SEGENV.aux0; @@ -2529,7 +2551,7 @@ CRGB WS2812FX::twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat) uint8_t hue = slowcycle8 - salt; CRGB c; if (bright > 0) { - c = ColorFromPalette(currentPalette, hue, bright, NOBLEND); + c = ColorFromPalette(strip.currentPalette, hue, bright, NOBLEND); if(COOL_LIKE_INCANDESCENT == 1) { // This code takes a pixel, and if its in the 'fading down' // part of the cycle, it adjusts the color a little bit like the @@ -2552,7 +2574,7 @@ CRGB WS2812FX::twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat) // "CalculateOneTwinkle" on each pixel. It then displays // either the twinkle color of the background color, // whichever is brighter. -uint16_t WS2812FX::twinklefox_base(bool cat) +uint16_t twinklefox_base(bool cat) { // "PRNG16" is the pseudorandom number generator // It MUST be reset to the same starting value each time @@ -2565,8 +2587,7 @@ uint16_t WS2812FX::twinklefox_base(bool cat) else SEGENV.aux0 = 22 + ((100 - SEGMENT.speed) >> 1); // Set up the background color, "bg". - CRGB bg; - bg = col_to_crgb(SEGCOLOR(1)); + CRGB bg = CRGB(SEGCOLOR(1)); uint8_t bglight = bg.getAverageLight(); if (bglight > 64) { bg.nscale8_video(16); // very bright, so scale to 1/16th @@ -2585,7 +2606,7 @@ uint16_t WS2812FX::twinklefox_base(bool cat) PRNG16 = (uint16_t)(PRNG16 * 2053) + 1384; // next 'random' number // use that number as clock speed adjustment factor (in 8ths, from 8/8ths to 23/8ths) uint8_t myspeedmultiplierQ5_3 = ((((PRNG16 & 0xFF)>>4) + (PRNG16 & 0x0F)) & 0x0F) + 0x08; - uint32_t myclock30 = (uint32_t)((now * myspeedmultiplierQ5_3) >> 3) + myclockoffset16; + uint32_t myclock30 = (uint32_t)((strip.now * myspeedmultiplierQ5_3) >> 3) + myclockoffset16; uint8_t myunique8 = PRNG16 >> 8; // get 'salt' value for this pixel // We now have the adjusted 'clock' for this pixel, now we call @@ -2598,29 +2619,29 @@ uint16_t WS2812FX::twinklefox_base(bool cat) if (deltabright >= 32 || (!bg)) { // If the new pixel is significantly brighter than the background color, // use the new color. - setPixelColor(i, c.red, c.green, c.blue); + SEGMENT.setPixelColor(i, c.red, c.green, c.blue); } else if (deltabright > 0) { // If the new pixel is just slightly brighter than the background color, // mix a blend of the new color and the background color - setPixelColor(i, color_blend(crgb_to_col(bg), crgb_to_col(c), deltabright * 8)); + SEGMENT.setPixelColor(i, color_blend(RGBW32(bg.r,bg.g,bg.b,0), RGBW32(c.r,c.g,c.b,0), deltabright * 8)); } else { // if the new pixel is not at all brighter than the background color, // just use the background color. - setPixelColor(i, bg.r, bg.g, bg.b); + SEGMENT.setPixelColor(i, bg.r, bg.g, bg.b); } } return FRAMETIME; } -uint16_t WS2812FX::mode_twinklefox() +uint16_t mode_twinklefox() { return twinklefox_base(false); } static const char *_data_FX_MODE_TWINKLEFOX PROGMEM = "Twinklefox"; -uint16_t WS2812FX::mode_twinklecat() +uint16_t mode_twinklecat() { return twinklefox_base(true); } @@ -2631,12 +2652,12 @@ static const char *_data_FX_MODE_TWINKLECAT PROGMEM = "Twinklecat"; #define HALLOWEEN_EYE_SPACE (2*MAX(1,SEGLEN>>5)) #define HALLOWEEN_EYE_WIDTH MAX(1,SEGLEN>>5) -uint16_t WS2812FX::mode_halloween_eyes() +uint16_t mode_halloween_eyes() { uint16_t eyeLength = (2*HALLOWEEN_EYE_WIDTH) + HALLOWEEN_EYE_SPACE; if (eyeLength > SEGLEN) return mode_static(); //bail if segment too short - fill(SEGCOLOR(1)); //fill background + SEGMENT.fill(SEGCOLOR(1)); //fill background uint8_t state = SEGENV.aux1 >> 8; uint16_t stateTime = SEGENV.call; @@ -2645,7 +2666,7 @@ uint16_t WS2812FX::mode_halloween_eyes() if (state == 0) { //spawn eyes SEGENV.aux0 = random16(0, SEGLEN - eyeLength); //start pos SEGENV.aux1 = random8(); //color - if (isMatrix) SEGMENT.offset = random16(SEGMENT.virtualHeight()-1); // a hack: reuse offset since it is not used in matrices + if (strip.isMatrix) SEGMENT.offset = random16(SEGMENT.virtualHeight()-1); // a hack: reuse offset since it is not used in matrices state = 1; } @@ -2653,22 +2674,22 @@ uint16_t WS2812FX::mode_halloween_eyes() uint16_t startPos = SEGENV.aux0; uint16_t start2ndEye = startPos + HALLOWEEN_EYE_WIDTH + HALLOWEEN_EYE_SPACE; - uint32_t fadestage = (now - SEGENV.step)*255 / stateTime; + uint32_t fadestage = (strip.now - SEGENV.step)*255 / stateTime; if (fadestage > 255) fadestage = 255; - uint32_t c = color_blend(color_from_palette(SEGENV.aux1 & 0xFF, false, false, 0), SEGCOLOR(1), fadestage); + uint32_t c = color_blend(SEGMENT.color_from_palette(SEGENV.aux1 & 0xFF, false, false, 0), SEGCOLOR(1), fadestage); for (uint16_t i = 0; i < HALLOWEEN_EYE_WIDTH; i++) { - if (isMatrix) { - setPixelColorXY(startPos + i, SEGMENT.offset, c); - setPixelColorXY(start2ndEye + i, SEGMENT.offset, c); + if (strip.isMatrix) { + SEGMENT.setPixelColorXY(startPos + i, SEGMENT.offset, c); + SEGMENT.setPixelColorXY(start2ndEye + i, SEGMENT.offset, c); } else { - setPixelColor(startPos + i, c); - setPixelColor(start2ndEye + i, c); + SEGMENT.setPixelColor(startPos + i, c); + SEGMENT.setPixelColor(start2ndEye + i, c); } } } - if (now - SEGENV.step > stateTime) { + if (strip.now - SEGENV.step > stateTime) { state++; if (state > 2) state = 0; @@ -2678,7 +2699,7 @@ uint16_t WS2812FX::mode_halloween_eyes() uint16_t eyeOffTimeBase = (255 - SEGMENT.speed)*10; stateTime = eyeOffTimeBase + random16(eyeOffTimeBase); } - SEGENV.step = now; + SEGENV.step = strip.now; SEGENV.call = stateTime; } @@ -2690,7 +2711,7 @@ static const char *_data_FX_MODE_HALLOWEEN_EYES PROGMEM = "Halloween Eyes@Durati //Speed slider sets amount of LEDs lit, intensity sets unlit -uint16_t WS2812FX::mode_static_pattern() +uint16_t mode_static_pattern() { uint16_t lit = 1 + SEGMENT.speed; uint16_t unlit = 1 + SEGMENT.intensity; @@ -2698,7 +2719,7 @@ uint16_t WS2812FX::mode_static_pattern() uint16_t cnt = 0; for (uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, (drawingLit) ? color_from_palette(i, true, PALETTE_SOLID_WRAP, 0) : SEGCOLOR(1)); + SEGMENT.setPixelColor(i, (drawingLit) ? SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0) : SEGCOLOR(1)); cnt++; if (cnt >= ((drawingLit) ? lit : unlit)) { cnt = 0; @@ -2711,7 +2732,7 @@ uint16_t WS2812FX::mode_static_pattern() static const char *_data_FX_MODE_STATIC_PATTERN PROGMEM = "Solid Pattern@Fg size,Bg size;Fg,Bg,;!=0"; -uint16_t WS2812FX::mode_tri_static_pattern() +uint16_t mode_tri_static_pattern() { uint8_t segSize = (SEGMENT.intensity >> 5) +1; uint8_t currSeg = 0; @@ -2719,11 +2740,11 @@ uint16_t WS2812FX::mode_tri_static_pattern() for (uint16_t i = 0; i < SEGLEN; i++) { if ( currSeg % 3 == 0 ) { - setPixelColor(i, SEGCOLOR(0)); + SEGMENT.setPixelColor(i, SEGCOLOR(0)); } else if( currSeg % 3 == 1) { - setPixelColor(i, SEGCOLOR(1)); + SEGMENT.setPixelColor(i, SEGCOLOR(1)); } else { - setPixelColor(i, (SEGCOLOR(2) > 0 ? SEGCOLOR(2) : WHITE)); + SEGMENT.setPixelColor(i, (SEGCOLOR(2) > 0 ? SEGCOLOR(2) : WHITE)); } currSegCount += 1; if (currSegCount >= segSize) { @@ -2737,9 +2758,9 @@ uint16_t WS2812FX::mode_tri_static_pattern() static const char *_data_FX_MODE_TRI_STATIC_PATTERN PROGMEM = "Solid Pattern Tri@,Size;1,2,3;!=0"; -uint16_t WS2812FX::spots_base(uint16_t threshold) +uint16_t spots_base(uint16_t threshold) { - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); uint16_t maxZones = SEGLEN >> 2; uint16_t zones = 1 + ((SEGMENT.intensity * maxZones) >> 8); @@ -2755,7 +2776,7 @@ uint16_t WS2812FX::spots_base(uint16_t threshold) if (wave > threshold) { uint16_t index = 0 + pos + i; uint8_t s = (wave - threshold)*255 / (0xFFFF - threshold); - setPixelColor(index, color_blend(color_from_palette(index, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), 255-s)); + SEGMENT.setPixelColor(index, color_blend(SEGMENT.color_from_palette(index, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), 255-s)); } } } @@ -2765,7 +2786,7 @@ uint16_t WS2812FX::spots_base(uint16_t threshold) //Intensity slider sets number of "lights", speed sets LEDs per light -uint16_t WS2812FX::mode_spots() +uint16_t mode_spots() { return spots_base((255 - SEGMENT.speed) << 8); } @@ -2773,9 +2794,9 @@ static const char *_data_FX_MODE_SPOTS PROGMEM = "Spots@Spread,Width;!,!,;!"; //Intensity slider sets number of "lights", LEDs per light fade in and out -uint16_t WS2812FX::mode_spots_fade() +uint16_t mode_spots_fade() { - uint16_t counter = now * ((SEGMENT.speed >> 2) +8); + uint16_t counter = strip.now * ((SEGMENT.speed >> 2) +8); uint16_t t = triwave16(counter); uint16_t tr = (t >> 1) + (t >> 2); return spots_base(tr); @@ -2793,7 +2814,7 @@ typedef struct Ball { /* * Bouncing Balls Effect */ -uint16_t WS2812FX::mode_bouncing_balls(void) { +uint16_t mode_bouncing_balls(void) { //allocate segment data uint16_t maxNumBalls = 16; uint16_t dataSize = sizeof(ball) * maxNumBalls; @@ -2811,13 +2832,13 @@ uint16_t WS2812FX::mode_bouncing_balls(void) { unsigned long time = millis(); if (SEGENV.call == 0) { - for (uint8_t i = 0; i < maxNumBalls; i++) balls[i].lastBounceTime = time; + for (size_t i = 0; i < maxNumBalls; i++) balls[i].lastBounceTime = time; } bool hasCol2 = SEGCOLOR(2); - fill(hasCol2 ? BLACK : SEGCOLOR(1)); + SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); - for (uint8_t i = 0; i < numBalls; i++) { + for (size_t i = 0; i < numBalls; i++) { float timeSinceLastBounce = (time - balls[i].lastBounceTime)/((255-SEGMENT.speed)*8/256 +1); balls[i].height = 0.5 * gravity * pow(timeSinceLastBounce/1000 , 2.0) + balls[i].impactVelocity * timeSinceLastBounce/1000; @@ -2835,48 +2856,48 @@ uint16_t WS2812FX::mode_bouncing_balls(void) { uint32_t color = SEGCOLOR(0); if (SEGMENT.palette) { - color = color_wheel(i*(256/MAX(numBalls, 8))); + color = SEGMENT.color_wheel(i*(256/MAX(numBalls, 8))); } else if (hasCol2) { color = SEGCOLOR(i % NUM_COLORS); } uint16_t pos = round(balls[i].height * (SEGLEN - 1)); - setPixelColor(pos, color); + SEGMENT.setPixelColor(pos, color); } return FRAMETIME; } -static const char *_data_FX_MODE_BOUNCINGBALLS PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,;!"; +static const char *_data_FX_MODE_BOUNCINGBALLS PROGMEM = "Bouncing Balls@Gravity,# of balls;!,!,;!;mp12=2"; //circle /* * Sinelon stolen from FASTLED examples */ -uint16_t WS2812FX::sinelon_base(bool dual, bool rainbow=false) { - fade_out(SEGMENT.intensity); +uint16_t sinelon_base(bool dual, bool rainbow=false) { + SEGMENT.fade_out(SEGMENT.intensity); uint16_t pos = beatsin16(SEGMENT.speed/10,0,SEGLEN-1); if (SEGENV.call == 0) SEGENV.aux0 = pos; - uint32_t color1 = color_from_palette(pos, true, false, 0); + uint32_t color1 = SEGMENT.color_from_palette(pos, true, false, 0); uint32_t color2 = SEGCOLOR(2); if (rainbow) { - color1 = color_wheel((pos & 0x07) * 32); + color1 = SEGMENT.color_wheel((pos & 0x07) * 32); } - setPixelColor(pos, color1); + SEGMENT.setPixelColor(pos, color1); if (dual) { - if (!color2) color2 = color_from_palette(pos, true, false, 0); + if (!color2) color2 = SEGMENT.color_from_palette(pos, true, false, 0); if (rainbow) color2 = color1; //rainbow - setPixelColor(SEGLEN-1-pos, color2); + SEGMENT.setPixelColor(SEGLEN-1-pos, color2); } if (SEGENV.aux0 != pos) { if (SEGENV.aux0 < pos) { for (uint16_t i = SEGENV.aux0; i < pos ; i++) { - setPixelColor(i, color1); - if (dual) setPixelColor(SEGLEN-1-i, color2); + SEGMENT.setPixelColor(i, color1); + if (dual) SEGMENT.setPixelColor(SEGLEN-1-i, color2); } } else { for (uint16_t i = SEGENV.aux0; i > pos ; i--) { - setPixelColor(i, color1); - if (dual) setPixelColor(SEGLEN-1-i, color2); + SEGMENT.setPixelColor(i, color1); + if (dual) SEGMENT.setPixelColor(SEGLEN-1-i, color2); } } SEGENV.aux0 = pos; @@ -2886,41 +2907,41 @@ uint16_t WS2812FX::sinelon_base(bool dual, bool rainbow=false) { } -uint16_t WS2812FX::mode_sinelon(void) { +uint16_t mode_sinelon(void) { return sinelon_base(false); } static const char *_data_FX_MODE_SINELON PROGMEM = "Sinelon"; -uint16_t WS2812FX::mode_sinelon_dual(void) { +uint16_t mode_sinelon_dual(void) { return sinelon_base(true); } static const char *_data_FX_MODE_SINELON_DUAL PROGMEM = "Sinelon Dual"; -uint16_t WS2812FX::mode_sinelon_rainbow(void) { +uint16_t mode_sinelon_rainbow(void) { return sinelon_base(false, true); } static const char *_data_FX_MODE_SINELON_RAINBOW PROGMEM = "Sinelon Rainbow"; //Rainbow with glitter, inspired by https://gist.github.com/kriegsman/062e10f7f07ba8518af6 -uint16_t WS2812FX::mode_glitter() +uint16_t mode_glitter() { mode_palette(); - if (isMatrix) { + if (strip.isMatrix) { uint16_t height = SEGMENT.virtualHeight(); uint16_t width = SEGMENT.virtualWidth(); for (uint16_t i = 0; i random8()) setPixelColorXY(random16(width-1), i, ULTRAWHITE); + if (SEGMENT.intensity > random8()) SEGMENT.setPixelColorXY(random16(width-1), i, ULTRAWHITE); } } else - if (SEGMENT.intensity > random8()) setPixelColor(random16(SEGLEN), ULTRAWHITE); + if (SEGMENT.intensity > random8()) SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE); return FRAMETIME; } -static const char *_data_FX_MODE_GLITTER PROGMEM = "Glitter@,!;!,!,!;!"; +static const char *_data_FX_MODE_GLITTER PROGMEM = "Glitter@,!;!,!,!;!=11;mp12=0"; //pixels //each needs 19 bytes @@ -2936,9 +2957,9 @@ typedef struct Spark { * POPCORN * modified from https://github.com/kitesurfer1404/WS2812FX/blob/master/src/custom/Popcorn.h */ -uint16_t WS2812FX::mode_popcorn(void) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); +uint16_t mode_popcorn(void) { + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); //allocate segment data uint16_t maxNumPopcorn = 21; // max 21 on 16 segment ESP8266 @@ -2951,7 +2972,7 @@ uint16_t WS2812FX::mode_popcorn(void) { gravity *= rows; //SEGLEN bool hasCol2 = SEGCOLOR(2); - fill(hasCol2 ? BLACK : SEGCOLOR(1)); + SEGMENT.fill(hasCol2 ? BLACK : SEGCOLOR(1)); uint8_t numPopcorn = SEGMENT.intensity*maxNumPopcorn/255; if (numPopcorn == 0) numPopcorn = 1; @@ -2980,13 +3001,13 @@ uint16_t WS2812FX::mode_popcorn(void) { } } if (popcorn[i].pos >= 0.0f) { // draw now active popcorn (either active before or just popped) - uint32_t col = color_wheel(popcorn[i].colIndex); + uint32_t col = SEGMENT.color_wheel(popcorn[i].colIndex); if (!SEGMENT.palette && popcorn[i].colIndex < NUM_COLORS) col = SEGCOLOR(popcorn[i].colIndex); uint16_t ledIndex = popcorn[i].pos; if (ledIndex < rows) { - if (isMatrix) setPixelColorXY(uint16_t(popcorn[i].posX), rows - 1 - ledIndex, col); - else setPixelColor(ledIndex, col); + if (strip.isMatrix) SEGMENT.setPixelColorXY(uint16_t(popcorn[i].posX), rows - 1 - ledIndex, col); + else SEGMENT.setPixelColor(ledIndex, col); } } } @@ -3000,7 +3021,7 @@ static const char *_data_FX_MODE_POPCORN PROGMEM = "Popcorn"; //Inspired by https://github.com/avanhanegem/ArduinoCandleEffectNeoPixel //and https://cpldcpu.wordpress.com/2016/01/05/reverse-engineering-a-real-candle/ -uint16_t WS2812FX::candle(bool multi) +uint16_t candle(bool multi) { if (multi) { @@ -3060,12 +3081,12 @@ uint16_t WS2812FX::candle(bool multi) } if (i > 0) { - setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s)); + SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), s)); SEGENV.data[d] = s; SEGENV.data[d+1] = s_target; SEGENV.data[d+2] = fadeStep; } else { for (uint16_t j = 0; j < SEGLEN; j++) { - setPixelColor(j, color_blend(SEGCOLOR(1), color_from_palette(j, true, PALETTE_SOLID_WRAP, 0), s)); + SEGMENT.setPixelColor(j, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(j, true, PALETTE_SOLID_WRAP, 0), s)); } SEGENV.aux0 = s; SEGENV.aux1 = s_target; SEGENV.step = fadeStep; @@ -3076,14 +3097,14 @@ uint16_t WS2812FX::candle(bool multi) } -uint16_t WS2812FX::mode_candle() +uint16_t mode_candle() { return candle(false); } static const char *_data_FX_MODE_CANDLE PROGMEM = "Candle@Flicker rate=96,Flicker intensity=224;!,!,;0"; -uint16_t WS2812FX::mode_candle_multi() +uint16_t mode_candle_multi() { return candle(true); } @@ -3110,11 +3131,11 @@ typedef struct particle { float fragment[STARBURST_MAX_FRAG]; } star; -uint16_t WS2812FX::mode_starburst(void) { +uint16_t mode_starburst(void) { uint16_t maxData = FAIR_DATA_PER_SEG; //ESP8266: 256 ESP32: 640 - uint8_t segs = getActiveSegmentsNum(); - if (segs <= (MAX_NUM_SEGMENTS /2)) maxData *= 2; //ESP8266: 512 if <= 8 segs ESP32: 1280 if <= 16 segs - if (segs <= (MAX_NUM_SEGMENTS /4)) maxData *= 2; //ESP8266: 1024 if <= 4 segs ESP32: 2560 if <= 8 segs + uint8_t segs = strip.getActiveSegmentsNum(); + if (segs <= (strip.getMaxSegments() /2)) maxData *= 2; //ESP8266: 512 if <= 8 segs ESP32: 1280 if <= 16 segs + if (segs <= (strip.getMaxSegments() /4)) maxData *= 2; //ESP8266: 1024 if <= 4 segs ESP32: 2560 if <= 8 segs uint16_t maxStars = maxData / sizeof(star); //ESP8266: max. 4/9/19 stars/seg, ESP32: max. 10/21/42 stars/seg uint8_t numStars = 1 + (SEGLEN >> 3); @@ -3140,7 +3161,7 @@ uint16_t WS2812FX::mode_starburst(void) { uint16_t startPos = random16(SEGLEN-1); float multiplier = (float)(random8())/255.0 * 1.0; - stars[j].color = col_to_crgb(color_wheel(random8())); + stars[j].color = CRGB(SEGMENT.color_wheel(random8())); stars[j].pos = startPos; stars[j].vel = maxSpeed * (float)(random8())/255.0 * multiplier; stars[j].birth = it; @@ -3155,7 +3176,7 @@ uint16_t WS2812FX::mode_starburst(void) { } } - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); for (int j=0; j particleIgnition + particleFadeTime) { fade = 1.0f; // Black hole, all faded out stars[j].birth = 0; - c = col_to_crgb(SEGCOLOR(1)); + c = CRGB(SEGCOLOR(1)); } else { age -= particleIgnition; fade = (age / particleFadeTime); // Fading star byte f = 254.5f*fade; - c = col_to_crgb(color_blend(crgb_to_col(c), SEGCOLOR(1), f)); + c = CRGB(color_blend(RGBW32(c.r,c.g,c.b,0), SEGCOLOR(1), f)); } } - float particleSize = (1.0 - fade) * 2; + float particleSize = (1.0f - fade) * 2.0f; - for (uint8_t index=0; index < STARBURST_MAX_FRAG*2; index++) { + for (size_t index=0; index < STARBURST_MAX_FRAG*2; index++) { bool mirrored = index & 0x1; uint8_t i = index >> 1; if (stars[j].fragment[i] > 0) { @@ -3212,7 +3233,7 @@ uint16_t WS2812FX::mode_starburst(void) { if (start == end) end++; if (end > SEGLEN) end = SEGLEN; for (int p = start; p < end; p++) { - setPixelColor(p, c.r, c.g, c.b); + SEGMENT.setPixelColor(p, c.r, c.g, c.b); } } } @@ -3220,7 +3241,7 @@ uint16_t WS2812FX::mode_starburst(void) { return FRAMETIME; } #undef STARBURST_MAX_FRAG -static const char *_data_FX_MODE_STARBURST PROGMEM = "Fireworks Starburst"; +static const char *_data_FX_MODE_STARBURST PROGMEM = "Fireworks Starburst@Chance,Fragments;,!,;!=11;mp12=0"; /* @@ -3228,16 +3249,16 @@ static const char *_data_FX_MODE_STARBURST PROGMEM = "Fireworks Starburst"; * adapted from: http://www.anirama.com/1000leds/1d-fireworks/ * adapted for 2D WLED by blazoncek (Blaz Kristan) */ -uint16_t WS2812FX::mode_exploding_fireworks(void) +uint16_t mode_exploding_fireworks(void) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); //allocate segment data uint16_t maxData = FAIR_DATA_PER_SEG; //ESP8266: 256 ESP32: 640 - uint8_t segs = getActiveSegmentsNum(); - if (segs <= (MAX_NUM_SEGMENTS /2)) maxData *= 2; //ESP8266: 512 if <= 8 segs ESP32: 1280 if <= 16 segs - if (segs <= (MAX_NUM_SEGMENTS /4)) maxData *= 2; //ESP8266: 1024 if <= 4 segs ESP32: 2560 if <= 8 segs + uint8_t segs = strip.getActiveSegmentsNum(); + if (segs <= (strip.getMaxSegments() /2)) maxData *= 2; //ESP8266: 512 if <= 8 segs ESP32: 1280 if <= 16 segs + if (segs <= (strip.getMaxSegments() /4)) maxData *= 2; //ESP8266: 1024 if <= 4 segs ESP32: 2560 if <= 8 segs int maxSparks = maxData / sizeof(spark); //ESP8266: max. 21/42/85 sparks/seg, ESP32: max. 53/106/213 sparks/seg uint16_t numSparks = min(2 + ((rows*cols) >> 1), maxSparks); @@ -3251,8 +3272,8 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) SEGENV.aux1 = dataSize; } - //fill(BLACK); - fade_out(252); + //SEGMENT.fill(BLACK); + SEGMENT.fade_out(252); Spark* sparks = reinterpret_cast(SEGENV.data); Spark* flare = sparks; //first spark is flare data @@ -3263,11 +3284,11 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) if (SEGENV.aux0 < 2) { //FLARE if (SEGENV.aux0 == 0) { //init flare flare->pos = 0; - flare->posX = isMatrix ? random16(2,cols-1) : (SEGMENT.intensity > random8()); // will enable random firing side on 1D + flare->posX = strip.isMatrix ? random16(2,cols-1) : (SEGMENT.intensity > random8()); // will enable random firing side on 1D uint16_t peakHeight = 75 + random8(180); //0-255 peakHeight = (peakHeight * (rows -1)) >> 8; flare->vel = sqrt(-2.0f * gravity * peakHeight); - flare->velX = isMatrix ? (random8(8)-4)/32.f : 0; // no X velocity on 1D + flare->velX = strip.isMatrix ? (random8(8)-4)/32.f : 0; // no X velocity on 1D flare->col = 255; //brightness SEGENV.aux0 = 1; } @@ -3275,12 +3296,12 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) // launch if (flare->vel > 12 * gravity) { // flare - if (isMatrix) setPixelColorXY(int(flare->posX), rows - uint16_t(flare->pos) - 1, flare->col, flare->col, flare->col); - else setPixelColor(int(flare->posX) ? rows - int(flare->pos) - 1 : int(flare->pos), flare->col, flare->col, flare->col); + if (strip.isMatrix) SEGMENT.setPixelColorXY(int(flare->posX), rows - uint16_t(flare->pos) - 1, flare->col, flare->col, flare->col); + else SEGMENT.setPixelColor(int(flare->posX) ? rows - int(flare->pos) - 1 : int(flare->pos), flare->col, flare->col, flare->col); flare->pos += flare->vel; flare->posX += flare->velX; flare->pos = constrain(flare->pos, 0, rows-1); - flare->posX = constrain(flare->posX, 0, cols-isMatrix); + flare->posX = constrain(flare->posX, 0, cols-strip.isMatrix); flare->vel += gravity; flare->col -= 2; } else { @@ -3303,12 +3324,12 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) sparks[i].posX = flare->posX; sparks[i].vel = (float(random16(0, 20000)) / 10000.0f) - 0.9f; // from -0.9 to 1.1 sparks[i].vel *= rows<32 ? 0.5f : 1; // reduce velocity for smaller strips - sparks[i].velX = isMatrix ? (float(random16(0, 4000)) / 10000.0f) - 0.2f : 0; // from -0.2 to 0.2 + sparks[i].velX = strip.isMatrix ? (float(random16(0, 4000)) / 10000.0f) - 0.2f : 0; // from -0.2 to 0.2 sparks[i].col = 345;//abs(sparks[i].vel * 750.0); // set colors before scaling velocity to keep them bright //sparks[i].col = constrain(sparks[i].col, 0, 345); sparks[i].colIndex = random8(); sparks[i].vel *= flare->pos/rows; // proportional to height - sparks[i].velX *= isMatrix ? flare->posX/cols : 0; // proportional to width + sparks[i].velX *= strip.isMatrix ? flare->posX/cols : 0; // proportional to width sparks[i].vel *= -gravity *50; } //sparks[1].col = 345; // this will be our known spark @@ -3321,27 +3342,27 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) sparks[i].pos += sparks[i].vel; sparks[i].posX += sparks[i].velX; sparks[i].vel += *dying_gravity; - sparks[i].velX += isMatrix ? *dying_gravity : 0; + sparks[i].velX += strip.isMatrix ? *dying_gravity : 0; if (sparks[i].col > 3) sparks[i].col -= 4; if (sparks[i].pos > 0 && sparks[i].pos < rows) { - if (isMatrix && !(sparks[i].posX >= 0 && sparks[i].posX < cols)) continue; + if (strip.isMatrix && !(sparks[i].posX >= 0 && sparks[i].posX < cols)) continue; uint16_t prog = sparks[i].col; - uint32_t spColor = (SEGMENT.palette) ? color_wheel(sparks[i].colIndex) : SEGCOLOR(0); + uint32_t spColor = (SEGMENT.palette) ? SEGMENT.color_wheel(sparks[i].colIndex) : SEGCOLOR(0); CRGB c = CRGB::Black; //HeatColor(sparks[i].col); if (prog > 300) { //fade from white to spark color - c = col_to_crgb(color_blend(spColor, WHITE, (prog - 300)*5)); + c = CRGB(color_blend(spColor, WHITE, (prog - 300)*5)); } else if (prog > 45) { //fade from spark color to black - c = col_to_crgb(color_blend(BLACK, spColor, prog - 45)); + c = CRGB(color_blend(BLACK, spColor, prog - 45)); uint8_t cooling = (300 - prog) >> 5; c.g = qsub8(c.g, cooling); c.b = qsub8(c.b, cooling * 2); } - if (isMatrix) setPixelColorXY(int(sparks[i].posX), rows - int(sparks[i].pos) - 1, c.red, c.green, c.blue); - else setPixelColor(int(sparks[i].posX) ? rows - int(sparks[i].pos) - 1 : int(sparks[i].pos), c.red, c.green, c.blue); + if (strip.isMatrix) SEGMENT.setPixelColorXY(int(sparks[i].posX), rows - int(sparks[i].pos) - 1, c.red, c.green, c.blue); + else SEGMENT.setPixelColor(int(sparks[i].posX) ? rows - int(sparks[i].pos) - 1 : int(sparks[i].pos), c.red, c.green, c.blue); } } - blur(16); + SEGMENT.blur(16); *dying_gravity *= .8f; // as sparks burn out they fall slower } else { SEGENV.aux0 = 6 + random8(10); //wait for this many frames @@ -3356,24 +3377,24 @@ uint16_t WS2812FX::mode_exploding_fireworks(void) return FRAMETIME; } #undef MAX_SPARKS -static const char *_data_FX_MODE_EXPLODING_FIREWORKS PROGMEM = "Fireworks 1D@Gravity,Firing side;!,!,;!"; +static const char *_data_FX_MODE_EXPLODING_FIREWORKS PROGMEM = "Fireworks 1D/2D@Gravity,Firing side=128;!,!,;!=11"; /* * Drip Effect * ported of: https://www.youtube.com/watch?v=sru2fXh4r7k */ -uint16_t WS2812FX::mode_drip(void) +uint16_t mode_drip(void) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); //allocate segment data uint8_t numDrops = 4; uint16_t dataSize = sizeof(spark) * numDrops; if (!SEGENV.allocateData(dataSize * cols)) return mode_static(); //allocation failed - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); Spark* drops = reinterpret_cast(SEGENV.data); @@ -3384,7 +3405,7 @@ uint16_t WS2812FX::mode_drip(void) int sourcedrop = 12; for (uint16_t k=0; k < cols; k++) { - for (uint8_t j=0; j < numDrops; j++) { + for (size_t j=0; j < numDrops; j++) { uint16_t idx = k*numDrops + j; if (drops[idx].colIndex == 0) { //init @@ -3395,14 +3416,14 @@ uint16_t WS2812FX::mode_drip(void) } uint32_t col = color_blend(BLACK, SEGCOLOR(0), sourcedrop); - if (isMatrix) setPixelColorXY(k, 0, col); - else setPixelColor(rows-1, col);// water source + if (strip.isMatrix) SEGMENT.setPixelColorXY(k, 0, col); + else SEGMENT.setPixelColor(rows-1, col);// water source if (drops[idx].colIndex == 1) { if (drops[idx].col > 255) drops[idx].col = 255; col = color_blend(BLACK,SEGCOLOR(0),drops[idx].col); - if (isMatrix) setPixelColorXY(k, rows - 1 - uint16_t(drops[idx].pos), col); - else setPixelColor(uint16_t(drops[idx].pos), col); + if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1 - uint16_t(drops[idx].pos), col); + else SEGMENT.setPixelColor(uint16_t(drops[idx].pos), col); drops[idx].col += map(SEGMENT.speed, 0, 255, 1, 6); // swelling @@ -3420,14 +3441,14 @@ uint16_t WS2812FX::mode_drip(void) for (uint16_t i = 1; i < 7 - drops[idx].colIndex; i++) { // some minor math so we don't expand bouncing droplets uint16_t pos = constrain(uint16_t(drops[idx].pos) +i, 0, rows-1); //this is BAD, returns a pos >= SEGLEN occasionally col = color_blend(BLACK, SEGCOLOR(0), drops[idx].col/i); - if (isMatrix) setPixelColorXY(k, rows - 1 - pos, col); - else setPixelColor(pos, col); //spread pixel with fade while falling + if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1 - pos, col); + else SEGMENT.setPixelColor(pos, col); //spread pixel with fade while falling } if (drops[idx].colIndex > 2) { // during bounce, some water is on the floor col = color_blend(SEGCOLOR(0), BLACK, drops[idx].col); - if (isMatrix) setPixelColorXY(k, rows - 1, col); - else setPixelColor(0, col); + if (strip.isMatrix) SEGMENT.setPixelColorXY(k, rows - 1, col); + else SEGMENT.setPixelColor(0, col); } } else { // we hit bottom if (drops[idx].colIndex > 2) { // already hit once, so back to forming @@ -3463,7 +3484,7 @@ typedef struct Tetris { uint32_t col; } tetris; -uint16_t WS2812FX::mode_tetrix(void) { +uint16_t mode_tetrix(void) { uint16_t dataSize = sizeof(tetris); if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed @@ -3473,14 +3494,14 @@ uint16_t WS2812FX::mode_tetrix(void) { if (SEGENV.call == 0 || SEGENV.aux1 >= SEGLEN) { SEGENV.aux1 = 0; // reset brick stack size SEGENV.step = 0; - fill(SEGCOLOR(1)); + SEGMENT.fill(SEGCOLOR(1)); return 250; // short wait } if (SEGENV.step == 0) { //init drop->speed = 0.0238 * (SEGMENT.speed ? (SEGMENT.speed>>2)+1 : random8(6,64)); // set speed drop->pos = SEGLEN; // start at end of segment (no need to subtract 1) - drop->col = color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap + drop->col = SEGMENT.color_from_palette(random8(0,15)<<4,false,false,0); // limit color choices so there is enough HUE gap SEGENV.step = 1; // drop state (0 init, 1 forming, 2 falling) SEGENV.aux0 = (SEGMENT.intensity ? (SEGMENT.intensity>>5)+1 : random8(1,5)) * (1+(SEGLEN>>6)); // size of brick } @@ -3495,7 +3516,7 @@ uint16_t WS2812FX::mode_tetrix(void) { if (drop->pos > SEGENV.aux1) { // fall until top of stack drop->pos -= drop->speed; // may add gravity as: speed += gravity if (int(drop->pos) < SEGENV.aux1) drop->pos = SEGENV.aux1; - for (uint16_t i=int(drop->pos); ipos)+SEGENV.aux0 ? drop->col : SEGCOLOR(1)); + for (uint16_t i=int(drop->pos); ipos)+SEGENV.aux0 ? drop->col : SEGCOLOR(1)); } else { // we hit bottom SEGENV.step = 0; // go back to init SEGENV.aux1 += SEGENV.aux0; // increase the stack size @@ -3504,14 +3525,14 @@ uint16_t WS2812FX::mode_tetrix(void) { } return FRAMETIME; } -static const char *_data_FX_MODE_TETRIX PROGMEM = "Tetrix@!=224,Width=0;!,!,;!=11"; +static const char *_data_FX_MODE_TETRIX PROGMEM = "Tetrix@!=224,Width=0;!,!,;!=11;mp12=1"; //vertical /* / Plasma Effect / adapted from https://github.com/atuline/FastLED-Demos/blob/master/plasma/plasma.ino */ -uint16_t WS2812FX::mode_plasma(void) { +uint16_t mode_plasma(void) { // initialize phases on start if (SEGENV.call == 0) { SEGENV.aux0 = random8(0,2); // add a bit of randomness @@ -3523,8 +3544,8 @@ uint16_t WS2812FX::mode_plasma(void) { uint8_t colorIndex = cubicwave8((i*(2+ 3*(SEGMENT.speed >> 5))+thisPhase) & 0xFF)/2 // factor=23 // Create a wave and add a phase change and add another wave with its own phase change. + cos8((i*(1+ 2*(SEGMENT.speed >> 5))+thatPhase) & 0xFF)/2; // factor=15 // Hey, you can even change the frequencies if you wish. uint8_t thisBright = qsub8(colorIndex, beatsin8(7,0, (128 - (SEGMENT.intensity>>1)))); - CRGB color = ColorFromPalette(currentPalette, colorIndex, thisBright, LINEARBLEND); - setPixelColor(i, color.red, color.green, color.blue); + CRGB color = ColorFromPalette(strip.currentPalette, colorIndex, thisBright, LINEARBLEND); + SEGMENT.setPixelColor(i, color.red, color.green, color.blue); } return FRAMETIME; @@ -3536,7 +3557,7 @@ static const char *_data_FX_MODE_PLASMA PROGMEM = "Plasma@Phase,;1,2,3;!"; * Percentage display * Intesity values from 0-100 turn on the leds. */ -uint16_t WS2812FX::mode_percent(void) { +uint16_t mode_percent(void) { uint8_t percent = MAX(0, MIN(200, SEGMENT.intensity)); uint16_t active_leds = (percent < 100) ? SEGLEN * percent / 100.0 @@ -3548,19 +3569,19 @@ uint16_t WS2812FX::mode_percent(void) { if (percent < 100) { for (uint16_t i = 0; i < SEGLEN; i++) { if (i < SEGENV.step) { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } else { - setPixelColor(i, SEGCOLOR(1)); + SEGMENT.setPixelColor(i, SEGCOLOR(1)); } } } else { for (uint16_t i = 0; i < SEGLEN; i++) { if (i < (SEGLEN - SEGENV.step)) { - setPixelColor(i, SEGCOLOR(1)); + SEGMENT.setPixelColor(i, SEGCOLOR(1)); } else { - setPixelColor(i, color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0)); } } } @@ -3582,28 +3603,28 @@ static const char *_data_FX_MODE_PERCENT PROGMEM = "Percent@,% of fill;!,!,;!"; * Modulates the brightness similar to a heartbeat * tries to draw an ECG aproximation on a 2D matrix */ -uint16_t WS2812FX::mode_heartbeat(void) { +uint16_t mode_heartbeat(void) { uint8_t bpm = 40 + (SEGMENT.speed >> 3); uint32_t msPerBeat = (60000L / bpm); uint32_t secondBeat = (msPerBeat / 3); uint32_t bri_lower = SEGENV.aux1; - unsigned long beatTimer = now - SEGENV.step; + unsigned long beatTimer = strip.now - SEGENV.step; bri_lower = bri_lower * 2042 / (2048 + SEGMENT.intensity); SEGENV.aux1 = bri_lower; if ((beatTimer > secondBeat) && !SEGENV.aux0) { // time for the second beat? - SEGENV.aux1 = isMatrix ? UINT16_MAX*3L/4 : UINT16_MAX; //3/4 bri + SEGENV.aux1 = strip.isMatrix ? UINT16_MAX*3L/4 : UINT16_MAX; //3/4 bri SEGENV.aux0 = 1; } if (beatTimer > msPerBeat) { // time to reset the beat timer? SEGENV.aux1 = UINT16_MAX; //full bri SEGENV.aux0 = 0; - SEGENV.step = now; + SEGENV.step = strip.now; } for (uint16_t i = 0; i < SEGLEN; i++) { - setPixelColor(i, color_blend(color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), 255 - (SEGENV.aux1 >> 8))); + SEGMENT.setPixelColor(i, color_blend(SEGMENT.color_from_palette(i, true, PALETTE_SOLID_WRAP, 0), SEGCOLOR(1), 255 - (SEGENV.aux1 >> 8))); } return FRAMETIME; @@ -3635,9 +3656,25 @@ static const char *_data_FX_MODE_HEARTBEAT PROGMEM = "Heartbeat@!,!;!,!,;!"; // // Modified for WLED, based on https://github.com/FastLED/FastLED/blob/master/examples/Pacifica/Pacifica.ino // -uint16_t WS2812FX::mode_pacifica() +// Add one layer of waves into the led array +CRGB pacifica_one_layer(uint16_t i, CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff) { - uint32_t nowOld = now; + uint16_t ci = cistart; + uint16_t waveangle = ioff; + uint16_t wavescale_half = (wavescale >> 1) + 20; + + waveangle += ((120 + SEGMENT.intensity) * i); //original 250 * i + uint16_t s16 = sin16(waveangle) + 32768; + uint16_t cs = scale16(s16, wavescale_half) + wavescale_half; + ci += (cs * i); + uint16_t sindex16 = sin16(ci) + 32768; + uint8_t sindex8 = scale16(sindex16, 240); + return ColorFromPalette(p, sindex8, bri, LINEARBLEND); +} + +uint16_t mode_pacifica() +{ + uint32_t nowOld = strip.now; CRGBPalette16 pacifica_palette_1 = { 0x000507, 0x000409, 0x00030B, 0x00030D, 0x000210, 0x000212, 0x000114, 0x000117, @@ -3650,17 +3687,17 @@ uint16_t WS2812FX::mode_pacifica() 0x000E39, 0x001040, 0x001450, 0x001860, 0x001C70, 0x002080, 0x1040BF, 0x2060FF }; if (SEGMENT.palette) { - pacifica_palette_1 = currentPalette; - pacifica_palette_2 = currentPalette; - pacifica_palette_3 = currentPalette; + pacifica_palette_1 = strip.currentPalette; + pacifica_palette_2 = strip.currentPalette; + pacifica_palette_3 = strip.currentPalette; } // Increment the four "color index start" counters, one for each wave layer. // Each is incremented at a different speed, and the speeds vary over time. uint16_t sCIStart1 = SEGENV.aux0, sCIStart2 = SEGENV.aux1, sCIStart3 = SEGENV.step, sCIStart4 = SEGENV.step >> 16; uint32_t deltams = (FRAMETIME >> 2) + ((FRAMETIME * SEGMENT.speed) >> 7); - uint64_t deltat = (now >> 2) + ((now * SEGMENT.speed) >> 7); - now = deltat; + uint64_t deltat = (strip.now >> 2) + ((strip.now * SEGMENT.speed) >> 7); + strip.now = deltat; uint16_t speedfactor1 = beatsin16(3, 179, 269); uint16_t speedfactor2 = beatsin16(4, 179, 269); @@ -3675,7 +3712,7 @@ uint16_t WS2812FX::mode_pacifica() SEGENV.step = sCIStart4; SEGENV.step = (SEGENV.step << 16) + sCIStart3; // Clear out the LED array to a dim background blue-green - //fill(132618); + //SEGMENT.fill(132618); uint8_t basethreshold = beatsin8( 9, 55, 65); uint8_t wave = beat8( 7 ); @@ -3703,45 +3740,28 @@ uint16_t WS2812FX::mode_pacifica() c.green = scale8(c.green, 200); c |= CRGB( 2, 5, 7); - setPixelColor(i, c.red, c.green, c.blue); + SEGMENT.setPixelColor(i, c.red, c.green, c.blue); } - now = nowOld; + strip.now = nowOld; return FRAMETIME; } static const char *_data_FX_MODE_PACIFICA PROGMEM = "Pacifica"; -// Add one layer of waves into the led array -CRGB WS2812FX::pacifica_one_layer(uint16_t i, CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff) -{ - uint16_t ci = cistart; - uint16_t waveangle = ioff; - uint16_t wavescale_half = (wavescale >> 1) + 20; - - waveangle += ((120 + SEGMENT.intensity) * i); //original 250 * i - uint16_t s16 = sin16(waveangle) + 32768; - uint16_t cs = scale16(s16, wavescale_half) + wavescale_half; - ci += (cs * i); - uint16_t sindex16 = sin16(ci) + 32768; - uint8_t sindex8 = scale16(sindex16, 240); - return ColorFromPalette(p, sindex8, bri, LINEARBLEND); -} - - //Solid colour background with glitter -uint16_t WS2812FX::mode_solid_glitter() +uint16_t mode_solid_glitter() { - fill(SEGCOLOR(0)); + SEGMENT.fill(SEGCOLOR(0)); - if (isMatrix) { + if (strip.isMatrix) { uint16_t height = SEGMENT.virtualHeight(); uint16_t width = SEGMENT.virtualWidth(); for (uint16_t i = 0; i random8()) setPixelColorXY(random16(width-1), i, ULTRAWHITE); + if (SEGMENT.intensity > random8()) SEGMENT.setPixelColorXY(random16(width-1), i, ULTRAWHITE); } } else - if (SEGMENT.intensity > random8()) setPixelColor(random16(SEGLEN), ULTRAWHITE); + if (SEGMENT.intensity > random8()) SEGMENT.setPixelColor(random16(SEGLEN), ULTRAWHITE); return FRAMETIME; } @@ -3751,7 +3771,7 @@ static const char *_data_FX_MODE_SOLID_GLITTER PROGMEM = "Solid Glitter@,!;!,,;0 /* * Mode simulates a gradual sunrise */ -uint16_t WS2812FX::mode_sunrise() { +uint16_t mode_sunrise() { //speed 0 - static sun //speed 1 - 60: sunrise time in minutes //speed 60 - 120 : sunset time in minutes - 60; @@ -3761,13 +3781,13 @@ uint16_t WS2812FX::mode_sunrise() { SEGENV.aux0 = SEGMENT.speed; } - fill(0); + SEGMENT.fill(0); uint16_t stage = 0xFFFF; uint32_t s10SinceStart = (millis() - SEGENV.step) /100; //tenths of seconds if (SEGMENT.speed > 120) { //quick sunrise and sunset - uint16_t counter = (now >> 1) * (((SEGMENT.speed -120) >> 1) +1); + uint16_t counter = (strip.now >> 1) * (((SEGMENT.speed -120) >> 1) +1); stage = triwave16(counter); } else if (SEGMENT.speed) { //sunrise uint8_t durMins = SEGMENT.speed; @@ -3781,37 +3801,37 @@ uint16_t WS2812FX::mode_sunrise() { for (uint16_t i = 0; i <= SEGLEN/2; i++) { //default palette is Fire - uint32_t c = color_from_palette(0, false, true, 255); //background + uint32_t c = SEGMENT.color_from_palette(0, false, true, 255); //background uint16_t wave = triwave16((i * stage) / SEGLEN); wave = (wave >> 8) + ((wave * SEGMENT.intensity) >> 15); if (wave > 240) { //clipped, full white sun - c = color_from_palette( 240, false, true, 255); + c = SEGMENT.color_from_palette( 240, false, true, 255); } else { //transition - c = color_from_palette(wave, false, true, 255); + c = SEGMENT.color_from_palette(wave, false, true, 255); } - setPixelColor(i, c); - setPixelColor(SEGLEN - i - 1, c); + SEGMENT.setPixelColor(i, c); + SEGMENT.setPixelColor(SEGLEN - i - 1, c); } return FRAMETIME; } -static const char *_data_FX_MODE_SUNRISE PROGMEM = "Sunrise@Time [min]=60,;;0"; +static const char *_data_FX_MODE_SUNRISE PROGMEM = "Sunrise@Time [min]=60,;;!=35"; /* * Effects by Andrew Tuline */ -uint16_t WS2812FX::phased_base(uint8_t moder) { // We're making sine waves here. By Andrew Tuline. +uint16_t phased_base(uint8_t moder) { // We're making sine waves here. By Andrew Tuline. uint8_t allfreq = 16; // Base frequency. float *phase = reinterpret_cast(&SEGENV.step); // Phase change value gets calculated (float fits into unsigned long). uint8_t cutOff = (255-SEGMENT.intensity); // You can change the number of pixels. AKA INTENSITY (was 192). uint8_t modVal = 5;//SEGMENT.fft1/8+1; // You can change the modulus. AKA FFT1 (was 5). - uint8_t index = now/64; // Set color rotation speed + uint8_t index = strip.now/64; // Set color rotation speed *phase += SEGMENT.speed/32.0; // You can change the speed of the wave. AKA SPEED (was .4) for (int i = 0; i < SEGLEN; i++) { @@ -3821,7 +3841,7 @@ uint16_t WS2812FX::phased_base(uint8_t moder) { // We're making val += *phase * (i % modVal +1) /2; // This sets the varying phase change of the waves. By Andrew Tuline. uint8_t b = cubicwave8(val); // Now we make an 8 bit sinewave. b = (b > cutOff) ? (b - cutOff) : 0; // A ternary operator to cutoff the light. - setPixelColor(i, color_blend(SEGCOLOR(1), color_from_palette(index, false, false, 0), b)); + SEGMENT.setPixelColor(i, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(index, false, false, 0), b)); index += 256 / SEGLEN; if (SEGLEN > 256) index ++; // Correction for segments longer than 256 LEDs } @@ -3830,32 +3850,32 @@ uint16_t WS2812FX::phased_base(uint8_t moder) { // We're making } -uint16_t WS2812FX::mode_phased(void) { +uint16_t mode_phased(void) { return phased_base(0); } static const char *_data_FX_MODE_PHASED PROGMEM = "Phased"; -uint16_t WS2812FX::mode_phased_noise(void) { +uint16_t mode_phased_noise(void) { return phased_base(1); } static const char *_data_FX_MODE_PHASEDNOISE PROGMEM = "Phased Noise"; -uint16_t WS2812FX::mode_twinkleup(void) { // A very short twinkle routine with fade-in and dual controls. By Andrew Tuline. - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : 1; - const uint16_t rows = isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); +uint16_t mode_twinkleup(void) { // A very short twinkle routine with fade-in and dual controls. By Andrew Tuline. + const uint16_t cols = strip.isMatrix ? SEGMENT.virtualWidth() : 1; + const uint16_t rows = strip.isMatrix ? SEGMENT.virtualHeight() : SEGMENT.virtualLength(); random16_set_seed(535); // The randomizer needs to be re-set each time through the loop in order for the same 'random' numbers to be the same each time through. for (int i = 0; i SEGMENT.intensity) pixBri = 0; - uint32_t col = color_blend(SEGCOLOR(1), color_from_palette(random8()+now/100, false, PALETTE_SOLID_WRAP, 0), pixBri); - if (isMatrix) setPixelColorXY(j, k, col); - else setPixelColor(i, col); + uint32_t col = color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(random8() + strip.now/100, false, PALETTE_SOLID_WRAP, 0), pixBri); + if (strip.isMatrix) SEGMENT.setPixelColorXY(j, k, col); + else SEGMENT.setPixelColor(i, col); } return FRAMETIME; @@ -3864,7 +3884,7 @@ static const char *_data_FX_MODE_TWINKLEUP PROGMEM = "Twinkleup@!,Intensity;!,!, // Peaceful noise that's slow and with gradually changing palettes. Does not support WLED palettes or default colours or controls. -uint16_t WS2812FX::mode_noisepal(void) { // Slow noise palette by Andrew Tuline. +uint16_t mode_noisepal(void) { // Slow noise palette by Andrew Tuline. uint16_t scale = 15 + (SEGMENT.intensity >> 2); //default was 30 //#define scale 30 @@ -3887,12 +3907,12 @@ uint16_t WS2812FX::mode_noisepal(void) { // S //EVERY_N_MILLIS(10) { //(don't have to time this, effect function is only called every 24ms) nblendPaletteTowardPalette(palettes[0], palettes[1], 48); // Blend towards the target palette over 48 iterations. - if (SEGMENT.palette > 0) palettes[0] = currentPalette; + if (SEGMENT.palette > 0) palettes[0] = strip.currentPalette; for(int i = 0; i < SEGLEN; i++) { uint8_t index = inoise8(i*scale, SEGENV.aux0+i*scale); // Get a value from the noise function. I'm using both x and y axis. color = ColorFromPalette(palettes[0], index, 255, LINEARBLEND); // Use the my own palette. - setPixelColor(i, color.red, color.green, color.blue); + SEGMENT.setPixelColor(i, color.red, color.green, color.blue); } SEGENV.aux0 += beatsin8(10,1,4); // Moving along the distance. Vary it a bit with a sine wave. @@ -3905,10 +3925,10 @@ static const char *_data_FX_MODE_NOISEPAL PROGMEM = "Noise Pal"; // Sine waves that have controllable phase change speed, frequency and cutoff. By Andrew Tuline. // SEGMENT.speed ->Speed, SEGMENT.intensity -> Frequency (SEGMENT.fft1 -> Color change, SEGMENT.fft2 -> PWM cutoff) // -uint16_t WS2812FX::mode_sinewave(void) { // Adjustable sinewave. By Andrew Tuline +uint16_t mode_sinewave(void) { // Adjustable sinewave. By Andrew Tuline //#define qsuba(x, b) ((x>b)?x-b:0) // Analog Unsigned subtraction macro. if result <0, then => 0 - uint16_t colorIndex = now /32;//(256 - SEGMENT.fft1); // Amount of colour change. + uint16_t colorIndex = strip.now /32;//(256 - SEGMENT.fft1); // Amount of colour change. SEGENV.step += SEGMENT.speed/16; // Speed of animation. uint16_t freq = SEGMENT.intensity/4;//SEGMENT.fft2/8; // Frequency of the signal. @@ -3916,7 +3936,7 @@ uint16_t WS2812FX::mode_sinewave(void) { // Adjustable sinewave. By for (int i=0; i> 2) +1); + counter = strip.now * ((SEGMENT.speed >> 2) +1); counter = counter >> 8; } @@ -3943,7 +3963,7 @@ uint16_t WS2812FX::mode_flow(void) uint16_t zoneLen = SEGLEN / zones; uint16_t offset = (SEGLEN - zones * zoneLen) >> 1; - fill(color_from_palette(-counter, false, true, 255)); + SEGMENT.fill(SEGMENT.color_from_palette(-counter, false, true, 255)); for (uint16_t z = 0; z < zones; z++) { @@ -3953,23 +3973,23 @@ uint16_t WS2812FX::mode_flow(void) uint8_t colorIndex = (i * 255 / zoneLen) - counter; uint16_t led = (z & 0x01) ? i : (zoneLen -1) -i; if (SEGMENT.getOption(SEG_OPTION_REVERSED)) led = (zoneLen -1) -led; - setPixelColor(pos + led, color_from_palette(colorIndex, false, true, 255)); + SEGMENT.setPixelColor(pos + led, SEGMENT.color_from_palette(colorIndex, false, true, 255)); } } return FRAMETIME; } -static const char *_data_FX_MODE_FLOW PROGMEM = "Flow"; +static const char *_data_FX_MODE_FLOW PROGMEM = "Flow@!,!;!,!,!;!=6;mp12=1"; //vertical /* * Dots waving around in a sine/pendulum motion. * Little pixel birds flying in a circle. By Aircoookie */ -uint16_t WS2812FX::mode_chunchun(void) +uint16_t mode_chunchun(void) { - fill(SEGCOLOR(1)); - uint16_t counter = now*(6 + (SEGMENT.speed >> 4)); + SEGMENT.fill(SEGCOLOR(1)); + uint16_t counter = strip.now * (6 + (SEGMENT.speed >> 4)); uint16_t numBirds = 2 + (SEGLEN >> 3); // 2 + 1/8 of a segment uint16_t span = (SEGMENT.intensity << 8) / numBirds; @@ -3978,8 +3998,8 @@ uint16_t WS2812FX::mode_chunchun(void) counter -= span; uint16_t megumin = sin16(counter) + 0x8000; uint16_t bird = uint32_t(megumin * SEGLEN) >> 16; - uint32_t c = color_from_palette((i * 255)/ numBirds, false, false, 0); // no palette wrapping - setPixelColor(bird, c); + uint32_t c = SEGMENT.color_from_palette((i * 255)/ numBirds, false, false, 0); // no palette wrapping + SEGMENT.setPixelColor(bird, c); } return FRAMETIME; } @@ -4016,7 +4036,7 @@ typedef struct Spotlight { * * By Steve Pomeroy @xxv */ -uint16_t WS2812FX::mode_dancing_shadows(void) +uint16_t mode_dancing_shadows(void) { uint8_t numSpotlights = map(SEGMENT.intensity, 0, 255, 2, SPOT_MAX_COUNT); // 49 on 32 segment ESP32, 17 on 16 segment ESP8266 bool initialize = SEGENV.aux0 != numSpotlights; @@ -4026,12 +4046,12 @@ uint16_t WS2812FX::mode_dancing_shadows(void) if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Spotlight* spotlights = reinterpret_cast(SEGENV.data); - fill(BLACK); + SEGMENT.fill(BLACK); unsigned long time = millis(); bool respawn = false; - for (uint8_t i = 0; i < numSpotlights; i++) { + for (size_t i = 0; i < numSpotlights; i++) { if (!initialize) { // advance the position of the spotlight int16_t delta = (float)(time - spotlights[i].lastUpdateTime) * @@ -4068,61 +4088,59 @@ uint16_t WS2812FX::mode_dancing_shadows(void) spotlights[i].type = random8(SPOT_TYPES_COUNT); } - uint32_t color = color_from_palette(spotlights[i].colorIdx, false, false, 0); + uint32_t color = SEGMENT.color_from_palette(spotlights[i].colorIdx, false, false, 0); int start = spotlights[i].position; if (spotlights[i].width <= 1) { if (start >= 0 && start < SEGLEN) { - blendPixelColor(start, color, 128); + SEGMENT.blendPixelColor(start, color, 128); } } else { switch (spotlights[i].type) { case SPOT_TYPE_SOLID: - for (uint8_t j = 0; j < spotlights[i].width; j++) { + for (size_t j = 0; j < spotlights[i].width; j++) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, 128); + SEGMENT.blendPixelColor(start + j, color, 128); } } break; case SPOT_TYPE_GRADIENT: - for (uint8_t j = 0; j < spotlights[i].width; j++) { + for (size_t j = 0; j < spotlights[i].width; j++) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, - cubicwave8(map(j, 0, spotlights[i].width - 1, 0, 255))); + SEGMENT.blendPixelColor(start + j, color, cubicwave8(map(j, 0, spotlights[i].width - 1, 0, 255))); } } break; case SPOT_TYPE_2X_GRADIENT: - for (uint8_t j = 0; j < spotlights[i].width; j++) { + for (size_t j = 0; j < spotlights[i].width; j++) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, - cubicwave8(2 * map(j, 0, spotlights[i].width - 1, 0, 255))); + SEGMENT.blendPixelColor(start + j, color, cubicwave8(2 * map(j, 0, spotlights[i].width - 1, 0, 255))); } } break; case SPOT_TYPE_2X_DOT: - for (uint8_t j = 0; j < spotlights[i].width; j += 2) { + for (size_t j = 0; j < spotlights[i].width; j += 2) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, 128); + SEGMENT.blendPixelColor(start + j, color, 128); } } break; case SPOT_TYPE_3X_DOT: - for (uint8_t j = 0; j < spotlights[i].width; j += 3) { + for (size_t j = 0; j < spotlights[i].width; j += 3) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, 128); + SEGMENT.blendPixelColor(start + j, color, 128); } } break; case SPOT_TYPE_4X_DOT: - for (uint8_t j = 0; j < spotlights[i].width; j += 4) { + for (size_t j = 0; j < spotlights[i].width; j += 4) { if ((start + j) >= 0 && (start + j) < SEGLEN) { - blendPixelColor(start + j, color, 128); + SEGMENT.blendPixelColor(start + j, color, 128); } } break; @@ -4139,8 +4157,8 @@ static const char *_data_FX_MODE_DANCING_SHADOWS PROGMEM = "Dancing Shadows@!,# Imitates a washing machine, rotating same waves forward, then pause, then backward. By Stefan Seegel */ -uint16_t WS2812FX::mode_washing_machine(void) { - float speed = tristate_square8(now >> 7, 90, 15); +uint16_t mode_washing_machine(void) { + float speed = tristate_square8(strip.now >> 7, 90, 15); float quot = 32.0f - ((float)SEGMENT.speed / 16.0f); speed /= quot; @@ -4148,7 +4166,7 @@ uint16_t WS2812FX::mode_washing_machine(void) { for (int i=0; i> 7)); - setPixelColor(i, color_from_palette(col, false, PALETTE_SOLID_WRAP, 3)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(col, false, PALETTE_SOLID_WRAP, 3)); } return FRAMETIME; @@ -4160,28 +4178,28 @@ static const char *_data_FX_MODE_WASHING_MACHINE PROGMEM = "Washing Machine"; Blends random colors across palette Modified, originally by Mark Kriegsman https://gist.github.com/kriegsman/1f7ccbbfa492a73c015e */ -uint16_t WS2812FX::mode_blends(void) { +uint16_t mode_blends(void) { uint16_t pixelLen = SEGLEN > UINT8_MAX ? UINT8_MAX : SEGLEN; uint16_t dataSize = sizeof(uint32_t) * (pixelLen + 1); // max segment length of 56 pixels on 16 segment ESP8266 if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed uint32_t* pixels = reinterpret_cast(SEGENV.data); uint8_t blendSpeed = map(SEGMENT.intensity, 0, UINT8_MAX, 10, 128); - uint8_t shift = (now * ((SEGMENT.speed >> 3) +1)) >> 8; + uint8_t shift = (strip.now * ((SEGMENT.speed >> 3) +1)) >> 8; for (int i = 0; i < pixelLen; i++) { - pixels[i] = color_blend(pixels[i], color_from_palette(shift + quadwave8((i + 1) * 16), false, PALETTE_SOLID_WRAP, 255), blendSpeed); + pixels[i] = color_blend(pixels[i], SEGMENT.color_from_palette(shift + quadwave8((i + 1) * 16), false, PALETTE_SOLID_WRAP, 255), blendSpeed); shift += 3; } uint16_t offset = 0; for (int i = 0; i < SEGLEN; i++) { - setPixelColor(i, pixels[offset++]); + SEGMENT.setPixelColor(i, pixels[offset++]); if (offset > pixelLen) offset = 0; } return FRAMETIME; } -static const char *_data_FX_MODE_BLENDS PROGMEM = "Blends@Shift speed,Blend speed;1,2,3,!"; +static const char *_data_FX_MODE_BLENDS PROGMEM = "Blends@Shift speed,Blend speed;1,2,3;!"; /* @@ -4209,7 +4227,7 @@ typedef struct TvSim { uint16_t pb = 0; } tvSim; -uint16_t WS2812FX::mode_tv_simulator(void) { +uint16_t mode_tv_simulator(void) { uint16_t nr, ng, nb, r, g, b, i, hue; uint8_t sat, bri, j; @@ -4266,9 +4284,9 @@ uint16_t WS2812FX::mode_tv_simulator(void) { } } // Apply gamma correction, further expand to 16/16/16 - nr = (uint8_t)gamma8(tvSimulator->actualColorR) * 257; // New R/G/B - ng = (uint8_t)gamma8(tvSimulator->actualColorG) * 257; - nb = (uint8_t)gamma8(tvSimulator->actualColorB) * 257; + nr = (uint8_t)strip.gamma8(tvSimulator->actualColorR) * 257; // New R/G/B + ng = (uint8_t)strip.gamma8(tvSimulator->actualColorG) * 257; + nb = (uint8_t)strip.gamma8(tvSimulator->actualColorB) * 257; if (SEGENV.aux0 == 0) { // initialize next iteration SEGENV.aux0 = 1; @@ -4297,7 +4315,7 @@ uint16_t WS2812FX::mode_tv_simulator(void) { // set strip color for (i = 0; i < SEGLEN; i++) { - setPixelColor(i, r >> 8, g >> 8, b >> 8); // Quantize to 8-bit + SEGMENT.setPixelColor(i, r >> 8, g >> 8, b >> 8); // Quantize to 8-bit } // if total duration has passed, remember last color and restart the loop @@ -4413,7 +4431,7 @@ class AuroraWave { }; }; -uint16_t WS2812FX::mode_aurora(void) { +uint16_t mode_aurora(void) { //aux1 = Wavecount //aux2 = Intensity in last loop @@ -4434,7 +4452,7 @@ uint16_t WS2812FX::mode_aurora(void) { waves = reinterpret_cast(SEGENV.data); for(int i = 0; i < SEGENV.aux1; i++) { - waves[i].init(SEGLEN, col_to_crgb(color_from_palette(random8(), false, false, random(0, 3)))); + waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random(0, 3)))); } } else { waves = reinterpret_cast(SEGENV.data); @@ -4446,7 +4464,7 @@ uint16_t WS2812FX::mode_aurora(void) { if(!(waves[i].stillAlive())) { //If a wave dies, reinitialize it starts over. - waves[i].init(SEGLEN, col_to_crgb(color_from_palette(random8(), false, false, random(0, 3)))); + waves[i].init(SEGLEN, CRGB(SEGMENT.color_from_palette(random8(), false, false, random(0, 3)))); } } @@ -4468,7 +4486,7 @@ uint16_t WS2812FX::mode_aurora(void) { } } - setPixelColor(i, mixedRgb[0], mixedRgb[1], mixedRgb[2]); + SEGMENT.setPixelColor(i, mixedRgb[0], mixedRgb[1], mixedRgb[2]); } return FRAMETIME; @@ -4482,13 +4500,13 @@ static const char *_data_FX_MODE_AURORA PROGMEM = "Aurora@!=24,!;1,2,3;!=50"; ///////////////////////// // 16 bit perlinmove. Use Perlin Noise instead of sinewaves for movement. By Andrew Tuline. // Controls are speed, # of pixels, faderate. -uint16_t WS2812FX::mode_perlinmove(void) { +uint16_t mode_perlinmove(void) { - fade_out(255-SEGMENT.custom1); + SEGMENT.fade_out(255-SEGMENT.custom1); for (uint16_t i = 0; i < SEGMENT.intensity/16 + 1; i++) { uint16_t locn = inoise16(millis()*128/(260-SEGMENT.speed)+i*15000, millis()*128/(260-SEGMENT.speed)); // Get a new pixel location from moving noise. uint16_t pixloc = map(locn, 50*256, 192*256, 0, SEGLEN-1); // Map that to the length of the strand, and ensure we don't go over. - setPixelColor(pixloc, color_from_palette(pixloc%255, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(pixloc, SEGMENT.color_from_palette(pixloc%255, false, PALETTE_SOLID_WRAP, 0)); } return FRAMETIME; @@ -4500,11 +4518,11 @@ static const char *_data_FX_MODE_PERLINMOVE PROGMEM = "Perlin Move@!,# of pixels // Waveins // ///////////////////////// // Uses beatsin8() + phase shifting. By: Andrew Tuline -uint16_t WS2812FX::mode_wavesins(void) { +uint16_t mode_wavesins(void) { for (uint16_t i = 0; i < SEGLEN; i++) { uint8_t bri = sin8(millis()/4 + i * SEGMENT.intensity); - setPixelColor(i, ColorFromPalette(currentPalette, beatsin8(SEGMENT.speed, SEGMENT.custom1, SEGMENT.custom1+SEGMENT.custom2, 0, i * SEGMENT.custom3), bri, LINEARBLEND)); + SEGMENT.setPixelColor(i, ColorFromPalette(strip.currentPalette, beatsin8(SEGMENT.speed, SEGMENT.custom1, SEGMENT.custom1+SEGMENT.custom2, 0, i * SEGMENT.custom3), bri, LINEARBLEND)); } return FRAMETIME; @@ -4516,7 +4534,7 @@ static const char *_data_FX_MODE_WAVESINS PROGMEM = "Wavesins@Speed,Brightness v // Flow Stripe // ////////////////////////////// // By: ldirko https://editor.soulmatelights.com/gallery/392-flow-led-stripe , modifed by: Andrew Tuline -uint16_t WS2812FX::mode_FlowStripe(void) { +uint16_t mode_FlowStripe(void) { const uint16_t hl = SEGLEN * 10 / 13; uint8_t hue = millis() / (SEGMENT.speed+1); @@ -4527,7 +4545,7 @@ uint16_t WS2812FX::mode_FlowStripe(void) { c = sin8(c); c = sin8(c / 2 + t); byte b = sin8(c + t/8); - setPixelColor(i, CHSV(b + hue, 255, 255)); + SEGMENT.setPixelColor(i, CHSV(b + hue, 255, 255)); } return FRAMETIME; @@ -4535,13 +4553,15 @@ uint16_t WS2812FX::mode_FlowStripe(void) { static const char *_data_FX_MODE_FLOWSTRIPE PROGMEM = "Flow Stripe@Hue speed,Effect speed;;"; +#ifndef WLED_DISABLE_2D /////////////////////////////////////////////////////////////////////////////// //*************************** 2D routines *********************************** +#define XY(x,y) SEGMENT.XY(x,y) // Black hole -uint16_t WS2812FX::mode_2DBlackHole(void) { // By: Stepko https://editor.soulmatelights.com/gallery/1012 , Modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DBlackHole(void) { // By: Stepko https://editor.soulmatelights.com/gallery/1012 , Modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4554,19 +4574,19 @@ uint16_t WS2812FX::mode_2DBlackHole(void) { // By: Stepko https://edi // initialize on first call if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); + SEGMENT.fill_solid(leds, CRGB::Black); } - fadeToBlackBy(leds, 16 + (SEGMENT.speed>>3)); // create fading trails + SEGMENT.fadeToBlackBy(leds, 16 + (SEGMENT.speed>>3)); // create fading trails float t = (float)(millis())/128; // timebase // outer stars - for (byte 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); y = beatsin8(SEGMENT.intensity>>3, 0, rows - 1, 0, ((i % 2) ? 192 : 64) + t * i); leds[XY(x,y)] += CHSV(i*32, 255, 255); } // inner stars - for (byte i = 0; i < 4; i++) { + for (size_t i = 0; i < 4; i++) { x = beatsin8(SEGMENT.custom2>>3, cols/4, cols - 1 - cols/4, 0, ((i % 2) ? 128 : 0) + t * i); y = beatsin8(SEGMENT.custom3>>3, rows/4, rows - 1 - rows/4, 0, ((i % 2) ? 192 : 64) + t * i); leds[XY(x,y)] += CHSV(i*32, 255, 255); @@ -4574,9 +4594,9 @@ uint16_t WS2812FX::mode_2DBlackHole(void) { // By: Stepko https://edi // central white dot leds[XY(cols/2,rows/2)] = CHSV(0,0,255); // blur everything a bit - blur2d(leds, 16); + SEGMENT.blur2d(leds, 16); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DBlackHole() static const char *_data_FX_MODE_2DBLACKHOLE PROGMEM = "2D Black Hole@Fade rate,Outer Y freq.,Outer X freq.,Inner X freq.,Inner Y freq.;;"; @@ -4585,8 +4605,8 @@ static const char *_data_FX_MODE_2DBLACKHOLE PROGMEM = "2D Black Hole@Fade rate, //////////////////////////// // 2D Colored Bursts // //////////////////////////// -uint16_t WS2812FX::mode_2DColoredBursts() { // By: ldirko https://editor.soulmatelights.com/gallery/819-colored-bursts , modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DColoredBursts() { // By: ldirko https://editor.soulmatelights.com/gallery/819-colored-bursts , modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4596,7 +4616,7 @@ uint16_t WS2812FX::mode_2DColoredBursts() { // By: ldirko https:/ CRGB *leds = reinterpret_cast(SEGENV.data); if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); + SEGMENT.fill_solid(leds, CRGB::Black); //for (uint16_t i = 0; i < w*h; i++) leds[i] = CRGB::Black; SEGENV.aux0 = 0; // start with red hue } @@ -4607,20 +4627,20 @@ uint16_t WS2812FX::mode_2DColoredBursts() { // By: ldirko https:/ byte numLines = SEGMENT.intensity/16 + 1; SEGENV.aux0++; // hue - fadeToBlackBy(leds, 40); + SEGMENT.fadeToBlackBy(leds, 40); - for (byte i = 0; i < numLines; i++) { + for (size_t i = 0; i < numLines; i++) { byte x1 = beatsin8(2 + SEGMENT.speed/16, 0, (cols - 1)); byte x2 = beatsin8(1 + SEGMENT.speed/16, 0, (cols - 1)); byte y1 = beatsin8(5 + SEGMENT.speed/16, 0, (rows - 1), 0, i * 24); byte y2 = beatsin8(3 + SEGMENT.speed/16, 0, (rows - 1), 0, i * 48 + 64); - CRGB color = ColorFromPalette(currentPalette, i * 255 / numLines + (SEGENV.aux0&0xFF), 255, LINEARBLEND); + CRGB color = ColorFromPalette(strip.currentPalette, i * 255 / numLines + (SEGENV.aux0&0xFF), 255, LINEARBLEND); byte xsteps = abs8(x1 - y1) + 1; byte ysteps = abs8(x2 - y2) + 1; byte steps = xsteps >= ysteps ? xsteps : ysteps; - for (byte i = 1; i <= steps; i++) { + for (size_t i = 1; i <= steps; i++) { byte dx = lerp8by8(x1, y1, i * 255 / steps); byte dy = lerp8by8(x2, y2, i * 255 / steps); int index = XY(dx, dy); @@ -4633,9 +4653,9 @@ uint16_t WS2812FX::mode_2DColoredBursts() { // By: ldirko https:/ leds[XY(y1, y2)] += CRGB::White; } } - blur2d(leds, 4); + SEGMENT.blur2d(leds, 4); - setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. + SEGMENT.setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. return FRAMETIME; } // mode_2DColoredBursts() static const char *_data_FX_MODE_2DCOLOREDBURSTS PROGMEM = "2D Colored Bursts@Speed,# of lines;;!"; @@ -4644,8 +4664,8 @@ static const char *_data_FX_MODE_2DCOLOREDBURSTS PROGMEM = "2D Colored Bursts@Sp ///////////////////// // 2D DNA // ///////////////////// -uint16_t WS2812FX::mode_2Ddna(void) { // dna originally by by ldirko at https://pastebin.com/pCkkkzcs. Updated by Preyy. WLED conversion by Andrew Tuline. - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Ddna(void) { // dna originally by by ldirko at https://pastebin.com/pCkkkzcs. Updated by Preyy. WLED conversion by Andrew Tuline. + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4654,27 +4674,27 @@ uint16_t WS2812FX::mode_2Ddna(void) { // dna originally by by ldirko at if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, 0); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); - fadeToBlackBy(leds, 64); + SEGMENT.fadeToBlackBy(leds, 64); for(int i = 0; i < cols; i++) { - leds[XY(i, beatsin8(SEGMENT.speed/8, 0, rows-1, 0, i*4))] = ColorFromPalette(currentPalette, i*5+millis()/17, beatsin8(5, 55, 255, 0, i*10), LINEARBLEND); - leds[XY(i, beatsin8(SEGMENT.speed/8, 0, rows-1, 0, i*4+128))] = ColorFromPalette(currentPalette,i*5+128+millis()/17, beatsin8(5, 55, 255, 0, i*10+128), LINEARBLEND); // 180 degrees (128) out of phase + leds[XY(i, beatsin8(SEGMENT.speed/8, 0, rows-1, 0, i*4))] = ColorFromPalette(strip.currentPalette, i*5+millis()/17, beatsin8(5, 55, 255, 0, i*10), LINEARBLEND); + leds[XY(i, beatsin8(SEGMENT.speed/8, 0, rows-1, 0, i*4+128))] = ColorFromPalette(strip.currentPalette,i*5+128+millis()/17, beatsin8(5, 55, 255, 0, i*10+128), LINEARBLEND); // 180 degrees (128) out of phase } - blur2d(leds, SEGMENT.intensity/8); + SEGMENT.blur2d(leds, SEGMENT.intensity/8); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2Ddna() -static const char *_data_FX_MODE_2DDNA PROGMEM = "2D DNA@Scroll speed,Blur;;!"; +static const char *_data_FX_MODE_2DDNA PROGMEM = "2D DNA@Scroll speed,Blur;1,2,3;!"; ///////////////////////// // 2D DNA Spiral // ///////////////////////// -uint16_t WS2812FX::mode_2DDNASpiral() { // By: ldirko https://editor.soulmatelights.com/gallery/810 , modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DDNASpiral() { // By: ldirko https://editor.soulmatelights.com/gallery/810 , modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4684,7 +4704,7 @@ uint16_t WS2812FX::mode_2DDNASpiral() { // By: ldirko https://edi CRGB *leds = reinterpret_cast(SEGENV.data); if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); + SEGMENT.fill_solid(leds, CRGB::Black); SEGENV.aux0 = 0; // hue } @@ -4692,7 +4712,7 @@ uint16_t WS2812FX::mode_2DDNASpiral() { // By: ldirko https://edi uint8_t freq = SEGMENT.intensity/8; uint32_t ms = millis() / 20; - nscale8(leds, 120); + SEGMENT.nscale8(leds, 120); for (uint16_t i = 0; i < rows; i++) { uint16_t x = beatsin8(speeds, 0, cols - 1, 0, i * freq) + beatsin8(speeds - 7, 0, cols - 1, 0, i * freq + 128); @@ -4701,10 +4721,10 @@ uint16_t WS2812FX::mode_2DDNASpiral() { // By: ldirko https://edi if ((i + ms / 8) & 3) { x = x / 2; x1 = x1 / 2; byte steps = abs8(x - x1) + 1; - for (byte k = 1; k <= steps; k++) { + for (size_t k = 1; k <= steps; k++) { byte dx = lerp8by8(x, x1, k * 255 / steps); uint16_t index = XY(dx, i); - leds[index] += ColorFromPalette(currentPalette, SEGENV.aux0, 255, LINEARBLEND); + leds[index] += ColorFromPalette(strip.currentPalette, SEGENV.aux0, 255, LINEARBLEND); leds[index] %= (k * 255 / steps); //for draw gradient line } leds[XY(x, i)] += CRGB::DarkSlateGray; @@ -4712,7 +4732,7 @@ uint16_t WS2812FX::mode_2DDNASpiral() { // By: ldirko https://edi } } - setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. + SEGMENT.setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. return FRAMETIME; } // mode_2DDNASpiral() static const char *_data_FX_MODE_2DDNASPIRAL PROGMEM = "2D DNA Spiral@Scroll speed,Blur;;!"; @@ -4721,8 +4741,8 @@ static const char *_data_FX_MODE_2DDNASPIRAL PROGMEM = "2D DNA Spiral@Scroll spe ///////////////////////// // 2D Drift // ///////////////////////// -uint16_t WS2812FX::mode_2DDrift() { // By: Stepko https://editor.soulmatelights.com/gallery/884-drift , Modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DDrift() { // By: Stepko https://editor.soulmatelights.com/gallery/884-drift , Modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4733,9 +4753,9 @@ uint16_t WS2812FX::mode_2DDrift() { // By: Stepko https://editor. if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); - fadeToBlackBy(leds, 128); + SEGMENT.fadeToBlackBy(leds, 128); const uint16_t maxDim = MAX(cols, rows)/2; unsigned long t = millis() / (32 - (SEGMENT.speed>>3)); @@ -4743,11 +4763,11 @@ uint16_t WS2812FX::mode_2DDrift() { // By: Stepko https://editor. float angle = radians(t * (maxDim - i)); uint16_t myX = (cols>>1) + (uint16_t)(sin_t(angle) * i) + (cols%2); uint16_t myY = (rows>>1) + (uint16_t)(cos_t(angle) * i) + (rows%2); - leds[XY(myX,myY)] = ColorFromPalette(currentPalette, (i * 20) + (t / 20), 255, LINEARBLEND); + leds[XY(myX,myY)] = ColorFromPalette(strip.currentPalette, (i * 20) + (t / 20), 255, LINEARBLEND); } - blur2d(leds, SEGMENT.intensity>>3); + SEGMENT.blur2d(leds, SEGMENT.intensity>>3); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DDrift() static const char *_data_FX_MODE_2DDRIFT PROGMEM = "2D Drift@Rotation speed,Blur amount;;!"; @@ -4756,8 +4776,8 @@ static const char *_data_FX_MODE_2DDRIFT PROGMEM = "2D Drift@Rotation speed,Blur ////////////////////////// // 2D Firenoise // ////////////////////////// -uint16_t WS2812FX::mode_2Dfirenoise(void) { // firenoise2d. By Andrew Tuline. Yet another short routine. - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dfirenoise(void) { // firenoise2d. By Andrew Tuline. Yet another short routine. + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4766,13 +4786,13 @@ uint16_t WS2812FX::mode_2Dfirenoise(void) { // firenoise2d. By And if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); uint16_t xscale = SEGMENT.intensity*4; uint32_t yscale = SEGMENT.speed*8; uint8_t indexx = 0; - currentPalette = CRGBPalette16( CRGB(0,0,0), CRGB(0,0,0), CRGB(0,0,0), CRGB(0,0,0), + strip.currentPalette = CRGBPalette16( CRGB(0,0,0), CRGB(0,0,0), CRGB(0,0,0), CRGB(0,0,0), CRGB::Red, CRGB::Red, CRGB::Red, CRGB::DarkOrange, CRGB::DarkOrange,CRGB::DarkOrange, CRGB::Orange, CRGB::Orange, CRGB::Yellow, CRGB::Orange, CRGB::Yellow, CRGB::Yellow); @@ -4780,11 +4800,11 @@ uint16_t WS2812FX::mode_2Dfirenoise(void) { // firenoise2d. By And for (uint16_t j=0; j < cols; j++) { for (uint16_t i=0; i < rows; i++) { indexx = inoise8(j*yscale*rows/255, i*xscale+millis()/4); // We're moving along our Perlin map. - leds[XY(j,i)] = ColorFromPalette(currentPalette, min(i*(indexx)>>4, 255), i*255/cols, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. + leds[XY(j,i)] = ColorFromPalette(strip.currentPalette, min(i*(indexx)>>4, 255), i*255/cols, LINEARBLEND); // With that value, look up the 8 bit colour palette value and assign it to the current LED. } // for i } // for j - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2Dfirenoise() static const char *_data_FX_MODE_2DFIRENOISE PROGMEM = "2D Firenoise@X scale,Y scale;;"; @@ -4793,8 +4813,8 @@ static const char *_data_FX_MODE_2DFIRENOISE PROGMEM = "2D Firenoise@X scale,Y s ////////////////////////////// // 2D Frizzles // ////////////////////////////// -uint16_t WS2812FX::mode_2DFrizzles(void) { // By: Stepko https://editor.soulmatelights.com/gallery/640-color-frizzles , Modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DFrizzles(void) { // By: Stepko https://editor.soulmatelights.com/gallery/640-color-frizzles , Modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4803,15 +4823,15 @@ uint16_t WS2812FX::mode_2DFrizzles(void) { // By: Stepko https:/ if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); - fadeToBlackBy(leds, 16); - for (byte i = 8; i > 0; i--) { - leds[XY(beatsin8(SEGMENT.speed/8 + i, 0, cols - 1), beatsin8(SEGMENT.intensity/8 - i, 0, rows - 1))] += ColorFromPalette(currentPalette, beatsin8(12, 0, 255), 255, LINEARBLEND); + SEGMENT.fadeToBlackBy(leds, 16); + for (size_t i = 8; i > 0; i--) { + leds[XY(beatsin8(SEGMENT.speed/8 + i, 0, cols - 1), beatsin8(SEGMENT.intensity/8 - i, 0, rows - 1))] += ColorFromPalette(strip.currentPalette, beatsin8(12, 0, 255), 255, LINEARBLEND); } - blur2d(leds, 16); + SEGMENT.blur2d(leds, 16); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DFrizzles() static const char *_data_FX_MODE_2DFRIZZLES PROGMEM = "2D Frizzles@X frequency,Y frequency;;!"; @@ -4825,8 +4845,8 @@ typedef struct ColorCount { int8_t count; } colorCount; -uint16_t WS2812FX::mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -4839,10 +4859,10 @@ uint16_t WS2812FX::mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired CRGB backgroundColor = SEGCOLOR(1); - if (SEGENV.call == 0 || now - *resetMillis > 5000) { - *resetMillis = now; + if (SEGENV.call == 0 || strip.now - *resetMillis > 5000) { + *resetMillis = strip.now; - random16_set_seed(now); //seed the random generator + random16_set_seed(strip.now); //seed the random generator //give the leds random state and colors (based on intensity, colors from palette or all posible colors are chosen) for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { @@ -4850,10 +4870,10 @@ uint16_t WS2812FX::mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired if (state == 0) leds[XY(x,y)] = backgroundColor; else - leds[XY(x,y)] = (CRGB)color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0); + leds[XY(x,y)] = (CRGB)SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0); } - fill_solid(prevLeds, CRGB::Black); + SEGMENT.fill_solid(prevLeds, CRGB::Black); SEGENV.aux1 = 0; SEGENV.aux0 = 0xFFFF; @@ -4909,12 +4929,12 @@ uint16_t WS2812FX::mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired // check if we had same CRC and reset if needed // same CRC would mean image did not change or was repeating itself - if (!(crc == SEGENV.aux0 || crc == SEGENV.aux1)) *resetMillis = now; //if no repetition avoid reset + if (!(crc == SEGENV.aux0 || crc == SEGENV.aux1)) *resetMillis = strip.now; //if no repetition avoid reset // remeber last two SEGENV.aux1 = SEGENV.aux0; SEGENV.aux0 = crc; - setPixels(leds); + SEGMENT.setPixels(leds); return (SEGMENT.getOption(SEG_OPTION_TRANSITIONAL)) ? FRAMETIME : FRAMETIME_FIXED * (128-(SEGMENT.speed>>1)); // update only when appropriate time passes (in 42 FPS slots) } // mode_2Dgameoflife() static const char *_data_FX_MODE_2DGAMEOFLIFE PROGMEM = "2D Game Of Life@!,;!,!;!"; @@ -4923,16 +4943,16 @@ static const char *_data_FX_MODE_2DGAMEOFLIFE PROGMEM = "2D Game Of Life@!,;!,!; ///////////////////////// // 2D Hiphotic // ///////////////////////// -uint16_t WS2812FX::mode_2DHiphotic() { // By: ldirko https://editor.soulmatelights.com/gallery/810 , Modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DHiphotic() { // By: ldirko https://editor.soulmatelights.com/gallery/810 , Modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); - const uint32_t a = now / 8; + const uint32_t a = strip.now / 8; for (uint16_t x = 0; x < cols; x++) { for (uint16_t y = 0; y < rows; y++) { - setPixelColorXY(x, y, color_from_palette(sin8(cos8(x * SEGMENT.speed/16 + a / 3) + sin8(y * SEGMENT.intensity/16 + a / 4) + a), false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColorXY(x, y, SEGMENT.color_from_palette(sin8(cos8(x * SEGMENT.speed/16 + a / 3) + sin8(y * SEGMENT.intensity/16 + a / 4) + a), false, PALETTE_SOLID_WRAP, 0)); } } @@ -4955,8 +4975,8 @@ typedef struct Julia { float xymag; } julia; -uint16_t WS2812FX::mode_2DJulia(void) { // An animated Julia set by Andrew Tuline. - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DJulia(void) { // An animated Julia set by Andrew Tuline. + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5043,9 +5063,9 @@ uint16_t WS2812FX::mode_2DJulia(void) { // An animated // We color each pixel based on how long it takes to get to infinity, or black if it never gets there. if (iter == maxIterations) { - setPixelColorXY(i, j, 0); + SEGMENT.setPixelColorXY(i, j, 0); } else { - setPixelColorXY(i, j, color_from_palette(iter*255/maxIterations, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColorXY(i, j, SEGMENT.color_from_palette(iter*255/maxIterations, false, PALETTE_SOLID_WRAP, 0)); } x += dx; } @@ -5061,24 +5081,24 @@ static const char *_data_FX_MODE_2DJULIA PROGMEM = "2D Julia@,Max iterations per ////////////////////////////// // 2D Lissajous // ////////////////////////////// -uint16_t WS2812FX::mode_2DLissajous(void) { // By: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DLissajous(void) { // By: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); - fadeToBlackBy(SEGMENT.intensity); - //fade_out(SEGMENT.intensity); + SEGMENT.fadeToBlackBy(SEGMENT.intensity); + //SEGMENT.fade_out(SEGMENT.intensity); //for (int i=0; i < 4*(cols+rows); i ++) { for (int i=0; i < 256; i ++) { //float xlocn = float(sin8(now/4+i*(SEGMENT.speed>>5))) / 255.0f; //float ylocn = float(cos8(now/4+i*2)) / 255.0f; - uint8_t xlocn = sin8(now/2+i*(SEGMENT.speed>>5)); - uint8_t ylocn = cos8(now/2+i*2); + uint8_t xlocn = sin8(strip.now/2+i*(SEGMENT.speed>>5)); + uint8_t ylocn = cos8(strip.now/2+i*2); xlocn = map(xlocn,0,255,0,cols-1); ylocn = map(ylocn,0,255,0,rows-1); - setPixelColorXY(xlocn, ylocn, color_from_palette(now/100+i, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColorXY(xlocn, ylocn, SEGMENT.color_from_palette(strip.now/100+i, false, PALETTE_SOLID_WRAP, 0)); } return FRAMETIME; @@ -5089,8 +5109,8 @@ static const char *_data_FX_MODE_2DLISSAJOUS PROGMEM = "2D Lissajous@X frequency /////////////////////// // 2D Matrix // /////////////////////// -uint16_t WS2812FX::mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams. Adapted by Andrew Tuline & improved by merkisoft and ewowi. - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dmatrix(void) { // Matrix2D. By Jeremy Williams. Adapted by Andrew Tuline & improved by merkisoft and ewowi. + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5099,7 +5119,7 @@ uint16_t WS2812FX::mode_2Dmatrix(void) { // Matrix2D. By Jeremy if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); uint8_t fade = map(SEGMENT.custom1, 0, 255, 50, 250); // equals trail size uint8_t speed = (256-SEGMENT.speed) >> map(MIN(rows, 150), 0, 150, 0, 3); // slower speeds for small displays @@ -5114,8 +5134,8 @@ uint16_t WS2812FX::mode_2Dmatrix(void) { // Matrix2D. By Jeremy trailColor = CRGB(27,130,39); } - if (now - SEGENV.step >= speed) { - SEGENV.step = now; + if (strip.now - SEGENV.step >= speed) { + SEGENV.step = strip.now; for (int16_t row=rows-1; row>=0; row--) { for (int16_t col=0; col(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); - fadeToBlackBy(leds, 15); + SEGMENT.fadeToBlackBy(leds, 15); byte t1 = millis() / (257 - SEGMENT.speed); // 20; byte t2 = sin8(t1) / 4 * 2; for (uint16_t i = 0; i < 13; i++) { byte x = sin8(t1 + i * SEGMENT.intensity/8)*(cols-1)/255; // max index now 255x15/255=15! byte y = sin8(t2 + i * SEGMENT.intensity/8)*(rows-1)/255; // max index now 255x15/255=15! - leds[XY(x, y)] = ColorFromPalette(currentPalette, i * 255 / 13, 255, LINEARBLEND); + leds[XY(x, y)] = ColorFromPalette(strip.currentPalette, i * 255 / 13, 255, LINEARBLEND); } - blur2d(leds, 16); + SEGMENT.blur2d(leds, 16); - setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. + SEGMENT.setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. return FRAMETIME; } // mode_2DSindots() static const char *_data_FX_MODE_2DSINDOTS PROGMEM = "2D Sindots@Speed,Dot distance;;!"; @@ -5404,9 +5425,9 @@ static const char *_data_FX_MODE_2DSINDOTS PROGMEM = "2D Sindots@Speed,Dot dista // 2D Squared Swirl // ////////////////////////////// // custom3 affects the blur amount. -uint16_t WS2812FX::mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. https://gist.github.com/kriegsman/368b316c55221134b160 +uint16_t mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. https://gist.github.com/kriegsman/368b316c55221134b160 // Modifed by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5415,13 +5436,13 @@ uint16_t WS2812FX::mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); const uint8_t kBorderWidth = 2; - fadeToBlackBy(leds, 24); + SEGMENT.fadeToBlackBy(leds, 24); uint8_t blurAmount = SEGMENT.custom3>>4; - blur2d(leds, blurAmount); + SEGMENT.blur2d(leds, blurAmount); // Use two out-of-sync sine waves uint8_t i = beatsin8(19, kBorderWidth, cols-kBorderWidth); @@ -5433,11 +5454,11 @@ uint16_t WS2812FX::mode_2Dsquaredswirl(void) { // By: Mark Kriegsman. uint16_t ms = millis(); - leds[XY(i, m)] += ColorFromPalette(currentPalette, ms/29, 255, LINEARBLEND); - leds[XY(j, n)] += ColorFromPalette(currentPalette, ms/41, 255, LINEARBLEND); - leds[XY(k, p)] += ColorFromPalette(currentPalette, ms/73, 255, LINEARBLEND); + leds[XY(i, m)] += ColorFromPalette(strip.currentPalette, ms/29, 255, LINEARBLEND); + leds[XY(j, n)] += ColorFromPalette(strip.currentPalette, ms/41, 255, LINEARBLEND); + leds[XY(k, p)] += ColorFromPalette(strip.currentPalette, ms/73, 255, LINEARBLEND); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2Dsquaredswirl() static const char *_data_FX_MODE_2DSQUAREDSWIRL PROGMEM = "2D Squared Swirl@,,,,Blur;,,;!"; @@ -5446,8 +5467,8 @@ static const char *_data_FX_MODE_2DSQUAREDSWIRL PROGMEM = "2D Squared Swirl@,,,, ////////////////////////////// // 2D Sun Radiation // ////////////////////////////// -uint16_t WS2812FX::mode_2DSunradiation(void) { // By: ldirko https://editor.soulmatelights.com/gallery/599-sun-radiation , modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DSunradiation(void) { // By: ldirko https://editor.soulmatelights.com/gallery/599-sun-radiation , modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5457,7 +5478,7 @@ uint16_t WS2812FX::mode_2DSunradiation(void) { // By: ldirko h CRGB *leds = reinterpret_cast(SEGENV.data); byte *bump = reinterpret_cast(SEGENV.data + dataSize); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); unsigned long t = millis() / 4; int index = 0; @@ -5488,7 +5509,7 @@ uint16_t WS2812FX::mode_2DSunradiation(void) { // By: ldirko h yindex += (cols + 2); } - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DSunradiation() static const char *_data_FX_MODE_2DSUNRADIATION PROGMEM = "2D Sun Radiation@Variance,Brightness;;"; @@ -5497,8 +5518,8 @@ static const char *_data_FX_MODE_2DSUNRADIATION PROGMEM = "2D Sun Radiation@Vari ///////////////////////// // 2D Tartan // ///////////////////////// -uint16_t WS2812FX::mode_2Dtartan(void) { // By: Elliott Kember https://editor.soulmatelights.com/gallery/3-tartan , Modified by: Andrew Tuline - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dtartan(void) { // By: Elliott Kember https://editor.soulmatelights.com/gallery/3-tartan , Modified by: Andrew Tuline + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5507,7 +5528,7 @@ uint16_t WS2812FX::mode_2Dtartan(void) { // By: Elliott Kember https:/ if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); uint8_t hue; int offsetX = beatsin16(3, -360, 360); @@ -5517,13 +5538,13 @@ uint16_t WS2812FX::mode_2Dtartan(void) { // By: Elliott Kember https:/ for (uint16_t y = 0; y < rows; y++) { uint16_t index = XY(x, y); hue = x * beatsin16(10, 1, 10) + offsetY; - leds[index] = ColorFromPalette(currentPalette, hue, sin8(x * SEGMENT.speed + offsetX) * sin8(x * SEGMENT.speed + offsetX) / 255, LINEARBLEND); + leds[index] = ColorFromPalette(strip.currentPalette, hue, sin8(x * SEGMENT.speed + offsetX) * sin8(x * SEGMENT.speed + offsetX) / 255, LINEARBLEND); hue = y * 3 + offsetX; - leds[index] += ColorFromPalette(currentPalette, hue, sin8(y * SEGMENT.intensity + offsetY) * sin8(y * SEGMENT.intensity + offsetY) / 255, LINEARBLEND); + leds[index] += ColorFromPalette(strip.currentPalette, hue, sin8(y * SEGMENT.intensity + offsetY) * sin8(y * SEGMENT.intensity + offsetY) / 255, LINEARBLEND); } } - setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. + SEGMENT.setPixels(leds); // Use this ONLY if we're going to display via leds[x] method. return FRAMETIME; } // mode_2DTartan() static const char *_data_FX_MODE_2DTARTAN PROGMEM = "2D Tartan@X scale,Y scale;;!"; @@ -5532,8 +5553,8 @@ static const char *_data_FX_MODE_2DTARTAN PROGMEM = "2D Tartan@X scale,Y scale;; ///////////////////////// // 2D spaceships // ///////////////////////// -uint16_t WS2812FX::mode_2Dspaceships(void) { //// Space ships by stepko (c)05.02.21 [https://editor.soulmatelights.com/gallery/639-space-ships], adapted by Blaz Kristan - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dspaceships(void) { //// Space ships by stepko (c)05.02.21 [https://editor.soulmatelights.com/gallery/639-space-ships], adapted by Blaz Kristan + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5542,9 +5563,9 @@ uint16_t WS2812FX::mode_2Dspaceships(void) { //// Space ships by stepko (c)05 if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); - uint32_t tb = now >> 12; // every ~4s + uint32_t tb = strip.now >> 12; // every ~4s if (tb > SEGENV.step) { int8_t dir = ++SEGENV.aux0; dir += (int)random8(3)-1; @@ -5554,12 +5575,12 @@ uint16_t WS2812FX::mode_2Dspaceships(void) { //// Space ships by stepko (c)05 SEGENV.step = tb + random8(4); } - fadeToBlackBy(leds, map(SEGMENT.speed, 0, 255, 248, 16)); - move(SEGENV.aux0, 1, leds); - for (byte i = 0; i < 8; i++) { + SEGMENT.fadeToBlackBy(leds, map(SEGMENT.speed, 0, 255, 248, 16)); + SEGMENT.move(SEGENV.aux0, 1, leds); + for (size_t i = 0; i < 8; i++) { byte x = beatsin8(12 + i, 2, cols - 3); byte y = beatsin8(15 + i, 2, rows - 3); - CRGB color = ColorFromPalette(currentPalette, beatsin8(12 + i, 0, 255), 255); + CRGB color = ColorFromPalette(strip.currentPalette, beatsin8(12 + i, 0, 255), 255); leds[XY(x, y)] += color; if (cols > 24 || rows > 24) { leds[XY(x + 1, y)] += color; @@ -5568,12 +5589,12 @@ uint16_t WS2812FX::mode_2Dspaceships(void) { //// Space ships by stepko (c)05 leds[XY(x, y - 1)] += color; } } - blur2d(leds, SEGMENT.intensity>>3); + SEGMENT.blur2d(leds, SEGMENT.intensity>>3); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } -static const char *_data_FX_MODE_SPACESHIPS PROGMEM = "2D Spaceships@!,Blur;!,!,!;!"; +static const char *_data_FX_MODE_2DSPACESHIPS PROGMEM = "2D Spaceships@!,Blur;!,!,!;!"; ///////////////////////// @@ -5581,8 +5602,8 @@ static const char *_data_FX_MODE_SPACESHIPS PROGMEM = "2D Spaceships@!,Blur;!,!, ///////////////////////// //// Crazy bees by stepko (c)12.02.21 [https://editor.soulmatelights.com/gallery/651-crazy-bees], adapted by Blaz Kristan #define MAX_BEES 5 -uint16_t WS2812FX::mode_2Dcrazybees(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dcrazybees(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5611,8 +5632,8 @@ uint16_t WS2812FX::mode_2Dcrazybees(void) { bee_t *bee = reinterpret_cast(SEGENV.data + dataSize); if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); - for (byte i = 0; i < n; i++) { + SEGMENT.fill_solid(leds, CRGB::Black); + for (size_t i = 0; i < n; i++) { bee[i].posX = random8(0, cols); bee[i].posY = random8(0, rows); bee[i].aimed(cols, rows); @@ -5622,9 +5643,9 @@ uint16_t WS2812FX::mode_2Dcrazybees(void) { if (millis() > SEGENV.step) { SEGENV.step = millis() + (FRAMETIME * 8 / ((SEGMENT.speed>>5)+1)); - fadeToBlackBy(leds, 32); + SEGMENT.fadeToBlackBy(leds, 32); - for (byte i = 0; i < n; i++) { + for (size_t i = 0; i < n; i++) { leds[XY(bee[i].aimX + 1, bee[i].aimY)] += CHSV(bee[i].hue, 255, 255); leds[XY(bee[i].aimX, bee[i].aimY + 1)] += CHSV(bee[i].hue, 255, 255); leds[XY(bee[i].aimX - 1, bee[i].aimY)] += CHSV(bee[i].hue, 255, 255); @@ -5644,13 +5665,13 @@ uint16_t WS2812FX::mode_2Dcrazybees(void) { bee[i].aimed(cols, rows); } } - blur2d(leds, SEGMENT.intensity>>4); + SEGMENT.blur2d(leds, SEGMENT.intensity>>4); - setPixels(leds); + SEGMENT.setPixels(leds); } return FRAMETIME; } -static const char *_data_FX_MODE_CRAZYBEES PROGMEM = "2D Crazy Bees@!,Blur;;"; +static const char *_data_FX_MODE_2DCRAZYBEES PROGMEM = "2D Crazy Bees@!,Blur;;"; ///////////////////////// @@ -5658,8 +5679,8 @@ static const char *_data_FX_MODE_CRAZYBEES PROGMEM = "2D Crazy Bees@!,Blur;;"; ///////////////////////// //// Ghost Rider by stepko (c)2021 [https://editor.soulmatelights.com/gallery/716-ghost-rider], adapted by Blaz Kristan #define LIGHTERS_AM 64 // max lighters (adequate for 32x32 matrix) -uint16_t WS2812FX::mode_2Dghostrider(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dghostrider(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5682,18 +5703,18 @@ uint16_t WS2812FX::mode_2Dghostrider(void) { CRGB *leds = reinterpret_cast(SEGENV.data); lighter_t *lighter = reinterpret_cast(SEGENV.data + dataSize); - const int maxLighters = min(cols + rows, LIGHTERS_AM); + const size_t maxLighters = min(cols + rows, LIGHTERS_AM); if (SEGENV.call == 0 || SEGENV.aux0 != cols || SEGENV.aux1 != rows) { SEGENV.aux0 = cols; SEGENV.aux1 = rows; - fill_solid(leds, CRGB::Black); - randomSeed(now); + SEGMENT.fill_solid(leds, CRGB::Black); + randomSeed(strip.now); lighter->angleSpeed = random8(0,20) - 10; lighter->Vspeed = 5; lighter->gPosX = (cols/2) * 10; lighter->gPosY = (rows/2) * 10; - for (byte i = 0; i < maxLighters; i++) { + for (size_t i = 0; i < maxLighters; i++) { lighter->lightersPosX[i] = lighter->gPosX; lighter->lightersPosY[i] = lighter->gPosY + i; lighter->time[i] = i * 2; @@ -5703,10 +5724,10 @@ uint16_t WS2812FX::mode_2Dghostrider(void) { if (millis() > SEGENV.step) { SEGENV.step = millis() + 1024 / (cols+rows); - fadeToBlackBy(leds, (SEGMENT.speed>>2)+64); + SEGMENT.fadeToBlackBy(leds, (SEGMENT.speed>>2)+64); CRGB color = CRGB::White; - wu_pixel(leds, lighter->gPosX * 256 / 10, lighter->gPosY * 256 / 10, color); + SEGMENT.wu_pixel(leds, lighter->gPosX * 256 / 10, lighter->gPosY * 256 / 10, color); lighter->gPosX += lighter->Vspeed * sin_t(radians(lighter->gAngle)); lighter->gPosY += lighter->Vspeed * cos_t(radians(lighter->gAngle)); @@ -5715,7 +5736,7 @@ uint16_t WS2812FX::mode_2Dghostrider(void) { if (lighter->gPosX > (cols - 1) * 10) lighter->gPosX = 0; if (lighter->gPosY < 0) lighter->gPosY = (rows - 1) * 10; if (lighter->gPosY > (rows - 1) * 10) lighter->gPosY = 0; - for (byte i = 0; i < maxLighters; i++) { + for (size_t i = 0; i < maxLighters; i++) { lighter->time[i] += random8(5, 20); if (lighter->time[i] >= 255 || (lighter->lightersPosX[i] <= 0) || @@ -5734,15 +5755,15 @@ uint16_t WS2812FX::mode_2Dghostrider(void) { lighter->lightersPosX[i] += -7 * sin_t(radians(lighter->Angle[i])); lighter->lightersPosY[i] += -7 * cos_t(radians(lighter->Angle[i])); } - wu_pixel(leds, lighter->lightersPosX[i] * 256 / 10, lighter->lightersPosY[i] * 256 / 10, ColorFromPalette(currentPalette, (256 - lighter->time[i]))); + SEGMENT.wu_pixel(leds, lighter->lightersPosX[i] * 256 / 10, lighter->lightersPosY[i] * 256 / 10, ColorFromPalette(strip.currentPalette, (256 - lighter->time[i]))); } - blur2d(leds, SEGMENT.intensity>>3); + SEGMENT.blur2d(leds, SEGMENT.intensity>>3); } - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } -static const char *_data_FX_MODE_GHOST_RIDER PROGMEM = "2D Ghost Rider@Fade rate,Blur;!,!,!;!"; +static const char *_data_FX_MODE_2DGHOSTRIDER PROGMEM = "2D Ghost Rider@Fade rate,Blur;!,!,!;!"; //////////////////////////// @@ -5750,8 +5771,8 @@ static const char *_data_FX_MODE_GHOST_RIDER PROGMEM = "2D Ghost Rider@Fade rate //////////////////////////// //// Floating Blobs by stepko (c)2021 [https://editor.soulmatelights.com/gallery/573-blobs], adapted by Blaz Kristan #define MAX_BLOBS 8 -uint16_t WS2812FX::mode_2Dfloatingblobs(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dfloatingblobs(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5774,8 +5795,8 @@ uint16_t WS2812FX::mode_2Dfloatingblobs(void) { if (SEGENV.call == 0 || SEGENV.aux0 != cols || SEGENV.aux1 != rows) { SEGENV.aux0 = cols; SEGENV.aux1 = rows; - fill_solid(leds, CRGB::Black); - for (byte i = 0; i < MAX_BLOBS; i++) { + SEGMENT.fill_solid(leds, CRGB::Black); + for (size_t i = 0; i < MAX_BLOBS; i++) { blob->r[i] = cols>15 ? random8(1, cols/8.f) : 1; blob->sX[i] = (float) random8(3, cols) / (float)(256 - SEGMENT.speed); // speed x blob->sY[i] = (float) random8(3, rows) / (float)(256 - SEGMENT.speed); // speed y @@ -5788,10 +5809,10 @@ uint16_t WS2812FX::mode_2Dfloatingblobs(void) { } } - fadeToBlackBy(leds, 20); + SEGMENT.fadeToBlackBy(leds, 20); // Bounce balls around - for (byte i = 0; i < Amount; i++) { + for (size_t i = 0; i < Amount; i++) { if (SEGENV.step < millis()) blob->color[i] = add8(blob->color[i], 4); // slowly change color // change radius if needed if (blob->grow[i]) { @@ -5807,9 +5828,9 @@ uint16_t WS2812FX::mode_2Dfloatingblobs(void) { blob->grow[i] = true; } } - CRGB c = ColorFromPalette(currentPalette, blob->color[i]); + CRGB c = ColorFromPalette(strip.currentPalette, blob->color[i]); //if (!SEGMENT.palette) c = SEGCOLOR(0); - if (blob->r[i] > 1.f) fill_circle(leds, blob->y[i], blob->x[i], blob->r[i], c); + if (blob->r[i] > 1.f) SEGMENT.fill_circle(leds, blob->y[i], blob->x[i], blob->r[i], c); else leds[XY(blob->y[i], blob->x[i])] += c; // move x if (blob->x[i] + blob->r[i] >= cols - 1) blob->x[i] += (blob->sX[i] * ((cols - 1 - blob->x[i]) / blob->r[i] + 0.005f)); @@ -5838,22 +5859,22 @@ uint16_t WS2812FX::mode_2Dfloatingblobs(void) { blob->y[i] = rows - 1.01f; } } - blur2d(leds, cols+rows); + SEGMENT.blur2d(leds, cols+rows); if (SEGENV.step < millis()) SEGENV.step = millis() + 2000; // change colors every 2 seconds - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } #undef MAX_BLOBS -static const char *_data_FX_MODE_BLOBS PROGMEM = "2D Blobs@!,# blobs;!,!,!;!"; +static const char *_data_FX_MODE_2DBLOBS PROGMEM = "2D Blobs@!,# blobs;!,!,!;!"; //////////////////////////// // 2D Scrolling text // //////////////////////////// -uint16_t WS2812FX::mode_2Dscrollingtext(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Dscrollingtext(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5886,25 +5907,25 @@ uint16_t WS2812FX::mode_2Dscrollingtext(void) { SEGENV.step = millis() + map(SEGMENT.speed, 0, 255, 10*FRAMETIME_FIXED, 2*FRAMETIME_FIXED); } - fade_out(255 - (SEGMENT.custom1>>5)); // fade to background color + SEGMENT.fade_out(255 - (SEGMENT.custom1>>5)); // fade to background color for (uint16_t i = 0; i < numberOfLetters; i++) { if (int(cols) - int(SEGENV.aux0) + letterWidth*(i+1) < 0) continue; // don't draw characters off-screen if (text[i]<32 || text[i]>126) continue; // skip non-ANSII characters (may add UTF translation at some point) - drawCharacter(text[i], int(cols) - int(SEGENV.aux0) + letterWidth*i, yoffset, letterWidth, letterHeight, color_from_palette(SEGENV.aux1, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.drawCharacter(text[i], int(cols) - int(SEGENV.aux0) + letterWidth*i, yoffset, letterWidth, letterHeight, SEGMENT.color_from_palette(SEGENV.aux1, false, PALETTE_SOLID_WRAP, 0)); } return FRAMETIME; } -static const char *_data_FX_MODE_SCROLL_TEXT PROGMEM = "2D Scrolling Text@!,Y Offset,Trail=0,Font size;!,!;!"; +static const char *_data_FX_MODE_2DSCROLLTEXT PROGMEM = "2D Scrolling Text@!,Y Offset=128,Trail=0,Font size;!,!;!;rev=0,mi=0,rY=0,mY=0"; //////////////////////////// // 2D Drift Rose // //////////////////////////// //// Drift Rose by stepko (c)2021 [https://editor.soulmatelights.com/gallery/1369-drift-rose-pattern], adapted by Blaz Kristan -uint16_t WS2812FX::mode_2Ddriftrose(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2Ddriftrose(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -5918,21 +5939,23 @@ uint16_t WS2812FX::mode_2Ddriftrose(void) { CRGB *leds = reinterpret_cast(SEGENV.data); if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); + SEGMENT.fill_solid(leds, CRGB::Black); } - fadeToBlackBy(leds, 32+(SEGMENT.speed>>3)); - for (byte i = 1; i < 37; i++) { + SEGMENT.fadeToBlackBy(leds, 32+(SEGMENT.speed>>3)); + for (size_t i = 1; i < 37; i++) { uint32_t x = (CX + (sin_t(radians(i * 10)) * (beatsin8(i, 0, L*2)-L))) * 255.f; uint32_t y = (CY + (cos_t(radians(i * 10)) * (beatsin8(i, 0, L*2)-L))) * 255.f; - wu_pixel(leds, x, y, CHSV(i * 10, 255, 255)); + SEGMENT.wu_pixel(leds, x, y, CHSV(i * 10, 255, 255)); } - blur2d(leds, (SEGMENT.intensity>>4)+1); + SEGMENT.blur2d(leds, (SEGMENT.intensity>>4)+1); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } -static const char *_data_FX_MODE_DRIFT_ROSE PROGMEM = "2D Drift Rose@Fade,Blur;;"; +static const char *_data_FX_MODE_2DDRIFTROSE PROGMEM = "2D Drift Rose@Fade,Blur;;"; + +#endif // WLED_DISABLE_2D /////////////////////////////////////////////////////////////////////////////// @@ -5973,12 +5996,7 @@ static const char *_data_FX_MODE_DRIFT_ROSE PROGMEM = "2D Drift Rose@Fade,Blur;; inputLevel = (uint8_t*) um_data->u_data[17]; // requires UI element (SEGMENT.customX?), changes source element } else { // add support for no audio data - uint32_t ms = millis(); - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 224); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - samplePeak = random8() > 250; // or use: sample==224 - FFT_MajorPeak = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); + um_data = simulateSound(SEGMENT.soundSim); } if (!myVals || !fftBin || ...) return mode_static(); */ @@ -5987,7 +6005,7 @@ static const char *_data_FX_MODE_DRIFT_ROSE PROGMEM = "2D Drift Rose@Fade,Blur;; ///////////////////////////////// // * Ripple Peak // ///////////////////////////////// -uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuline. +uint16_t mode_ripplepeak(void) { // * Ripple peak. By Andrew Tuline. // This currently has no controls. #define maxsteps 16 // Case statement wouldn't allow a variable. @@ -5996,23 +6014,17 @@ uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By A if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Ripple* ripples = reinterpret_cast(SEGENV.data); - uint8_t *binNum, *maxVol; // just in case assignment - uint8_t samplePeak = 0; // actually a bool - float FFT_MajorPeak = 0.0; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - FFT_MajorPeak = *(float*) um_data->u_data[6]; - binNum = (uint8_t*)um_data->u_data[10]; - maxVol = (uint8_t*)um_data->u_data[9]; - samplePeak = *(uint8_t*)um_data->u_data[5]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - samplePeak = random8() > 250; - FFT_MajorPeak = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - binNum = (uint8_t*) &SEGENV.aux1; - maxVol = (uint8_t*)(&SEGENV.aux1+1); // just in case assignment + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t samplePeak = *(uint8_t*)um_data->u_data[5]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; + uint8_t *maxVol = (uint8_t*)um_data->u_data[9]; + uint8_t *binNum = (uint8_t*)um_data->u_data[10]; + + // printUmData(); if (SEGENV.call == 0) { SEGENV.aux0 = 255; @@ -6023,8 +6035,8 @@ uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By A *binNum = SEGMENT.custom2; // Select a bin. *maxVol = SEGMENT.custom3/2; // Our volume comparator. - fade_out(240); // Lower frame rate means less effective fading than FastLED - fade_out(240); + SEGMENT.fade_out(240); // Lower frame rate means less effective fading than FastLED + SEGMENT.fade_out(240); for (uint16_t i = 0; i < SEGMENT.intensity/16; i++) { // Limit the number of ripples. if (samplePeak) ripples[i].state = 255; @@ -6044,7 +6056,7 @@ uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By A break; case 0: - setPixelColor(ripples[i].pos, color_blend(SEGCOLOR(1), color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0)); + SEGMENT.setPixelColor(ripples[i].pos, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0)); ripples[i].state++; break; @@ -6053,8 +6065,8 @@ uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By A break; default: // Middle of the ripples. - setPixelColor((ripples[i].pos + ripples[i].state + SEGLEN) % SEGLEN, color_blend(SEGCOLOR(1), color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0/ripples[i].state*2)); - setPixelColor((ripples[i].pos - ripples[i].state + SEGLEN) % SEGLEN, color_blend(SEGCOLOR(1), color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0/ripples[i].state*2)); + SEGMENT.setPixelColor((ripples[i].pos + ripples[i].state + SEGLEN) % SEGLEN, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0/ripples[i].state*2)); + SEGMENT.setPixelColor((ripples[i].pos - ripples[i].state + SEGLEN) % SEGLEN, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(ripples[i].color, false, PALETTE_SOLID_WRAP, 0), SEGENV.aux0/ripples[i].state*2)); ripples[i].state++; // Next step. break; } // switch step @@ -6062,15 +6074,16 @@ uint16_t WS2812FX::mode_ripplepeak(void) { // * Ripple peak. By A return FRAMETIME; } // mode_ripplepeak() -static const char *_data_FX_MODE_RIPPLEPEAK PROGMEM = " ♪ Ripple Peak@Fade rate,Max # of ripples,,Select bin,Volume (minimum);!,!;!"; +static const char *_data_FX_MODE_RIPPLEPEAK PROGMEM = "Ripple Peak ♪@Fade rate,Max # of ripples,,Select bin,Volume (minimum)=0;!,!;!;mp12=0,ssim=1"; // Pixel, Beatsin +#ifndef WLED_DISABLE_2D ///////////////////////// // * 2D Swirl // ///////////////////////// // By: Mark Kriegsman https://gist.github.com/kriegsman/5adca44e14ad025e6d3b , modified by Andrew Tuline -uint16_t WS2812FX::mode_2DSwirl(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DSwirl(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -6079,11 +6092,11 @@ uint16_t WS2812FX::mode_2DSwirl(void) { if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - if (SEGENV.call == 0) fill_solid(leds, CRGB::Black); + if (SEGENV.call == 0) SEGMENT.fill_solid(leds, CRGB::Black); const uint8_t borderWidth = 2; - blur2d(leds, SEGMENT.custom1); + SEGMENT.blur2d(leds, SEGMENT.custom1); uint8_t i = beatsin8( 27*SEGMENT.speed/255, borderWidth, cols - borderWidth); uint8_t j = beatsin8( 41*SEGMENT.speed/255, borderWidth, rows - borderWidth); @@ -6091,44 +6104,39 @@ uint16_t WS2812FX::mode_2DSwirl(void) { uint8_t nj = (cols - 1) - j; uint16_t ms = millis(); - uint8_t soundAgc = 0; - int16_t rawSampleAgc = 0, sample; - float sampleAvg = 0.0f; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - sampleAvg = *(float*) um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - rawSampleAgc = *(int16_t*)um_data->u_data[4]; - sample = *(int16_t*)um_data->u_data[3]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 224); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + int16_t sampleRaw = *(int16_t*)um_data->u_data[3]; + int16_t rawSampleAgc = *(int16_t*)um_data->u_data[4]; - int tmpSound = (soundAgc) ? rawSampleAgc : sample; + // printUmData(); - leds[XY( i, j)] += ColorFromPalette(currentPalette, (ms / 11 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 11, 200, 255); - leds[XY( j, i)] += ColorFromPalette(currentPalette, (ms / 13 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 13, 200, 255); - leds[XY(ni, nj)] += ColorFromPalette(currentPalette, (ms / 17 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 17, 200, 255); - leds[XY(nj, ni)] += ColorFromPalette(currentPalette, (ms / 29 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 29, 200, 255); - leds[XY( i, nj)] += ColorFromPalette(currentPalette, (ms / 37 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 37, 200, 255); - leds[XY(ni, j)] += ColorFromPalette(currentPalette, (ms / 41 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 41, 200, 255); + float tmpSound = (soundAgc) ? rawSampleAgc : sampleRaw; - setPixels(leds); + leds[XY( i, j)] += ColorFromPalette(strip.currentPalette, (ms / 11 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 11, 200, 255); + leds[XY( j, i)] += ColorFromPalette(strip.currentPalette, (ms / 13 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 13, 200, 255); + leds[XY(ni, nj)] += ColorFromPalette(strip.currentPalette, (ms / 17 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 17, 200, 255); + leds[XY(nj, ni)] += ColorFromPalette(strip.currentPalette, (ms / 29 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 29, 200, 255); + leds[XY( i, nj)] += ColorFromPalette(strip.currentPalette, (ms / 37 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 37, 200, 255); + leds[XY(ni, j)] += ColorFromPalette(strip.currentPalette, (ms / 41 + sampleAvg*4), tmpSound * SEGMENT.intensity / 64, LINEARBLEND); //CHSV( ms / 41, 200, 255); + + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DSwirl() -static const char *_data_FX_MODE_2DSWIRL PROGMEM = " ♪ 2D Swirl@!,Sensitivity=64,Blur;,Bg Swirl;!"; +static const char *_data_FX_MODE_2DSWIRL PROGMEM = "2D Swirl ♪@!,Sensitivity=64,Blur;,Bg Swirl;!;ssim=1"; // Beatsin ///////////////////////// // * 2D Waverly // ///////////////////////// // By: Stepko, https://editor.soulmatelights.com/gallery/652-wave , modified by Andrew Tuline -uint16_t WS2812FX::mode_2DWaverly(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DWaverly(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -6138,19 +6146,19 @@ uint16_t WS2812FX::mode_2DWaverly(void) { CRGB *leds = reinterpret_cast(SEGENV.data); if (SEGENV.call == 0) { - fill_solid(leds, CRGB::Black); + SEGMENT.fill_solid(leds, CRGB::Black); } um_data_t *um_data; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAvg = 0.0f; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - sampleAvg = *(float*) um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*) um_data->u_data[2]; + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { + // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fadeToBlackBy(leds, SEGMENT.speed); + SEGMENT.fadeToBlackBy(leds, SEGMENT.speed); long t = millis() / 2; for (uint16_t i = 0; i < cols; i++) { @@ -6163,17 +6171,18 @@ uint16_t WS2812FX::mode_2DWaverly(void) { uint16_t thisMax = map(thisVal, 0, 512, 0, rows); for (uint16_t j = 0; j < thisMax; j++) { - leds[XY(i, j)] += ColorFromPalette(currentPalette, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); - leds[XY((cols - 1) - i, (rows - 1) - j)] += ColorFromPalette(currentPalette, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); + leds[XY(i, j)] += ColorFromPalette(strip.currentPalette, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); + leds[XY((cols - 1) - i, (rows - 1) - j)] += ColorFromPalette(strip.currentPalette, map(j, 0, thisMax, 250, 0), 255, LINEARBLEND); } } - blur2d(leds, 16); + SEGMENT.blur2d(leds, 16); - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DWaverly() -static const char *_data_FX_MODE_2DWAVERLY PROGMEM = " ♪ 2D Waverly@Amplification,Sensitivity=64;;!"; +static const char *_data_FX_MODE_2DWAVERLY PROGMEM = "2D Waverly ♪@Amplification,Sensitivity=64;;!;ssim=1"; // Beatsin +#endif // WLED_DISABLE_2D // float version of map() static float mapf(float x, float in_min, float in_max, float out_min, float out_max){ @@ -6189,27 +6198,24 @@ typedef struct Gravity { /////////////////////// // * GRAVCENTER // /////////////////////// -uint16_t WS2812FX::mode_gravcenter(void) { // Gravcenter. By Andrew Tuline. +uint16_t mode_gravcenter(void) { // Gravcenter. By Andrew Tuline. const uint16_t dataSize = sizeof(gravity); if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Gravity* gravcen = reinterpret_cast(SEGENV.data); um_data_t *um_data; - float tmpSound = (float)inoise8(23333); // I have no idea what that does - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - //soundAgc = *(uint8_t*)um_data->u_data[1]; - //sampleAgc = *(float*)um_data->u_data[2]; - //sampleAvg = *(float*)um_data->u_data[0]; - tmpSound = *(uint8_t*)um_data->u_data[1] ? *(float*)um_data->u_data[2] : *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - tmpSound = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - //tmpSound = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fade_out(240); + float tmpSound = (soundAgc) ? sampleAgc : sampleAvg; + + SEGMENT.fade_out(240); float segmentSampleAvg = tmpSound * (float)SEGMENT.intensity / 255.0f; segmentSampleAvg *= 0.125; // divide by 8, to compensate for later "sensitivty" upscaling @@ -6220,8 +6226,8 @@ uint16_t WS2812FX::mode_gravcenter(void) { // Gravcenter. By Andr for (int i=0; i= gravcen->topLED) @@ -6230,41 +6236,40 @@ uint16_t WS2812FX::mode_gravcenter(void) { // Gravcenter. By Andr gravcen->topLED--; if (gravcen->topLED >= 0) { - setPixelColor(gravcen->topLED+SEGLEN/2, color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); - setPixelColor(SEGLEN/2-1-gravcen->topLED, color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(gravcen->topLED+SEGLEN/2, SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(SEGLEN/2-1-gravcen->topLED, SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); } gravcen->gravityCounter = (gravcen->gravityCounter + 1) % gravity; return FRAMETIME; } // mode_gravcenter() -static const char *_data_FX_MODE_GRAVCENTER PROGMEM = " ♪ Gravcenter@Rate of fall,Sensitivity=128;,!;!"; +static const char *_data_FX_MODE_GRAVCENTER PROGMEM = "Gravcenter ♪@Rate of fall,Sensitivity=128;,!;!;mp12=2,ssim=1"; // Circle, Beatsin /////////////////////// // * GRAVCENTRIC // /////////////////////// -uint16_t WS2812FX::mode_gravcentric(void) { // Gravcentric. By Andrew Tuline. +uint16_t mode_gravcentric(void) { // Gravcentric. By Andrew Tuline. uint16_t dataSize = sizeof(gravity); if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Gravity* gravcen = reinterpret_cast(SEGENV.data); um_data_t *um_data; - float tmpSound = (float)inoise8(23333); // I have no idea what that does - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - //soundAgc = *(uint8_t*)um_data->u_data[1]; - //sampleAgc = *(float*)um_data->u_data[2]; - //sampleAvg = *(float*)um_data->u_data[0]; - tmpSound = *(uint8_t*)um_data->u_data[1] ? *(float*)um_data->u_data[2] : *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - tmpSound = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - //tmpSound = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fade_out(240); - fade_out(240); // twice? really? + // printUmData(); + + float tmpSound = (soundAgc) ? sampleAgc : sampleAvg; + + SEGMENT.fade_out(240); + SEGMENT.fade_out(240); // twice? really? float segmentSampleAvg = tmpSound * (float)SEGMENT.intensity / 255.0; segmentSampleAvg *= 0.125f; // divide by 8, to compensate for later "sensitivty" upscaling @@ -6275,8 +6280,8 @@ uint16_t WS2812FX::mode_gravcentric(void) { // Gravcentric. for (int i=0; i= gravcen->topLED) @@ -6285,41 +6290,37 @@ uint16_t WS2812FX::mode_gravcentric(void) { // Gravcentric. gravcen->topLED--; if (gravcen->topLED >= 0) { - setPixelColor(gravcen->topLED+SEGLEN/2, CRGB::Gray); - setPixelColor(SEGLEN/2-1-gravcen->topLED, CRGB::Gray); + SEGMENT.setPixelColor(gravcen->topLED+SEGLEN/2, CRGB::Gray); + SEGMENT.setPixelColor(SEGLEN/2-1-gravcen->topLED, CRGB::Gray); } gravcen->gravityCounter = (gravcen->gravityCounter + 1) % gravity; return FRAMETIME; } // mode_gravcentric() -static const char *_data_FX_MODE_GRAVCENTRIC PROGMEM = " ♪ Gravcentric@Rate of fall,Sensitivity=128;!;!"; +static const char *_data_FX_MODE_GRAVCENTRIC PROGMEM = "Gravcentric ♪@Rate of fall,Sensitivity=128;!;!;mp12=2,ssim=1"; // Circle, Beatsin /////////////////////// // * GRAVIMETER // /////////////////////// -#ifndef SR_DEBUG_AGC -uint16_t WS2812FX::mode_gravimeter(void) { // Gravmeter. By Andrew Tuline. +uint16_t mode_gravimeter(void) { // Gravmeter. By Andrew Tuline. uint16_t dataSize = sizeof(gravity); if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Gravity* gravcen = reinterpret_cast(SEGENV.data); um_data_t *um_data; - float tmpSound = (float)inoise8(23333); // I have no idea what that does - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - //soundAgc = *(uint8_t*)um_data->u_data[1]; - //sampleAgc = *(float*)um_data->u_data[2]; - //sampleAvg = *(float*)um_data->u_data[0]; - tmpSound = *(uint8_t*)um_data->u_data[1] ? *(float*)um_data->u_data[2] : *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - tmpSound = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - //tmpSound = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fade_out(240); + float tmpSound = (soundAgc) ? sampleAgc : sampleAvg; + + SEGMENT.fade_out(240); float segmentSampleAvg = tmpSound * (float)SEGMENT.intensity / 255.0; segmentSampleAvg *= 0.25; // divide by 4, to compensate for later "sensitivty" upscaling @@ -6330,7 +6331,7 @@ uint16_t WS2812FX::mode_gravimeter(void) { // Gravmeter. By Andre for (int i=0; i= gravcen->topLED) @@ -6339,170 +6340,85 @@ uint16_t WS2812FX::mode_gravimeter(void) { // Gravmeter. By Andre gravcen->topLED--; if (gravcen->topLED > 0) { - setPixelColor(gravcen->topLED, color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(gravcen->topLED, SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); } gravcen->gravityCounter = (gravcen->gravityCounter + 1) % gravity; return FRAMETIME; } // mode_gravimeter() -static const char *_data_FX_MODE_GRAVIMETER PROGMEM = " ♪ Gravimeter@Rate of fall,Sensitivity=128;,!;!"; -#else -// This an abuse of the gravimeter effect for AGC debugging -// instead of sound volume, it uses the AGC gain multiplier as input -uint16_t WS2812FX::mode_gravimeter(void) { // Gravmeter. By Andrew Tuline. - - uint16_t dataSize = sizeof(gravity); - if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed - Gravity* gravcen = reinterpret_cast(SEGENV.data); - - uint8_t *inputLevel = (uint8_t*)(&SEGENV.aux1+1); - um_data_t *um_data; - uint16_t sample = 0; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAgv = 0.0f, multAgc = 0.0f, sampleReal = 0.0f; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - sample = *(uint16_t*)um_data->u_data[3]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - multAgc = *(float*)um_data->u_data[11]; - sampleReal = *(float*)um_data->u_data[12]; - sampleGain = *(float*)um_data->u_data[13]; - inputLevel = (uint8_t*)um_data->u_data[17]; - } - - fade_out(240); - - //TODO: implement inputLevel as a global or slider - *inputLevel = SEGMENT.custom1; - - float tmpSound = multAgc; // AGC gain - if (soundAgc == 0) { - if ((sampleAvg> 1.0f) && (sampleReal > 0.05f)) - tmpSound = (float)sample / sampleReal; // current non-AGC gain - else - tmpSound = ((float)sampleGain/40.0f * (float)*inputLevel/128.0f) + 1.0f/16.0f; // non-AGC gain from presets - } - - if (tmpSound > 2) tmpSound = ((tmpSound -2.0f) / 2) +2; //compress ranges > 2 - if (tmpSound > 1) tmpSound = ((tmpSound -1.0f) / 2) +1; //compress ranges > 1 - - float segmentSampleAvg = 64.0f * tmpSound * (float)SEGMENT.intensity / 128.0f; - float mySampleAvg = mapf(segmentSampleAvg, 0.0f, 128.0f, 0, (SEGLEN-1)); // map to pixels availeable in current segment - int tempsamp = constrain(mySampleAvg, 0, SEGLEN-1); // Keep the sample from overflowing. - - //tempsamp = SEGLEN - tempsamp; // uncomment to invert direction - segmentSampleAvg = fmax(64.0f - fmin(segmentSampleAvg, 63),8); // inverted brightness - - uint8_t gravity = 8 - SEGMENT.speed/32; - - if (sampleAvg > 1) // disable bar "body" if below squelch - { - for (int i=0; i= gravcen->topLED) - gravcen->topLED = tempsamp; - else if (gravcen->gravityCounter % gravity == 0) - gravcen->topLED--; - - if (gravcen->topLED > 0) { - setPixelColor(gravcen->topLED, color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0)); - } - gravcen->gravityCounter = (gravcen->gravityCounter + 1) % gravity; - - return FRAMETIME; -} // mode_gravimeter() -static const char *_data_FX_MODE_GRAVIMETER PROGMEM = " ♪ Gravimeter@Rate of fall,Sensitivity=128,Input level=128;,!;!"; -#endif +static const char *_data_FX_MODE_GRAVIMETER PROGMEM = "Gravimeter ♪@Rate of fall,Sensitivity=128;,!;!;mp12=2,ssim=1"; // Circle, Beatsin ////////////////////// // * JUGGLES // ////////////////////// -uint16_t WS2812FX::mode_juggles(void) { // Juggles. By Andrew Tuline. +uint16_t mode_juggles(void) { // Juggles. By Andrew Tuline. um_data_t *um_data; - float sampleAgc = 0.0f; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - sampleAgc = *(float*)um_data->u_data[2]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sampleAgc = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - //sampleAgc = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAgc = *(float*)um_data->u_data[2]; - fade_out(224); + SEGMENT.fade_out(224); uint16_t my_sampleAgc = fmax(fmin(sampleAgc, 255.0), 0); - for (uint8_t i=0; iu_data[1]; - rawSampleAgc = *(int16_t*)um_data->u_data[4]; - sample = *(int16_t*)um_data->u_data[3]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + int16_t sampleRaw = *(int16_t*)um_data->u_data[3]; + int16_t rawSampleAgc = *(int16_t*)um_data->u_data[4]; - if (SEGENV.call == 0) fill(BLACK); + if (SEGENV.call == 0) SEGMENT.fill(BLACK); uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; if(SEGENV.aux0 != secondHand) { SEGENV.aux0 = secondHand; - uint8_t tmpSound = (soundAgc) ? rawSampleAgc : sample; + uint8_t tmpSound = (soundAgc) ? rawSampleAgc : sampleRaw; int pixBri = tmpSound * SEGMENT.intensity / 64; - for (uint16_t i=0; iu_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fade_out(SEGMENT.speed); - fade_out(SEGMENT.speed); + SEGMENT.fade_out(SEGMENT.speed); + SEGMENT.fade_out(SEGMENT.speed); float tmpSound = (soundAgc) ? sampleAgc : sampleAvg; float tmpSound2 = tmpSound * (float)SEGMENT.intensity / 256.0; // Too sensitive. @@ -6513,7 +6429,7 @@ uint16_t WS2812FX::mode_midnoise(void) { // Midnoise. By Andrew for (int i=(SEGLEN/2-maxLen); i<(SEGLEN/2+maxLen); i++) { uint8_t index = inoise8(i*tmpSound+SEGENV.aux0, SEGENV.aux1+i*tmpSound); // Get a value from the noise function. I'm using both x and y axis. - setPixelColor(i, color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); } SEGENV.aux0=SEGENV.aux0+beatsin8(5,0,10); @@ -6521,32 +6437,27 @@ uint16_t WS2812FX::mode_midnoise(void) { // Midnoise. By Andrew return FRAMETIME; } // mode_midnoise() -static const char *_data_FX_MODE_MIDNOISE PROGMEM = " ♪ Midnoise@Fade rate,Maximum length=128;,!;!"; +static const char *_data_FX_MODE_MIDNOISE PROGMEM = "Midnoise ♪@Fade rate,Maximum length=128;,!;!;mp12=2,ssim=1"; // Circle, Beatsin ////////////////////// // * NOISEFIRE // ////////////////////// // I am the god of hellfire. . . Volume (only) reactive fire routine. Oh, look how short this is. -uint16_t WS2812FX::mode_noisefire(void) { // Noisefire. By Andrew Tuline. - currentPalette = CRGBPalette16(CHSV(0,255,2), CHSV(0,255,4), CHSV(0,255,8), CHSV(0, 255, 8), // Fire palette definition. Lower value = darker. +uint16_t mode_noisefire(void) { // Noisefire. By Andrew Tuline. + strip.currentPalette = CRGBPalette16(CHSV(0,255,2), CHSV(0,255,4), CHSV(0,255,8), CHSV(0, 255, 8), // Fire palette definition. Lower value = darker. CHSV(0, 255, 16), CRGB::Red, CRGB::Red, CRGB::Red, CRGB::DarkOrange,CRGB::DarkOrange, CRGB::Orange, CRGB::Orange, CRGB::Yellow, CRGB::Orange, CRGB::Yellow, CRGB::Yellow); um_data_t *um_data; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAvg = 0.0f; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; for (uint16_t i = 0; i < SEGLEN; i++) { uint16_t index = inoise8(i*SEGMENT.speed/64,millis()*SEGMENT.speed/64*SEGLEN/255); // X location is constant, but we move along the Y at the rate of millis(). By Andrew Tuline. @@ -6554,43 +6465,35 @@ uint16_t WS2812FX::mode_noisefire(void) { // Noisefire. By Andre // This is a simple y=mx+b equation that's been scaled. index/128 is another scaling. uint8_t tmpSound = (soundAgc) ? sampleAgc : sampleAvg; - CRGB color = ColorFromPalette(currentPalette, index, tmpSound*2, LINEARBLEND); // Use the my own palette. - setPixelColor(i, color); + CRGB color = ColorFromPalette(strip.currentPalette, index, tmpSound*2, LINEARBLEND); // Use the my own palette. + SEGMENT.setPixelColor(i, color); } return FRAMETIME; } // mode_noisefire() -static const char *_data_FX_MODE_NOISEFIRE PROGMEM = " ♪ Noisefire@!,!;;"; +static const char *_data_FX_MODE_NOISEFIRE PROGMEM = "Noisefire ♪@!,!;;;mp12=2,ssim=1"; // Circle, Beatsin /////////////////////// // * Noisemeter // /////////////////////// -uint16_t WS2812FX::mode_noisemeter(void) { // Noisemeter. By Andrew Tuline. +uint16_t mode_noisemeter(void) { // Noisemeter. By Andrew Tuline. um_data_t *um_data; - uint8_t soundAgc = 0; - int16_t rawSampleAgc = 0, sample; - float sampleAgc = 0.0f, sampleAvg; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - rawSampleAgc = *(int16_t*)um_data->u_data[4]; - sample = *(int16_t*)um_data->u_data[3]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 255); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; + int16_t sampleRaw = *(int16_t*)um_data->u_data[3]; + int16_t rawSampleAgc = *(int16_t*)um_data->u_data[4]; uint8_t fadeRate = map(SEGMENT.speed,0,255,224,255); - fade_out(fadeRate); + SEGMENT.fade_out(fadeRate); - float tmpSound = (soundAgc) ? rawSampleAgc : sample; + float tmpSound = (soundAgc) ? rawSampleAgc : sampleRaw; float tmpSound2 = tmpSound * 2.0 * (float)SEGMENT.intensity / 255.0; int maxLen = mapf(tmpSound2, 0, 255, 0, SEGLEN); // map to pixels availeable in current segment // Still a bit too sensitive. if (maxLen >SEGLEN) maxLen = SEGLEN; @@ -6598,7 +6501,7 @@ uint16_t WS2812FX::mode_noisemeter(void) { // Noisemeter. By Andr tmpSound = soundAgc ? sampleAgc : sampleAvg; // now use smoothed value (sampleAvg or sampleAgc) for (int i=0; iu_data[1]; - rawSampleAgc = *(int16_t*)um_data->u_data[4]; - sample = *(int16_t*)um_data->u_data[3]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + int16_t sampleRaw = *(int16_t*)um_data->u_data[3]; + int16_t rawSampleAgc = *(int16_t*)um_data->u_data[4]; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 16; if(SEGENV.aux0 != secondHand) { SEGENV.aux0 = secondHand; - uint8_t tmpSound = (soundAgc) ? rawSampleAgc : sample; + uint8_t tmpSound = (soundAgc) ? rawSampleAgc : sampleRaw; int pixBri = tmpSound * SEGMENT.intensity / 64; - setPixelColor(SEGLEN/2, color_blend(SEGCOLOR(1), color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri)); + SEGMENT.setPixelColor(SEGLEN/2, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(millis(), false, PALETTE_SOLID_WRAP, 0), pixBri)); - for (uint16_t i=SEGLEN-1; i>SEGLEN/2; i--) setPixelColor(i, getPixelColor(i-1)); // Move to the right. - for (uint16_t i=0; iSEGLEN/2; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); // Move to the right. + for (uint16_t i=0; i(SEGENV.data); um_data_t *um_data; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAvg; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; - fade_out(64); + SEGMENT.fade_out(64); plasmoip->thisphase += beatsin8(6,-4,4); // You can change direction and speed individually. plasmoip->thatphase += beatsin8(7,-4,4); // Two phase values to make a complex pattern. By Andrew Tuline. @@ -6688,42 +6581,33 @@ uint16_t WS2812FX::mode_plasmoid(void) { // Plasmoid. By Andrew int tmpSound = (soundAgc) ? sampleAgc : sampleAvg; if (tmpSound * SEGMENT.intensity / 64 < thisbright) {thisbright = 0;} - setPixelColor(i, color_add(getPixelColor(i), color_blend(SEGCOLOR(1), color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0), thisbright))); + SEGMENT.setPixelColor(i, color_add(SEGMENT.getPixelColor(i), color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0), thisbright))); } return FRAMETIME; } // mode_plasmoid() -static const char *_data_FX_MODE_PLASMOID PROGMEM = " ♪ Plasmoid@Phase=128,# of pixels=128;,!;!"; +static const char *_data_FX_MODE_PLASMOID PROGMEM = "Plasmoid ♪@Phase=128,# of pixels=128;,!;!;mp12=0,ssim=1"; // Pixels, Beatsin /////////////////////// // * PUDDLEPEAK // /////////////////////// // Andrew's crappy peak detector. If I were 40+ years younger, I'd learn signal processing. -uint16_t WS2812FX::mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline. +uint16_t mode_puddlepeak(void) { // Puddlepeak. By Andrew Tuline. uint16_t size = 0; uint8_t fadeVal = map(SEGMENT.speed,0,255, 224, 255); uint16_t pos = random(SEGLEN); // Set a random starting position. - uint8_t *binNum, *maxVol; - uint8_t samplePeak = 0; - float sampleAgc = 0.0f; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - sampleAgc = *(float*)um_data->u_data[2]; - binNum = (uint8_t*)um_data->u_data[10]; - maxVol = (uint8_t*)um_data->u_data[9]; - samplePeak = *(uint8_t*)um_data->u_data[5]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - samplePeak = random8() > 250; - sampleAgc = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); - //sampleAgc = mapf(sampleAvg, 0, 255, 0, 255); // help me out here - maxVol = (uint8_t*)&SEGENV.aux0; - binNum = (uint8_t*)&SEGENV.aux1; + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAgc = *(float*) um_data->u_data[2]; + uint8_t samplePeak = *(uint8_t*)um_data->u_data[5]; + uint8_t *maxVol = (uint8_t*)um_data->u_data[9]; + uint8_t *binNum = (uint8_t*)um_data->u_data[10]; if (SEGENV.call == 0) { SEGMENT.custom2 = *binNum; @@ -6733,7 +6617,7 @@ uint16_t WS2812FX::mode_puddlepeak(void) { // Puddlepeak. By Andr *binNum = SEGMENT.custom2; // Select a bin. *maxVol = SEGMENT.custom3/4; // Our volume comparator. - fade_out(fadeVal); + SEGMENT.fade_out(fadeVal); if (samplePeak == 1) { size = sampleAgc * SEGMENT.intensity /256 /4 + 1; // Determine size of the flash based on the volume. @@ -6741,39 +6625,34 @@ uint16_t WS2812FX::mode_puddlepeak(void) { // Puddlepeak. By Andr } for (uint16_t i=0; iu_data[1]; - rawSampleAgc = *(int16_t*)um_data->u_data[4]; - sample = *(int16_t*)um_data->u_data[3]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - sample = inoise8(beatsin8(120, 10, 30)*10 + (ms>>14), ms>>3); - sample = map(sample, 50, 190, 0, 255); + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + int16_t sampleRaw = *(int16_t*)um_data->u_data[3]; + int16_t rawSampleAgc = *(int16_t*)um_data->u_data[4]; - uint16_t tmpSound = (soundAgc) ? rawSampleAgc : sample; + uint16_t tmpSound = (soundAgc) ? rawSampleAgc : sampleRaw; if (tmpSound > 1) { size = tmpSound * SEGMENT.intensity /256 /8 + 1; // Determine size of the flash based on the volume. @@ -6781,12 +6660,12 @@ uint16_t WS2812FX::mode_puddles(void) { // Puddles. By Andrew } for(uint16_t i=0; iu_data[8]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; if (!fftResult) return mode_static(); if (SEGENV.call == 0) { - fill(BLACK); + SEGMENT.fill(BLACK); SEGENV.aux0 = 0; } - fade_out(SEGMENT.speed); + SEGMENT.fade_out(SEGMENT.speed); uint16_t segLoc = random16(SEGLEN); - setPixelColor(segLoc, color_blend(SEGCOLOR(1), color_from_palette(fftResult[SEGENV.aux0], false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0])); + SEGMENT.setPixelColor(segLoc, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(fftResult[SEGENV.aux0], false, PALETTE_SOLID_WRAP, 0), 2*fftResult[SEGENV.aux0])); ++(SEGENV.aux0) %= 16; // make sure it doesn't cross 16 - blur(SEGMENT.intensity); + SEGMENT.blur(SEGMENT.intensity); return FRAMETIME; } // mode_blurz() -static const char *_data_FX_MODE_BLURZ PROGMEM = " ♫ Blurz@Fade rate,Blur amount;!,Color mix;!"; +static const char *_data_FX_MODE_BLURZ PROGMEM = "Blurz ♫@Fade rate,Blur amount;!,Color mix;!;mp12=0,ssim=1"; // Pixels, Beatsin ///////////////////////// // ** DJLight // ///////////////////////// -uint16_t WS2812FX::mode_DJLight(void) { // Written by ??? Adapted by Will Tatam. +uint16_t mode_DJLight(void) { // Written by ??? Adapted by Will Tatam. const int NUM_LEDS = SEGLEN; // aka SEGLEN const int mid = NUM_LEDS / 2; @@ -6954,13 +6831,12 @@ uint16_t WS2812FX::mode_DJLight(void) { // Written by ??? Adap if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed CRGB *leds = reinterpret_cast(SEGENV.data); - uint8_t *fftResult = nullptr; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - fftResult = (uint8_t*)um_data->u_data[8]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; if (!fftResult) return mode_static(); uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64; @@ -6973,42 +6849,37 @@ uint16_t WS2812FX::mode_DJLight(void) { // Written by ??? Adap for (int i = NUM_LEDS - 1; i > mid; i--) leds[i] = leds[i - 1]; //move to the left for (int i = 0; i < mid; i++) leds[i] = leds[i + 1]; // move to the right - for (uint16_t i=0; iu_data[6]; - FFT_Magnitude = *(float*)um_data->u_data[7]; - sampleAvg = *(float*)um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - multAgc = *(float*)um_data->u_data[11]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; + float FFT_Magnitude = *(float*) um_data->u_data[7]; + float multAgc = *(float*) um_data->u_data[11]; float my_magnitude = FFT_Magnitude / 4.0; if (soundAgc) my_magnitude *= multAgc; if (sampleAvg < 1 ) my_magnitude = 0.001; // noise gate closed - mute - fade_out(SEGMENT.speed); + SEGMENT.fade_out(SEGMENT.speed); uint16_t locn = (log10f((float)FFT_MajorPeak) - 1.78f) * (float)SEGLEN/(3.71f-1.78f); // log10 frequency range is from 1.78 to 3.71. Let's scale to SEGLEN. @@ -7016,26 +6887,24 @@ uint16_t WS2812FX::mode_freqmap(void) { // Map FFT_MajorPeak t uint16_t pixCol = (log10f(FFT_MajorPeak) - 1.78f) * 255.0f/(3.71f-1.78f); // Scale log10 of frequency values to the 255 colour index. uint16_t bright = (int)my_magnitude; - setPixelColor(locn, color_blend(SEGCOLOR(1), color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), bright)); + SEGMENT.setPixelColor(locn, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), bright)); return FRAMETIME; } // mode_freqmap() -static const char *_data_FX_MODE_FREQMAP PROGMEM = " ♫ Freqmap@Fade rate,Starting color;,!;!"; +static const char *_data_FX_MODE_FREQMAP PROGMEM = "Freqmap ♫@Fade rate,Starting color;,!;!;mp12=2,ssim=1"; // Circle, Beatsin /////////////////////// // ** Freqmatrix // /////////////////////// -uint16_t WS2812FX::mode_freqmatrix(void) { // Freqmatrix. By Andreas Pleschung. - float FFT_MajorPeak = 0.0; - float sampleAgc = 0.0f; +uint16_t mode_freqmatrix(void) { // Freqmatrix. By Andreas Pleschung. um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - FFT_MajorPeak = *(float*)um_data->u_data[6]; - sampleAgc = *(float*)um_data->u_data[2]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAgc = *(float*)um_data->u_data[2]; + float FFT_MajorPeak = *(float*)um_data->u_data[6]; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; if(SEGENV.aux0 != secondHand) { @@ -7066,13 +6935,13 @@ uint16_t WS2812FX::mode_freqmatrix(void) { // Freqmatrix. By Andr } // shift the pixels one pixel up - for (uint16_t i = SEGLEN-1; i > 0; i--) setPixelColor(i, getPixelColor(i-1)); - setPixelColor(0, color); + for (uint16_t i = SEGLEN-1; i > 0; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); + SEGMENT.setPixelColor(0, color); } return FRAMETIME; } // mode_freqmatrix() -static const char *_data_FX_MODE_FREQMATRIX PROGMEM = " ♫ Freqmatrix@Time delay,Sound effect,Low bin,High bin,Sensivity;;"; +static const char *_data_FX_MODE_FREQMATRIX PROGMEM = "Freqmatrix ♫@Time delay,Sound effect,Low bin,High bin,Sensivity;;;mp12=0,ssim=1"; // Pixels, Beatsin ////////////////////// @@ -7082,39 +6951,34 @@ static const char *_data_FX_MODE_FREQMATRIX PROGMEM = " ♫ Freqmatrix@Time dela // End frequency = 5120 Hz and lo10(5120) = 3.71 // SEGMENT.speed select faderate // SEGMENT.intensity select colour index -uint16_t WS2812FX::mode_freqpixels(void) { // Freqpixel. By Andrew Tuline. - float FFT_MajorPeak = 0.0; - float FFT_Magnitude = 0.0; - uint8_t soundAgc = 0; - float sampleAvg = 0.0f; - float multAgc = 0.0f; +uint16_t mode_freqpixels(void) { // Freqpixel. By Andrew Tuline. um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - FFT_MajorPeak = *(float*)um_data->u_data[6]; - FFT_Magnitude = *(float*)um_data->u_data[7]; - sampleAvg = *(float*)um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - multAgc = *(float*)um_data->u_data[11]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; + float FFT_Magnitude = *(float*) um_data->u_data[7]; + float multAgc = *(float*) um_data->u_data[11]; float my_magnitude = FFT_Magnitude / 16.0; if (soundAgc) my_magnitude *= multAgc; if (sampleAvg < 1 ) my_magnitude = 0.001; // noise gate closed - mute uint16_t fadeRate = 2*SEGMENT.speed - SEGMENT.speed*SEGMENT.speed/255; // Get to 255 as quick as you can. - fade_out(fadeRate); + SEGMENT.fade_out(fadeRate); for (int i=0; i < SEGMENT.intensity/32+1; i++) { uint16_t locn = random16(0,SEGLEN); uint8_t pixCol = (log10f(FFT_MajorPeak) - 1.78) * 255.0/(3.71-1.78); // Scale log10 of frequency values to the 255 colour index. - setPixelColor(locn, color_blend(SEGCOLOR(1), color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), (int)my_magnitude)); + SEGMENT.setPixelColor(locn, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(SEGMENT.intensity+pixCol, false, PALETTE_SOLID_WRAP, 0), (int)my_magnitude)); } return FRAMETIME; } // mode_freqpixels() -static const char *_data_FX_MODE_FREQPIXELS PROGMEM = " ♫ Freqpixels@Fade rate,Starting colour and # of pixels;;"; +static const char *_data_FX_MODE_FREQPIXELS PROGMEM = "Freqpixels ♫@Fade rate,Starting colour and # of pixels;;;mp12=0,ssim=1"; // Pixels, Beatsin ////////////////////// @@ -7132,19 +6996,16 @@ static const char *_data_FX_MODE_FREQPIXELS PROGMEM = " ♫ Freqpixels@Fade rate // // As a compromise between speed and accuracy we are currently sampling with 10240Hz, from which we can then determine with a 512bin FFT our max frequency is 5120Hz. // Depending on the music stream you have you might find it useful to change the frequency mapping. -uint16_t WS2812FX::mode_freqwave(void) { // Freqwave. By Andreas Pleschung. - float FFT_MajorPeak = 0.0; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAvg = 0.0f; +uint16_t mode_freqwave(void) { // Freqwave. By Andreas Pleschung. um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - FFT_MajorPeak = *(float*)um_data->u_data[6]; - sampleAvg = *(float*)um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; uint8_t secondHand = micros()/(256-SEGMENT.speed)/500 % 16; if(SEGENV.aux0 != secondHand) { @@ -7179,42 +7040,38 @@ uint16_t WS2812FX::mode_freqwave(void) { // Freqwave. By Andrea color = CHSV(i, 240, (uint8_t)b); // implicit conversion to RGB supplied by FastLED } - setPixelColor(SEGLEN/2, color); + SEGMENT.setPixelColor(SEGLEN/2, color); // shift the pixels one pixel outwards - for (uint16_t i = SEGLEN-1; i > SEGLEN/2; i--) setPixelColor(i, getPixelColor(i-1)); // Move to the right. - for (uint16_t i = 0; i < SEGLEN/2; i++) setPixelColor(i, getPixelColor(i+1)); // Move to the left. + for (uint16_t i = SEGLEN-1; i > SEGLEN/2; i--) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i-1)); // Move to the right. + for (uint16_t i = 0; i < SEGLEN/2; i++) SEGMENT.setPixelColor(i, SEGMENT.getPixelColor(i+1)); // Move to the left. } return FRAMETIME; } // mode_freqwave() -static const char *_data_FX_MODE_FREQWAVE PROGMEM = " ♫ Freqwave@Time delay,Sound effect,Low bin,High bin,Pre-amp;;"; +static const char *_data_FX_MODE_FREQWAVE PROGMEM = "Freqwave ♫@Time delay,Sound effect,Low bin,High bin,Pre-amp;;;mp12=2,ssim=1"; // Circle, Beatsin /////////////////////// // ** Gravfreq // /////////////////////// -uint16_t WS2812FX::mode_gravfreq(void) { // Gravfreq. By Andrew Tuline. +uint16_t mode_gravfreq(void) { // Gravfreq. By Andrew Tuline. uint16_t dataSize = sizeof(gravity); if (!SEGENV.allocateData(dataSize)) return mode_static(); //allocation failed Gravity* gravcen = reinterpret_cast(SEGENV.data); um_data_t *um_data; - uint8_t soundAgc = 0; - float sampleAgc = 0.0f, sampleAvg = 0.0f; - float FFT_MajorPeak = 0.0; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - FFT_MajorPeak = *(float*)um_data->u_data[6]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - sampleAgc = *(float*)um_data->u_data[2]; - sampleAvg = *(float*)um_data->u_data[0]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - sampleAvg = inoise8(12345); // I have no idea what that does + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float sampleAgc = *(float*) um_data->u_data[2]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; - fade_out(240); + SEGMENT.fade_out(240); float tmpSound = (soundAgc) ? sampleAgc : sampleAvg; float segmentSampleAvg = tmpSound * (float)SEGMENT.intensity / 255.0; @@ -7228,8 +7085,8 @@ uint16_t WS2812FX::mode_gravfreq(void) { // Gravfreq. By Andrew uint8_t index = (log10((int)FFT_MajorPeak) - (3.71-1.78)) * 255; //int? shouldn't it be floor() or similar - setPixelColor(i+SEGLEN/2, color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); - setPixelColor(SEGLEN/2-i-1, color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(i+SEGLEN/2, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColor(SEGLEN/2-i-1, SEGMENT.color_from_palette(index, false, PALETTE_SOLID_WRAP, 0)); } if (tempsamp >= gravcen->topLED) @@ -7238,64 +7095,58 @@ uint16_t WS2812FX::mode_gravfreq(void) { // Gravfreq. By Andrew gravcen->topLED--; if (gravcen->topLED >= 0) { - setPixelColor(gravcen->topLED+SEGLEN/2, CRGB::Gray); - setPixelColor(SEGLEN/2-1-gravcen->topLED, CRGB::Gray); + SEGMENT.setPixelColor(gravcen->topLED+SEGLEN/2, CRGB::Gray); + SEGMENT.setPixelColor(SEGLEN/2-1-gravcen->topLED, CRGB::Gray); } gravcen->gravityCounter = (gravcen->gravityCounter + 1) % gravity; return FRAMETIME; } // mode_gravfreq() -static const char *_data_FX_MODE_GRAVFREQ PROGMEM = " ♫ Gravfreq@Rate of fall,Sensivity=128;,!;!"; +static const char *_data_FX_MODE_GRAVFREQ PROGMEM = "Gravfreq ♫@Rate of fall,Sensivity=128;,!;!;mp12=2,ssim=1"; // Circle, Beatsin ////////////////////// // ** Noisemove // ////////////////////// -uint16_t WS2812FX::mode_noisemove(void) { // Noisemove. By: Andrew Tuline - uint8_t *fftResult = nullptr; +uint16_t mode_noisemove(void) { // Noisemove. By: Andrew Tuline um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - fftResult = (uint8_t*)um_data->u_data[8]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; if (!fftResult) return mode_static(); - fade_out(224); // Just in case something doesn't get faded. + SEGMENT.fade_out(224); // Just in case something doesn't get faded. uint8_t numBins = map(SEGMENT.intensity,0,255,0,16); // Map slider to fftResult bins. for (int i=0; iu_data[6]; - FFT_Magnitude = *(float*)um_data->u_data[7]; - sampleAvg = *(float*)um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - multAgc = *(float*)um_data->u_data[11]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; + float FFT_Magnitude = *(float*) um_data->u_data[7]; + float multAgc = *(float*) um_data->u_data[11]; - fade_out(128); // Just in case something doesn't get faded. + SEGMENT.fade_out(128); // Just in case something doesn't get faded. float frTemp = FFT_MajorPeak; uint8_t octCount = 0; // Octave counter. @@ -7317,45 +7168,33 @@ uint16_t WS2812FX::mode_rocktaves(void) { // Rocktaves. Same not // leds[beatsin8(8+octCount*4,0,SEGLEN-1,0,octCount*8)] += CHSV((uint8_t)frTemp,255,volTemp); // Back and forth with different frequencies and phase shift depending on current octave. uint16_t i = map(beatsin8(8+octCount*4, 0, 255, 0, octCount*8), 0, 255, 0, SEGLEN-1); - setPixelColor(i, color_add(getPixelColor(i),color_blend(SEGCOLOR(1), color_from_palette((uint8_t)frTemp, false, PALETTE_SOLID_WRAP, 0), volTemp))); + SEGMENT.setPixelColor(i, color_add(SEGMENT.getPixelColor(i),color_blend(SEGCOLOR(1), SEGMENT.color_from_palette((uint8_t)frTemp, false, PALETTE_SOLID_WRAP, 0), volTemp))); return FRAMETIME; } // mode_rocktaves() -static const char *_data_FX_MODE_ROCKTAVES PROGMEM = " ♫ Rocktaves@;,!;!"; +static const char *_data_FX_MODE_ROCKTAVES PROGMEM = "Rocktaves ♫@;,!;!;mp12=0,ssim=1"; // Pixels, Beatsin /////////////////////// // ** Waterfall // /////////////////////// // Combines peak detection with FFT_MajorPeak and FFT_Magnitude. -uint16_t WS2812FX::mode_waterfall(void) { // Waterfall. By: Andrew Tuline - if (SEGENV.call == 0) fill(BLACK); +uint16_t mode_waterfall(void) { // Waterfall. By: Andrew Tuline + if (SEGENV.call == 0) SEGMENT.fill(BLACK); - uint8_t *binNum, *maxVol; - uint8_t samplePeak = 0; - float FFT_MajorPeak = 0.0; - float FFT_Magnitude = 0.0; - uint8_t soundAgc = 0; - float sampleAvg = 0.0f; - float multAgc = 0.0f; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - maxVol = (uint8_t*)um_data->u_data[9]; - samplePeak = *(uint8_t*)um_data->u_data[5]; - binNum = (uint8_t*)um_data->u_data[10]; - FFT_MajorPeak = *(float*)um_data->u_data[6]; - FFT_Magnitude = *(float*)um_data->u_data[7]; - sampleAvg = *(float*)um_data->u_data[0]; - soundAgc = *(uint8_t*)um_data->u_data[1]; - multAgc = *(float*)um_data->u_data[11]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data - uint32_t ms = millis(); - binNum = (uint8_t*) &SEGENV.aux1; - maxVol = (uint8_t*)(&SEGENV.aux1+1); - samplePeak = random8() > 250; - sampleAvg = inoise8(beatsin8(90, 0, 200)*15 + (ms>>10), ms>>3); + um_data = simulateSound(SEGMENT.soundSim); } + float sampleAvg = *(float*) um_data->u_data[0]; + uint8_t soundAgc = *(uint8_t*)um_data->u_data[1]; + uint8_t samplePeak = *(uint8_t*)um_data->u_data[5]; + float FFT_MajorPeak = *(float*) um_data->u_data[6]; + float FFT_Magnitude = *(float*) um_data->u_data[7]; + uint8_t *maxVol = (uint8_t*)um_data->u_data[9]; + uint8_t *binNum = (uint8_t*)um_data->u_data[10]; + float multAgc = *(float*) um_data->u_data[11]; if (SEGENV.call == 0) { SEGENV.aux0 = 255; @@ -7363,8 +7202,8 @@ uint16_t WS2812FX::mode_waterfall(void) { // Waterfall. By: An SEGMENT.custom3 = *maxVol * 2; } - *binNum = SEGMENT.custom2; // Select a bin. - *maxVol = SEGMENT.custom3/2; // Our volume comparator. + *binNum = SEGMENT.custom2; // Select a bin. + *maxVol = SEGMENT.custom3/2; // Our volume comparator. uint8_t secondHand = micros() / (256-SEGMENT.speed)/500 + 1 % 16; if (SEGENV.aux0 != secondHand) { // Triggered millis timing. @@ -7377,23 +7216,24 @@ uint16_t WS2812FX::mode_waterfall(void) { // Waterfall. By: An uint8_t pixCol = (log10f((float)FFT_MajorPeak) - 2.26f) * 177; // log10 frequency range is from 2.26 to 3.7. Let's scale accordingly. if (samplePeak) { - setPixelColor(SEGLEN-1, CHSV(92,92,92)); + SEGMENT.setPixelColor(SEGLEN-1, CHSV(92,92,92)); } else { - setPixelColor(SEGLEN-1, color_blend(SEGCOLOR(1), color_from_palette(pixCol+SEGMENT.intensity, false, PALETTE_SOLID_WRAP, 0), (int)my_magnitude)); + SEGMENT.setPixelColor(SEGLEN-1, color_blend(SEGCOLOR(1), SEGMENT.color_from_palette(pixCol+SEGMENT.intensity, false, PALETTE_SOLID_WRAP, 0), (int)my_magnitude)); } - for (uint16_t i=0; i(SEGENV.data); //array of previous bar heights per frequency band - uint8_t *fftResult = nullptr; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - fftResult = (uint8_t*)um_data->u_data[8]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; if (!fftResult) return mode_static(); if (SEGENV.call == 0) for (int i=0; i>2)); + SEGMENT.fadeToBlackBy(SEGMENT.speed); for (int x=0; x < cols; x++) { uint8_t band = map(x, 0, cols-1, 0, NUM_BANDS - 1); @@ -7432,25 +7271,25 @@ uint16_t WS2812FX::mode_2DGEQ(void) { // By Will Tatam. Code reduction by Ewoud if (SEGMENT.custom2 > 128) //color_vertical / color bars toggle colorIndex = map(y, 0, rows-1, 0, 255); - ledColor = color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0); - setPixelColorXY(x, rows-1 - y, ledColor); + ledColor = SEGMENT.color_from_palette(colorIndex, false, PALETTE_SOLID_WRAP, 0); + SEGMENT.setPixelColorXY(x, rows-1 - y, ledColor); } if (previousBarHeight[x] > 0) - setPixelColorXY(x, rows - previousBarHeight[x], (SEGCOLOR(2) != BLACK) ? SEGCOLOR(2) : ledColor); + SEGMENT.setPixelColorXY(x, rows - previousBarHeight[x], (SEGCOLOR(2) != BLACK) ? SEGCOLOR(2) : ledColor); if (rippleTime && previousBarHeight[x]>0) previousBarHeight[x]--; //delay/ripple effect } return FRAMETIME; } // mode_2DGEQ() -static const char *_data_FX_MODE_2DGEQ PROGMEM = " ♫ 2D GEQ@Fade speed,Ripple decay,# of bands=255,Color bars=64;!,,Peak Color;!=11"; +static const char *_data_FX_MODE_2DGEQ PROGMEM = "2D GEQ ♫@Fade speed,Ripple decay,# of bands=255,Color bars=64;!,,Peak Color;!=11;ssim=1"; // Beatsin ///////////////////////// // ** 2D Funky plank // ///////////////////////// -uint16_t WS2812FX::mode_2DFunkyPlank(void) { // Written by ??? Adapted by Will Tatam. - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DFunkyPlank(void) { // Written by ??? Adapted by Will Tatam. + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); @@ -7467,13 +7306,12 @@ uint16_t WS2812FX::mode_2DFunkyPlank(void) { // Written by ??? Adap bandInc = (NUMB_BANDS / cols); } - uint8_t *fftResult = nullptr; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - fftResult = (uint8_t*)um_data->u_data[8]; - } else { + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { // add support for no audio data + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; if (!fftResult) return mode_static(); uint8_t secondHand = micros()/(256-SEGMENT.speed)/500+1 % 64; @@ -7501,16 +7339,19 @@ uint16_t WS2812FX::mode_2DFunkyPlank(void) { // Written by ??? Adap } } - setPixels(leds); + SEGMENT.setPixels(leds); return FRAMETIME; } // mode_2DFunkyPlank -static const char *_data_FX_MODE_2DFUNKYPLANK PROGMEM = " ♫ 2D Funky Plank@Scroll speed,,# of bands;;"; +static const char *_data_FX_MODE_2DFUNKYPLANK PROGMEM = "2D Funky Plank ♫@Scroll speed,,# of bands;;;ssim=1"; // Beatsin + +#endif // WLED_DISABLE_2D //end audio only routines #endif +#ifndef WLED_DISABLE_2D ///////////////////////// // 2D Akemi // ///////////////////////// @@ -7549,31 +7390,30 @@ static uint8_t akemi[] PROGMEM = { 0,0,0,0,0,0,0,0,0,0,0,0,0,3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; -uint16_t WS2812FX::mode_2DAkemi(void) { - if (!isMatrix) return mode_static(); // not a 2D set-up +uint16_t mode_2DAkemi(void) { + if (!strip.isMatrix) return mode_static(); // not a 2D set-up const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); - uint16_t counter = (now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; + uint16_t counter = (strip.now * ((SEGMENT.speed >> 2) +2)) & 0xFFFF; counter = counter >> 8; const float lightFactor = 0.15f; const float normalFactor = 0.4f; - float base = 0.0f; - uint8_t *fftResult = nullptr; um_data_t *um_data; - if (usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { - fftResult = (uint8_t*)um_data->u_data[8]; - base = fftResult[0]/255.0f; + if (!usermods.getUMData(&um_data, USERMOD_ID_AUDIOREACTIVE)) { + um_data = simulateSound(SEGMENT.soundSim); } + uint8_t *fftResult = (uint8_t*)um_data->u_data[8]; + float base = fftResult[0]/255.0f; //draw and color Akemi for (uint16_t y=0; y < rows; y++) for (uint16_t x=0; x < cols; x++) { CRGB color; CRGB soundColor = ORANGE; - CRGB faceColor = color_wheel(counter); + CRGB faceColor = SEGMENT.color_wheel(counter); CRGB armsAndLegsColor = SEGCOLOR(1) > 0 ? SEGCOLOR(1) : 0xFFE0A0; //default warmish white 0xABA8FF; //0xFF52e5;// uint8_t ak = pgm_read_byte_near(akemi + ((y * 32)/rows) * 32 + (x * 32)/cols); // akemi[(y * 32)/rows][(x * 32)/cols] switch (ak) { @@ -7590,10 +7430,10 @@ uint16_t WS2812FX::mode_2DAkemi(void) { } if (SEGMENT.intensity > 128 && fftResult && fftResult[0] > 128) { //dance if base is high - setPixelColorXY(x, 0, BLACK); - setPixelColorXY(x, y+1, color); + SEGMENT.setPixelColorXY(x, 0, BLACK); + SEGMENT.setPixelColorXY(x, y+1, color); } else - setPixelColorXY(x, y, color); + SEGMENT.setPixelColorXY(x, y, color); } //add geq left and right @@ -7601,250 +7441,273 @@ uint16_t WS2812FX::mode_2DAkemi(void) { for (uint16_t x=0; x < cols/8; x++) { uint16_t band = x * cols/8; uint16_t barHeight = map(fftResult[band], 0, 255, 0, 17*rows/32); - CRGB color = color_from_palette((band * 35), false, PALETTE_SOLID_WRAP, 0); + CRGB color = SEGMENT.color_from_palette((band * 35), false, PALETTE_SOLID_WRAP, 0); for (uint16_t y=0; y < barHeight; y++) { - setPixelColorXY(x, rows/2-y, color); - setPixelColorXY(cols-1-x, rows/2-y, color); + SEGMENT.setPixelColorXY(x, rows/2-y, color); + SEGMENT.setPixelColorXY(cols-1-x, rows/2-y, color); } } } return FRAMETIME; } // mode_2DAkemi -static const char *_data_FX_MODE_2DAKEMI PROGMEM = "2D Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette"; +static const char *_data_FX_MODE_2DAKEMI PROGMEM = "2D Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette;ssim=1"; //beatsin +#endif // WLED_DISABLE_2D ////////////////////////////////////////////////////////////////////////////////////////// // mode data static const char *_data_RESERVED PROGMEM = "Reserved"; + +void WS2812FX::addEffect(uint8_t id, mode_ptr mode_fn, const char *mode_name) { + /* + if (id == 255) { for (int i=1; i<_modeCount; i++) if (_mode[i] == &mode_static) { id = i; break; } } // find empty slot + if (id < _modeCount) { + if (_mode[id] != &mode_static) return; // do not overwrite alerady added effect + _mode[id] = mode_fn; + _modeData[id] = mode_name; + } + */ + if (id >= _mode.size()) { + _mode.push_back(mode_fn); + _modeData.push_back(mode_name); + } else { + _mode.insert(_mode.begin()+id, mode_fn); + _modeData.insert(_modeData.begin()+id, mode_name); + } +} + void WS2812FX::setupEffectData() { // fill reserved word in case there will be any gaps in the array - for (byte i=0; i + #include "const.h" #define FASTLED_INTERNAL //remove annoying pragma messages @@ -54,40 +56,43 @@ #define RGBW32(r,g,b,w) (uint32_t((byte(w) << 24) | (byte(r) << 16) | (byte(g) << 8) | (byte(b)))) #endif +//colors.cpp (.h does not like including other .h) +uint32_t color_blend(uint32_t,uint32_t,uint16_t,bool b16); +uint32_t color_add(uint32_t,uint32_t); + /* Not used in all effects yet */ #define WLED_FPS 42 #define FRAMETIME_FIXED (1000/WLED_FPS) -#define FRAMETIME _frametime +//#define FRAMETIME _frametime +#define FRAMETIME strip.getFrameTime() /* each segment uses 52 bytes of SRAM memory, so if you're application fails because of insufficient memory, decreasing MAX_NUM_SEGMENTS may help */ #ifdef ESP8266 #define MAX_NUM_SEGMENTS 16 - /* How many color transitions can run at once */ - #define MAX_NUM_TRANSITIONS 8 /* How much data bytes all segments combined may allocate */ #define MAX_SEGMENT_DATA 4096 #else #ifndef MAX_NUM_SEGMENTS #define MAX_NUM_SEGMENTS 32 #endif - #define MAX_NUM_TRANSITIONS 24 #define MAX_SEGMENT_DATA 20480 #endif /* How much data bytes each segment should max allocate to leave enough space for other segments, assuming each segment uses the same amount of data. 256 for ESP8266, 640 for ESP32. */ -#define FAIR_DATA_PER_SEG (MAX_SEGMENT_DATA / MAX_NUM_SEGMENTS) +#define FAIR_DATA_PER_SEG (MAX_SEGMENT_DATA / strip.getMaxSegments()) #define MIN_SHOW_DELAY (_frametime < 16 ? 8 : 15) #define NUM_COLORS 3 /* number of colors per segment */ -#define SEGMENT _segments[_segment_index] -#define SEGCOLOR(x) _colors_t[x] -#define SEGENV _segment_runtimes[_segment_index] -#define SEGLEN _virtualSegmentLength -#define SEGACT SEGMENT.stop -#define SPEED_FORMULA_L 5U + (50U*(255U - SEGMENT.speed))/SEGLEN +#define SEGMENT strip._segments[strip.getCurrSegmentId()] +#define SEGENV strip._segments[strip.getCurrSegmentId()] +//#define SEGCOLOR(x) strip._segments[s//trip.getCurrSegmentId()].currentColor(x, strip._segments[strip.getCurrSegmentId()].colors[x]) +//#define SEGLEN strip._segments[strip.getCurrSegmentId()].virtualLength() +#define SEGCOLOR(x) strip.segColor(x) /* saves us a few kbytes of code */ +#define SEGLEN strip._virtualSegmentLength /* saves us a few kbytes of code */ +#define SPEED_FORMULA_L (5U + (50U*(255U - SEGMENT.speed))/SEGLEN) // some common colors #define RED (uint32_t)0xFF0000 @@ -110,15 +115,15 @@ // bit 2: segment is on // bit 1: reverse segment // bit 0: segment is selected -#define NO_OPTIONS (uint8_t)0x00 -#define TRANSPOSED (uint8_t)0x400 // rotated 90deg & reversed -#define REVERSE_Y_2D (uint8_t)0x200 -#define MIRROR_Y_2D (uint8_t)0x100 -#define TRANSITIONAL (uint8_t)0x080 -#define MIRROR (uint8_t)0x008 -#define SEGMENT_ON (uint8_t)0x004 -#define REVERSE (uint8_t)0x002 -#define SELECTED (uint8_t)0x001 +#define NO_OPTIONS (uint16_t)0x0000 +#define TRANSPOSED (uint16_t)0x0400 // rotated 90deg & reversed +#define REVERSE_Y_2D (uint16_t)0x0200 +#define MIRROR_Y_2D (uint16_t)0x0100 +#define TRANSITIONAL (uint16_t)0x0080 +#define MIRROR (uint16_t)0x0008 +#define SEGMENT_ON (uint16_t)0x0004 +#define REVERSE (uint16_t)0x0002 +#define SELECTED (uint16_t)0x0001 #define FX_MODE_STATIC 0 #define FX_MODE_BLINK 1 @@ -168,12 +173,14 @@ #define FX_MODE_FIRE_FLICKER 45 #define FX_MODE_GRADIENT 46 #define FX_MODE_LOADING 47 -#define FX_MODE_POLICE 48 // candidate for removal (after below three) +//#define FX_MODE_POLICE 48 // candidate for removal (after below three) +#define FX_MODE_WAVESINS 48 // was Police prior to 0.14 (use Two Dots with Red/Blue) #define FX_MODE_FAIRY 49 //was Police All prior to 0.13.0-b6 (use "Two Dots" with Red/Blue and full intensity) #define FX_MODE_TWO_DOTS 50 #define FX_MODE_FAIRYTWINKLE 51 //was Two Areas prior to 0.13.0-b6 (use "Two Dots" with full intensity) #define FX_MODE_RUNNING_DUAL 52 -#define FX_MODE_HALLOWEEN 53 // candidate for removal +//#define FX_MODE_HALLOWEEN 53 // candidate for removal +#define FX_MODE_PERLINMOVE 53 // was Halloween prior to 0.14 (use Cahse 2 with Purple/Orange) #define FX_MODE_TRICOLOR_CHASE 54 #define FX_MODE_TRICOLOR_WIPE 55 #define FX_MODE_TRICOLOR_FADE 56 @@ -234,638 +241,552 @@ #define FX_MODE_CHUNCHUN 111 #define FX_MODE_DANCING_SHADOWS 112 #define FX_MODE_WASHING_MACHINE 113 -#define FX_MODE_CANDY_CANE 114 // candidate for removal +//#define FX_MODE_CANDY_CANE 114 // candidate for removal +#define FX_MODE_FLOWSTRIPE 114 // was Cany Cane prior to 0.14 (use Cahse 2 with Red/White) #define FX_MODE_BLENDS 115 #define FX_MODE_TV_SIMULATOR 116 #define FX_MODE_DYNAMIC_SMOOTH 117 // new 2D effects -#define FX_MODE_SPACESHIPS 118 -#define FX_MODE_CRAZYBEES 119 -#define FX_MODE_GHOST_RIDER 120 -#define FX_MODE_BLOBS 121 -#define FX_MODE_SCROLL_TEXT 122 -#define FX_MODE_DRIFT_ROSE 123 +#define FX_MODE_2DSPACESHIPS 118 +#define FX_MODE_2DCRAZYBEES 119 +#define FX_MODE_2DGHOSTRIDER 120 +#define FX_MODE_2DBLOBS 121 +#define FX_MODE_2DSCROLLTEXT 122 +#define FX_MODE_2DDRIFTROSE 123 +// WLED-SR effects (non SR compatible IDs) +#define FX_MODE_2DBLACKHOLE 124 // non audio +#define FX_MODE_2DDNASPIRAL 125 // non audio +#define FX_MODE_2DHIPHOTIC 126 // non audio +#define FX_MODE_2DPLASMABALL 127 // non audio +#define FX_MODE_2DSINDOTS 128 // non audio +#define FX_MODE_2DFRIZZLES 129 // non audio +#define FX_MODE_2DLISSAJOUS 130 // non audio +#define FX_MODE_2DPOLARLIGHTS 131 // non audio +#define FX_MODE_2DTARTAN 132 // non audio +#define FX_MODE_2DGAMEOFLIFE 133 // non audio +#define FX_MODE_2DJULIA 134 // non audio +#define FX_MODE_2DCOLOREDBURSTS 135 // non audio +#define FX_MODE_2DSUNRADIATION 136 // non audio +#define FX_MODE_2DNOISE 137 // non audio +#define FX_MODE_2DFIRENOISE 138 // non audio +#define FX_MODE_2DSQUAREDSWIRL 139 // non audio +#define FX_MODE_2DDNA 140 // non audio +#define FX_MODE_2DMATRIX 141 // non audio +#define FX_MODE_2DMETABALLS 142 // non audio +#define FX_MODE_2DPULSER 143 // non audio +#define FX_MODE_2DDRIFT 144 // non audio +#define FX_MODE_2DWAVERLY 145 // audio enhanced +#define FX_MODE_2DSWIRL 146 // audio enhanced +#define FX_MODE_2DAKEMI 147 // audio enhanced +#define FX_MODE_PIXELWAVE 160 // audio enhanced +#define FX_MODE_JUGGLES 161 // audio enhanced +#define FX_MODE_MATRIPIX 162 // audio enhanced +#define FX_MODE_GRAVIMETER 163 // audio enhanced +#define FX_MODE_PLASMOID 164 // audio enhanced +#define FX_MODE_PUDDLES 165 // audio enhanced +#define FX_MODE_MIDNOISE 166 // audio enhanced +#define FX_MODE_NOISEMETER 167 // audio enhanced +#define FX_MODE_NOISEFIRE 168 // audio enhanced +#define FX_MODE_PUDDLEPEAK 169 // audio enhanced +#define FX_MODE_RIPPLEPEAK 170 // audio enhanced +#define FX_MODE_GRAVCENTER 171 // audio enhanced +#define FX_MODE_GRAVCENTRIC 172 // audio enhanced -// WLED-SR effects #ifndef USERMOD_AUDIOREACTIVE - #define FX_MODE_PERLINMOVE 53 // should be moved to 53 - #define FX_MODE_FLOWSTRIPE 114 // should be moved to 114 - #define FX_MODE_WAVESINS 48 // should be moved to 48 - #define FX_MODE_2DBLACKHOLE 124 // non audio - #define FX_MODE_2DDNASPIRAL 125 // non audio - #define FX_MODE_2DHIPHOTIC 126 // non audio - #define FX_MODE_2DPLASMABALL 127 // non audio - #define FX_MODE_2DSINDOTS 128 // non audio - #define FX_MODE_PIXELWAVE 129 // audio enhanced - #define FX_MODE_JUGGLES 130 // audio enhanced - #define FX_MODE_MATRIPIX 131 // audio enhanced - #define FX_MODE_GRAVIMETER 132 // audio enhanced - #define FX_MODE_PLASMOID 133 // audio enhanced - #define FX_MODE_PUDDLES 134 // audio enhanced - #define FX_MODE_MIDNOISE 135 // audio enhanced - #define FX_MODE_NOISEMETER 136 // audio enhanced - #define FX_MODE_2DFRIZZLES 137 // non audio - #define FX_MODE_2DLISSAJOUS 138 // non audio - #define FX_MODE_2DPOLARLIGHTS 139 // non audio - #define FX_MODE_2DTARTAN 140 // non audio - #define FX_MODE_2DGAMEOFLIFE 141 // non audio - #define FX_MODE_2DJULIA 142 // non audio - #define FX_MODE_NOISEFIRE 143 // audio enhanced - #define FX_MODE_PUDDLEPEAK 144 // audio enhanced - #define FX_MODE_2DCOLOREDBURSTS 145 // non audio - #define FX_MODE_2DSUNRADIATION 146 // non audio - #define FX_MODE_2DNOISE 147 // non audio - #define FX_MODE_RIPPLEPEAK 148 // audio enhanced - #define FX_MODE_2DFIRENOISE 149 // non audio - #define FX_MODE_2DSQUAREDSWIRL 150 // non audio - #define FX_MODE_2DDNA 151 // non audio - #define FX_MODE_2DMATRIX 152 // non audio - #define FX_MODE_2DMETABALLS 153 // non audio - #define FX_MODE_2DPULSER 154 // non audio - #define FX_MODE_2DDRIFT 155 // non audio - #define FX_MODE_2DWAVERLY 156 // audio enhanced - #define FX_MODE_GRAVCENTER 157 // audio enhanced - #define FX_MODE_GRAVCENTRIC 158 // audio enhanced - #define FX_MODE_2DSWIRL 159 // audio enhanced - #define FX_MODE_2DAKEMI 160 // audio enhanced - - #define MODE_COUNT 161 + #define MODE_COUNT 173 #else - #define FX_MODE_PIXELS 128 - #define FX_MODE_PIXELWAVE 129 // audio enhanced - #define FX_MODE_JUGGLES 130 // audio enhanced - #define FX_MODE_MATRIPIX 131 // audio enhanced - #define FX_MODE_GRAVIMETER 132 // audio enhanced - #define FX_MODE_PLASMOID 133 // audio enhanced - #define FX_MODE_PUDDLES 134 // audio enhanced - #define FX_MODE_MIDNOISE 135 // audio enhanced - #define FX_MODE_NOISEMETER 136 // audio enhanced - #define FX_MODE_FREQWAVE 137 - #define FX_MODE_FREQMATRIX 138 - #define FX_MODE_2DGEQ 139 - #define FX_MODE_WATERFALL 140 - #define FX_MODE_FREQPIXELS 141 - #define FX_MODE_BINMAP 142 - #define FX_MODE_NOISEFIRE 143 // audio enhanced - #define FX_MODE_PUDDLEPEAK 144 // audio enhanced - #define FX_MODE_NOISEMOVE 145 - #define FX_MODE_2DNOISE 146 // non audio - #define FX_MODE_PERLINMOVE 147 // should be moved to 53 - #define FX_MODE_RIPPLEPEAK 148 // audio enhanced - #define FX_MODE_2DFIRENOISE 149 // non audio - #define FX_MODE_2DSQUAREDSWIRL 150 // non audio + #define FX_MODE_PIXELS 173 +// #define FX_MODE_PIXELWAVE 129 // audio enhanced +// #define FX_MODE_JUGGLES 130 // audio enhanced +// #define FX_MODE_MATRIPIX 131 // audio enhanced +// #define FX_MODE_GRAVIMETER 132 // audio enhanced +// #define FX_MODE_PLASMOID 133 // audio enhanced +// #define FX_MODE_PUDDLES 134 // audio enhanced +// #define FX_MODE_MIDNOISE 135 // audio enhanced +// #define FX_MODE_NOISEMETER 136 // audio enhanced + #define FX_MODE_FREQWAVE 174 + #define FX_MODE_FREQMATRIX 175 + #define FX_MODE_2DGEQ 148 + #define FX_MODE_WATERFALL 176 + #define FX_MODE_FREQPIXELS 177 + #define FX_MODE_BINMAP 178 +// #define FX_MODE_NOISEFIRE 143 // audio enhanced +// #define FX_MODE_PUDDLEPEAK 144 // audio enhanced + #define FX_MODE_NOISEMOVE 179 +// #define FX_MODE_2DNOISE 146 // non audio + //#define FX_MODE_PERLINMOVE 147 // moved to 53 +// #define FX_MODE_RIPPLEPEAK 148 // audio enhanced +// #define FX_MODE_2DFIRENOISE 149 // non audio +// #define FX_MODE_2DSQUAREDSWIRL 150 // non audio //#define FX_MODE_2DFIRE2012 151 // implemented in native Fire2012 - #define FX_MODE_2DDNA 152 // non audio - #define FX_MODE_2DMATRIX 153 // non audio - #define FX_MODE_2DMETABALLS 154 // non audio - #define FX_MODE_FREQMAP 155 - #define FX_MODE_GRAVCENTER 156 // audio enhanced - #define FX_MODE_GRAVCENTRIC 157 // audio enhanced - #define FX_MODE_GRAVFREQ 158 - #define FX_MODE_DJLIGHT 159 - #define FX_MODE_2DFUNKYPLANK 160 +// #define FX_MODE_2DDNA 152 // non audio +// #define FX_MODE_2DMATRIX 153 // non audio +// #define FX_MODE_2DMETABALLS 154 // non audio + #define FX_MODE_FREQMAP 180 +// #define FX_MODE_GRAVCENTER 156 // audio enhanced +// #define FX_MODE_GRAVCENTRIC 157 // audio enhanced + #define FX_MODE_GRAVFREQ 181 + #define FX_MODE_DJLIGHT 182 + #define FX_MODE_2DFUNKYPLANK 149 //#define FX_MODE_2DCENTERBARS 161 // obsolete by X & Y mirroring - #define FX_MODE_2DPULSER 162 // non audio - #define FX_MODE_BLURZ 163 - #define FX_MODE_2DDRIFT 164 // non audio - #define FX_MODE_2DWAVERLY 165 // audio enhanced - #define FX_MODE_2DSUNRADIATION 166 // non audio - #define FX_MODE_2DCOLOREDBURSTS 167 // non audio - #define FX_MODE_2DJULIA 168 // non audio - #define FX_MODE_2DPOOLNOISE 169 // reserved in JSON_mode_names - #define FX_MODE_2DTWISTER 170 // reserved in JSON_mode_names - #define FX_MODE_2DCAELEMENTATY 171 // reserved in JSON_mode_names - #define FX_MODE_2DGAMEOFLIFE 172 // non audio - #define FX_MODE_2DTARTAN 173 // non audio - #define FX_MODE_2DPOLARLIGHTS 174 // non audio - #define FX_MODE_2DSWIRL 175 // audio enhanced - #define FX_MODE_2DLISSAJOUS 176 // non audio - #define FX_MODE_2DFRIZZLES 177 // non audio - #define FX_MODE_2DPLASMABALL 178 // non audio - #define FX_MODE_FLOWSTRIPE 179 // should be moved to 114 - #define FX_MODE_2DHIPHOTIC 180 // non audio - #define FX_MODE_2DSINDOTS 181 // non audio - #define FX_MODE_2DDNASPIRAL 182 // non audio - #define FX_MODE_2DBLACKHOLE 183 // non audio - #define FX_MODE_WAVESINS 184 // should be moved to 48 - #define FX_MODE_ROCKTAVES 185 - #define FX_MODE_2DAKEMI 186 // audio enhanced +// #define FX_MODE_2DPULSER 162 // non audio + #define FX_MODE_BLURZ 183 +// #define FX_MODE_2DDRIFT 164 // non audio +// #define FX_MODE_2DWAVERLY 165 // audio enhanced +// #define FX_MODE_2DSUNRADIATION 166 // non audio +// #define FX_MODE_2DCOLOREDBURSTS 167 // non audio +// #define FX_MODE_2DJULIA 168 // non audio + #define FX_MODE_2DPOOLNOISE 150 // reserved in JSON_mode_names + #define FX_MODE_2DTWISTER 151 // reserved in JSON_mode_names + #define FX_MODE_2DCAELEMENTATY 152 // reserved in JSON_mode_names +// #define FX_MODE_2DGAMEOFLIFE 172 // non audio +// #define FX_MODE_2DTARTAN 173 // non audio +// #define FX_MODE_2DPOLARLIGHTS 174 // non audio +// #define FX_MODE_2DSWIRL 175 // audio enhanced +// #define FX_MODE_2DLISSAJOUS 176 // non audio +// #define FX_MODE_2DFRIZZLES 177 // non audio +// #define FX_MODE_2DPLASMABALL 178 // non audio + //#define FX_MODE_FLOWSTRIPE 179 // moved to 114 +// #define FX_MODE_2DHIPHOTIC 180 // non audio +// #define FX_MODE_2DSINDOTS 181 // non audio +// #define FX_MODE_2DDNASPIRAL 182 // non audio +// #define FX_MODE_2DBLACKHOLE 183 // non audio + //#define FX_MODE_WAVESINS 184 // moved to 48 + #define FX_MODE_ROCKTAVES 184 +// #define FX_MODE_2DAKEMI 186 // audio enhanced //#define FX_MODE_CUSTOMEFFECT 187 //WLEDSR Custom Effects - #define MODE_COUNT 187 + #define MODE_COUNT 185 #endif +typedef enum mapping1D2D { + M12_Pixels = 0, + M12_VerticalBar = 1, + M12_Circle = 2, + M12_Block = 3 +} mapping1D2D_t; -class WS2812FX { - typedef uint16_t (WS2812FX::*mode_ptr)(void); +// segment, 68 (92 in memory) bytes +typedef struct Segment { + public: + uint16_t start; // start index / start X coordinate 2D (left) + uint16_t stop; // stop index / stop X coordinate 2D (right); segment is invalid if stop == 0 + uint16_t offset; + uint8_t speed; + uint8_t intensity; + uint8_t palette; + uint8_t mode; + union { + uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected + struct { + uint16_t selected:1; // 0 : selected + uint16_t reverse:1; // 1 : reversed + uint16_t on:1; // 2 : is On + uint16_t mirror:1; // 3 : mirrored + uint16_t pxs:1; // 4 : indicates that the effect does not use FRAMETIME or needs getPixelColor (?) + uint16_t freeze:1; // 5 : paused/frozen + uint16_t reset:1; // 6 : indicates that Segment runtime requires reset + uint16_t transitional:1; // 7 : transitional (there is transition occuring) + uint16_t reverse_y:1; // 8 : reversed Y (2D) + uint16_t mirror_y:1; // 9 : mirrored Y (2D) + uint16_t transpose:1; // 10 : transposed (2D, swapped X & Y) + uint16_t map1D2D:2; // 11-12 : mapping for 1D effect on 2D (0-strip, 1-expand vertically, 2-circular, 3-rectangular) + uint16_t soundSim:3; // 13-15 : 0-7 sound simulation types + }; + }; + uint8_t grouping, spacing; + uint8_t opacity; + uint32_t colors[NUM_COLORS]; + uint8_t cct; //0==1900K, 255==10091K + uint8_t custom1, custom2, custom3; // custom FX parameters + uint16_t startY; // start Y coodrinate 2D (top) + uint16_t stopY; // stop Y coordinate 2D (bottom) + char *name; - // pre show callback - typedef void (*show_callback) (void); + // runtime data + unsigned long next_time; // millis() of next update + uint32_t step; // custom "step" var + uint32_t call; // call counter + uint16_t aux0; // custom var + uint16_t aux1; // custom var + byte* data; + + private: + uint8_t _capabilities; + uint16_t _dataLen; + + // transition data, valid only if getOption(SEG_OPTION_TRANSITIONAL)==true + //struct Transition { + uint32_t _colorT[NUM_COLORS]; + uint8_t _briT; + uint8_t _cctT; + uint32_t _start; + uint16_t _dur; + // Transition(uint16_t dur=10) : _briT(255), _cctT(127), _start(millis()), _dur(dur) {} + // Transition(uint16_t d, uint8_t b, uint8_t c, const uint32_t *o) : _briT(b), _cctT(c), _start(millis()), _dur(d) { + // for (size_t i=0; i> n) & 0x01); } + inline bool isSelected() { return getOption(0); } + inline bool isActive() { return stop > start; } + inline uint16_t width() { return stop - start; } + inline uint16_t height() { return stopY - startY; } + inline uint16_t length() { return width(); } + inline uint16_t groupLength() { return grouping + spacing; } + inline uint8_t getLightCapabilities() { return _capabilities; } + + bool setColor(uint8_t slot, uint32_t c); //returns true if changed + void setCCT(uint16_t k); + void setOpacity(uint8_t o); + void setOption(uint8_t n, bool val); + uint8_t differs(Segment& b); + void refreshLightCapabilities(); + + // runtime data functions + bool allocateData(uint16_t len); + void deallocateData(void); + inline uint16_t dataSize(void) { return _dataLen; } + void resetIfRequired(void); + /** + * Flags that before the next effect is calculated, + * the internal segment state should be reset. + * Call resetIfRequired before calling the next effect function. + * Safe to call from interrupts and network requests. + */ + inline void markForReset() { reset = true; } // setOption(SEG_OPTION_RESET, true) + + // transition functions + void startTransition(uint16_t dur); // transition has to start before actual segment values change + void handleTransition(void); + uint16_t progress(); //transition progression between 0-65535 + uint8_t currentBri(uint8_t briNew, bool useCct = false); + uint32_t currentColor(uint8_t slot, uint32_t colorNew) { return getOption(SEG_OPTION_TRANSITIONAL) /*&& !_t*/ ? color_blend(/*_t->*/_colorT[slot], colorNew, progress(), true) : colorNew; } + + // 1D strip + uint16_t virtualLength(); + void setPixelColor(int n, uint32_t c); // set relative pixel within segment with color + void setPixelColor(int n, byte r, byte g, byte b, byte w = 0) { setPixelColor(n, RGBW32(r,g,b,w)); } // automatically inline + void setPixelColor(int n, CRGB c) { setPixelColor(n, c.red, c.green, c.blue); } // automatically inline + void setPixelColor(float i, uint32_t c, bool aa = true); + void setPixelColor(float i, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0, bool aa = true) { setPixelColor(i, RGBW32(r,g,b,w), aa); } + void setPixelColor(float i, CRGB c, bool aa = true) { setPixelColor(i, c.red, c.green, c.blue, 0, aa); } + uint32_t getPixelColor(uint16_t i); + // 1D support functions (some implement 2D as well) + void blur(uint8_t); + void fill(uint32_t c); + void fade_out(uint8_t r); + void fadeToBlackBy(uint8_t fadeBy); + void blendPixelColor(uint16_t n, uint32_t color, uint8_t blend); + void addPixelColor(uint16_t n, uint32_t color); + uint8_t get_random_wheel_index(uint8_t pos); + uint32_t color_from_palette(uint16_t, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri = 255); + uint32_t color_wheel(uint8_t pos); + + // 2D matrix + uint16_t virtualWidth(); + uint16_t virtualHeight(); + uint16_t XY(uint16_t x, uint16_t y); // support function to get relative index within segment (for leds[]) + void setPixelColorXY(int x, int y, uint32_t c); // set relative pixel within segment with color + void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline + void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, c.red, c.green, c.blue); } // automatically inline + void setPixelColorXY(float x, float y, uint32_t c, bool aa = true); + void setPixelColorXY(float x, float y, byte r, byte g, byte b, byte w = 0, bool aa = true) { setPixelColorXY(x, y, RGBW32(r,g,b,w), aa); } + void setPixelColorXY(float x, float y, CRGB c, bool aa = true) { setPixelColorXY(x, y, c.red, c.green, c.blue, 0, aa); } + uint32_t getPixelColorXY(uint16_t x, uint16_t y); + // 2D support functions + void blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend); + void addPixelColorXY(uint16_t x, uint16_t y, uint32_t color); + void blur1d(CRGB* leds, fract8 blur_amount); + void blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds=nullptr); // 1D box blur (with weight) + void blur2d(CRGB* leds, fract8 blur_amount); + void blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr); + void blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr); + void moveX(CRGB *leds, int8_t delta); + void moveY(CRGB *leds, int8_t delta); + void move(uint8_t dir, uint8_t delta, CRGB *leds=nullptr); + void fill_solid(CRGB* leds, CRGB c); + void fill_circle(CRGB* leds, uint16_t cx, uint16_t cy, uint8_t radius, CRGB c); + void fadeToBlackBy(CRGB* leds, uint8_t fadeBy); + void nscale8(CRGB* leds, uint8_t scale); + void setPixels(CRGB* leds); + void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, CRGB *leds = nullptr); + void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds = nullptr); + void wu_pixel(CRGB *leds, uint32_t x, uint32_t y, CRGB c); + inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) { drawLine(x0, y0, x1, y1, CRGB(byte(c>>16), byte(c>>8), byte(c))); } + inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t c) { drawCharacter(chr, x, y, w, h, CRGB(byte(c>>16), byte(c>>8), byte(c))); } +} segment; +//static int i = sizeof(Segment); + +// main "strip" class +class WS2812FX { // 96 bytes + typedef uint16_t (*mode_ptr)(void); // pointer to mode function + typedef void (*show_callback)(void); // pre show callback + typedef struct ModeData { + mode_ptr _fcn; // mode (effect) function + const char *_data; // mode (effect) name and its slider control data array + ModeData(uint16_t (*fcn)(void), const char *data) : _fcn(fcn), _data(data) {} + } mode_data_t; static WS2812FX* instance; public: - // segment parameters - typedef struct Segment { // 35 (36 in memory) bytes - uint16_t start; // start index / start X coordinate 2D (left) - uint16_t stop; // stop index / stop X coordinate 2D (right); segment is invalid if stop == 0 - uint16_t offset; - uint8_t speed; - uint8_t intensity; - uint8_t palette; - uint8_t mode; - uint16_t options; //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected - uint8_t grouping, spacing; - uint8_t opacity; - uint32_t colors[NUM_COLORS]; - uint8_t cct; //0==1900K, 255==10091K - uint8_t _capabilities; - uint8_t custom1, custom2, custom3; // custom FX parameters - uint16_t startY; // start Y coodrinate 2D (top) - uint16_t stopY; // stop Y coordinate 2D (bottom) - char *name; - inline bool getOption(uint8_t n) { return ((options >> n) & 0x01); } - inline bool isSelected() { return getOption(0); } - inline bool isActive() { return stop > start; } - inline uint16_t width() { return stop - start; } - inline uint16_t height() { return stopY - startY; } - inline uint16_t length() { return width(); } - inline uint16_t groupLength() { return grouping + spacing; } - inline uint8_t getLightCapabilities() { return _capabilities; } - bool setColor(uint8_t slot, uint32_t c, uint8_t segn) { //returns true if changed - if (slot >= NUM_COLORS || segn >= MAX_NUM_SEGMENTS) return false; - if (c == colors[slot]) return false; - uint8_t b = (slot == 1) ? cct : opacity; - ColorTransition::startTransition(b, colors[slot], instance->_transitionDur, segn, slot); - colors[slot] = c; return true; - } - void setCCT(uint16_t k, uint8_t segn) { - if (segn >= MAX_NUM_SEGMENTS) return; - if (k > 255) { //kelvin value, convert to 0-255 - if (k < 1900) k = 1900; - if (k > 10091) k = 10091; - k = (k - 1900) >> 5; - } - if (cct == k) return; - ColorTransition::startTransition(cct, colors[1], instance->_transitionDur, segn, 1); - cct = k; - } - void setOpacity(uint8_t o, uint8_t segn) { - if (segn >= MAX_NUM_SEGMENTS) return; - if (opacity == o) return; - ColorTransition::startTransition(opacity, colors[0], instance->_transitionDur, segn, 0); - opacity = o; - } - void setOption(uint8_t n, bool val, uint8_t segn = 255) { - bool prevOn = false; - if (n == SEG_OPTION_ON) { - prevOn = getOption(SEG_OPTION_ON); - if (!val && prevOn) { //fade off - ColorTransition::startTransition(opacity, colors[0], instance->_transitionDur, segn, 0); - } - } - if (val) options |= 0x01 << n; - else options &= ~(0x01 << n); - if (n == SEG_OPTION_ON && val && !prevOn) { //fade on - ColorTransition::startTransition(0, colors[0], instance->_transitionDur, segn, 0); - } - } - // 2D matrix - uint16_t virtualWidth() { - uint16_t groupLen = groupLength(); - uint16_t vWidth = ((getOption(SEG_OPTION_TRANSPOSED) ? height() : width()) + groupLen - 1) / groupLen; - if (getOption(SEG_OPTION_MIRROR)) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED - return vWidth; - } - uint16_t virtualHeight() { - uint16_t groupLen = groupLength(); - uint16_t vHeight = ((getOption(SEG_OPTION_TRANSPOSED) ? width() : height()) + groupLen - 1) / groupLen; - if (getOption(SEG_OPTION_MIRROR_Y)) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED - return vHeight; - } - // 1D strip - uint16_t virtualLength() { - uint16_t groupLen = groupLength(); - uint16_t vLength = (length() + groupLen - 1) / groupLen; - if (getOption(SEG_OPTION_MIRROR)) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED - return vLength; - } - uint8_t differs(Segment& b); - void refreshLightCapabilities(); - } segment; - - // segment runtime parameters - typedef struct Segment_runtime { // 28 bytes - unsigned long next_time; // millis() of next update - uint32_t step; // custom "step" var - uint32_t call; // call counter - uint16_t aux0; // custom var - uint16_t aux1; // custom var - byte* data = nullptr; - bool allocateData(uint16_t len){ - if (data && _dataLen == len) return true; //already allocated - deallocateData(); - if (WS2812FX::instance->_usedSegmentData + len > MAX_SEGMENT_DATA) return false; //not enough memory - // if possible use SPI RAM on ESP32 - #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) - if (psramFound()) - data = (byte*) ps_malloc(len); - else - #endif - data = (byte*) malloc(len); - if (!data) return false; //allocation failed - WS2812FX::instance->_usedSegmentData += len; - _dataLen = len; - memset(data, 0, len); - return true; - } - void deallocateData(){ - free(data); - data = nullptr; - WS2812FX::instance->_usedSegmentData -= _dataLen; - _dataLen = 0; - } - - /** - * If reset of this segment was request, clears runtime - * settings of this segment. - * Must not be called while an effect mode function is running - * because it could access the data buffer and this method - * may free that data buffer. - */ - void resetIfRequired() { - if (_requiresReset) { - next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; - deallocateData(); - _requiresReset = false; - } - } - - /** - * Flags that before the next effect is calculated, - * the internal segment state should be reset. - * Call resetIfRequired before calling the next effect function. - * Safe to call from interrupts and network requests. - */ - inline void markForReset() { _requiresReset = true; } - private: - uint16_t _dataLen = 0; - bool _requiresReset = false; - } segment_runtime; - - typedef struct ColorTransition { // 12 bytes - uint32_t colorOld = 0; - uint32_t transitionStart; - uint16_t transitionDur; - uint8_t segment = 0xFF; //lower 6 bits: the segment this transition is for (255 indicates transition not in use/available) upper 2 bits: color channel - uint8_t briOld = 0; - static void startTransition(uint8_t oldBri, uint32_t oldCol, uint16_t dur, uint8_t segn, uint8_t slot) { - if (segn >= MAX_NUM_SEGMENTS || slot >= NUM_COLORS || dur == 0) return; - if (instance->_brightness == 0) return; //do not need transitions if master bri is off - if (!instance->_segments[segn].getOption(SEG_OPTION_ON)) return; //not if segment is off either - uint8_t tIndex = 0xFF; //none found - uint16_t tProgression = 0; - uint8_t s = segn + (slot << 6); //merge slot and segment into one byte - - for (uint8_t i = 0; i < MAX_NUM_TRANSITIONS; i++) { - uint8_t tSeg = instance->transitions[i].segment; - //see if this segment + color already has a running transition - if (tSeg == s) { - tIndex = i; break; - } - if (tSeg == 0xFF) { //free transition - tIndex = i; tProgression = 0xFFFF; - } - } - - if (tIndex == 0xFF) { //no slot found yet - for (uint8_t i = 0; i < MAX_NUM_TRANSITIONS; i++) { - //find most progressed transition to overwrite - uint16_t prog = instance->transitions[i].progress(); - if (prog > tProgression) { - tIndex = i; tProgression = prog; - } - } - } - - ColorTransition& t = instance->transitions[tIndex]; - if (t.segment == s) //this is an active transition on the same segment+color - { - bool wasTurningOff = (oldBri == 0); - t.briOld = t.currentBri(wasTurningOff, slot); - t.colorOld = t.currentColor(oldCol); - } else { - t.briOld = oldBri; - t.colorOld = oldCol; - uint8_t prevSeg = t.segment & 0x3F; - if (prevSeg < MAX_NUM_SEGMENTS) instance->_segments[prevSeg].setOption(SEG_OPTION_TRANSITIONAL, false); - } - t.transitionDur = dur; - t.transitionStart = millis(); - t.segment = s; - instance->_segments[segn].setOption(SEG_OPTION_TRANSITIONAL, true); - //refresh immediately, required for Solid mode - if (instance->_segment_runtimes[segn].next_time > t.transitionStart + 22) instance->_segment_runtimes[segn].next_time = t.transitionStart; - } - uint16_t progress(bool allowEnd = false) { //transition progression between 0-65535 - uint32_t timeNow = millis(); - if (timeNow - transitionStart > transitionDur) { - if (allowEnd) { - uint8_t segn = segment & 0x3F; - if (segn < MAX_NUM_SEGMENTS) instance->_segments[segn].setOption(SEG_OPTION_TRANSITIONAL, false); - segment = 0xFF; - } - return 0xFFFF; - } - uint32_t elapsed = timeNow - transitionStart; - uint32_t prog = elapsed * 0xFFFF / transitionDur; - return (prog > 0xFFFF) ? 0xFFFF : prog; - } - uint32_t currentColor(uint32_t colorNew) { - return instance->color_blend(colorOld, colorNew, progress(true), true); - } - uint8_t currentBri(bool turningOff = false, uint8_t slot = 0) { - uint8_t segn = segment & 0x3F; - if (segn >= MAX_NUM_SEGMENTS) return 0; - uint8_t briNew = instance->_segments[segn].opacity; - if (slot == 0) { - if (!instance->_segments[segn].getOption(SEG_OPTION_ON) || turningOff) briNew = 0; - } else { //transition slot 1 brightness for CCT transition - briNew = instance->_segments[segn].cct; - } - uint32_t prog = progress() + 1; - return ((briNew * prog) + (briOld * (0x10000 - prog))) >> 16; - } - } color_transition; - - WS2812FX() { + WS2812FX() : + gammaCorrectBri(false), + gammaCorrectCol(true), + paletteFade(0), + paletteBlend(0), + milliampsPerLed(55), + cctBlending(0), + ablMilliampsMax(ABL_MILLIAMPS_DEFAULT), + currentMilliamps(0), + now(millis()), + timebase(0), + isMatrix(false), +#ifndef WLED_DISABLE_2D + hPanels(1), + vPanels(1), + panelH(8), + panelW(8), + matrixWidth(DEFAULT_LED_COUNT), + matrixHeight(1), + matrix{0,0,0,0}, + panel{{0,0,0,0}}, +#endif + currentPalette(CRGBPalette16(CRGB::Black)), + targetPalette(CloudColors_p), + _bri_t(0), + _colors_t{0,0,0}, + _virtualSegmentLength(0), + _length(DEFAULT_LED_COUNT), + _rand16seed(0), + _brightness(DEFAULT_BRIGHTNESS), + _usedSegmentData(0), + _transitionDur(750), + _targetFps(WLED_FPS), + _frametime(FRAMETIME_FIXED), + _cumulativeFps(2), + _isServicing(false), + _isOffRefreshRequired(false), + _hasWhiteChannel(false), + _triggered(false), + _no_rgb(false), + _modeCount(MODE_COUNT), + _callback(nullptr), + customMappingTable(nullptr), + customMappingSize(0), + _lastPaletteChange(0), + _lastShow(0), + _segment_index(0), + _segment_index_palette_last(99), + _mainSegment(0) + { WS2812FX::instance = this; - setupEffectData(); - _brightness = DEFAULT_BRIGHTNESS; - currentPalette = CRGBPalette16(CRGB::Black); - targetPalette = CloudColors_p; - ablMilliampsMax = ABL_MILLIAMPS_DEFAULT; - currentMilliamps = 0; - timebase = 0; - resetSegments(); + _mode.reserve(_modeCount); + _modeData.reserve(_modeCount); + if (_mode.capacity() <= 1 || _modeData.capacity() <= 1) _modeCount = 1; + else setupEffectData(); + /* + _mode = new mode_ptr[_modeCount]; + _modeData = new const char*[_modeCount]; + if (_mode && _modeData) setupEffectData(); + else _modeCount = 1; // only Solid will work + */ } + ~WS2812FX() { + if (customMappingTable) delete[] customMappingTable; + //delete[] _mode; + //delete[] _modeData; + _mode.clear(); + _modeData.clear(); + _segments.clear(); + } + + static WS2812FX* getInstance(void) { return instance; } + void finalizeInit(), service(void), - blur(uint8_t), - fill(uint32_t c, uint8_t seg=255), - fade_out(uint8_t r), - fadeToBlackBy(uint8_t fadeBy), setMode(uint8_t segid, uint8_t m), setColor(uint8_t slot, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), setColor(uint8_t slot, uint32_t c), setCCT(uint16_t k), setBrightness(uint8_t b, bool direct = false), setRange(uint16_t i, uint16_t i2, uint32_t col), - setShowCallback(show_callback cb), - setTransition(uint16_t t), setTransitionMode(bool t), calcGammaTable(float), - trigger(void), - setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t grouping = 0, uint8_t spacing = 0, uint16_t offset = UINT16_MAX, uint16_t startY=0, uint16_t stopY=0), + purgeSegments(void), + setSegment(uint8_t n, uint16_t start, uint16_t stop, uint8_t grouping = 1, uint8_t spacing = 0, uint16_t offset = UINT16_MAX, uint16_t startY=0, uint16_t stopY=1), setMainSegmentId(uint8_t n), restartRuntime(), resetSegments(), makeAutoSegments(bool forceReset = false), fixInvalidSegments(), - setPixelColor(int n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), - setPixelColor(float i, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0, bool aa = false), + setPixelColor(int n, uint32_t c), show(void), setTargetFps(uint8_t fps), deserializeMap(uint8_t n=0); - void addEffect(uint8_t id, mode_ptr mode_fn, const char *mode_name) { if (id < _modeCount) { _mode[id] = mode_fn; _modeData[id] = mode_name;} } - void setupEffectData(void); // defined in FX.cpp + void fill(uint32_t c) { for (int i = 0; i < _length; i++) setPixelColor(i, c); } // fill whole strip with color (inline) + void addEffect(uint8_t id, mode_ptr mode_fn, const char *mode_name); // add effect to the list; defined in FX.cpp + void setupEffectData(void); // add default effects to the list; defined in FX.cpp // outsmart the compiler :) by correctly overloading - inline void setPixelColor(int n, uint32_t c) {setPixelColor(n, byte(c>>16), byte(c>>8), byte(c), byte(c>>24));} - inline void setPixelColor(int n, CRGB c) {setPixelColor(n, c.red, c.green, c.blue);} - inline void setPixelColor(float i, uint32_t c, bool aa=true) {setPixelColor(i, byte(c>>16), byte(c>>8), byte(c), byte(c>>24), aa);} - inline void setPixelColor(float i, CRGB c, bool aa=true) {setPixelColor(i, c.red, c.green, c.blue, 0, aa);} + inline void setPixelColor(int n, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0) { setPixelColor(n, RGBW32(r,g,b,w)); } + inline void setPixelColor(int n, CRGB c) { setPixelColor(n, c.red, c.green, c.blue); } + inline void trigger(void) { _triggered = true; } // Forces the next frame to be computed on all active segments. + inline void setShowCallback(show_callback cb) { _callback = cb; } + inline void setTransition(uint16_t t) { _transitionDur = t; } + inline void appendSegment(const Segment &seg = Segment()) { _segments.push_back(seg); } + inline void addUsedSegmentData(int16_t size) { _usedSegmentData += size; } bool - gammaCorrectBri = false, - gammaCorrectCol = true, + gammaCorrectBri, + gammaCorrectCol, checkSegmentAlignment(void), hasRGBWBus(void), hasCCTBus(void), // return true if the strip is being sent pixel updates isUpdating(void); + inline bool isServicing(void) { return _isServicing; } + inline bool hasWhiteChannel(void) {return _hasWhiteChannel;} + inline bool isOffRefreshRequired(void) {return _isOffRefreshRequired;} + uint8_t - paletteFade = 0, - paletteBlend = 0, - milliampsPerLed = 55, - cctBlending = 0, - getBrightness(void), - getPaletteCount(void), - getMaxSegments(void), + paletteFade, + paletteBlend, + milliampsPerLed, + cctBlending, getActiveSegmentsNum(void), getFirstSelectedSegId(void), - getMainSegmentId(void), getLastActiveSegmentId(void), - getTargetFps(void), setPixelSegment(uint8_t n), gamma8(uint8_t), - gamma8_cal(uint8_t, float), - get_random_wheel_index(uint8_t); + gamma8_cal(uint8_t, float); + inline uint8_t getBrightness(void) { return _brightness; } + inline uint8_t getMaxSegments(void) { return MAX_NUM_SEGMENTS; } // returns maximum number of supported segments (fixed value) + 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 getTargetFps() { return _targetFps; } inline uint8_t getModeCount() { return _modeCount; } - inline uint8_t sin_gap(uint16_t in) { - if (in & 0x100) return 0; - return sin8(in + 192); // correct phase shift of sine so that it starts and stops at 0 - } - - int8_t - tristate_square8(uint8_t x, uint8_t pulsewidth, uint8_t attdec); uint16_t ablMilliampsMax, currentMilliamps, - triwave16(uint16_t), - getLengthTotal(void), getLengthPhysical(void), getFps(); - inline uint16_t getMinShowDelay() { return MIN_SHOW_DELAY; } + inline uint16_t getFrameTime(void) { return _frametime; } + inline uint16_t getMinShowDelay(void) { return MIN_SHOW_DELAY; } + inline uint16_t getLengthTotal(void) { return _length; } + inline uint16_t getTransition(void) { return _transitionDur; } + inline uint16_t getUsedSegmentData(void) { return _usedSegmentData; } uint32_t now, timebase, - color_wheel(uint8_t), - color_from_palette(uint16_t, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri = 255), - color_blend(uint32_t,uint32_t,uint16_t,bool b16=false), - color_add(uint32_t,uint32_t), currentColor(uint32_t colorNew, uint8_t tNr), gamma32(uint32_t), - getLastShow(void), getPixelColor(uint16_t); + inline uint32_t getLastShow(void) { return _lastShow; } + inline uint32_t segColor(uint8_t i) { return _colors_t[i]; } + const char * - getModeData(uint8_t id = 0) { return id<_modeCount ? _modeData[id] : nullptr; } + getModeData(uint8_t id = 0) { return (id && id<_modeCount) ? _modeData[id] : PSTR("Solid"); } const char ** - getModeDataSrc(void) { return _modeData; } + getModeDataSrc(void) { return &(_modeData[0]); } // vectors use arrays for underlying data - WS2812FX::Segment - &getSegment(uint8_t n), - &getFirstSelectedSeg(void), - &getMainSegment(void); + Segment& getSegment(uint8_t id); + inline Segment& getFirstSelectedSeg(void) { return _segments[getFirstSelectedSegId()]; } + inline Segment& getMainSegment(void) { return _segments[getMainSegmentId()]; } + inline Segment* getSegments(void) { return &(_segments[0]); } - WS2812FX::Segment* - getSegments(void); - - // builtin modes - uint16_t - mode_static(void), - mode_blink(void), - mode_blink_rainbow(void), - mode_strobe(void), - mode_strobe_rainbow(void), - mode_color_wipe(void), - mode_color_sweep(void), - mode_color_wipe_random(void), - mode_color_sweep_random(void), - mode_random_color(void), - mode_dynamic(void), - mode_breath(void), - mode_fade(void), - mode_scan(void), - mode_dual_scan(void), - mode_theater_chase(void), - mode_theater_chase_rainbow(void), - mode_rainbow(void), - mode_rainbow_cycle(void), - mode_running_lights(void), - mode_saw(void), - mode_twinkle(void), - mode_dissolve(void), - mode_dissolve_random(void), - mode_sparkle(void), - mode_flash_sparkle(void), - mode_hyper_sparkle(void), - mode_multi_strobe(void), - mode_android(void), - mode_chase_color(void), - mode_chase_random(void), - mode_chase_rainbow(void), - mode_chase_flash(void), - mode_chase_flash_random(void), - mode_chase_rainbow_white(void), - mode_colorful(void), - mode_traffic_light(void), - mode_running_color(void), - mode_aurora(void), - mode_running_random(void), - mode_larson_scanner(void), - mode_comet(void), - mode_fireworks(void), - mode_rain(void), - mode_tetrix(void), - mode_halloween(void), - mode_fire_flicker(void), - mode_gradient(void), - mode_loading(void), - mode_police(void), - mode_fairy(void), - mode_two_dots(void), - mode_fairytwinkle(void), - mode_running_dual(void), - mode_bicolor_chase(void), - mode_tricolor_chase(void), - mode_tricolor_wipe(void), - mode_tricolor_fade(void), - mode_lightning(void), - mode_icu(void), - mode_multi_comet(void), - mode_dual_larson_scanner(void), - mode_random_chase(void), - mode_oscillate(void), - mode_fire_2012(void), - mode_pride_2015(void), - mode_bpm(void), - mode_juggle(void), - mode_palette(void), - mode_colorwaves(void), - mode_fillnoise8(void), - mode_noise16_1(void), - mode_noise16_2(void), - mode_noise16_3(void), - mode_noise16_4(void), - mode_colortwinkle(void), - mode_lake(void), - mode_meteor(void), - mode_meteor_smooth(void), - mode_railway(void), - mode_ripple(void), - mode_twinklefox(void), - mode_twinklecat(void), - mode_halloween_eyes(void), - mode_static_pattern(void), - mode_tri_static_pattern(void), - mode_spots(void), - mode_spots_fade(void), - mode_glitter(void), - mode_candle(void), - mode_starburst(void), - mode_exploding_fireworks(void), - mode_bouncing_balls(void), - mode_sinelon(void), - mode_sinelon_dual(void), - mode_sinelon_rainbow(void), - mode_popcorn(void), - mode_drip(void), - mode_plasma(void), - mode_percent(void), - mode_ripple_rainbow(void), - mode_heartbeat(void), - mode_pacifica(void), - mode_candle_multi(void), - mode_solid_glitter(void), - mode_sunrise(void), - mode_phased(void), - mode_twinkleup(void), - mode_noisepal(void), - mode_sinewave(void), - mode_phased_noise(void), - mode_flow(void), - mode_chunchun(void), - mode_dancing_shadows(void), - mode_washing_machine(void), - mode_candy_cane(void), - mode_blends(void), - mode_tv_simulator(void), - mode_dynamic_smooth(void), - // non-audio transfered from WLED-SR - mode_perlinmove(void), - mode_wavesins(void), - mode_FlowStripe(void); - -// 2D support (panels) + // 2D support (panels) bool - isMatrix = false; + isMatrix; +#ifndef WLED_DISABLE_2D + #define WLED_MAX_PANELS 64 uint8_t - hPanels = 1, - vPanels = 1; + hPanels, + vPanels; uint16_t - panelH = 8, - panelW = 8, - matrixWidth = DEFAULT_LED_COUNT, - matrixHeight = 1; + panelH, + panelW, + matrixWidth, + matrixHeight; - #define WLED_MAX_PANELS 64 typedef struct panel_bitfield_t { unsigned char bottomStart : 1, // starts at bottom? @@ -874,244 +795,86 @@ class WS2812FX { serpentine : 1; // is serpentine? } Panel; Panel - matrix = {0,0,0,0}, - panel[WLED_MAX_PANELS] = {{0,0,0,0}}; + matrix, + panel[WLED_MAX_PANELS]; +#endif void setUpMatrix(), - setPixelColorXY(int x, int y, uint8_t r, uint8_t g, uint8_t b, uint8_t w = 0), - setPixelColorXY(float x, float y, byte r, byte g, byte b, byte w = 0, bool aa = false), - blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend), - addPixelColorXY(uint16_t x, uint16_t y, uint32_t color), - blur1d(CRGB* leds, fract8 blur_amount), - blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds=nullptr), // 1D box blur (with weight) - blur2d(CRGB* leds, fract8 blur_amount), - blurRow(uint16_t row, fract8 blur_amount, CRGB* leds=nullptr), - blurCol(uint16_t col, fract8 blur_amount, CRGB* leds=nullptr), - moveX(CRGB *leds, int8_t delta), - moveY(CRGB *leds, int8_t delta), - move(uint8_t dir, uint8_t delta, CRGB *leds=nullptr), - fill_solid(CRGB* leds, CRGB c), - fill_circle(CRGB* leds, uint16_t cx, uint16_t cy, uint8_t radius, CRGB c), - fadeToBlackBy(CRGB* leds, uint8_t fadeBy), - nscale8(CRGB* leds, uint8_t scale), - setPixels(CRGB* leds), - drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, CRGB *leds = nullptr), - drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds = nullptr), - wu_pixel(CRGB *leds, uint32_t x, uint32_t y, CRGB c); + setPixelColorXY(int x, int y, uint32_t c); // outsmart the compiler :) by correctly overloading - inline void setPixelColorXY(int x, int y, uint32_t c) { setPixelColorXY(x, y, byte(c>>16), byte(c>>8), byte(c), byte(c>>24)); } - inline void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, c.red, c.green, c.blue, 0); } - inline void setPixelColorXY(float x, float y, uint32_t c, bool aa=true) { setPixelColorXY(x, y, byte(c>>16), byte(c>>8), byte(c), byte(c>>24), aa); } - inline void setPixelColorXY(float x, float y, CRGB c, bool aa=true) { setPixelColorXY(x, y, c.red, c.green, c.blue, 0, aa); } - inline void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint32_t c) { drawLine(x0, y0, x1, y1, CRGB(byte(c>>16), byte(c>>8), byte(c))); } - inline void drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, uint32_t c) { drawCharacter(chr, x, y, w, h, CRGB(byte(c>>16), byte(c>>8), byte(c))); } - - uint16_t - XY(uint16_t, uint16_t), - get2DPixelIndex(uint16_t x, uint16_t y, uint8_t seg=255); + inline void setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w = 0) { setPixelColorXY(x, y, RGBW32(r,g,b,w)); } // automatically inline + inline void setPixelColorXY(int x, int y, CRGB c) { setPixelColorXY(x, y, c.red, c.green, c.blue); } uint32_t getPixelColorXY(uint16_t, uint16_t); -// end 2D support + // end 2D support - // 2D modes - uint16_t - mode_2Dspaceships(void), - mode_2Dcrazybees(void), - mode_2Dghostrider(void), - mode_2Dfloatingblobs(void), - mode_2Dscrollingtext(void), - mode_2Ddriftrose(void); - - // WLED-SR modes -#ifndef USERMOD_AUDIOREACTIVE - uint16_t - mode_2Dnoise(void), - mode_2Dfirenoise(void), - mode_2Dsquaredswirl(void), - mode_2Ddna(void), - mode_2Dmatrix(void), - mode_2Dmetaballs(void), - mode_2DPulser(void), - mode_2Dgameoflife(void), - mode_2Dtartan(void), - mode_2DPolarLights(void), - mode_2DSwirl(void), - mode_2DLissajous(void), - mode_2DFrizzles(void), - mode_2DPlasmaball(void), - mode_2DHiphotic(void), - mode_2DSindots(void), - mode_2DDNASpiral(void), - mode_2DBlackHole(void), - mode_2DSunradiation(void), - mode_2DWaverly(void), - mode_2DDrift(void), - mode_2DColoredBursts(void), - mode_2DJulia(void), - mode_gravimeter(void), - mode_gravcenter(void), - mode_gravcentric(void), - mode_juggles(void), - mode_matripix(void), - mode_midnoise(void), - mode_noisemeter(void), - mode_noisefire(void), - mode_pixelwave(void), - mode_plasmoid(void), - mode_puddles(void), - mode_puddlepeak(void), - mode_ripplepeak(void), - mode_2DAkemi(void); -#else - uint16_t - mode_pixels(void), - mode_pixelwave(void), - mode_juggles(void), - mode_matripix(void), - mode_gravimeter(void), - mode_plasmoid(void), - mode_puddles(void), - mode_midnoise(void), - mode_noisemeter(void), - mode_freqwave(void), - mode_freqmatrix(void), - mode_2DGEQ(void), - mode_waterfall(void), - mode_freqpixels(void), - mode_binmap(void), - mode_noisefire(void), - mode_puddlepeak(void), - mode_noisemove(void), - mode_2Dnoise(void), - mode_ripplepeak(void), - mode_2Dfirenoise(void), - mode_2Dsquaredswirl(void), - mode_2Ddna(void), - mode_2Dmatrix(void), - mode_2Dmetaballs(void), - mode_freqmap(void), - mode_gravcenter(void), - mode_gravcentric(void), - mode_gravfreq(void), - mode_DJLight(void), - mode_2DFunkyPlank(void), - mode_2DPulser(void), - mode_blurz(void), - mode_2Dgameoflife(void), - mode_2Dtartan(void), - mode_2DPolarLights(void), - mode_2DSwirl(void), - mode_2DLissajous(void), - mode_2DFrizzles(void), - mode_2DPlasmaball(void), - mode_2DHiphotic(void), - mode_2DSindots(void), - mode_2DDNASpiral(void), - mode_2DBlackHole(void), - mode_rocktaves(void), - mode_2DAkemi(void), - mode_2DSunradiation(void), - mode_2DWaverly(void), - mode_2DDrift(void), - mode_2DColoredBursts(void), - mode_2DJulia(void), - mode_customEffect(void); //WLEDSR Custom Effects -#endif - - private: - uint32_t crgb_to_col(CRGB fastled); - CRGB col_to_crgb(uint32_t); CRGBPalette16 currentPalette; CRGBPalette16 targetPalette; - uint16_t _length, _virtualSegmentLength; + // using public variables to reduce code size increase due to inline function getSegment() (with bounds checking) + // and color transitions + uint8_t _bri_t; // used for opacity transitions + uint32_t _colors_t[3]; // used for color transitions + uint16_t _virtualSegmentLength; + + //segment _segments[MAX_NUM_SEGMENTS]; // SRAM footprint: 88 bytes per element + std::vector _segments; // deleting a segment while effects play crashes ESP + friend class Segment; + //size_t segSize = sizeof(Segment); + //size_t segsSize = sizeof(_segments); + + private: + uint16_t _length; uint16_t _rand16seed; uint8_t _brightness; - uint16_t _usedSegmentData = 0; - uint16_t _transitionDur = 750; + uint16_t _usedSegmentData; + uint16_t _transitionDur; - uint8_t _targetFps = 42; - uint16_t _frametime = (1000/42); - uint16_t _cumulativeFps = 2; + uint8_t _targetFps; + uint16_t _frametime; + uint16_t _cumulativeFps; + // will require only 1 byte +// struct { +// byte _isServicing : 1; +// byte _isOffRefreshRequired : 1; +// byte _hasWhiteChannel : 1; +// byte _triggered : 1; +// byte _no_rgb : 1; +// }; bool - _isOffRefreshRequired = false, //periodic refresh is required for the strip to remain off. - _hasWhiteChannel = false, - _triggered; + _isServicing, + _isOffRefreshRequired, //periodic refresh is required for the strip to remain off. + _hasWhiteChannel, + _triggered, + _no_rgb; - uint8_t _modeCount = MODE_COUNT; - // TODO: allocate memory using new or malloc() - mode_ptr _mode[MODE_COUNT]; // SRAM footprint: 4 bytes per element - const char *_modeData[MODE_COUNT]; // mode (effect) name and its slider control data array + uint8_t _modeCount; + //mode_ptr *_mode; // SRAM footprint: 4 bytes per element + //const char **_modeData; // mode (effect) name and its slider control data array + std::vector _mode; // SRAM footprint: 4 bytes per element + std::vector _modeData; // mode (effect) name and its slider control data array - show_callback _callback = nullptr; + show_callback _callback; - // mode helper functions - uint16_t - blink(uint32_t, uint32_t, bool strobe, bool), - candle(bool), - color_wipe(bool, bool), - dynamic(bool), - scan(bool), - fireworks_base(CRGB*), - running_base(bool,bool), - larson_scanner(bool), - sinelon_base(bool,bool), - dissolve(uint32_t), - chase(uint32_t, uint32_t, uint32_t, bool), - gradient_base(bool), - ripple_base(bool), - police_base(uint32_t, uint32_t), - running(uint32_t, uint32_t, bool theatre=false), - tricolor_chase(uint32_t, uint32_t), - twinklefox_base(bool), - spots_base(uint16_t), - phased_base(uint8_t); - - CRGB twinklefox_one_twinkle(uint32_t ms, uint8_t salt, bool cat); - CRGB pacifica_one_layer(uint16_t i, CRGBPalette16& p, uint16_t cistart, uint16_t wavescale, uint8_t bri, uint16_t ioff); + uint16_t* customMappingTable; + uint16_t customMappingSize; + + uint32_t _lastPaletteChange; + uint32_t _lastShow; + + uint8_t _segment_index; + uint8_t _segment_index_palette_last; + uint8_t _mainSegment; void - blendPixelColor(uint16_t n, uint32_t color, uint8_t blend), - startTransition(uint8_t oldBri, uint32_t oldCol, uint16_t dur, uint8_t segn, uint8_t slot), estimateCurrentAndLimitBri(void), load_gradient_palette(uint8_t), handle_palette(void); - - uint16_t* customMappingTable = nullptr; - uint16_t customMappingSize = 0; - - uint32_t _lastPaletteChange = 0; - uint32_t _lastShow = 0; - - uint32_t _colors_t[3]; - uint8_t _bri_t; - bool _no_rgb = false; - - uint8_t _segment_index = 0; - uint8_t _segment_index_palette_last = 99; - uint8_t _mainSegment; - - segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 27 bytes per element - // start, stop, offset, speed, intensity, palette, mode, options, grouping, spacing, opacity (unused), color[], capabilities, custom 1, custom 2, custom 3 - {0, 7, 0, DEFAULT_SPEED, DEFAULT_INTENSITY, 0, DEFAULT_MODE, NO_OPTIONS, 1, 0, 255, {DEFAULT_COLOR}, 0, DEFAULT_C1, DEFAULT_C2, DEFAULT_C3, 0, 1} - }; - segment_runtime _segment_runtimes[MAX_NUM_SEGMENTS]; // SRAM footprint: 28 bytes per element - friend class Segment_runtime; - - ColorTransition transitions[MAX_NUM_TRANSITIONS]; //12 bytes per element - friend class ColorTransition; - - uint16_t - transitionProgress(uint8_t tNr); - - public: - inline bool hasWhiteChannel(void) {return _hasWhiteChannel;} - inline bool isOffRefreshRequired(void) {return _isOffRefreshRequired;} }; extern const char JSON_mode_names[]; diff --git a/wled00/FX_2Dfcn.cpp b/wled00/FX_2Dfcn.cpp index 72aa875c3..635300801 100644 --- a/wled00/FX_2Dfcn.cpp +++ b/wled00/FX_2Dfcn.cpp @@ -35,6 +35,7 @@ // but ledmap takes care of that. ledmap is constructed upon initialization // so matrix should disable regular ledmap processing void WS2812FX::setUpMatrix() { +#ifndef WLED_DISABLE_2D // erase old ledmap, just in case. if (customMappingTable != nullptr) delete[] customMappingTable; customMappingTable = nullptr; @@ -46,7 +47,7 @@ void WS2812FX::setUpMatrix() { // safety check if (matrixWidth * matrixHeight > MAX_LEDS) { - matrixWidth = getLengthTotal(); + matrixWidth = _length; matrixHeight = 1; isMatrix = false; return; @@ -94,107 +95,113 @@ void WS2812FX::setUpMatrix() { #endif } else { // memory allocation error - matrixWidth = getLengthTotal(); + matrixWidth = _length; matrixHeight = 1; isMatrix = false; return; } } else { // not a matrix set up - matrixWidth = getLengthTotal(); + matrixWidth = _length; matrixHeight = 1; } +#endif } +// absolute matrix version of setPixelColor() +void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, uint32_t col) +{ +#ifndef WLED_DISABLE_2D + if (!isMatrix) return; // not a matrix set-up + uint16_t index = y * matrixWidth + x; + if (index >= _length) return; + if (index < customMappingSize) index = customMappingTable[index]; + busses.setPixelColor(index, col); +#endif +} + +// returns RGBW values of pixel +uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) { +#ifndef WLED_DISABLE_2D + uint16_t index = (y * matrixWidth + x); + if (index >= _length) return 0; + if (index < customMappingSize) index = customMappingTable[index]; + return busses.getPixelColor(index); +#else + return 0; +#endif +} + +/////////////////////////////////////////////////////////// +// Segment:: routines +/////////////////////////////////////////////////////////// + // XY(x,y) - gets pixel index within current segment (often used to reference leds[] array element) -uint16_t IRAM_ATTR WS2812FX::XY(uint16_t x, uint16_t y) { - uint16_t width = SEGMENT.virtualWidth(); // segment width in logical pixels - uint16_t height = SEGMENT.virtualHeight(); // segment height in logical pixels -/* - if (SEGMENT.getOption(SEG_OPTION_TRANSPOSED)) { - uint16_t t; - // swap X & Y if segment transposed - t = x; x = y; y = t; - // swap width & height if segment transposed - t = width; width = height; height = t; - } -*/ +uint16_t IRAM_ATTR Segment::XY(uint16_t x, uint16_t y) { +#ifndef WLED_DISABLE_2D + uint16_t width = virtualWidth(); // segment width in logical pixels + uint16_t height = virtualHeight(); // segment height in logical pixels return (x%width) + (y%height) * width; +#else + return 0; +#endif } -// get2DPixelIndex(x,y,seg) - returns an index of segment pixel in a matrix layout -// index still needs to undergo ledmap processing to represent actual physical pixel -// matrix is always organized by matrixHeight number of matrixWidth pixels from top to bottom, left to right -// so: pixel at get2DPixelIndex(5,6) in a 2D segment with [start=10, stop=19, startY=20, stopY=29 : 10x10 pixels] -// corresponds to pixel with logical index of 847 (0 based) if a 2D segment belongs to a 32x32 matrix. -// math: (matrixWidth * (startY + y)) + start + x => (32 * (20+6)) + 10 + 5 = 847 -uint16_t IRAM_ATTR WS2812FX::get2DPixelIndex(uint16_t x, uint16_t y, uint8_t seg) { - if (seg == 255) seg = _segment_index; - x %= _segments[seg].width(); // just in case constrain x (wrap around) - y %= _segments[seg].height(); // just in case constrain y (wrap around) - return ((_segments[seg].startY + y) * matrixWidth) + _segments[seg].start + x; -} - -void IRAM_ATTR WS2812FX::setPixelColorXY(int x, int y, byte r, byte g, byte b, byte w) +void IRAM_ATTR Segment::setPixelColorXY(int x, int y, uint32_t col) { - if (!isMatrix) return; // not a matrix set-up +#ifndef WLED_DISABLE_2D + if (!strip.isMatrix) return; // not a matrix set-up - if (_bri_t < 255) { - r = scale8(r, _bri_t); - g = scale8(g, _bri_t); - b = scale8(b, _bri_t); - w = scale8(w, _bri_t); + uint8_t _bri_t = strip._bri_t; + //uint8_t _bri_t = currentBri(getOption(SEG_OPTION_ON) ? opacity : 0); + if (_bri_t < 255) { + byte r = scale8(R(col), _bri_t); + byte g = scale8(G(col), _bri_t); + byte b = scale8(B(col), _bri_t); + byte w = scale8(W(col), _bri_t); + col = RGBW32(r, g, b, w); } - uint32_t col = RGBW32(r, g, b, w); - if (SEGMENT.getOption(SEG_OPTION_REVERSED) ) x = SEGMENT.virtualWidth() - x - 1; - if (SEGMENT.getOption(SEG_OPTION_REVERSED_Y)) y = SEGMENT.virtualHeight() - y - 1; - if (SEGMENT.getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed + if (getOption(SEG_OPTION_REVERSED) ) x = virtualWidth() - x - 1; + if (getOption(SEG_OPTION_REVERSED_Y)) y = virtualHeight() - y - 1; + if (getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed - x *= SEGMENT.groupLength(); // expand to physical pixels - y *= SEGMENT.groupLength(); // expand to physical pixels - if (x >= SEGMENT.width() || y >= SEGMENT.height()) return; // if pixel would fall out of segment just exit + x *= groupLength(); // expand to physical pixels + y *= groupLength(); // expand to physical pixels + if (x >= width() || y >= height()) return; // if pixel would fall out of segment just exit - for (uint8_t j = 0; j < SEGMENT.grouping; j++) { // groupping vertically - for (uint8_t g = 0; g < SEGMENT.grouping; g++) { // groupping horizontally - uint16_t index, xX = (x+g), yY = (y+j); - if (xX >= SEGMENT.width() || yY >= SEGMENT.height()) continue; // we have reached one dimension's end + for (int j = 0; j < grouping; j++) { // groupping vertically + for (int g = 0; g < grouping; g++) { // groupping horizontally + uint16_t xX = (x+g), yY = (y+j); + if (xX >= width() || yY >= height()) continue; // we have reached one dimension's end - //if (SEGMENT.getOption(SEG_OPTION_REVERSED) ) xX = SEGMENT.width() - xX - 1; - //if (SEGMENT.getOption(SEG_OPTION_REVERSED_Y)) yY = SEGMENT.height() - yY - 1; + strip.setPixelColorXY(start + xX, startY + yY, col); - index = get2DPixelIndex(xX, yY); - if (index < customMappingSize) index = customMappingTable[index]; - busses.setPixelColor(index, col); - - if (SEGMENT.getOption(SEG_OPTION_MIRROR)) { //set the corresponding horizontally mirrored pixel - //index = get2DPixelIndex(SEGMENT.width() - xX - 1, yY); - index = SEGMENT.getOption(SEG_OPTION_TRANSPOSED) ? get2DPixelIndex(xX, SEGMENT.height() - yY - 1) : get2DPixelIndex(SEGMENT.width() - xX - 1, yY); - if (index < customMappingSize) index = customMappingTable[index]; - busses.setPixelColor(index, col); + if (getOption(SEG_OPTION_MIRROR)) { //set the corresponding horizontally mirrored pixel + if (getOption(SEG_OPTION_TRANSPOSED)) strip.setPixelColorXY(start + xX, startY + height() - yY - 1, col); + else strip.setPixelColorXY(start + width() - xX - 1, startY + yY, col); } - if (SEGMENT.getOption(SEG_OPTION_MIRROR_Y)) { //set the corresponding vertically mirrored pixel - //index = get2DPixelIndex(xX, SEGMENT.height() - yY - 1); - index = SEGMENT.getOption(SEG_OPTION_TRANSPOSED) ? get2DPixelIndex(SEGMENT.width() - xX - 1, yY) : get2DPixelIndex(xX, SEGMENT.height() - yY - 1); - if (index < customMappingSize) index = customMappingTable[index]; - busses.setPixelColor(index, col); + if (getOption(SEG_OPTION_MIRROR_Y)) { //set the corresponding vertically mirrored pixel + if (getOption(SEG_OPTION_TRANSPOSED)) strip.setPixelColorXY(start + width() - xX - 1, startY + yY, col); + else strip.setPixelColorXY(start + xX, startY + height() - yY - 1, col); } - if (SEGMENT.getOption(SEG_OPTION_MIRROR_Y) && SEGMENT.getOption(SEG_OPTION_MIRROR)) { //set the corresponding vertically AND horizontally mirrored pixel - index = get2DPixelIndex(SEGMENT.width() - xX - 1, SEGMENT.height() - yY - 1); - if (index < customMappingSize) index = customMappingTable[index]; - busses.setPixelColor(index, col); + if (getOption(SEG_OPTION_MIRROR_Y) && getOption(SEG_OPTION_MIRROR)) { //set the corresponding vertically AND horizontally mirrored pixel + strip.setPixelColorXY(width() - xX - 1, height() - yY - 1, col); } } } +#endif } // anti-aliased version of setPixelColorXY() -void /*IRAM_ATTR*/ WS2812FX::setPixelColorXY(float x, float y, byte r, byte g, byte b, byte w, bool aa) +void Segment::setPixelColorXY(float x, float y, uint32_t col, bool aa) { +#ifndef WLED_DISABLE_2D + if (!strip.isMatrix) return; // not a matrix set-up if (x<0.0f || x>1.0f || y<0.0f || y>1.0f) return; // not normalized - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); float fX = x * (cols-1); float fY = y * (rows-1); @@ -213,80 +220,59 @@ void /*IRAM_ATTR*/ WS2812FX::setPixelColorXY(float x, float y, byte r, byte g, b uint32_t cXRYB = getPixelColorXY(xR, yB); if (xL!=xR && yT!=yB) { - // blend TL pixel - cXLYT = color_blend(RGBW32(r,g,b,w), cXLYT, uint8_t(sqrtf(dL*dT)*255.0f)); - setPixelColorXY(xL, yT, R(cXLYT), G(cXLYT), B(cXLYT), W(cXLYT)); - // blend TR pixel - cXRYT = color_blend(RGBW32(r,g,b,w), cXRYT, uint8_t(sqrtf(dR*dT)*255.0f)); - setPixelColorXY(xR, yT, R(cXRYT), G(cXRYT), B(cXRYT), W(cXRYT)); - // blend BL pixel - cXLYB = color_blend(RGBW32(r,g,b,w), cXLYB, uint8_t(sqrtf(dL*dB)*255.0f)); - setPixelColorXY(xL, yB, R(cXLYB), G(cXLYB), B(cXLYB), W(cXLYB)); - // blend BR pixel - cXRYB = color_blend(RGBW32(r,g,b,w), cXRYB, uint8_t(sqrtf(dR*dB)*255.0f)); - setPixelColorXY(xR, yB, R(cXRYB), G(cXRYB), B(cXRYB), W(cXRYB)); + setPixelColorXY(xL, yT, color_blend(col, cXLYT, uint8_t(sqrtf(dL*dT)*255.0f))); // blend TL pixel + setPixelColorXY(xR, yT, color_blend(col, cXRYT, uint8_t(sqrtf(dR*dT)*255.0f))); // blend TR pixel + setPixelColorXY(xL, yB, color_blend(col, cXLYB, uint8_t(sqrtf(dL*dB)*255.0f))); // blend BL pixel + setPixelColorXY(xR, yB, color_blend(col, cXRYB, uint8_t(sqrtf(dR*dB)*255.0f))); // blend BR pixel } else if (xR!=xL && yT==yB) { - // blend L pixel - cXLYT = color_blend(RGBW32(r,g,b,w), cXLYT, uint8_t(dL*255.0f)); - setPixelColorXY(xR, yT, R(cXLYT), G(cXLYT), B(cXLYT), W(cXLYT)); - // blend R pixel - cXRYT = color_blend(RGBW32(r,g,b,w), cXRYT, uint8_t(dR*255.0f)); - setPixelColorXY(xR, yT, R(cXRYT), G(cXRYT), B(cXRYT), W(cXRYT)); + setPixelColorXY(xR, yT, color_blend(col, cXLYT, uint8_t(dL*255.0f))); // blend L pixel + setPixelColorXY(xR, yT, color_blend(col, cXRYT, uint8_t(dR*255.0f))); // blend R pixel } else if (xR==xL && yT!=yB) { - // blend T pixel - cXLYT = color_blend(RGBW32(r,g,b,w), cXLYT, uint8_t(dT*255.0f)); - setPixelColorXY(xR, yT, R(cXLYT), G(cXLYT), B(cXLYT), W(cXLYT)); - // blend B pixel - cXLYB = color_blend(RGBW32(r,g,b,w), cXLYB, uint8_t(dB*255.0f)); - setPixelColorXY(xL, yB, R(cXLYB), G(cXLYB), B(cXLYB), W(cXLYB)); + setPixelColorXY(xR, yT, color_blend(col, cXLYT, uint8_t(dT*255.0f))); // blend T pixel + setPixelColorXY(xL, yB, color_blend(col, cXLYB, uint8_t(dB*255.0f))); // blend B pixel } else { - // exact match (x & y land on a pixel) - setPixelColorXY(xL, yT, r, g, b, w); + setPixelColorXY(xL, yT, col); // exact match (x & y land on a pixel) } } else { - setPixelColorXY(uint16_t(roundf(fX)), uint16_t(roundf(fY)), r, g, b, w); + setPixelColorXY(uint16_t(roundf(fX)), uint16_t(roundf(fY)), col); } +#endif } // returns RGBW values of pixel -uint32_t WS2812FX::getPixelColorXY(uint16_t x, uint16_t y) { - uint16_t index; - if (SEGLEN) { - if (SEGMENT.getOption(SEG_OPTION_REVERSED) ) x = SEGMENT.virtualWidth() - x - 1; - if (SEGMENT.getOption(SEG_OPTION_REVERSED_Y)) y = SEGMENT.virtualHeight() - y - 1; - if (SEGMENT.getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed - - x *= SEGMENT.groupLength(); // expand to physical pixels - y *= SEGMENT.groupLength(); // expand to physical pixels - if (x >= SEGMENT.width() || y >= SEGMENT.height()) return 0; - - index = get2DPixelIndex(x, y); - } else { - index = y * matrixWidth + x; - } - if (index < customMappingSize) index = customMappingTable[index]; - - return busses.getPixelColor(index); +uint32_t Segment::getPixelColorXY(uint16_t x, uint16_t y) { +#ifndef WLED_DISABLE_2D + if (getOption(SEG_OPTION_REVERSED) ) x = virtualWidth() - x - 1; + if (getOption(SEG_OPTION_REVERSED_Y)) y = virtualHeight() - y - 1; + if (getOption(SEG_OPTION_TRANSPOSED)) { uint16_t t = x; x = y; y = t; } // swap X & Y if segment transposed + x *= groupLength(); // expand to physical pixels + y *= groupLength(); // expand to physical pixels + if (x >= width() || y >= height()) return 0; + return strip.getPixelColorXY(start + x, startY + y); +#else + return 0; +#endif } -/* - * Blends the specified color with the existing pixel color. - */ -void WS2812FX::blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) { +// Blends the specified color with the existing pixel color. +void Segment::blendPixelColorXY(uint16_t x, uint16_t y, uint32_t color, uint8_t blend) { +#ifndef WLED_DISABLE_2D setPixelColorXY(x, y, color_blend(getPixelColorXY(x,y), color, blend)); +#endif } -/* - * Adds the specified color with the existing pixel color perserving color balance. - */ -void WS2812FX::addPixelColorXY(uint16_t x, uint16_t y, uint32_t color) { +// Adds the specified color with the existing pixel color perserving color balance. +void Segment::addPixelColorXY(uint16_t x, uint16_t y, uint32_t color) { +#ifndef WLED_DISABLE_2D setPixelColorXY(x, y, color_add(getPixelColorXY(x,y), color)); +#endif } // blurRow: perform a blur on a row of a rectangular matrix -void WS2812FX::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (row >= rows) return; // blur one row @@ -294,13 +280,13 @@ void WS2812FX::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { uint8_t seep = blur_amount >> 1; CRGB carryover = CRGB::Black; for (uint16_t x = 0; x < cols; x++) { - CRGB cur = leds ? leds[XY(x,row)] : col_to_crgb(getPixelColorXY(x, row)); + CRGB cur = leds ? leds[XY(x,row)] : CRGB(getPixelColorXY(x, row)); CRGB part = cur; part.nscale8(seep); cur.nscale8(keep); cur += carryover; if (x) { - CRGB prev = (leds ? leds[XY(x-1,row)] : col_to_crgb(getPixelColorXY(x-1, row))) + part; + CRGB prev = (leds ? leds[XY(x-1,row)] : CRGB(getPixelColorXY(x-1, row))) + part; if (leds) leds[XY(x-1,row)] = prev; else setPixelColorXY(x-1, row, prev); } @@ -308,12 +294,14 @@ void WS2812FX::blurRow(uint16_t row, fract8 blur_amount, CRGB* leds) { else setPixelColorXY(x, row, cur); carryover = part; } +#endif } // blurCol: perform a blur on a column of a rectangular matrix -void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (col >= cols) return; // blur one column @@ -321,13 +309,13 @@ void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { uint8_t seep = blur_amount >> 1; CRGB carryover = CRGB::Black; for (uint16_t i = 0; i < rows; i++) { - CRGB cur = leds ? leds[XY(col,i)] : col_to_crgb(getPixelColorXY(col, i)); + CRGB cur = leds ? leds[XY(col,i)] : CRGB(getPixelColorXY(col, i)); CRGB part = cur; part.nscale8(seep); cur.nscale8(keep); cur += carryover; if (i) { - CRGB prev = (leds ? leds[XY(col,i-1)] : col_to_crgb(getPixelColorXY(col, i-1))) + part; + CRGB prev = (leds ? leds[XY(col,i-1)] : CRGB(getPixelColorXY(col, i-1))) + part; if (leds) leds[XY(col,i-1)] = prev; else setPixelColorXY(col, i-1, prev); } @@ -335,6 +323,7 @@ void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { else setPixelColorXY(col, i, cur); carryover = part; } +#endif } // blur1d: one-dimensional blur filter. Spreads light to 2 line neighbors. @@ -351,17 +340,20 @@ void WS2812FX::blurCol(uint16_t col, fract8 blur_amount, CRGB* leds) { // eventually all the way to black; this is by design so that // it can be used to (slowly) clear the LEDs to black. -void WS2812FX::blur1d(CRGB* leds, fract8 blur_amount) { - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::blur1d(CRGB* leds, fract8 blur_amount) { +#ifndef WLED_DISABLE_2D + const uint16_t rows = virtualHeight(); for (uint16_t y = 0; y < rows; y++) blurRow(y, blur_amount, leds); +#endif } // 1D Box blur (with added weight - blur_amount: [0=no blur, 255=max blur]) -void WS2812FX::blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); - const uint16_t dim1 = vertical ? rows : cols; - const uint16_t dim2 = vertical ? cols : rows; +void Segment::blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); + const uint16_t dim1 = vertical ? rows : cols; + const uint16_t dim2 = vertical ? cols : rows; if (i >= dim2) return; const float seep = blur_amount/255.f; const float keep = 3.f - 2.f*seep; @@ -374,9 +366,9 @@ void WS2812FX::blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds) uint16_t yp = vertical ? y-1 : y; uint16_t xn = vertical ? x : x+1; uint16_t yn = vertical ? y+1 : y; - CRGB curr = leds ? leds[XY(x,y)] : col_to_crgb(getPixelColorXY(x,y)); - CRGB prev = (xp<0 || yp<0) ? CRGB::Black : (leds ? leds[XY(xp,yp)] : col_to_crgb(getPixelColorXY(xp,yp))); - CRGB next = ((vertical && yn>=dim1) || (!vertical && xn>=dim1)) ? CRGB::Black : (leds ? leds[XY(xn,yn)] : col_to_crgb(getPixelColorXY(xn,yn))); + CRGB curr = leds ? leds[XY(x,y)] : CRGB(getPixelColorXY(x,y)); + CRGB prev = (xp<0 || yp<0) ? CRGB::Black : (leds ? leds[XY(xp,yp)] : CRGB(getPixelColorXY(xp,yp))); + CRGB next = ((vertical && yn>=dim1) || (!vertical && xn>=dim1)) ? CRGB::Black : (leds ? leds[XY(xn,yn)] : CRGB(getPixelColorXY(xn,yn))); uint16_t r, g, b; r = (curr.r*keep + (prev.r + next.r)*seep) / 3; g = (curr.g*keep + (prev.g + next.g)*seep) / 3; @@ -389,63 +381,65 @@ void WS2812FX::blur1d(uint16_t i, bool vertical, fract8 blur_amount, CRGB* leds) if (leds) leds[XY(x,y)] = tmp[j]; else setPixelColorXY(x, y, tmp[j]); } +#endif } -void WS2812FX::blur2d(CRGB* leds, fract8 blur_amount) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::blur2d(CRGB* leds, fract8 blur_amount) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount, leds); // blur all rows for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount, leds); // blur all columns +#endif } -void WS2812FX::moveX(CRGB *leds, int8_t delta) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::moveX(CRGB *leds, int8_t delta) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (!delta) return; if (delta > 0) { for (uint8_t y = 0; y < rows; y++) for (uint8_t x = 0; x < cols-1; x++) { + if (x + delta >= cols) break; if (leds) leds[XY(x, y)] = leds[XY((x + delta)%cols, y)]; else setPixelColorXY(x, y, getPixelColorXY((x + delta)%cols, y)); } } else { for (uint8_t y = 0; y < rows; y++) for (int16_t x = cols-1; x >= 0; x--) { - if (x + delta < 0) { - if (leds) leds[XY(x, y)] = leds[XY(cols + delta, y)]; - else setPixelColorXY(x, y, getPixelColorXY(cols + delta, y)); - } else { - if (leds) leds[XY(x, y)] = leds[XY(x + delta, y)]; - else setPixelColorXY(x, y, getPixelColorXY(x + delta, y)); - } + if (x + delta < 0) break; + if (leds) leds[XY(x, y)] = leds[XY(x + delta, y)]; + else setPixelColorXY(x, y, getPixelColorXY(x + delta, y)); } } +#endif } -void WS2812FX::moveY(CRGB *leds, int8_t delta) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::moveY(CRGB *leds, int8_t delta) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (!delta) return; if (delta > 0) { for (uint8_t x = 0; x < cols; x++) for (uint8_t y = 0; y < rows-1; y++) { - if (leds) leds[XY(x, y)] = leds[XY(x, (y + delta)%rows)]; - else setPixelColorXY(x, y, getPixelColorXY(x, (y + delta)%rows)); + if (y + delta >= rows) break; + if (leds) leds[XY(x, y)] = leds[XY(x, (y + delta))]; + else setPixelColorXY(x, y, getPixelColorXY(x, (y + delta))); } } else { for (uint8_t x = 0; x < cols; x++) for (int16_t y = rows-1; y >= 0; y--) { - if (y + delta < 0) { - if (leds) leds[XY(x, y)] = leds[XY(x, rows + delta)]; - else setPixelColorXY(x, y, getPixelColorXY(x, rows + delta)); - } else { - if (leds) leds[XY(x, y)] = leds[XY(x, y + delta)]; - else setPixelColorXY(x, y, getPixelColorXY(x, y + delta)); - } + if (y + delta < 0) break; + if (leds) leds[XY(x, y)] = leds[XY(x, y + delta)]; + else setPixelColorXY(x, y, getPixelColorXY(x, y + delta)); } } +#endif } // move() - move all pixels in desired direction delta number of pixels // @param dir direction: 0=left, 1=left-up, 2=up, 3=right-up, 4=right, 5=right-down, 6=down, 7=left-down // @param delta number of pixels to move -void WS2812FX::move(uint8_t dir, uint8_t delta, CRGB *leds) { +void Segment::move(uint8_t dir, uint8_t delta, CRGB *leds) { +#ifndef WLED_DISABLE_2D if (delta==0) return; switch (dir) { case 0: moveX(leds, delta); break; @@ -457,21 +451,25 @@ void WS2812FX::move(uint8_t dir, uint8_t delta, CRGB *leds) { case 6: moveY(leds,-delta); break; case 7: moveX(leds, delta); moveY(leds,-delta); break; } +#endif } -void WS2812FX::fill_solid(CRGB* leds, CRGB color) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::fill_solid(CRGB* leds, CRGB color) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { if (leds) leds[XY(x,y)] = color; else setPixelColorXY(x, y, color); } +#endif } // by stepko, taken from https://editor.soulmatelights.com/gallery/573-blobs -void WS2812FX::fill_circle(CRGB* leds, uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::fill_circle(CRGB* leds, uint16_t cx, uint16_t cy, uint8_t radius, CRGB col) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); for (int16_t y = -radius; y <= radius; y++) { for (int16_t x = -radius; x <= radius; x++) { if (x * x + y * y <= radius * radius && @@ -480,31 +478,39 @@ void WS2812FX::fill_circle(CRGB* leds, uint16_t cx, uint16_t cy, uint8_t radius, leds[XY(cx + x, cy + y)] += col; } } +#endif } -void WS2812FX::fadeToBlackBy(CRGB* leds, uint8_t fadeBy) { +void Segment::fadeToBlackBy(CRGB* leds, uint8_t fadeBy) { +#ifndef WLED_DISABLE_2D nscale8(leds, 255 - fadeBy); +#endif } -void WS2812FX::nscale8(CRGB* leds, uint8_t scale) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::nscale8(CRGB* leds, uint8_t scale) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { if (leds) leds[XY(x,y)].nscale8(scale); - else setPixelColorXY(x, y, col_to_crgb(getPixelColorXY(x, y)).nscale8(scale)); + else setPixelColorXY(x, y, CRGB(getPixelColorXY(x, y)).nscale8(scale)); } +#endif } -void WS2812FX::setPixels(CRGB* leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::setPixels(CRGB* leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) setPixelColorXY(x, y, leds[XY(x,y)]); +#endif } //line function -void WS2812FX::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, CRGB *leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, CRGB c, CRGB *leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (x0 >= cols || x1 >= cols || y0 >= rows || y1 >= rows) return; const int16_t dx = abs(x1-x0), sx = x0-dx) { err -= dy; x0 += sx; } if (e2 < dy) { err += dx; y0 += sy; } } +#endif } +#ifndef WLED_DISABLE_2D // font curtesy of https://github.com/idispatch/raster-fonts static const unsigned char console_font_6x8[] PROGMEM = { @@ -4527,10 +4535,10 @@ static const unsigned char console_font_5x8[] PROGMEM = { 0x00, /* 00000 */ 0x00, /* 00000 */ 0x90, /* 10010 */ - 0x90, /* 10010 */ 0xF0, /* 11110 */ 0x90, /* 10010 */ 0x90, /* 10010 */ + 0x90, /* 10010 */ 0x00, /* 00000 */ /* @@ -6669,19 +6677,21 @@ static const unsigned char console_font_5x8[] PROGMEM = { 0x00, /* 00000 */ 0x00, /* 00000 */ }; +#endif // draws a raster font character on canvas // only supports 5x8 and 6x8 fonts ATM -void WS2812FX::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds) { - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); +void Segment::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, uint8_t h, CRGB color, CRGB *leds) { +#ifndef WLED_DISABLE_2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); if (w<5 || w>6 || h!=8) return; for (uint8_t i = 0; i= rows) break; // drawing off-screen - uint8_t bits; + uint8_t bits = 0; switch (w) { case 5: bits = pgm_read_byte_near(&console_font_5x8[(chr * 8) + i]); break; case 6: bits = pgm_read_byte_near(&console_font_6x8[(chr * 8) + i]); break; @@ -6694,10 +6704,12 @@ void WS2812FX::drawCharacter(unsigned char chr, int16_t x, int16_t y, uint8_t w, } } } +#endif } #define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8)) -void WS2812FX::wu_pixel(CRGB *leds, uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel procedure by reddit u/sutaburosu +void Segment::wu_pixel(CRGB *leds, uint32_t x, uint32_t y, CRGB c) { //awesome wu_pixel procedure by reddit u/sutaburosu +#ifndef WLED_DISABLE_2D // extract the fractional parts and derive their inverses uint8_t xx = x & 0xff, yy = y & 0xff, ix = 255 - xx, iy = 255 - yy; // calculate the intensities for each affected pixel @@ -6710,5 +6722,6 @@ void WS2812FX::wu_pixel(CRGB *leds, uint32_t x, uint32_t y, CRGB c) { //awe leds[xy].g = qadd8(leds[xy].g, c.g * wu[i] >> 8); leds[xy].b = qadd8(leds[xy].b, c.b * wu[i] >> 8); } +#endif } #undef WU_WEIGHT diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 31761cc96..83512be8f 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -69,14 +69,609 @@ #error "Max segments must be at least max number of busses!" #endif + +/////////////////////////////////////////////////////////////////////////////// +// Segment class implementation +/////////////////////////////////////////////////////////////////////////////// + +Segment::Segment(const Segment &orig) { + DEBUG_PRINTLN(F("-- Segment duplicated --")); + memcpy(this, &orig, sizeof(Segment)); + name = nullptr; + data = nullptr; + _dataLen = 0; + //_t = nullptr; + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } + if (orig.data) { allocateData(orig._dataLen); memcpy(data, orig.data, orig._dataLen); } + //if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } + DEBUG_PRINTF(" Original data: %p (%d)\n", orig.data, (int)orig._dataLen); + DEBUG_PRINTF(" Constructed data: %p (%d)\n", data, (int)_dataLen); +} + +Segment::Segment(Segment &&orig) noexcept { + DEBUG_PRINTLN(F("-- Move constructor --")); + memcpy(this, &orig, sizeof(Segment)); + orig.name = nullptr; + orig.data = nullptr; + orig._dataLen = 0; + //orig._t = nullptr; +} + +Segment& Segment::operator= (const Segment &orig) { + DEBUG_PRINTLN(F("-- Segment copied --")); + if (this != &orig) { + if (name) { + DEBUG_PRINTF(" Copy Deleting %s (%p)\n", name, name); + delete[] name; + } + //if (_t) delete _t; + deallocateData(); + memcpy(this, &orig, sizeof(Segment)); + name = nullptr; + data = nullptr; + _dataLen = 0; + //_t = nullptr; + if (orig.name) { name = new char[strlen(orig.name)+1]; if (name) strcpy(name, orig.name); } + if (orig.data) { allocateData(orig._dataLen); memcpy(data, orig.data, orig._dataLen); } + //if (orig._t) { _t = new Transition(orig._t->_dur, orig._t->_briT, orig._t->_cctT, orig._t->_colorT); } + DEBUG_PRINTF(" Original data: %p (%d)\n", orig.data, (int)orig._dataLen); + DEBUG_PRINTF(" Copied data: %p (%d)\n", data, (int)_dataLen); + } + return *this; +} + +Segment& Segment::operator= (Segment &&orig) noexcept { + DEBUG_PRINTLN(F("-- Moving segment --")); + if (this != &orig) { + if (name) { + DEBUG_PRINTF(" Move Deleting %s (%p)\n", name, name); + delete[] name; // free old name + } + //if (_t) delete _t; + deallocateData(); // free old runtime data + memcpy(this, &orig, sizeof(Segment)); + orig.name = nullptr; + orig.data = nullptr; + orig._dataLen = 0; + //orig._t = nullptr; + } + return *this; +} + +bool Segment::allocateData(uint16_t len) { + if (data && _dataLen == len) return true; //already allocated + deallocateData(); + // TODO: move out to WS2812FX class: for (seg : _segments) sum += seg.dataSize(); + if (strip.getUsedSegmentData() + len > MAX_SEGMENT_DATA) return false; //not enough memory + // if possible use SPI RAM on ESP32 + #if defined(ARDUINO_ARCH_ESP32) && defined(WLED_USE_PSRAM) + if (psramFound()) + data = (byte*) ps_malloc(len); + else + #endif + data = (byte*) malloc(len); + if (!data) return false; //allocation failed + strip.addUsedSegmentData(len); // TODO: move out to WS2812FX class: for (seg : _segments) sum += seg.dataSize(); + _dataLen = len; + memset(data, 0, len); + DEBUG_PRINTF("-- Allocated data %p (%d)\n", data, (int)len); + return true; +} + +void Segment::deallocateData() { + // NOTE: deallocating data sometimes produces corrupt heap. + if (!data) return; + DEBUG_PRINTF("-- Deallocating data: %p (%d)\n", data, (int)_dataLen); + free(data); + DEBUG_PRINTLN(F("-- Data freed.")); + data = nullptr; + strip.addUsedSegmentData(-(int16_t)_dataLen); // TODO: move out to WS2812FX class: for (seg : _segments) sum -= seg.dataSize(); + _dataLen = 0; + DEBUG_PRINTLN(F("-- Dealocated data.")); +} + +/** + * If reset of this segment was requested, clears runtime + * settings of this segment. + * Must not be called while an effect mode function is running + * because it could access the data buffer and this method + * may free that data buffer. + */ +void Segment::resetIfRequired() { + if (reset) { // (getOption(SEG_OPTION_RESET)) + next_time = 0; step = 0; call = 0; aux0 = 0; aux1 = 0; + reset = false; // setOption(SEG_OPTION_RESET, false); + } +} + +void Segment::startTransition(uint16_t dur) { + // starting a transition has to occur before change so we get current values 1st + /*uint8_t*/ _briT = currentBri(getOption(SEG_OPTION_ON) ? opacity : 0); // comment out uint8_t if not using Transition struct + /*uint8_t*/ _cctT = currentBri(cct, true); // comment out uint8_t if not using Transition struct + //uint32_t _colorT[NUM_COLORS]; // comment out if not using Transition struct + for (size_t i=0; i_briT = _briT; + //_t->_cctT = _cctT; + //for (size_t i=0; i_colorT[i] = _colorT[i]; + + setOption(SEG_OPTION_TRANSITIONAL, true); +} + +uint16_t Segment::progress() { //transition progression between 0-65535 + //if (!_t) return 0xFFFFU; + uint32_t timeNow = millis(); + if (timeNow - /*_t->*/_start > /*_t->*/_dur) return 0xFFFFU; + return (timeNow - /*_t->*/_start) * 0xFFFFU / /*_t->*/_dur; +} + +uint8_t Segment::currentBri(uint8_t briNew, bool useCct) { + //if (!_t) return (useCct) ? cct : opacity; + if (getOption(SEG_OPTION_TRANSITIONAL)) { + uint32_t prog = progress() + 1; + if (useCct) return ((briNew * prog) + /*_t->*/_cctT * (0x10000 - prog)) >> 16; + else return ((briNew * prog) + /*_t->*/_briT * (0x10000 - prog)) >> 16; + } else { + return (useCct) ? cct : (getOption(SEG_OPTION_ON) ? opacity : 0); + } +} + +void Segment::handleTransition() { + if (!getOption(SEG_OPTION_TRANSITIONAL)) return; + unsigned long maxWait = millis() + 20; + if (mode == FX_MODE_STATIC && next_time > maxWait) next_time = maxWait; + if (progress() == 0xFFFFU) { + //if (_t) { delete _t; _t = nullptr; } + setOption(SEG_OPTION_TRANSITIONAL, false); // finish transitioning segment + } +} + +bool Segment::setColor(uint8_t slot, uint32_t c) { //returns true if changed + if (slot >= NUM_COLORS || c == colors[slot]) return false; + startTransition(strip.getTransition()); // start transition prior to change + colors[slot] = c; + return true; +} + +void Segment::setCCT(uint16_t k) { + if (k > 255) { //kelvin value, convert to 0-255 + if (k < 1900) k = 1900; + if (k > 10091) k = 10091; + k = (k - 1900) >> 5; + } + if (cct == k) return; + startTransition(strip.getTransition()); // start transition prior to change + cct = k; +} + +void Segment::setOpacity(uint8_t o) { + if (opacity == o) return; + startTransition(strip.getTransition()); // start transition prior to change + opacity = o; +} + +void Segment::setOption(uint8_t n, bool val) { + bool prevOn = getOption(SEG_OPTION_ON); + if (n == SEG_OPTION_ON && val != prevOn) startTransition(strip.getTransition()); // start transition prior to change + if (val) options |= 0x01 << n; + else options &= ~(0x01 << n); +} + +// 2D matrix +uint16_t Segment::virtualWidth() { + uint16_t groupLen = groupLength(); + uint16_t vWidth = ((getOption(SEG_OPTION_TRANSPOSED) ? height() : width()) + groupLen - 1) / groupLen; + if (getOption(SEG_OPTION_MIRROR)) vWidth = (vWidth + 1) /2; // divide by 2 if mirror, leave at least a single LED + return vWidth; +} + +uint16_t Segment::virtualHeight() { + uint16_t groupLen = groupLength(); + uint16_t vHeight = ((getOption(SEG_OPTION_TRANSPOSED) ? width() : height()) + groupLen - 1) / groupLen; + if (getOption(SEG_OPTION_MIRROR_Y)) vHeight = (vHeight + 1) /2; // divide by 2 if mirror, leave at least a single LED + return vHeight; +} + +// 1D strip +uint16_t Segment::virtualLength() { +#ifndef WLED_DISABLE_2D + if (height() > 1) { + uint16_t vW = virtualWidth(); + uint16_t vH = virtualHeight(); + uint32_t vLen = vW * vH; // use all pixels from segment + switch (map1D2D) { + case M12_VerticalBar: + vLen = vW; // segment width since it is used in getPixelColor() + break; + case M12_Block: + case M12_Circle: + vLen = max(vW,vH); // get the longest dimension + break; + } + return vLen; + } +#endif + uint16_t groupLen = groupLength(); + uint16_t vLength = (length() + groupLen - 1) / groupLen; + if (getOption(SEG_OPTION_MIRROR)) vLength = (vLength + 1) /2; // divide by 2 if mirror, leave at least a single LED + return vLength; +} + +void IRAM_ATTR Segment::setPixelColor(int i, uint32_t col) +{ +#ifndef WLED_DISABLE_2D + if (height() > 1) { // if this does not work use strip.isMatrix + uint16_t vH = virtualHeight(); // segment height in logical pixels + uint16_t vW = virtualWidth(); + switch (map1D2D) { + case M12_Pixels: + // use all available pixels as a long strip + setPixelColorXY(i % vW, i / vW, col); + break; + case M12_VerticalBar: + // expand 1D effect vertically + for (int y = 0; y < vH; y++) setPixelColorXY(i, y, col); + break; + case M12_Circle: + // expand in circular fashion from center + for (float degrees = 0.0f; degrees <= 90.0f; degrees += 89.99f / (sqrtf((float)max(vH,vW))*i+1)) { // this may prove too many iterations on larger matrices + // may want to try float version as well (with or without antialiasing) + int x = roundf(sin_t(degrees*DEG_TO_RAD) * i); + int y = roundf(cos_t(degrees*DEG_TO_RAD) * i); + setPixelColorXY(x, y, col); + } + break; + case M12_Block: + for (int x = 0; x <= i; x++) setPixelColorXY(x, i, col); + for (int y = 0; y < i; y++) setPixelColorXY(i, y, col); + break; + } + return; + } +#endif + + uint16_t len = length(); + uint8_t _bri_t = strip._bri_t; + //uint8_t _bri_t = currentBri(getOption(SEG_OPTION_ON) ? opacity : 0); + if (_bri_t < 255) { + byte r = scale8(R(col), _bri_t); + byte g = scale8(G(col), _bri_t); + byte b = scale8(B(col), _bri_t); + byte w = scale8(W(col), _bri_t); + col = RGBW32(r, g, b, w); + } + + // expand pixel (taking into account start, grouping, spacing [and offset]) + i = i * groupLength(); + if (getOption(SEG_OPTION_REVERSED)) { // is segment reversed? + if (getOption(SEG_OPTION_MIRROR)) { // is segment mirrored? + i = (len - 1) / 2 - i; //only need to index half the pixels + } else { + i = (len - 1) - i; + } + } + i += start; // starting pixel in a group + + // set all the pixels in the group + for (int j = 0; j < grouping; j++) { + uint16_t indexSet = i + ((getOption(SEG_OPTION_REVERSED)) ? -j : j); + if (indexSet >= start && indexSet < stop) { + if (getOption(SEG_OPTION_MIRROR)) { //set the corresponding mirrored pixel + uint16_t indexMir = stop - indexSet + start - 1; + indexMir += offset; // offset/phase + if (indexMir >= stop) indexMir -= len; // wrap + strip.setPixelColor(indexMir, col); + } + indexSet += offset; // offset/phase + if (indexSet >= stop) indexSet -= len; // wrap + strip.setPixelColor(indexSet, col); + } + } +} + +// anti-aliased normalized version of setPixelColor() +void Segment::setPixelColor(float i, uint32_t col, bool aa) +{ + if (i<0.0f || i>1.0f) return; // not normalized + + float fC = i * (virtualLength()-1); + if (aa) { + uint16_t iL = roundf(fC-0.49f); + uint16_t iR = roundf(fC+0.49f); + float dL = fC - iL; + float dR = iR - fC; + uint32_t cIL = getPixelColor(iL); + uint32_t cIR = getPixelColor(iR); + if (iR!=iL) { + // blend L pixel + cIL = color_blend(col, cIL, uint8_t(dL*255.0f)); + setPixelColor(iL, cIL); + // blend R pixel + cIR = color_blend(col, cIR, uint8_t(dR*255.0f)); + setPixelColor(iR, cIR); + } else { + // exact match (x & y land on a pixel) + setPixelColor(iL, col); + } + } else { + setPixelColor(uint16_t(roundf(fC)), col); + } +} + +uint32_t Segment::getPixelColor(uint16_t i) +{ +#ifndef WLED_DISABLE_2D + if (height() > 1) { // if this does not work use strip.isMatrix + uint16_t vH = virtualHeight(); // segment height in logical pixels + uint16_t vW = virtualWidth(); + switch (map1D2D) { + case M12_Pixels: + return getPixelColorXY(i % vW, i / vW); + break; + case M12_VerticalBar: + return getPixelColorXY(i, 0); + break; + case M12_Circle: + case M12_Block: + // use longest dimension + return vW>vH ? getPixelColorXY(i, 0) : getPixelColorXY(0, i); + break; + } + return 0; + } +#endif + + if (getOption(SEG_OPTION_REVERSED)) i = virtualLength() - i - 1; + i *= groupLength(); + i += start; + /* offset/phase */ + i += offset; + if (i >= stop) i -= length(); + return strip.getPixelColor(i); +} + +uint8_t Segment::differs(Segment& b) { + uint8_t d = 0; + if (start != b.start) d |= SEG_DIFFERS_BOUNDS; + if (stop != b.stop) d |= SEG_DIFFERS_BOUNDS; + if (offset != b.offset) d |= SEG_DIFFERS_GSO; + if (grouping != b.grouping) d |= SEG_DIFFERS_GSO; + if (spacing != b.spacing) d |= SEG_DIFFERS_GSO; + if (opacity != b.opacity) d |= SEG_DIFFERS_BRI; + if (mode != b.mode) d |= SEG_DIFFERS_FX; + if (speed != b.speed) d |= SEG_DIFFERS_FX; + if (intensity != b.intensity) d |= SEG_DIFFERS_FX; + if (palette != b.palette) d |= SEG_DIFFERS_FX; + if (custom1 != b.custom1) d |= SEG_DIFFERS_FX; + if (custom2 != b.custom2) d |= SEG_DIFFERS_FX; + if (custom3 != b.custom3) d |= SEG_DIFFERS_FX; + if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; + if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; + + //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected + if ((options & 0b1111111100101110) != (b.options & 0b1111111100101110)) d |= SEG_DIFFERS_OPT; + if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL; + + for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL; + + return d; +} + +void Segment::refreshLightCapabilities() { + uint8_t capabilities = 0x01; + + for (uint8_t b = 0; b < busses.getNumBusses(); b++) { + Bus *bus = busses.getBus(b); + if (bus == nullptr || bus->getLength()==0) break; + if (!bus->isOk()) continue; + if (bus->getStart() >= stop) continue; + if (bus->getStart() + bus->getLength() <= start) continue; + + uint8_t type = bus->getType(); + if (type == TYPE_ANALOG_1CH || (!cctFromRgb && type == TYPE_ANALOG_2CH)) capabilities &= 0xFE; // does not support RGB + if (bus->isRgbw()) capabilities |= 0x02; // segment supports white channel + if (!cctFromRgb) { + switch (type) { + case TYPE_ANALOG_5CH: + case TYPE_ANALOG_2CH: + capabilities |= 0x04; //segment supports white CCT + } + } + if (correctWB && type != TYPE_ANALOG_1CH) capabilities |= 0x04; //white balance correction (uses CCT slider) + uint8_t aWM = Bus::getAutoWhiteMode()<255 ? Bus::getAutoWhiteMode() : bus->getAWMode(); + bool whiteSlider = (aWM == RGBW_MODE_DUAL || aWM == RGBW_MODE_MANUAL_ONLY); // white slider allowed + if (bus->isRgbw() && (whiteSlider || !(capabilities & 0x01))) capabilities |= 0x08; // allow white channel adjustments (AWM allows or is not RGB) + } + _capabilities = capabilities; +} + +/* + * Fills segment with color + */ +void Segment::fill(uint32_t c) { + const uint16_t cols = strip.isMatrix ? virtualWidth() : virtualLength(); + const uint16_t rows = virtualHeight(); // will be 1 for 1D + for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { + if (strip.isMatrix) setPixelColorXY(x, y, c); + else setPixelColor(x, c); + } +} + +// Blends the specified color with the existing pixel color. +void Segment::blendPixelColor(uint16_t n, uint32_t color, uint8_t blend) { + setPixelColor(n, color_blend(getPixelColor(n), color, blend)); +} + +// Adds the specified color with the existing pixel color perserving color balance. +void Segment::addPixelColor(uint16_t n, uint32_t color) { + setPixelColor(n, color_add(getPixelColor(n), color)); +} + +/* + * fade out function, higher rate = quicker fade + */ +void Segment::fade_out(uint8_t rate) { + const uint16_t cols = strip.isMatrix ? virtualWidth() : virtualLength(); + const uint16_t rows = virtualHeight(); // will be 1 for 1D + + rate = (255-rate) >> 1; + float mappedRate = float(rate) +1.1; + + uint32_t color = colors[1]; // SEGCOLOR(1); // target color + int w2 = W(color); + int r2 = R(color); + int g2 = G(color); + int b2 = B(color); + + for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { + color = strip.isMatrix ? getPixelColorXY(x, y) : getPixelColor(x); + int w1 = W(color); + int r1 = R(color); + int g1 = G(color); + int b1 = B(color); + + int wdelta = (w2 - w1) / mappedRate; + int rdelta = (r2 - r1) / mappedRate; + int gdelta = (g2 - g1) / mappedRate; + int bdelta = (b2 - b1) / mappedRate; + + // if fade isn't complete, make sure delta is at least 1 (fixes rounding issues) + wdelta += (w2 == w1) ? 0 : (w2 > w1) ? 1 : -1; + rdelta += (r2 == r1) ? 0 : (r2 > r1) ? 1 : -1; + gdelta += (g2 == g1) ? 0 : (g2 > g1) ? 1 : -1; + bdelta += (b2 == b1) ? 0 : (b2 > b1) ? 1 : -1; + + if (strip.isMatrix) setPixelColorXY(x, y, r1 + rdelta, g1 + gdelta, b1 + bdelta, w1 + wdelta); + else setPixelColor(x, r1 + rdelta, g1 + gdelta, b1 + bdelta, w1 + wdelta); + } +} + +// fades all pixels to black using nscale8() +void Segment::fadeToBlackBy(uint8_t fadeBy) { + const uint16_t cols = strip.isMatrix ? virtualWidth() : virtualLength(); + const uint16_t rows = virtualHeight(); // will be 1 for 1D + + for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { + if (strip.isMatrix) setPixelColorXY(x, y, CRGB(getPixelColorXY(x,y)).nscale8(255-fadeBy)); + else setPixelColor(x, CRGB(getPixelColor(x)).nscale8(255-fadeBy)); + } +} + +/* + * blurs segment content, source: FastLED colorutils.cpp + */ +void Segment::blur(uint8_t blur_amount) +{ + if (strip.isMatrix) { + // compatibility with 2D + const uint16_t cols = virtualWidth(); + const uint16_t rows = virtualHeight(); + for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount); // blur all rows + for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount); // blur all columns + return; + } + uint8_t keep = 255 - blur_amount; + uint8_t seep = blur_amount >> 1; + CRGB carryover = CRGB::Black; + for(uint16_t i = 0; i < virtualLength(); i++) + { + CRGB cur = CRGB(getPixelColor(i)); + CRGB part = cur; + part.nscale8(seep); + cur.nscale8(keep); + cur += carryover; + if(i > 0) { + uint32_t c = getPixelColor(i-1); + uint8_t r = R(c); + uint8_t g = G(c); + uint8_t b = B(c); + setPixelColor(i-1, qadd8(r, part.red), qadd8(g, part.green), qadd8(b, part.blue)); + } + setPixelColor(i,cur.red, cur.green, cur.blue); + carryover = part; + } +} + +/* + * Put a value 0 to 255 in to get a color value. + * The colours are a transition r -> g -> b -> back to r + * Inspired by the Adafruit examples. + */ +uint32_t Segment::color_wheel(uint8_t pos) { // TODO + if (palette) return color_from_palette(pos, false, true, 0); + pos = 255 - pos; + if(pos < 85) { + return ((uint32_t)(255 - pos * 3) << 16) | ((uint32_t)(0) << 8) | (pos * 3); + } else if(pos < 170) { + pos -= 85; + return ((uint32_t)(0) << 16) | ((uint32_t)(pos * 3) << 8) | (255 - pos * 3); + } else { + pos -= 170; + return ((uint32_t)(pos * 3) << 16) | ((uint32_t)(255 - pos * 3) << 8) | (0); + } +} + +/* + * Returns a new, random wheel index with a minimum distance of 42 from pos. + */ +uint8_t Segment::get_random_wheel_index(uint8_t pos) { + uint8_t r = 0, x = 0, y = 0, d = 0; + + while(d < 42) { + r = random8(); + x = abs(pos - r); + y = 255 - x; + d = MIN(x, y); + } + return r; +} + +/* + * Gets a single color from the currently selected palette. + * @param i Palette Index (if mapping is true, the full palette will be _virtualSegmentLength long, if false, 255). Will wrap around automatically. + * @param mapping if true, LED position in segment is considered for color + * @param wrap FastLED palettes will usally wrap back to the start smoothly. Set false to get a hard edge + * @param mcol If the default palette 0 is selected, return the standard color 0, 1 or 2 instead. If >2, Party palette is used instead + * @param pbri Value to scale the brightness of the returned color by. Default is 255. (no scaling) + * @returns Single color from palette + */ +uint32_t IRAM_ATTR Segment::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri) +{ + if ((palette == 0 && mcol < 3) || strip._no_rgb) { + uint32_t color = colors[mcol]; // SEGCOLOR(mcol); + if (pbri == 255) return color; + return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri)); + } + + uint8_t paletteIndex = i; + if (mapping && virtualLength() > 1) paletteIndex = (i*255)/(virtualLength() -1); + if (!wrap) paletteIndex = scale8(paletteIndex, 240); //cut off blend at palette "end" + CRGB fastled_col; + fastled_col = ColorFromPalette(strip.currentPalette, paletteIndex, pbri, (strip.paletteBlend == 3)? NOBLEND:LINEARBLEND); + + return RGBW32(fastled_col.r, fastled_col.g, fastled_col.b, 0); +} + + +/////////////////////////////////////////////////////////////////////////////// +// WS2812FX class implementation +/////////////////////////////////////////////////////////////////////////////// + //do not call this method from system context (network callback) void WS2812FX::finalizeInit(void) { //reset segment runtimes - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { - _segment_runtimes[i].markForReset(); - _segment_runtimes[i].resetIfRequired(); + for (segment &seg : _segments) { + seg.markForReset(); + seg.resetIfRequired(); } +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// _segments[i].markForReset(); +// _segments[i].resetIfRequired(); +// } _hasWhiteChannel = _isOffRefreshRequired = false; @@ -129,137 +724,99 @@ void WS2812FX::service() { if (nowUp - _lastShow < MIN_SHOW_DELAY) return; bool doShow = false; - for(uint8_t i=0; i < MAX_NUM_SEGMENTS; i++) - { - //if (realtimeMode && useMainSegmentOnly && i == getMainSegmentId()) continue; + _isServicing = true; + _segment_index = 0; + for (segment &seg : _segments) { +// for (int i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); + // reset the segment runtime data if needed + seg.resetIfRequired(); - _segment_index = i; - - // reset the segment runtime data if needed, called before isActive to ensure deleted - // segment's buffers are cleared - SEGENV.resetIfRequired(); - - if (!SEGMENT.isActive()) continue; + if (!seg.isActive()) continue; // last condition ensures all solid segments are updated at the same time - if(nowUp > SEGENV.next_time || _triggered || (doShow && SEGMENT.mode == 0)) + if(nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC)) { - if (SEGMENT.grouping == 0) SEGMENT.grouping = 1; //sanity check + if (seg.grouping == 0) seg.grouping = 1; //sanity check doShow = true; uint16_t delay = FRAMETIME; - if (!SEGMENT.getOption(SEG_OPTION_FREEZE)) { //only run effect function if not frozen - SEGLEN = SEGMENT.virtualLength(); - _bri_t = SEGMENT.opacity; _colors_t[0] = SEGMENT.colors[0]; _colors_t[1] = SEGMENT.colors[1]; _colors_t[2] = SEGMENT.colors[2]; - uint8_t _cct_t = SEGMENT.cct; - if (!SEGMENT.getOption(SEG_OPTION_ON)) _bri_t = 0; - for (uint8_t t = 0; t < MAX_NUM_TRANSITIONS; t++) { - if ((transitions[t].segment & 0x3F) != i) continue; - uint8_t slot = transitions[t].segment >> 6; - if (slot == 0) _bri_t = transitions[t].currentBri(); - if (slot == 1) _cct_t = transitions[t].currentBri(false, 1); - _colors_t[slot] = transitions[t].currentColor(SEGMENT.colors[slot]); - } + if (!seg.getOption(SEG_OPTION_FREEZE)) { //only run effect function if not frozen + _virtualSegmentLength = seg.virtualLength(); + _bri_t = seg.currentBri(seg.getOption(SEG_OPTION_ON) ? seg.opacity : 0); + uint8_t _cct_t = seg.currentBri(seg.cct, true); + _colors_t[0] = seg.currentColor(0, seg.colors[0]); + _colors_t[1] = seg.currentColor(1, seg.colors[1]); + _colors_t[2] = seg.currentColor(2, seg.colors[2]); + seg.handleTransition(); + if (!cctFromRgb || correctWB) busses.setSegmentCCT(_cct_t, correctWB); for (uint8_t c = 0; c < NUM_COLORS; c++) { _colors_t[c] = gamma32(_colors_t[c]); } handle_palette(); - delay = (this->*_mode[SEGMENT.mode])(); // effect function (NOTE: may add SEGMENT and SEGENV to parameters) - if (SEGMENT.mode != FX_MODE_HALLOWEEN_EYES) SEGENV.call++; + delay = (*_mode[seg.mode])(); + if (seg.mode != FX_MODE_HALLOWEEN_EYES) seg.call++; } - SEGENV.next_time = nowUp + delay; + seg.next_time = nowUp + delay; } + _segment_index++; } - SEGLEN = 0; + _virtualSegmentLength = 0; busses.setSegmentCCT(-1); if(doShow) { yield(); show(); } _triggered = false; + _isServicing = false; } -// anti-aliased normalized version of setPixelColor() -void /*IRAM_ATTR*/ WS2812FX::setPixelColor(float i, byte r, byte g, byte b, byte w, bool aa) +void WS2812FX::setPixelColor(int i, uint32_t col) { - if (i<0.0f || i>1.0f) return; // not normalized + if (i >= _length) return; - float fC = i * (SEGLEN-1); - if (aa) { - uint16_t iL = roundf(fC-0.49f); - uint16_t iR = roundf(fC+0.49f); - float dL = fC - iL; - float dR = iR - fC; - uint32_t cIL = getPixelColor(iL); - uint32_t cIR = getPixelColor(iR); - if (iR!=iL) { - // blend L pixel - cIL = color_blend(RGBW32(r,g,b,w), cIL, uint8_t(dL*255.0f)); - setPixelColor(iL, R(cIL), G(cIL), B(cIL), W(cIL)); - // blend R pixel - cIR = color_blend(RGBW32(r,g,b,w), cIR, uint8_t(dR*255.0f)); - setPixelColor(iR, R(cIR), G(cIR), B(cIR), W(cIR)); - } else { - // exact match (x & y land on a pixel) - setPixelColor(iL, r, g, b, w); - } - } else { - setPixelColor(uint16_t(roundf(fC)), r, g, b, w); - } -} + // if realtime mode is active and applying to main segment + if (realtimeMode && useMainSegmentOnly) { + Segment &seg = _segments[_mainSegment]; + uint16_t len = seg.length(); // length of segment in number of pixels -void IRAM_ATTR WS2812FX::setPixelColor(int i, byte r, byte g, byte b, byte w) -{ - uint8_t segIdx = SEGLEN ? _segment_index : _mainSegment; - if (isMatrix && SEGLEN) { - // map linear pixel into 2D segment area (even for 1D segments, expanding vertically) - uint16_t h = _segments[segIdx].virtualHeight(); // segment height in logical pixels - for (uint16_t y = 0; y < h; y++) { // expand 1D effect vertically - setPixelColorXY(i, y * _segments[segIdx].groupLength(), r, g, b, w); + if (seg.opacity < 255) { + byte r = scale8(R(col), seg.opacity); + byte g = scale8(G(col), seg.opacity); + byte b = scale8(B(col), seg.opacity); + byte w = scale8(W(col), seg.opacity); + col = RGBW32(r, g, b, w); } - return; - } - - if (SEGLEN || (realtimeMode && useMainSegmentOnly)) { - //color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments) - if (SEGLEN && _bri_t < 255) { // SEGLEN!=0 -> from segment/FX - r = scale8(r, _bri_t); - g = scale8(g, _bri_t); - b = scale8(b, _bri_t); - w = scale8(w, _bri_t); - } - uint32_t col = RGBW32(r, g, b, w); - uint16_t len = _segments[segIdx].length(); // length of segment in number of pixels // get physical pixel address (taking into account start, grouping, spacing [and offset]) - i = i * _segments[segIdx].groupLength(); - if (_segments[segIdx].getOption(SEG_OPTION_REVERSED)) { // is segment reversed? - if (_segments[segIdx].getOption(SEG_OPTION_MIRROR)) { // is segment mirrored? + i = i * seg.groupLength(); + if (seg.getOption(SEG_OPTION_REVERSED)) { // is segment reversed? + if (seg.getOption(SEG_OPTION_MIRROR)) { // is segment mirrored? i = (len - 1) / 2 - i; //only need to index half the pixels } else { i = (len - 1) - i; } } - i += _segments[segIdx].start; // starting pixel in a group + i += seg.start; // starting pixel in a group // set all the pixels in the group - for (uint16_t j = 0; j < _segments[segIdx].grouping; j++) { - uint16_t indexSet = i + ((_segments[segIdx].getOption(SEG_OPTION_REVERSED)) ? -j : j); - if (indexSet >= _segments[segIdx].start && indexSet < _segments[segIdx].stop) { + for (uint16_t j = 0; j < seg.grouping; j++) { + uint16_t indexSet = i + ((seg.getOption(SEG_OPTION_REVERSED)) ? -j : j); + if (indexSet >= seg.start && indexSet < seg.stop) { - if (_segments[segIdx].getOption(SEG_OPTION_MIRROR)) { //set the corresponding mirrored pixel - uint16_t indexMir = _segments[segIdx].stop - indexSet + _segments[segIdx].start - 1; - indexMir += _segments[segIdx].offset; // offset/phase - if (indexMir >= _segments[segIdx].stop) indexMir -= len; // wrap + if (seg.getOption(SEG_OPTION_MIRROR)) { //set the corresponding mirrored pixel + uint16_t indexMir = seg.stop - indexSet + seg.start - 1; + indexMir += seg.offset; // offset/phase + if (indexMir >= seg.stop) indexMir -= len; // wrap if (indexMir < customMappingSize) indexMir = customMappingTable[indexMir]; busses.setPixelColor(indexMir, col); } - indexSet += _segments[segIdx].offset; // offset/phase - if (indexSet >= _segments[segIdx].stop) indexSet -= len; // wrap + indexSet += seg.offset; // offset/phase + if (indexSet >= seg.stop) indexSet -= len; // wrap if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet]; busses.setPixelColor(indexSet, col); @@ -267,10 +824,20 @@ void IRAM_ATTR WS2812FX::setPixelColor(int i, byte r, byte g, byte b, byte w) } } else { if (i < customMappingSize) i = customMappingTable[i]; - busses.setPixelColor(i, RGBW32(r, g, b, w)); + busses.setPixelColor(i, col); } } +uint32_t WS2812FX::getPixelColor(uint16_t i) +{ + if (i >= _length) return 0; + //#ifndef WLED_DISABLE_2D + //if (isMatrix) return getPixelColorXY(i%matrixWidth, i/matrixWidth); // compatibility w/ non-effect fn + //#endif + if (i < customMappingSize) i = customMappingTable[i]; + return busses.getPixelColor(i); +} + //DISCLAIMER //The following function attemps to calculate the current LED power usage, @@ -392,56 +959,43 @@ uint16_t WS2812FX::getFps() { return _cumulativeFps +1; } -uint8_t WS2812FX::getTargetFps() { - return _targetFps; -} - void WS2812FX::setTargetFps(uint8_t fps) { if (fps > 0 && fps <= 120) _targetFps = fps; _frametime = 1000 / _targetFps; } -/** - * Forces the next frame to be computed on all active segments. - */ -void WS2812FX::trigger() { - _triggered = true; -} - void WS2812FX::setMode(uint8_t segid, uint8_t m) { - if (segid >= MAX_NUM_SEGMENTS) return; + if (segid >= _segments.size()) return; +// if (segid >= getMaxSegments()) return; if (m >= getModeCount()) m = getModeCount() - 1; - if (_segments[segid].mode != m) - { - _segment_runtimes[segid].markForReset(); + if (_segments[segid].mode != m) { + //_segments[segid].startTransition(strip.getTransition()); // set effect transitions + _segments[segid].markForReset(); _segments[segid].mode = m; } } -uint8_t WS2812FX::getPaletteCount() -{ - return 13 + GRADIENT_PALETTE_COUNT; -} - //applies to all active and selected segments void WS2812FX::setColor(uint8_t slot, uint32_t c) { if (slot >= NUM_COLORS) return; - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].isActive() && _segments[i].isSelected()) { - _segments[i].setColor(slot, c, i); + for (segment &seg : _segments) { +// for (int i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); + if (seg.isSelected()) { + seg.setColor(slot, c); } } } void WS2812FX::setCCT(uint16_t k) { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].isActive() && _segments[i].isSelected()) { - _segments[i].setCCT(k, i); + for (segment &seg : _segments) { +// for (int i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); + if (seg.isActive() && seg.isSelected()) { + seg.setCCT(k); } } } @@ -451,9 +1005,10 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) { if (_brightness == b) return; _brightness = b; if (_brightness == 0) { //unfreeze all segments on power off - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - _segments[i].setOption(SEG_OPTION_FREEZE, false); + for (segment &seg : _segments) { +// for (int i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); + seg.setOption(SEG_OPTION_FREEZE, false); } } if (direct) { @@ -461,114 +1016,58 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) { busses.setBrightness(b); } else { unsigned long t = millis(); - if (_segment_runtimes[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) show(); //apply brightness change immediately if no refresh soon + if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) show(); //apply brightness change immediately if no refresh soon } } -uint8_t WS2812FX::getBrightness(void) { - return _brightness; -} - -uint8_t WS2812FX::getMaxSegments(void) { - return MAX_NUM_SEGMENTS; -} - uint8_t WS2812FX::getFirstSelectedSegId(void) { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].isActive() && _segments[i].isSelected()) return i; + size_t i = 0; + for (segment &seg : _segments) { +// for (int i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); + if (seg.isSelected()) return i; + i++; } // if none selected, use the main segment return getMainSegmentId(); } void WS2812FX::setMainSegmentId(uint8_t n) { - if (n >= MAX_NUM_SEGMENTS) return; - //use supplied n if active, or first active - if (_segments[n].isActive()) { - _mainSegment = n; return; - } - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].isActive()) { - _mainSegment = i; return; - } - } +// if (n >= getMaxSegments()) return; +// //use supplied n if active, or first active +// if (_segments[n].isActive()) { +// _mainSegment = n; return; +// } +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// if (_segments[i].isActive()) { +// _mainSegment = i; return; +// } +// } _mainSegment = 0; + if (n < _segments.size()) { + _mainSegment = n; + } return; } -uint8_t WS2812FX::getMainSegmentId(void) { - return _mainSegment; -} - uint8_t WS2812FX::getLastActiveSegmentId(void) { - for (uint8_t i = MAX_NUM_SEGMENTS -1; i > 0; i--) { - if (_segments[i].isActive()) return i; - } - return 0; +// for (uint8_t i = getMaxSegments() -1; i > 0; i--) { +// if (_segments[i].isActive()) return i; +// } +// return 0; + return _segments.size()-1; } uint8_t WS2812FX::getActiveSegmentsNum(void) { uint8_t c = 0; - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { +// for (uint8_t i = 0; i < getMaxSegments(); i++) { + for (size_t i = 0; i < _segments.size(); i++) { if (_segments[i].isActive()) c++; } return c; } -uint32_t WS2812FX::getPixelColor(uint16_t i) -{ - if (isMatrix) return getPixelColorXY(i%matrixWidth, i/matrixWidth); // compatibility w/ non-effect fn - - // get physical pixel - if (SEGMENT.getOption(SEG_OPTION_REVERSED)) i = SEGMENT.virtualLength() - i - 1; - i *= SEGMENT.groupLength(); - //if (SEGMENT.getOption(SEG_OPTION_REVERSED)) { - // if (SEGMENT.getOption(SEG_OPTION_MIRROR)) i = (SEGMENT.length() - 1) / 2 - i; //only need to index half the pixels - // else i = (SEGMENT.length() - 1) - i; - //} - i += SEGMENT.start; - - if (SEGLEN) { - /* offset/phase */ - i += SEGMENT.offset; - if (i >= SEGMENT.stop) i -= SEGMENT.length(); - } - - if (i < customMappingSize) i = customMappingTable[i]; - if (i >= _length) return 0; - - return busses.getPixelColor(i); -} - -WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) { - if (id >= MAX_NUM_SEGMENTS) return _segments[getMainSegmentId()]; - return _segments[id]; -} - -WS2812FX::Segment& WS2812FX::getFirstSelectedSeg(void) { - return _segments[getFirstSelectedSegId()]; -} - -WS2812FX::Segment& WS2812FX::getMainSegment(void) { - return _segments[getMainSegmentId()]; -} - -WS2812FX::Segment* WS2812FX::getSegments(void) { - return _segments; -} - -uint32_t WS2812FX::getLastShow(void) { - return _lastShow; -} - -uint16_t WS2812FX::getLengthTotal(void) { - return _length; -} - uint16_t WS2812FX::getLengthPhysical(void) { uint16_t len = 0; for (uint8_t b = 0; b < busses.getNumBusses(); b++) { @@ -579,64 +1078,6 @@ uint16_t WS2812FX::getLengthPhysical(void) { return len; } -uint8_t WS2812FX::Segment::differs(Segment& b) { - uint8_t d = 0; - if (start != b.start) d |= SEG_DIFFERS_BOUNDS; - if (stop != b.stop) d |= SEG_DIFFERS_BOUNDS; - if (offset != b.offset) d |= SEG_DIFFERS_GSO; - if (grouping != b.grouping) d |= SEG_DIFFERS_GSO; - if (spacing != b.spacing) d |= SEG_DIFFERS_GSO; - if (opacity != b.opacity) d |= SEG_DIFFERS_BRI; - if (mode != b.mode) d |= SEG_DIFFERS_FX; - if (speed != b.speed) d |= SEG_DIFFERS_FX; - if (intensity != b.intensity) d |= SEG_DIFFERS_FX; - if (palette != b.palette) d |= SEG_DIFFERS_FX; - if (custom1 != b.custom1) d |= SEG_DIFFERS_FX; - if (custom2 != b.custom2) d |= SEG_DIFFERS_FX; - if (custom3 != b.custom3) d |= SEG_DIFFERS_FX; - if (startY != b.startY) d |= SEG_DIFFERS_BOUNDS; - if (stopY != b.stopY) d |= SEG_DIFFERS_BOUNDS; - - //bit pattern: msb first: [transposed mirrorY reverseY] transitional (tbd) paused needspixelstate mirrored on reverse selected - if ((options & 0b11100101110) != (b.options & 0b11100101110)) d |= SEG_DIFFERS_OPT; - if ((options & 0x01) != (b.options & 0x01)) d |= SEG_DIFFERS_SEL; - - for (uint8_t i = 0; i < NUM_COLORS; i++) if (colors[i] != b.colors[i]) d |= SEG_DIFFERS_COL; - - return d; -} - -void WS2812FX::Segment::refreshLightCapabilities() { - if (!isActive()) { - _capabilities = 0; return; - } - uint8_t capabilities = 0; - - for (uint8_t b = 0; b < busses.getNumBusses(); b++) { - Bus *bus = busses.getBus(b); - if (bus == nullptr || bus->getLength()==0) break; - if (!bus->isOk()) continue; - if (bus->getStart() >= stop) continue; - if (bus->getStart() + bus->getLength() <= start) continue; - - uint8_t type = bus->getType(); - if (type != TYPE_ANALOG_1CH && (cctFromRgb || type != TYPE_ANALOG_2CH)) capabilities |= 0x01; // segment supports RGB (full color) - if (bus->isRgbw()) capabilities |= 0x02; // segment supports white channel - if (!cctFromRgb) { - switch (type) { - case TYPE_ANALOG_5CH: - case TYPE_ANALOG_2CH: - capabilities |= 0x04; //segment supports white CCT - } - } - if (correctWB && type != TYPE_ANALOG_1CH) capabilities |= 0x04; //white balance correction (uses CCT slider) - uint8_t aWM = Bus::getAutoWhiteMode()<255 ? Bus::getAutoWhiteMode() : bus->getAWMode(); - bool whiteSlider = (aWM == RGBW_MODE_DUAL || aWM == RGBW_MODE_MANUAL_ONLY); // white slider allowed - if (bus->isRgbw() && (whiteSlider || !(capabilities & 0x01))) capabilities |= 0x08; // allow white channel adjustments (AWM allows or is not RGB) - } - _capabilities = capabilities; -} - //used for JSON API info.leds.rgbw. Little practical use, deprecate with info.leds.rgbw. //returns if there is an RGBW bus (supports RGB and White, not only white) //not influenced by auto-white mode, also true if white slider does not affect output white channel @@ -668,8 +1109,30 @@ bool WS2812FX::hasCCTBus(void) { return false; } +void WS2812FX::purgeSegments(void) { + // remove all inactive segments (from the back) + int deleted = 0; + if (_segments.size() <= 1 || _isServicing) return; + for (int i = _segments.size()-1; i > 0; i--) + if (_segments[i].stop == 0) { + DEBUG_PRINT(F("-- Removing segment: ")); DEBUG_PRINTLN(i); + deleted++; + _segments.erase(_segments.begin() + i); + } + if (deleted) { + _segments.shrink_to_fit(); + if (_mainSegment >= _segments.size()) setMainSegmentId(0); + } +} + +Segment& WS2812FX::getSegment(uint8_t id) { +// return _segments[id >= getMaxSegments() ? getMainSegmentId() : id]; + return _segments[id >= _segments.size() ? getMainSegmentId() : id]; // vectors +} + 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 >= MAX_NUM_SEGMENTS) return; + if (n >= _segments.size()) return; +// if (n >= getMaxSegments()) return; Segment& seg = _segments[n]; //return if neither bounds nor grouping have changed @@ -681,23 +1144,29 @@ void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, && (!grouping || (seg.grouping == grouping && seg.spacing == spacing)) && (offset == UINT16_MAX || offset == seg.offset)) return; - if (seg.stop) setRange(seg.start, seg.stop -1, 0); //turn old segment range off + //if (seg.stop) setRange(seg.start, seg.stop -1, BLACK); //turn old segment range off + if (seg.stop) seg.fill(BLACK); //turn old segment range off if (i2 <= i1) //disable segment { + // disabled segments should get removed using purgeSegments() + DEBUG_PRINT(F("-- Segment ")); DEBUG_PRINT(n); DEBUG_PRINTLN(F(" marked inactive.")); seg.stop = 0; - if (seg.name) { - delete[] seg.name; - seg.name = nullptr; - } + //if (seg.name) { + // delete[] seg.name; + // seg.name = nullptr; + //} // if main segment is deleted, set first active as main segment if (n == _mainSegment) setMainSegmentId(0); + seg.markForReset(); return; } if (isMatrix) { + #ifndef WLED_DISABLE_2D if (i1 < matrixWidth) seg.start = i1; seg.stop = i2 > matrixWidth ? matrixWidth : i2; if (startY < matrixHeight) seg.startY = startY; seg.stopY = stopY > matrixHeight ? matrixHeight : MAX(1,stopY); + #endif } else { if (i1 < _length) seg.start = i1; seg.stop = i2 > _length ? _length : i2; @@ -709,28 +1178,37 @@ void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, seg.spacing = spacing; } if (offset < UINT16_MAX) seg.offset = offset; - _segment_runtimes[n].markForReset(); + seg.markForReset(); if (!boundsUnchanged) seg.refreshLightCapabilities(); } void WS2812FX::restartRuntime() { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { - _segment_runtimes[i].markForReset(); - } + for (segment &seg : _segments) seg.markForReset(); +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); +// seg.markForReset(); +// } } void WS2812FX::resetSegments() { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) if (_segments[i].name) delete[] _segments[i].name; + _segments.clear(); // destructs all Segment as part of clearing + segment seg = isMatrix ? Segment(0, matrixWidth, 0, matrixHeight) : Segment(0, _length); + _segments.push_back(seg); + _mainSegment = 0; +/* + for (uint8_t i = 0; i < getMaxSegments(); i++) if (_segments[i].name) delete[] _segments[i].name; _mainSegment = 0; memset(_segments, 0, sizeof(_segments)); - //memset(_segment_runtimes, 0, sizeof(_segment_runtimes)); + //memset(_segmentruntimes, 0, sizeof(_segmentruntimes)); _segment_index = 0; _segments[0].mode = DEFAULT_MODE; _segments[0].colors[0] = DEFAULT_COLOR; _segments[0].start = 0; + _segments[0].startY = 0; _segments[0].speed = DEFAULT_SPEED; _segments[0].intensity = DEFAULT_INTENSITY; - _segments[0].stop = _length; + _segments[0].stop = isMatrix ? matrixWidth : _length; + _segments[0].stopY = isMatrix ? matrixHeight : 1; _segments[0].grouping = 1; _segments[0].setOption(SEG_OPTION_SELECTED, 1); _segments[0].setOption(SEG_OPTION_ON, 1); @@ -740,9 +1218,9 @@ void WS2812FX::resetSegments() { _segments[0].custom2 = DEFAULT_C2; _segments[0].custom3 = DEFAULT_C3; - for (uint16_t i = 1; i < MAX_NUM_SEGMENTS; i++) + for (uint16_t i = 1; i < getMaxSegments(); i++) { - _segments[i].colors[0] = color_wheel(i*51); + _segments[i].colors[0] = _segments[i].color_wheel(i*51); _segments[i].grouping = 1; _segments[i].setOption(SEG_OPTION_ON, 1); _segments[i].opacity = 255; @@ -752,23 +1230,28 @@ void WS2812FX::resetSegments() { _segments[i].custom1 = DEFAULT_C1; _segments[i].custom2 = DEFAULT_C2; _segments[i].custom3 = DEFAULT_C3; - _segment_runtimes[i].markForReset(); + _segments[i].markForReset(); } - _segment_runtimes[0].markForReset(); + _segments[0].markForReset(); +*/ } void WS2812FX::makeAutoSegments(bool forceReset) { if (isMatrix) { + #ifndef WLED_DISABLE_2D // only create 1 2D segment - uint8_t mainSeg = getMainSegmentId(); - if (forceReset) { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { - setSegment(i, 0, 0); - } - } - if (getActiveSegmentsNum() < 2) { - setSegment(mainSeg, 0, matrixWidth, 1, 0, 0, 0, matrixHeight); + if (forceReset || getSegmentsNum() == 0) resetSegments(); // initialises 1 segment + else if (getActiveSegmentsNum() == 1) { + size_t i = getLastActiveSegmentId(); + _segments[i].start = 0; + _segments[i].stop = matrixWidth; + _segments[i].startY = 0; + _segments[i].stopY = matrixHeight; + _segments[i].grouping = 1; + _segments[i].spacing = 0; + _mainSegment = i; } + #endif } else if (autoSegments) { //make one segment per bus uint16_t segStarts[MAX_NUM_SEGMENTS] = {0}; uint16_t segStops [MAX_NUM_SEGMENTS] = {0}; @@ -777,7 +1260,7 @@ void WS2812FX::makeAutoSegments(bool forceReset) { Bus* b = busses.getBus(i); segStarts[s] = b->getStart(); - segStops[s] = segStarts[s] + b->getLength(); + segStops[s] = segStarts[s] + b->getLength(); //check for overlap with previous segments for (uint8_t j = 0; j < s; j++) { @@ -790,22 +1273,25 @@ void WS2812FX::makeAutoSegments(bool forceReset) { } s++; } - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { - _segments[i].setOption(SEG_OPTION_SELECTED, true, i); - setSegment(i, segStarts[i], segStops[i]); + _segments.clear(); + for (uint8_t i = 0; i < s; i++) { + Segment seg = Segment(segStarts[i], segStops[i]); + seg.setOption(SEG_OPTION_SELECTED, true); + _segments.push_back(seg); } +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// _segments[i].setOption(SEG_OPTION_SELECTED, true); +// setSegment(i, segStarts[i], segStops[i]); +// } + _mainSegment = 0; } else { + if (forceReset || getSegmentsNum() == 0) resetSegments(); //expand the main seg to the entire length, but only if there are no other segments, or reset is forced - uint8_t mainSeg = getMainSegmentId(); - - if (forceReset) { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) { - setSegment(i, 0, 0); - } - } - - if (getActiveSegmentsNum() < 2) { - setSegment(mainSeg, 0, _length); + else if (getActiveSegmentsNum() == 1) { + size_t i = getLastActiveSegmentId(); + _segments[i].start = 0; + _segments[i].stop = _length; + _mainSegment = 0; } } @@ -814,26 +1300,31 @@ void WS2812FX::makeAutoSegments(bool forceReset) { void WS2812FX::fixInvalidSegments() { //make sure no segment is longer than total (sanity check) - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].start >= _length) setSegment(i, 0, 0); - if (_segments[i].stop > _length) setSegment(i, _segments[i].start, _length); + for (int i = getSegmentsNum()-1; i > 0; i--) { + if (_segments[i].start >= _length) { _segments.erase(_segments.begin()+i); continue; } + if (_segments[i].stop > _length) _segments[i].stop = _length; // this is always called as the last step after finalizeInit(), update covered bus types - getSegment(i).refreshLightCapabilities(); + _segments[i].refreshLightCapabilities(); } +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// if (_segments[i].start >= _length) { _segments[i].start = _segments[i].stop = 0; _segments[i].markForReset(); } +// if (_segments[i].stop > _length) { _segments[i].stop = _length; _segments[i].markForReset(); } +// // this is always called as the last step after finalizeInit(), update covered bus types +// if (_segments[i].isActive()) _segments[i].refreshLightCapabilities(); +// } } //true if all segments align with a bus, or if a segment covers the total length bool WS2812FX::checkSegmentAlignment() { - for (uint8_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - if (_segments[i].start >= _segments[i].stop) continue; //inactive segment - bool aligned = false; + bool aligned = false; + for (segment &seg : _segments) { +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); for (uint8_t b = 0; bgetStart() && _segments[i].stop == bus->getStart() + bus->getLength()) aligned = true; + if (seg.start == bus->getStart() && seg.stop == bus->getStart() + bus->getLength()) aligned = true; } - if (_segments[i].start == 0 && _segments[i].stop == _length) aligned = true; + if (seg.start == 0 && seg.stop == _length) aligned = true; if (!aligned) return false; } return true; @@ -845,9 +1336,10 @@ bool WS2812FX::checkSegmentAlignment() { uint8_t WS2812FX::setPixelSegment(uint8_t n) { uint8_t prevSegId = _segment_index; - if (n < MAX_NUM_SEGMENTS) { + if (n < _segments.size()) { +// if (n < getMaxSegments()) { _segment_index = n; - SEGLEN = SEGMENT.virtualLength(); + _virtualSegmentLength = _segments[_segment_index].virtualLength(); } return prevSegId; } @@ -863,270 +1355,55 @@ void WS2812FX::setRange(uint16_t i, uint16_t i2, uint32_t col) } } -void WS2812FX::setShowCallback(show_callback cb) -{ - _callback = cb; -} - -void WS2812FX::setTransition(uint16_t t) -{ - _transitionDur = t; -} - void WS2812FX::setTransitionMode(bool t) { - unsigned long waitMax = millis() + 20; //refresh after 20 ms if transition enabled - for (uint16_t i = 0; i < MAX_NUM_SEGMENTS; i++) - { - _segments[i].setOption(SEG_OPTION_TRANSITIONAL, t); - - if (t && _segments[i].mode == FX_MODE_STATIC && _segment_runtimes[i].next_time > waitMax) - _segment_runtimes[i].next_time = waitMax; - } + for (segment &seg : _segments) seg.startTransition(t ? getTransition() : 0); +// for (uint8_t i = 0; i < getMaxSegments(); i++) { +// Segment &seg = getSegment(i); +// seg.startTransition(t ? getTransition() : 0); +// } } -/* - * color blend function - */ -uint32_t IRAM_ATTR WS2812FX::color_blend(uint32_t color1, uint32_t color2, uint16_t blend, bool b16) { - if(blend == 0) return color1; - uint16_t blendmax = b16 ? 0xFFFF : 0xFF; - if(blend == blendmax) return color2; - uint8_t shift = b16 ? 16 : 8; - - uint32_t w1 = W(color1); - uint32_t r1 = R(color1); - uint32_t g1 = G(color1); - uint32_t b1 = B(color1); - - uint32_t w2 = W(color2); - uint32_t r2 = R(color2); - uint32_t g2 = G(color2); - uint32_t b2 = B(color2); - - uint32_t w3 = ((w2 * blend) + (w1 * (blendmax - blend))) >> shift; - uint32_t r3 = ((r2 * blend) + (r1 * (blendmax - blend))) >> shift; - uint32_t g3 = ((g2 * blend) + (g1 * (blendmax - blend))) >> shift; - uint32_t b3 = ((b2 * blend) + (b1 * (blendmax - blend))) >> shift; - - return RGBW32(r3, g3, b3, w3); -} - -/* - * color add function that preserves ratio - * idea: https://github.com/Aircoookie/WLED/pull/2465 by https://github.com/Proto-molecule - */ -uint32_t WS2812FX::color_add(uint32_t c1, uint32_t c2) -{ - uint32_t r = R(c1) + R(c2); - uint32_t g = G(c1) + G(c2); - uint32_t b = B(c1) + B(c2); - uint32_t w = W(c1) + W(c2); - uint16_t max = r; - if (g > max) max = g; - if (b > max) max = b; - if (w > max) max = w; - if (max < 256) return RGBW32(r, g, b, w); - else return RGBW32(r * 255 / max, g * 255 / max, b * 255 / max, w * 255 / max); -} - -/* - * Fills segment with color - */ -void WS2812FX::fill(uint32_t c, uint8_t seg) { - uint8_t oldSeg; - if (seg != 255) oldSeg = setPixelSegment(seg); - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); - const uint16_t rows = SEGMENT.virtualHeight(); // will be 1 for 1D - for(uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { - if (isMatrix) setPixelColorXY(x, y, c); - else setPixelColor(x, c); - } - if (seg != 255) setPixelSegment(oldSeg); -} - -/* - * Blends the specified color with the existing pixel color. - */ -void WS2812FX::blendPixelColor(uint16_t n, uint32_t color, uint8_t blend) -{ - setPixelColor(n, color_blend(getPixelColor(n), color, blend)); -} - -/* - * fade out function, higher rate = quicker fade - */ -void WS2812FX::fade_out(uint8_t rate) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); - const uint16_t rows = SEGMENT.virtualHeight(); // will be 1 for 1D - - rate = (255-rate) >> 1; - float mappedRate = float(rate) +1.1; - - uint32_t color = SEGCOLOR(1); // target color - int w2 = W(color); - int r2 = R(color); - int g2 = G(color); - int b2 = B(color); - - for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { - color = isMatrix ? getPixelColorXY(x, y) : getPixelColor(x); - int w1 = W(color); - int r1 = R(color); - int g1 = G(color); - int b1 = B(color); - - int wdelta = (w2 - w1) / mappedRate; - int rdelta = (r2 - r1) / mappedRate; - int gdelta = (g2 - g1) / mappedRate; - int bdelta = (b2 - b1) / mappedRate; - - // if fade isn't complete, make sure delta is at least 1 (fixes rounding issues) - wdelta += (w2 == w1) ? 0 : (w2 > w1) ? 1 : -1; - rdelta += (r2 == r1) ? 0 : (r2 > r1) ? 1 : -1; - gdelta += (g2 == g1) ? 0 : (g2 > g1) ? 1 : -1; - bdelta += (b2 == b1) ? 0 : (b2 > b1) ? 1 : -1; - - if (isMatrix) setPixelColorXY(x, y, r1 + rdelta, g1 + gdelta, b1 + bdelta, w1 + wdelta); - else setPixelColor(x, r1 + rdelta, g1 + gdelta, b1 + bdelta, w1 + wdelta); - } -} - -// fades all pixels to black using nscale8() -void WS2812FX::fadeToBlackBy(uint8_t fadeBy) { - const uint16_t cols = isMatrix ? SEGMENT.virtualWidth() : SEGMENT.virtualLength(); - const uint16_t rows = SEGMENT.virtualHeight(); // will be 1 for 1D - - for (uint16_t y = 0; y < rows; y++) for (uint16_t x = 0; x < cols; x++) { - if (isMatrix) setPixelColorXY(x, y, col_to_crgb(getPixelColorXY(x,y)).nscale8(255-fadeBy)); - else setPixelColor(x, col_to_crgb(getPixelColor(x)).nscale8(255-fadeBy)); - } -} - -/* - * blurs segment content, source: FastLED colorutils.cpp - */ -void WS2812FX::blur(uint8_t blur_amount) -{ - if (isMatrix) { - // compatibility with 2D - const uint16_t cols = SEGMENT.virtualWidth(); - const uint16_t rows = SEGMENT.virtualHeight(); - for (uint16_t i = 0; i < rows; i++) blurRow(i, blur_amount); // blur all rows - for (uint16_t k = 0; k < cols; k++) blurCol(k, blur_amount); // blur all columns - return; - } - uint8_t keep = 255 - blur_amount; - uint8_t seep = blur_amount >> 1; - CRGB carryover = CRGB::Black; - for(uint16_t i = 0; i < SEGLEN; i++) - { - CRGB cur = col_to_crgb(getPixelColor(i)); - CRGB part = cur; - part.nscale8(seep); - cur.nscale8(keep); - cur += carryover; - if(i > 0) { - uint32_t c = getPixelColor(i-1); - uint8_t r = R(c); - uint8_t g = G(c); - uint8_t b = B(c); - setPixelColor(i-1, qadd8(r, part.red), qadd8(g, part.green), qadd8(b, part.blue)); - } - setPixelColor(i,cur.red, cur.green, cur.blue); - carryover = part; - } -} - -uint16_t IRAM_ATTR WS2812FX::triwave16(uint16_t in) -{ - if (in < 0x8000) return in *2; - return 0xFFFF - (in - 0x8000)*2; -} - -/* - * Generates a tristate square wave w/ attac & decay - * @param x input value 0-255 - * @param pulsewidth 0-127 - * @param attdec attac & decay, max. pulsewidth / 2 - * @returns signed waveform value - */ -int8_t WS2812FX::tristate_square8(uint8_t x, uint8_t pulsewidth, uint8_t attdec) { - int8_t a = 127; - if (x > 127) { - a = -127; - x -= 127; - } - - if (x < attdec) { //inc to max - return (int16_t) x * a / attdec; - } - else if (x < pulsewidth - attdec) { //max - return a; - } - else if (x < pulsewidth) { //dec to 0 - return (int16_t) (pulsewidth - x) * a / attdec; - } - return 0; -} - -/* - * Put a value 0 to 255 in to get a color value. - * The colours are a transition r -> g -> b -> back to r - * Inspired by the Adafruit examples. - */ -uint32_t WS2812FX::color_wheel(uint8_t pos) { - if (SEGMENT.palette) return color_from_palette(pos, false, true, 0); - pos = 255 - pos; - if(pos < 85) { - return ((uint32_t)(255 - pos * 3) << 16) | ((uint32_t)(0) << 8) | (pos * 3); - } else if(pos < 170) { - pos -= 85; - return ((uint32_t)(0) << 16) | ((uint32_t)(pos * 3) << 8) | (255 - pos * 3); - } else { - pos -= 170; - return ((uint32_t)(pos * 3) << 16) | ((uint32_t)(255 - pos * 3) << 8) | (0); - } -} - -/* - * Returns a new, random wheel index with a minimum distance of 42 from pos. - */ -uint8_t WS2812FX::get_random_wheel_index(uint8_t pos) { - uint8_t r = 0, x = 0, y = 0, d = 0; - - while(d < 42) { - r = random8(); - x = abs(pos - r); - y = 255 - x; - d = MIN(x, y); - } - return r; -} - - -uint32_t IRAM_ATTR WS2812FX::crgb_to_col(CRGB fastled) -{ - return RGBW32(fastled.red, fastled.green, fastled.blue, 0); -} - - -CRGB IRAM_ATTR WS2812FX::col_to_crgb(uint32_t color) -{ - CRGB fastled_col; - fastled_col.red = R(color); - fastled_col.green = G(color); - fastled_col.blue = B(color); - return fastled_col; -} - - void WS2812FX::load_gradient_palette(uint8_t index) { - byte i = constrain(index, 0, GRADIENT_PALETTE_COUNT -1); + // NOTE: due to constant execution (in every effect update) of this code + // if loading from FS is requested it will produce excessive flickering + // loading of palette into RAM from FS should be optimised in such case + // (it is mandatory to load palettes in each service() as each segment can + // have its own palette) + byte tcp[72]; //support gradient palettes with up to 18 entries - memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[i])), 72); - targetPalette.loadDynamicGradientPalette(tcp); + if (index>114) { + char fileName[32]; + strcpy_P(fileName, PSTR("/palette")); + sprintf(fileName +8, "%d", index-115); // palette ID == 128 + strcat(fileName, ".json"); + + if (WLED_FS.exists(fileName)) { + StaticJsonDocument<1536> pDoc; // barely enough to fit 72 numbers + DEBUG_PRINT(F("Reading palette from ")); + DEBUG_PRINTLN(fileName); + + if (readObjectFromFile(fileName, nullptr, &pDoc)) { + JsonArray pal = pDoc[F("palette")]; + if (!pal.isNull() && pal.size()>7) { // not an empty palette (at least 2 entries) + size_t palSize = MIN(pal.size(), 72); + palSize -= palSize % 4; // make sure size is multiple of 4 + for (size_t i=0; i()<256; i+=4) { + tcp[ i ] = (uint8_t) pal[ i ].as(); // index + tcp[i+1] = (uint8_t) pal[i+1].as(); // R + tcp[i+2] = (uint8_t) pal[i+2].as(); // G + tcp[i+3] = (uint8_t) pal[i+3].as(); // B + } + targetPalette.loadDynamicGradientPalette(tcp); + } + } + } + } else { + byte i = constrain(index, 0, GRADIENT_PALETTE_COUNT -1); + memcpy_P(tcp, (byte*)pgm_read_dword(&(gGradientPalettes[i])), 72); + targetPalette.loadDynamicGradientPalette(tcp); + } } @@ -1138,10 +1415,11 @@ void WS2812FX::handle_palette(void) bool singleSegmentMode = (_segment_index == _segment_index_palette_last); _segment_index_palette_last = _segment_index; - byte paletteIndex = SEGMENT.palette; + byte paletteIndex = _segments[_segment_index].palette; if (paletteIndex == 0) //default palette. Differs depending on effect { - switch (SEGMENT.mode) + // TODO: get default palette ID from _modeData[] + switch (_segments[_segment_index].mode) { case FX_MODE_FIRE_2012 : paletteIndex = 35; break; //heat palette case FX_MODE_COLORWAVES : paletteIndex = 26; break; //landscape 33 @@ -1155,7 +1433,7 @@ void WS2812FX::handle_palette(void) case FX_MODE_FLOW : paletteIndex = 6; break; //party } } - if (SEGMENT.mode >= FX_MODE_METEOR && paletteIndex == 0) paletteIndex = 4; + if (_segments[_segment_index].mode >= FX_MODE_METEOR && paletteIndex == 0) paletteIndex = 4; switch (paletteIndex) { @@ -1166,7 +1444,7 @@ void WS2812FX::handle_palette(void) { targetPalette = PartyColors_p; break; //fallback } - if (millis() - _lastPaletteChange > 1000 + ((uint32_t)(255-SEGMENT.intensity))*100) + if (millis() - _lastPaletteChange > 1000 + ((uint32_t)(255-_segments[_segment_index].intensity))*100) { targetPalette = CRGBPalette16( CHSV(random8(), 255, random8(128, 255)), @@ -1176,22 +1454,22 @@ void WS2812FX::handle_palette(void) _lastPaletteChange = millis(); } break;} case 2: {//primary color only - CRGB prim = col_to_crgb(SEGCOLOR(0)); + CRGB prim = CRGB(SEGCOLOR(0)); targetPalette = CRGBPalette16(prim); break;} case 3: {//primary + secondary - CRGB prim = col_to_crgb(SEGCOLOR(0)); - CRGB sec = col_to_crgb(SEGCOLOR(1)); + CRGB prim = CRGB(SEGCOLOR(0)); + CRGB sec = CRGB(SEGCOLOR(1)); targetPalette = CRGBPalette16(prim,prim,sec,sec); break;} case 4: {//primary + secondary + tertiary - CRGB prim = col_to_crgb(SEGCOLOR(0)); - CRGB sec = col_to_crgb(SEGCOLOR(1)); - CRGB ter = col_to_crgb(SEGCOLOR(2)); + CRGB prim = CRGB(SEGCOLOR(0)); + CRGB sec = CRGB(SEGCOLOR(1)); + CRGB ter = CRGB(SEGCOLOR(2)); targetPalette = CRGBPalette16(ter,sec,prim); break;} case 5: {//primary + secondary (+tert if not off), more distinct - CRGB prim = col_to_crgb(SEGCOLOR(0)); - CRGB sec = col_to_crgb(SEGCOLOR(1)); + CRGB prim = CRGB(SEGCOLOR(0)); + CRGB sec = CRGB(SEGCOLOR(1)); if (SEGCOLOR(2)) { - CRGB ter = col_to_crgb(SEGCOLOR(2)); + CRGB ter = CRGB(SEGCOLOR(2)); targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,ter,ter,ter,ter,ter,prim); } else { targetPalette = CRGBPalette16(prim,prim,prim,prim,prim,prim,prim,prim,sec,sec,sec,sec,sec,sec,sec,sec); @@ -1215,7 +1493,7 @@ void WS2812FX::handle_palette(void) load_gradient_palette(paletteIndex -13); } - if (singleSegmentMode && paletteFade && SEGENV.call > 0) //only blend if just one segment uses FastLED mode + if (singleSegmentMode && paletteFade && _segments[_segment_index].call > 0) //only blend if just one segment uses FastLED mode { nblendPaletteTowardPalette(currentPalette, targetPalette, 48); } else @@ -1225,33 +1503,6 @@ void WS2812FX::handle_palette(void) } -/* - * Gets a single color from the currently selected palette. - * @param i Palette Index (if mapping is true, the full palette will be SEGLEN long, if false, 255). Will wrap around automatically. - * @param mapping if true, LED position in segment is considered for color - * @param wrap FastLED palettes will usally wrap back to the start smoothly. Set false to get a hard edge - * @param mcol If the default palette 0 is selected, return the standard color 0, 1 or 2 instead. If >2, Party palette is used instead - * @param pbri Value to scale the brightness of the returned color by. Default is 255. (no scaling) - * @returns Single color from palette - */ -uint32_t IRAM_ATTR WS2812FX::color_from_palette(uint16_t i, bool mapping, bool wrap, uint8_t mcol, uint8_t pbri) -{ - if ((SEGMENT.palette == 0 && mcol < 3) || _no_rgb) { - uint32_t color = SEGCOLOR(mcol); - if (pbri == 255) return color; - return RGBW32(scale8_video(R(color),pbri), scale8_video(G(color),pbri), scale8_video(B(color),pbri), scale8_video(W(color),pbri)); - } - - uint8_t paletteIndex = i; - if (mapping && SEGLEN > 1) paletteIndex = (i*255)/(SEGLEN -1); - if (!wrap) paletteIndex = scale8(paletteIndex, 240); //cut off blend at palette "end" - CRGB fastled_col; - fastled_col = ColorFromPalette(currentPalette, paletteIndex, pbri, (paletteBlend == 3)? NOBLEND:LINEARBLEND); - - return crgb_to_col(fastled_col); -} - - //load custom mapping table from JSON file (called from finalizeInit() or deserializeState()) void WS2812FX::deserializeMap(uint8_t n) { if (isMatrix) return; // 2D support creates its own ledmap @@ -1302,7 +1553,7 @@ void WS2812FX::deserializeMap(uint8_t n) { } //gamma 2.8 lookup table used for color correction -byte gammaT[] = { +static byte gammaT[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, @@ -1321,7 +1572,7 @@ byte gammaT[] = { 215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 }; uint8_t WS2812FX::gamma8_cal(uint8_t b, float gamma) { - return (int)(pow((float)b / 255.0, gamma) * 255 + 0.5); + return (int)(powf((float)b / 255.0f, gamma) * 255.0f + 0.5f); } void WS2812FX::calcGammaTable(float gamma) @@ -1357,180 +1608,7 @@ int16_t Bus::_cct = -1; uint8_t Bus::_cctBlend = 0; uint8_t Bus::_gAWM = 255; - -// WLEDSR: extensions -// Technical notes -// =============== -// If an effect name is followed by an @, slider and color control is effective. -// See setSliderAndColorControl in index.js for implementation -// If not effective then: -// - For AC effects (id<128) 2 sliders and 3 colors and the palette will be shown -// - For SR effects (id>128) 5 sliders and 3 colors and the palette will be shown -// If effective (@) -// - a ; seperates slider controls (left) from color controls (middle) and palette control (right) -// - if left, middle or right is empty no controls are shown -// - a , seperates slider controls (max 5) or color controls (max 3). Palette has only one value -// - a ! means that the default is used. -// - For sliders: Effect speeds, Effect intensity, Custom 1, Custom 2, Custom 3 -// - For colors: Fx color, Background color, Custom -// - For palette: prompt for color palette OR palette ID if numeric (will hide palette selection) -// -// Note: If palette is on and no colors are specified 1,2 and 3 is shown in each color circle. -// If a color is specified, the 1,2 or 3 is replaced by that specification. -// Note: Effects can override default pattern behaviour -// - FadeToBlack can override the background setting -// - Defining SEGCOL() can override a specific palette using these values (e.g. Color Gradient) const char JSON_mode_names[] PROGMEM = R"=====(["Mode names have moved"])====="; -/* -R"=====([ -"Solid", -"Blink@!,;!,!,;!", -"Breathe@!,;!,!;!", -"Wipe@!,!;!,!,;!", -"Wipe Random@!,;1,2,3;!", -"Random Colors@!,Fade time;1,2,3;!", -"Sweep@!,!;!,!,;!", -"Dynamic@!,!;1,2,3;!", -"Colorloop@!,Saturation;1,2,3;!", -"Rainbow@!,Size;1,2,3;!", -"Scan@!,# of dots;!,!,;!", -"Scan Dual@!,# of dots;!,!,;!", -"Fade@!,;!,!,;!", -"Theater@!,Gap size;!,!,;!", -"Theater Rainbow@!,Gap size;1,2,3;!", -"Running@!,Wave width;!,!,;!", -"Saw@!,Width;!,!,;!", -"Twinkle@!,;!,!,;!", -"Dissolve@Repeat speed,Dissolve speed;!,!,;!", -"Dissolve Rnd@Repeat speed,Dissolve speed;,!,;!", -"Sparkle@!,;!,!,;!", -"Sparkle Dark@!,!;Bg,Fx,;!", -"Sparkle+@!,!;Bg,Fx,;!", -"Strobe@!,;!,!,;!", -"Strobe Rainbow@!,;,!,;!", -"Strobe Mega@!,!;!,!,;!", -"Blink Rainbow@Frequency,Blink duration;!,!,;!", -"Android@!,Width;!,!,;!", -"Chase@!,Width;!,!,!;!", -"Chase Random@!,Width;!,,!;!", -"Chase Rainbow@!,Width;!,!,;0", -"Chase Flash@!,;Bg,Fx,!;!", -"Chase Flash Rnd@!,;,Fx,;!", -"Rainbow Runner@!,Size;Bg,,;!", -"Colorful@!,Saturation;1,2,3;!", -"Traffic Light@!,;,!,;!", -"Sweep Random", -"Chase 2@!,Width;!,!,;!", -"Aurora@!=24,!;1,2,3;!=50", -"Stream", -"Scanner", -"Lighthouse", -"Fireworks@Sharpness=96,Frequency=192;!,2,;!=11", -"Rain@Fade rate=128,Frequency=128;!,2,;!", -"Tetrix@!=224,Width=0;!,!,;!=11", -"Fire Flicker@!,!;!,,;!", -"Gradient@!,Spread=16;!,!,;!", -"Loading@!,Fade=16;!,!,;!", -"Police@!,Width;,Bg,;0", -"Fairy", -"Two Dots@!,Dot size;1,2,Bg;!", -"Fairy Twinkle", -"Running Dual", -"Halloween", -"Chase 3@!,Size;1,2,3;0", -"Tri Wipe@!,Width;1,2,3;0", -"Tri Fade", -"Lightning", -"ICU", -"Multi Comet", -"Scanner Dual", -"Stream 2", -"Oscillate", -"Pride 2015@!,;;", -"Juggle@!=16,Trail=240;!,!,;!", -"Palette@!,;1,2,3;!", -"Fire 2012@Spark rate=120,Decay=64;1,2,3;!", -"Colorwaves", -"Bpm@!=64,;1,2,3;!", -"Fill Noise", -"Noise 1", -"Noise 2", -"Noise 3", -"Noise 4", -"Colortwinkles@Fade speed,Spawn speed;1,2,3;!", -"Lake@!,;1,2,3;!", -"Meteor@!,Trail length;!,!,;!", -"Meteor Smooth@!,Trail length;!,!,;!", -"Railway", -"Ripple", -"Twinklefox", -"Twinklecat", -"Halloween Eyes@Duration,Eye fade time;Fx,Bg,;!", -"Solid Pattern@Fg size,Bg size;Fg,Bg,;!=0", -"Solid Pattern Tri@,Size;1,2,3;!=0", -"Spots@Spread,Width;!,!,;!", -"Spots Fade@Spread,Width;!,!,;!", -"Glitter", -"Candle@Flicker rate=96,Flicker intensity=224;!,!,;0", -"Fireworks Starburst", -"Fireworks 1D@Gravity,Firing side;!,!,;!", -"Bouncing Balls@Gravity,# of balls;!,!,;!", -"Sinelon", -"Sinelon Dual", -"Sinelon Rainbow", -"Popcorn", -"Drip@Gravity,# of drips;!,!;!", -"Plasma@Phase,;1,2,3;!", -"Percent@,% of fill;!,!,;!", -"Ripple Rainbow", -"Heartbeat@!,!;!,!,;!", -"Pacifica", -"Candle Multi@Flicker rate=96,Flicker intensity=224;!,!,;0", -"Solid Glitter@,!;!,,;0", -"Sunrise@Time [min]=60,;;0", -"Phased", -"Twinkleup@!,Intensity;!,!,;!", -"Noise Pal", -"Sine", -"Phased Noise", -"Flow", -"Chunchun@!,Gap size;!,!,;!", -"Dancing Shadows@!,# of shadows;!,,;!", -"Washing Machine", -"Candy Cane@!,Width;;", -"Blends@Shift speed,Blend speed;1,2,3,!", -"TV Simulator", -"Dynamic Smooth", -"2D Black Hole@Fade rate,Outer Y freq.,Outer X freq.,Inner X freq.,Inner Y freq.;;", -"2D DNA@Scroll speed,Blur;;!", -"2D DNA Spiral@Scroll speed,Blur;;!", -"2D Drift@Rotation speed,Blur amount;;!", -"2D Firenoise@X scale,Y scale;;", -"2D Frizzles@X frequency,Y frequency;;!", -"2D Hipnotic@X scale,Y scale;;!", -"2D Lissajous@X frequency,Fadetime;!,!,!;!", -"2D Matrix@Falling speed,Spawning rate,Trail,Custom color;Spawn,Trail;", -"2D Akemi@Color speed,Dance;Head palette,Arms & Legs,Eyes & Mouth;Face palette", -"2D Colored Bursts@Speed,Number of lines;;!", -"2D Game Of Life@!,;!,!;!", -"2D Julia@,Max iterations per pixel,X center,Y center,Area size;;!", -"2D Metaballs@Speed;!,!,!;!", -"2D Noise@Speed,Scale;!,!,!;!", -"2D Plasma Ball@Speed;!,!,!;!", -"2D Polar Lights@Speed,X scale,Palette;!,!,!;!", -"2D Pulser@Speed,Blur;;!", -"2D Sindots@Speed,Dot distance;;!", -"2D Squared Swirl@,,,,Blur;,,;!", -"2D Sun Radiation@Variance,Brightness;;", -"2D Tartan@X scale,Y scale;;!", -"2D Waverly@Fade rate,Sensitivity;;!", -"2D Spaceships@Fade rate,Blur;!,!,!;!", -"2D Crazy Bees@Fade rate,Blur;;", -"2D Ghost Rider@Fade rate,Blur;!,!,!;!", -"2D Blobs@!,# blobs;!,!,!;!" -])====="; -*/ - const char JSON_palette_names[] PROGMEM = R"=====([ "Default","* Random Cycle","* Color 1","* Colors 1&2","* Color Gradient","* Colors Only","Party","Cloud","Lava","Ocean", "Forest","Rainbow","Rainbow Bands","Sunset","Rivendell","Breeze","Red & Blue","Yellowout","Analogous","Splash", diff --git a/wled00/button.cpp b/wled00/button.cpp index 4c11e9b02..0567abb0e 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -195,11 +195,11 @@ void handleAnalog(uint8_t b) colorHStoRGB(aRead*256,255,col); } else { // otherwise use "double press" for segment selection - WS2812FX::Segment& seg = strip.getSegment(macroDoublePress[b]); + Segment& seg = strip.getSegment(macroDoublePress[b]); if (aRead == 0) { seg.setOption(SEG_OPTION_ON, 0); // off } else { - seg.setOpacity(aRead, macroDoublePress[b]); + seg.setOpacity(aRead); seg.setOption(SEG_OPTION_ON, 1); } // this will notify clients of update (websockets,mqtt,etc) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index a600c8a4a..b8796b8d8 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -91,6 +91,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { Bus::setCCTBlend(strip.cctBlending); strip.setTargetFps(hw_led["fps"]); //NOP if 0, default 42 FPS + #ifndef WLED_DISABLE_2D // 2D Matrix Settings JsonObject matrix = hw_led[F("matrix")]; if (!matrix.isNull()) { @@ -125,6 +126,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { strip.setUpMatrix(); } + #endif JsonArray ins = hw_led["ins"]; @@ -132,6 +134,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { uint8_t s = 0; // bus iterator if (fromFS) busses.removeAll(); // can't safely manipulate busses directly in network callback uint32_t mem = 0; + bool busesChanged = false; for (JsonObject elm : ins) { if (s >= WLED_MAX_BUSSES) break; uint8_t pins[5] = {255, 255, 255, 255, 255}; @@ -161,10 +164,11 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { } else { if (busConfigs[s] != nullptr) delete busConfigs[s]; busConfigs[s] = new BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode); - doInitBusses = true; + busesChanged = true; } s++; } + doInitBusses = busesChanged; // finalization done in beginStrip() } if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus @@ -618,6 +622,7 @@ void serializeConfig() { hw_led["fps"] = strip.getTargetFps(); hw_led[F("rgbwm")] = Bus::getAutoWhiteMode(); // global override + #ifndef WLED_DISABLE_2D // 2D Matrix Settings if (strip.isMatrix) { JsonObject matrix = hw_led.createNestedObject(F("matrix")); @@ -639,6 +644,7 @@ void serializeConfig() { pnl["s"] = strip.panel[i].serpentine; } } + #endif JsonArray hw_led_ins = hw_led.createNestedArray("ins"); diff --git a/wled00/colors.cpp b/wled00/colors.cpp index 25cce032e..abe1cc4cf 100644 --- a/wled00/colors.cpp +++ b/wled00/colors.cpp @@ -1,12 +1,57 @@ #include "wled.h" /* - * Color conversion methods + * Color conversion & utility methods */ +/* + * color blend function + */ +uint32_t IRAM_ATTR color_blend(uint32_t color1, uint32_t color2, uint16_t blend, bool b16) { + if(blend == 0) return color1; + uint16_t blendmax = b16 ? 0xFFFF : 0xFF; + if(blend == blendmax) return color2; + uint8_t shift = b16 ? 16 : 8; + + uint32_t w1 = W(color1); + uint32_t r1 = R(color1); + uint32_t g1 = G(color1); + uint32_t b1 = B(color1); + + uint32_t w2 = W(color2); + uint32_t r2 = R(color2); + uint32_t g2 = G(color2); + uint32_t b2 = B(color2); + + uint32_t w3 = ((w2 * blend) + (w1 * (blendmax - blend))) >> shift; + uint32_t r3 = ((r2 * blend) + (r1 * (blendmax - blend))) >> shift; + uint32_t g3 = ((g2 * blend) + (g1 * (blendmax - blend))) >> shift; + uint32_t b3 = ((b2 * blend) + (b1 * (blendmax - blend))) >> shift; + + return RGBW32(r3, g3, b3, w3); +} + +/* + * color add function that preserves ratio + * idea: https://github.com/Aircoookie/WLED/pull/2465 by https://github.com/Proto-molecule + */ +uint32_t color_add(uint32_t c1, uint32_t c2) +{ + uint32_t r = R(c1) + R(c2); + uint32_t g = G(c1) + G(c2); + uint32_t b = B(c1) + B(c2); + uint32_t w = W(c1) + W(c2); + uint16_t max = r; + if (g > max) max = g; + if (b > max) max = b; + if (w > max) max = w; + if (max < 256) return RGBW32(r, g, b, w); + else return RGBW32(r * 255 / max, g * 255 / max, b * 255 / max, w * 255 / max); +} + void setRandomColor(byte* rgb) { - lastRandomIndex = strip.get_random_wheel_index(lastRandomIndex); + lastRandomIndex = strip.getMainSegment().get_random_wheel_index(lastRandomIndex); colorHStoRGB(lastRandomIndex*256,255,rgb); } diff --git a/wled00/const.h b/wled00/const.h index bba1a79ff..499724c4c 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -5,6 +5,8 @@ * Readability defines and their associated numerical values + compile-time constants */ +#define GRADIENT_PALETTE_COUNT 58 + //Defaults #define DEFAULT_CLIENT_SSID "Your_Network" #define DEFAULT_AP_PASS "wled1234" @@ -76,7 +78,8 @@ #define USERMOD_ID_WORDCLOCK 27 //Usermod "usermod_v2_word_clock.h" #define USERMOD_ID_MY9291 28 //Usermod "usermod_MY9291.h" #define USERMOD_ID_SI7021_MQTT_HA 29 //Usermod "usermod_si7021_mqtt_ha.h" -#define USERMOD_ID_AUDIOREACTIVE 30 //Usermod "audioreactive.h" +#define USERMOD_ID_BME280 30 //Usermod "usermod_bme280.h +#define USERMOD_ID_AUDIOREACTIVE 31 //Usermod "audioreactive.h" //Access point behavior #define AP_BEHAVIOR_BOOT_NO_CONN 0 //Open AP when no connection after boot @@ -223,6 +226,7 @@ #define SEG_OPTION_MIRROR 3 //Indicates that the effect will be mirrored within the segment #define SEG_OPTION_NONUNITY 4 //Indicates that the effect does not use FRAMETIME or needs getPixelColor #define SEG_OPTION_FREEZE 5 //Segment contents will not be refreshed +#define SEG_OPTION_RESET 6 //Segment runtime requires reset #define SEG_OPTION_TRANSITIONAL 7 #define SEG_OPTION_REVERSED_Y 8 #define SEG_OPTION_MIRROR_Y 9 @@ -358,4 +362,46 @@ #define INTERFACE_UPDATE_COOLDOWN 2000 //time in ms to wait between websockets, alexa, and MQTT updates +#if defined(ESP8266) && defined(HW_PIN_SCL) + #undef HW_PIN_SCL +#endif +#if defined(ESP8266) && defined(HW_PIN_SDA) + #undef HW_PIN_SDA +#endif +#ifndef HW_PIN_SCL + #ifdef ESP8266 + #define HW_PIN_SCL 5 + #else + #define HW_PIN_SCL 22 + #endif +#endif +#ifndef HW_PIN_SDA + #ifdef ESP8266 + #define HW_PIN_SDA 4 + #else + #define HW_PIN_SDA 21 + #endif +#endif + +#if defined(ESP8266) && defined(HW_PIN_CLOCKSPI) + #undef HW_PIN_CLOCKSPI +#endif +#if defined(ESP8266) && defined(HW_PIN_DATASPI) + #undef HW_PIN_DATASPI +#endif +#ifndef HW_PIN_CLOCKSPI + #ifdef ESP8266 + #define HW_PIN_CLOCKSPI 14 + #else + #define HW_PIN_CLOCKSPI 18 + #endif +#endif +#ifndef HW_PIN_DATASPI + #ifdef ESP8266 + #define HW_PIN_DATASPI 13 + #else + #define HW_PIN_DATASPI 23 + #endif +#endif + #endif diff --git a/wled00/data/index.css b/wled00/data/index.css index 65dde158d..70232f7c3 100644 --- a/wled00/data/index.css +++ b/wled00/data/index.css @@ -193,7 +193,7 @@ button { position: absolute; top: 8px; left: 12px; - pointer-events: none; + /*pointer-events: none;*/ width: 24px; height: 24px; } @@ -368,7 +368,7 @@ button { } #sliders { - width: 310px; + width: 300px; margin: 0 auto; position: sticky; bottom: 0; @@ -380,18 +380,34 @@ button { } .slider { - background: var(--c-2); - max-width: 310px; + background-color: var(--c-2); + max-width: 300px; min-width: 280px; margin: 0 auto; /* add 5px; if you want some vertical space but looks ugly */ - border-radius: 15px; + border-radius: 24px; position: relative; } +.filter { + background-color: var(--c-4); + box-shadow: 0px 0px 6px 6px var(--c-1); + border-radius: 26px; + height: 26px; + margin: 0 auto 4px; /* 8px if you want space */ + padding: 8px 2px; + position: relative; + /*width: 260px;*/ + /*transition: opacity 1s;*/ + /*opacity: 1;*/ + z-index: 1; +} + /* Tooltip text */ .slider .tooltiptext { visibility: hidden; background-color: var(--c-5); + /*border: 2px solid var(--c-2);*/ + box-shadow: 4px 4px 10px 4px var(--c-1); color: var(--c-f); text-align: center; padding: 5px 10px; @@ -447,6 +463,10 @@ button { .hide { display: none !important; } +.fade { + visibility: hidden; + opacity: 0; +} .first { margin-top: 10px; @@ -827,19 +847,22 @@ input[type=range]::-moz-range-thumb { } select { - padding: 4px; + padding: 4px 8px; margin: 0; font-size: 19px; background-color: var(--c-3); color: var(--c-d); cursor: pointer; - border: 1px solid var(--c-2); - border-radius: 5px; + border: 0 solid var(--c-2); + border-radius: 20px; transition-duration: 0.5s; -webkit-backface-visibility: hidden; -webkit-transform:translate3d(0,0,0); + -webkit-appearance: none; + -moz-appearance: none; backface-visibility: hidden; transform:translate3d(0,0,0); + text-overflow: ellipsis; } #tt { text-align: center; @@ -847,16 +870,26 @@ select { .cl { background-color: #000; } -.sel-p { - margin: 5px 0 10px; - width: 5em; -} -.sel-pl { +select.sel-p, select.sel-pl, select.sel-ple { + margin: 5px 0; width: 100%; - background-position: 141px 16px; + height: 40px; } -.sel-ple { - width: 100%; +div.sel-p { + position: relative; +} +div.sel-p:after { + content: ""; + position: absolute; + right: 10px; + top: 22px; + width: 0; + height: 0; + border-left: 8px solid transparent; + border-right: 8px solid transparent; + border-top: 8px solid var(--c-f); +} +select.sel-ple { text-align: center; } option { @@ -1173,6 +1206,25 @@ TD .checkmark, TD .radiomark { left: 9px; } +.filter .fchkl { + display: inline-block; + min-width: 0.7em; + padding: 4px 4px 4px 32px; + text-align: left; + line-height: 24px; + vertical-align: middle; + -webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%); +} + +.lbl-s { + display: inline-block; + /* margin: 10px 4px 0 0; */ + font-size: 13px; + width: 48%; + text-align: center; +} + /* list wrapper */ .list { position: relative; @@ -1226,6 +1278,7 @@ TD .checkmark, TD .radiomark { .lstI.sticky, .lstI.selected { z-index: 1; + box-shadow: 0px 0px 10px 4px var(--c-1); } #pcont .selected:not([class*="expanded"]) { @@ -1258,6 +1311,9 @@ TD .checkmark, TD .radiomark { /* list item name (for sorting) */ .lstIname { white-space: nowrap; + text-overflow: ellipsis; + -webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%); } /* list item palette preview */ @@ -1287,6 +1343,8 @@ TD .checkmark, TD .radiomark { border-radius: 21px; background: var(--c-2); border: 1px solid var(--c-3); + -webkit-filter: grayscale(100%); /* Safari 6.0 - 9.0 */ + filter: grayscale(100%); } .fnd input[type="text"]:focus { diff --git a/wled00/data/index.htm b/wled00/data/index.htm index b9b8d94ca..83a56d4b8 100644 --- a/wled00/data/index.htm +++ b/wled00/data/index.htm @@ -202,7 +202,7 @@
- +
@@ -217,6 +217,28 @@
+
+ + + + + +
diff --git a/wled00/data/index.js b/wled00/data/index.js index c70f227cf..772350c3b 100644 --- a/wled00/data/index.js +++ b/wled00/data/index.js @@ -5,10 +5,10 @@ var isOn = false, nlA = false, isLv = false, isInfo = false, isNodes = false, sy var hasWhite = false, hasRGB = false, hasCCT = false; var nlDur = 60, nlTar = 0; var nlMode = false; -var selectedFx = 0, prevFx = -1; +var selectedFx = 0; var selectedPal = 0; var csel = 0; // selected color slot (0-2) -var currentPreset = -1, prevPS = -1; +var currentPreset = -1; var lastUpdate = 0; var segCount = 0, ledCount = 0, lowestUnused = 0, maxSeg = 0, lSeg = 0; var pcMode = false, pcModeA = false, lastw = 0, wW; @@ -25,7 +25,7 @@ var ws, cpick, ranges; var cfg = { theme:{base:"dark", bg:{url:""}, alpha:{bg:0.6,tab:0.8}, color:{bg:""}}, comp :{colors:{picker: true, rgb: false, quick: true, hex: false}, - labels:true, pcmbot:false, pid:true, seglen:false, segpwr:false, css:true, hdays:false} + labels:true, pcmbot:false, pid:true, seglen:false, segpwr:false, segexp:false, css:true, hdays:false} }; var hol = [ [0,11,24,4,"https://aircoookie.github.io/xmas.png"], // christmas @@ -167,12 +167,12 @@ function loadBg(iUrl) img.src = iUrl; if (iUrl == "" || iUrl==="https://picsum.photos/1920/1080") { var today = new Date(); - for (var i=0; i=hs && today<=he) img.src = hol[i][4]; + he.setDate(he.getDate() + h[3]); + if (today>=hs && today<=he) img.src = h[4]; } } img.addEventListener('load', (e) => { @@ -605,7 +605,7 @@ function parseInfo(i) { mh = i.leds.matrix ? i.leds.matrix.h : 0; isM = mw>0 && mh>0; if (!isM) hideModes("2D "); - if (!i.u || !i.u.AudioReactive) { /*hideModes("♪ ");*/ hideModes("♫ "); } // hide /*audio*/ frequency reactive effects + //if (!i.u || !i.u.AudioReactive) { /*hideModes(" ♪");*/ hideModes(" ♫"); } // hide /*audio*/ frequency reactive effects } //https://stackoverflow.com/questions/2592092/executing-script-elements-inserted-with-innerhtml @@ -621,6 +621,19 @@ function parseInfo(i) { //} //setInnerHTML(obj, html); +//https://stackoverflow.com/questions/2592092/executing-script-elements-inserted-with-innerhtml +//var setInnerHTML = function(elm, html) { +// elm.innerHTML = html; +// Array.from(elm.querySelectorAll("script")).forEach( oldScript => { +// const newScript = document.createElement("script"); +// Array.from(oldScript.attributes) +// .forEach( attr => newScript.setAttribute(attr.name, attr.value) ); +// newScript.appendChild(document.createTextNode(oldScript.innerHTML)); +// oldScript.parentNode.replaceChild(newScript, oldScript); +// }); +//} +//setInnerHTML(obj, html); + function populateInfo(i) { var cn=""; @@ -671,17 +684,15 @@ function populateSegments(s) let li = lastinfo; segCount = 0; lowestUnused = 0; lSeg = 0; - for (var y = 0; y < (s.seg||[]).length; y++) - { + for (var inst of (s.seg||[])) { segCount++; - var inst = s.seg[y]; let i = parseInt(inst.id); if (i == lowestUnused) lowestUnused = i+1; if (i > lSeg) lSeg = i; let sg = gId(`seg${i}`); - let exp = sg ? sg.classList.contains("expanded") : false; + let exp = sg ? (sg.classList.contains("expanded") || (i===0 && cfg.comp.segexp)) : false; let segp = `
@@ -690,17 +701,33 @@ function populateSegments(s)
`; - let rvXck = ``; - let miXck = ``; + let rvXck = ``; + let miXck = ``; let rvYck = "", miYck =""; if (isM) { - rvYck = ``; - miYck = ``; + rvYck = ``; + miYck = ``; } + let map2D = `
Expand 1D FX
+
+
`; + let sndSim = `
Sound sim
+
+
`; cn += `
&#x${inst.frz ? (li.live && li.liveseg==i?'e410':'e0e8') : 'e325'};
@@ -741,10 +768,12 @@ function populateSegments(s)
${!isM?rvXck:''} + ${map2D} + ${s.AudioReactive && s.AudioReactive.on ? "" : sndSim}
@@ -779,27 +808,34 @@ function populateEffects() var effects = eJson; var html = ""; - effects.shift(); // remove solid - for (let i = 0; i < effects.length; i++) effects[i] = {id: effects[i][0], name:effects[i][1]}; + effects.shift(); // temporary remove solid + for (let i = 0; i < effects.length; i++) { + effects[i] = { + id: effects[i][0], + name:effects[i][1] + }; + } effects.sort((a,b) => (a.name).localeCompare(b.name)); - effects.unshift({ "id": 0, "name": "Solid" }); - for (let i = 0; i < effects.length; i++) { + for (let ef of effects) { // WLEDSR: add slider and color control to setX (used by requestjson) - if (effects[i].name.indexOf("Reserved") < 0) { - let id = effects[i].id; - html += generateListItemHtml( - 'fx', - id, - effects[i].name, - 'setX', - '', - !(Array.isArray(fxdata) && fxdata.length>id) ? '' : fxdata[id].substr(1) - ); + let id = ef.id; + let nm = ef.name; + let fd = ""; + if (ef.name.indexOf("Reserved") < 0) { + if (Array.isArray(fxdata) && fxdata.length>id) { + fd = fxdata[id].substr(1); + var eP = (fd == '')?[]:fd.split(";"); + var p = (eP.length<3 || eP[2]==='')?[]:eP[2].split(","); + var m = (eP.length<4 || eP[3]==='')?[]:eP[3].split(","); + if (isM && m.length>0) for (let r of m) { if (r.substring(0,4)=="mp12") nm += " *"; } // 1D effects with defined mapping + if (p.length>0 && p[0].substring(0,1) === "!") nm += " 🎨"; + } + html += generateListItemHtml('fx',id,nm,'setX','',fd); } } @@ -809,7 +845,7 @@ function populateEffects() function populatePalettes() { var palettes = lJson; - palettes.shift(); // remove default + palettes.shift(); // temporary remove default for (let i = 0; i < palettes.length; i++) { palettes[i] = { "id": palettes[i][0], @@ -817,20 +853,19 @@ function populatePalettes() }; } palettes.sort((a,b) => (a.name).localeCompare(b.name)); - palettes.unshift({ "id": 0, "name": "Default" }); var html = ""; - for (let i = 0; i < palettes.length; i++) { + for (let pa of palettes) { html += generateListItemHtml( 'palette', - palettes[i].id, - palettes[i].name, + pa.id, + pa.name, 'setPalette', - `
` + `
` ); } @@ -895,12 +930,12 @@ function genPalPrevCss(id) return `background: linear-gradient(to right,${gradient.join()});`; } -function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', extraPar = '') +function generateListItemHtml(listName, id, name, clickAction, extraHtml = '', effectPar = '') { - return `
+ return `
`; } else { @@ -1708,24 +1733,24 @@ ${makePlSel(true)} Include brightness - + `; if (Array.isArray(lastinfo.maps) && lastinfo.maps.length>0) { - content += `
Ledmap: `; for (const k of (lastinfo.maps||[])) content += ``; content += "
"; } @@ -1740,7 +1765,7 @@ ${makePlSel(true)} ${pl?"Show playlist editor":(i>0)?"Overwrite with state":"Use current state"} - +
@@ -1778,9 +1803,9 @@ function makePlEntry(p,i) { @@ -1952,6 +1977,20 @@ function setMiY(s) requestJson(obj); } +function setMp12(s) +{ + var value = gId(`seg${s}mp12`).selectedIndex; + var obj = {"seg": {"id": s, "mp12": value}}; + requestJson(obj); +} + +function setSSim(s) +{ + var value = gId(`seg${s}ssim`).selectedIndex; + var obj = {"seg": {"id": s, "ssim": value}}; + requestJson(obj); +} + function setTp(s) { var tp = gId(`seg${s}tp`).checked; @@ -1990,6 +2029,8 @@ function setX(ind = null) } else { d.querySelector(`#fxlist input[name="fx"][value="${ind}"]`).checked = true; } +/* + // this code also in updateSelectedFx var selElement = d.querySelector('#fxlist .selected'); if (selElement) { selElement.classList.remove('selected'); @@ -1997,7 +2038,7 @@ function setX(ind = null) } d.querySelector(`#fxlist .lstI[data-id="${ind}"]`).classList.add('selected'); - +*/ var obj = {"seg": {"fx": parseInt(ind)}}; requestJson(obj); } @@ -2009,11 +2050,13 @@ function setPalette(paletteId = null) } else { d.querySelector(`#pallist input[name="palette"][value="${paletteId}"]`).checked = true; } +/* var selElement = d.querySelector('#pallist .selected'); if (selElement) { selElement.classList.remove('selected') } d.querySelector(`#pallist .lstI[data-id="${paletteId}"]`).classList.add('selected'); +*/ var obj = {"seg": {"pal": paletteId}}; requestJson(obj); } @@ -2127,6 +2170,7 @@ function saveP(i,pl) } populatePresets(); resetPUtil(); + setTimeout(()=>{pmtLast=0; loadPresets();}, 500); // force reloading of presets } function testPl(i,bt) { @@ -2362,6 +2406,11 @@ function rSegs() bt.style.color = "var(--c-f)"; bt.innerHTML = "Reset segments"; var obj = {"seg":[{"start":0,"stop":ledCount,"sel":true}]}; + if (isM) { + obj.seg[0].stop = mw; + obj.seg[0].startX = 0; + obj.seg[0].stopY = mh; + } for (let i=1; i<=lSeg; i++) obj.seg.push({"stop":0}); requestJson(obj); } @@ -2422,6 +2471,10 @@ function hideModes(txt) for (let e of (gId('fxlist').querySelectorAll('.lstI')||[])) { if (e.querySelector('.lstIname').innerText.indexOf(txt) >= 0) e.classList.add("hide"); //else e.classList.remove("hide"); } + if (txt==="2D ") { + gId("filter1D").classList.add("hide"); + gId("filter2D").classList.add("hide"); + } } function search(f,l=null) @@ -2444,6 +2497,19 @@ function clean(c) i.value=''; i.focus(); i.dispatchEvent(new Event('input')); + if (i.parentElement.id=='fxFind') { + gId("filters").querySelectorAll("input[type=checkbox]").forEach((e)=>{e.checked=false;}); + } +} + +function filterFx(o) +{ + if (!o) return; + let i = gId('fxFind').children[0]; + i.value=!o.checked?'':o.dataset.flt; + i.focus(); + i.dispatchEvent(new Event('input')); + gId("filters").querySelectorAll("input[type=checkbox]").forEach((e)=>{if(e!==o)e.checked=false;}); } // make sure "dur" and "transition" are arrays with at least the length of "ps" diff --git a/wled00/data/settings.htm b/wled00/data/settings.htm index d156d3709..3032959dd 100644 --- a/wled00/data/settings.htm +++ b/wled00/data/settings.htm @@ -6,9 +6,38 @@ WLED Settings diff --git a/wled00/data/settings_dmx.htm b/wled00/data/settings_dmx.htm index b2b54e20f..8ee8e1b23 100644 --- a/wled00/data/settings_dmx.htm +++ b/wled00/data/settings_dmx.htm @@ -6,35 +6,65 @@ DMX Settings diff --git a/wled00/data/settings_leds.htm b/wled00/data/settings_leds.htm index b10316729..fce968569 100644 --- a/wled00/data/settings_leds.htm +++ b/wled00/data/settings_leds.htm @@ -8,10 +8,29 @@ diff --git a/wled00/data/settings_sec.htm b/wled00/data/settings_sec.htm index c40f7bb92..f39361261 100644 --- a/wled00/data/settings_sec.htm +++ b/wled00/data/settings_sec.htm @@ -7,11 +7,30 @@ Misc Settings - +
diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index b634d6b3b..595dac295 100644 --- a/wled00/data/settings_sync.htm +++ b/wled00/data/settings_sync.htm @@ -5,42 +5,71 @@ Sync Settings - + function SP(){var p = d.Sf.DI.value; gId("xp").style.display = (p > 0)?"none":"block"; if (p > 0) d.Sf.EP.value = p;} + function SetVal(){switch(parseInt(d.Sf.EP.value)){case 5568: d.Sf.DI.value = 5568; break; case 6454: d.Sf.DI.value = 6454; break; case 4048: d.Sf.DI.value = 4048; break; }; SP();FC();} + function S(){ + if (window.location.protocol == "file:") { + loc = true; + locip = localStorage.getItem('locIp'); + if (!locip) { + locip = prompt("File Mode. Please enter WLED IP!"); + localStorage.setItem('locIp', locip); + } + } + var url = (loc?`http://${locip}`:'') + '/settings/s.js?p=4'; + loadJS(url, false); // If we set async false, file is loaded and executed, then next statement is processed + } + diff --git a/wled00/data/settings_time.htm b/wled00/data/settings_time.htm index 49aecb5a3..a3a729543 100644 --- a/wled00/data/settings_time.htm +++ b/wled00/data/settings_time.htm @@ -7,26 +7,42 @@ Time Settings diff --git a/wled00/data/settings_ui.htm b/wled00/data/settings_ui.htm index 289c91863..fd6e0e044 100644 --- a/wled00/data/settings_ui.htm +++ b/wled00/data/settings_ui.htm @@ -7,6 +7,7 @@ UI Settings @@ -241,6 +260,7 @@ :
:
:
+ :
I hate dark mode:
:
diff --git a/wled00/data/settings_um.htm b/wled00/data/settings_um.htm index 33eb309ba..4b9d47cc4 100644 --- a/wled00/data/settings_um.htm +++ b/wled00/data/settings_um.htm @@ -81,6 +81,7 @@ } function addField(k,f,o,a=false) { //key, field, (sub)object, isArray if (isO(o)) { + urows += '
'; for (const [s,v] of Object.entries(o)) { // possibility to nest objects (only 1 level) if (f!=='unknown' && !k.includes(":")) addField(k+":"+f,s,v); @@ -191,7 +192,6 @@ e.preventDefault(); if (d.Sf.checkValidity()) d.Sf.submit(); //https://stackoverflow.com/q/37323914 } - //fun-ction GetV() {} // replaced during 'npm run build' diff --git a/wled00/data/settings_wifi.htm b/wled00/data/settings_wifi.htm index 6bc495646..4b9fc6529 100644 --- a/wled00/data/settings_wifi.htm +++ b/wled00/data/settings_wifi.htm @@ -6,16 +6,44 @@ WiFi Settings - +
diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 3cf5b895e..a9a3dd8c9 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -58,6 +58,9 @@ bool getJsonValue(const JsonVariant& element, DestType& destination, const Defau //colors.cpp +uint32_t color_blend(uint32_t,uint32_t,uint16_t,bool b16=false); +uint32_t color_add(uint32_t,uint32_t); + inline uint32_t colorFromRgbw(byte* rgbw) { return uint32_t((byte(rgbw[3]) << 24) | (byte(rgbw[0]) << 16) | (byte(rgbw[1]) << 8) | (byte(rgbw[2]))); } void colorHStoRGB(uint16_t hue, byte sat, byte* rgb); //hue, sat to rgb void colorKtoRGB(uint16_t kelvin, byte* rgb); @@ -129,7 +132,7 @@ void handleIR(); void deserializeSegment(JsonObject elem, byte it, byte presetId = 0); bool deserializeState(JsonObject root, byte callMode = CALL_MODE_DIRECT_CHANGE, byte presetId = 0); -void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool forPreset = false, bool segmentBounds = true); +void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset = false, bool segmentBounds = true); void serializeState(JsonObject root, bool forPreset = false, bool includeBri = true, bool segmentBounds = true); void serializeInfo(JsonObject root); void serializeModeNames(JsonArray arr, const char *qstring); @@ -296,7 +299,7 @@ class UsermodManager { void onUpdateBegin(bool); bool add(Usermod* um); Usermod* lookup(uint16_t mod_id); - byte getModCount(); + byte getModCount() {return numMods;}; }; //usermods_list.cpp @@ -321,8 +324,10 @@ bool isAsterisksOnly(const char* str, byte maxLen); bool requestJSONBufferLock(uint8_t module=255); void releaseJSONBufferLock(); uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLen); -uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxLen); +uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxLen, uint8_t *var = nullptr); +int16_t extractModeDefaults(uint8_t mode, const char *segVar); uint16_t crc16(const unsigned char* data_p, size_t length); +um_data_t* simulateSound(uint8_t simulationId); //wled_eeprom.cpp void applyMacro(byte index); diff --git a/wled00/html_settings.h b/wled00/html_settings.h index e78403b43..ccfff2981 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -64,1518 +64,1662 @@ const uint8_t PAGE_settingsCss[] PROGMEM = { // Autogenerated from wled00/data/settings.htm, do not edit!! -const uint16_t PAGE_settings_length = 696; +const uint16_t PAGE_settings_length = 985; const uint8_t PAGE_settings[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x95, 0x6d, 0x6f, 0xd3, 0x30, - 0x10, 0xc7, 0xdf, 0xf7, 0x53, 0x98, 0x4c, 0xb0, 0x56, 0x6a, 0xda, 0xae, 0x43, 0x08, 0xf2, 0x50, - 0xa4, 0xd1, 0x0d, 0x26, 0x31, 0x6d, 0xd2, 0x9e, 0xe0, 0xa5, 0x63, 0x5f, 0xd2, 0x63, 0x89, 0x1d, - 0xd9, 0x4e, 0xdb, 0x50, 0xf5, 0xbb, 0x73, 0x49, 0xbb, 0x07, 0xc4, 0x04, 0x13, 0xea, 0x9b, 0x24, - 0x67, 0xbb, 0xff, 0xbb, 0xfb, 0xfd, 0xcf, 0x6a, 0xf4, 0x6a, 0x7a, 0xfe, 0xe9, 0xea, 0xfb, 0xc5, - 0x31, 0x9b, 0xb9, 0x22, 0x9f, 0x44, 0xcd, 0x93, 0xe5, 0x5c, 0x65, 0xb1, 0x07, 0xca, 0xa3, 0x18, - 0xb8, 0x9c, 0x44, 0x05, 0x38, 0xce, 0xc4, 0x8c, 0x1b, 0x0b, 0x2e, 0xf6, 0xae, 0xaf, 0x4e, 0xfc, - 0xf7, 0xde, 0x76, 0xb5, 0x23, 0xb4, 0x72, 0xa0, 0x68, 0x79, 0x81, 0xd2, 0xcd, 0x62, 0x09, 0x73, - 0x14, 0xe0, 0xb7, 0x41, 0x1f, 0x15, 0x3a, 0xe4, 0xb9, 0x6f, 0x05, 0xcf, 0x21, 0x3e, 0xe8, 0x17, - 0x7c, 0x89, 0x45, 0x55, 0x3c, 0xc4, 0x95, 0x05, 0xd3, 0x06, 0x3c, 0xa1, 0x58, 0x69, 0x8f, 0x75, - 0x14, 0x2f, 0x20, 0xf6, 0xe6, 0x08, 0x8b, 0x52, 0x1b, 0x47, 0x59, 0x1c, 0xba, 0x1c, 0x26, 0xb7, - 0x5f, 0x8f, 0xa7, 0xec, 0x12, 0x9c, 0x43, 0x95, 0xd9, 0x68, 0xb8, 0x59, 0x8c, 0xac, 0x30, 0x58, - 0xba, 0x49, 0x67, 0xce, 0x0d, 0x93, 0xb1, 0xd4, 0xa2, 0x2a, 0xa8, 0x94, 0x30, 0xad, 0x94, 0x70, - 0xa8, 0x15, 0xcb, 0x4e, 0x65, 0x57, 0xf5, 0x56, 0x06, 0x5c, 0x65, 0x14, 0x93, 0x83, 0x0c, 0xdc, - 0x71, 0x0e, 0xcd, 0x99, 0xa3, 0xba, 0xdd, 0x5a, 0x3f, 0x1c, 0xbd, 0xec, 0xf6, 0x56, 0x9f, 0xc1, - 0xdd, 0x74, 0x7b, 0xeb, 0x4e, 0x34, 0xdc, 0x0a, 0x6f, 0x13, 0x30, 0x6b, 0x44, 0xec, 0x0d, 0xed, - 0x36, 0xfd, 0xd0, 0x0e, 0x7e, 0xd8, 0x8f, 0x65, 0x3c, 0xa2, 0xea, 0x1e, 0x4f, 0xba, 0x9a, 0x2a, - 0xea, 0x24, 0x5a, 0xd6, 0x2b, 0x07, 0x4b, 0xe7, 0xf3, 0x1c, 0x33, 0x15, 0x08, 0xca, 0x05, 0x26, - 0x4c, 0xb8, 0xb8, 0xcb, 0x8c, 0xae, 0x94, 0x0c, 0xf6, 0xc6, 0xe3, 0x71, 0x38, 0x03, 0xcc, 0x66, - 0x2e, 0x38, 0x18, 0x8d, 0xca, 0x65, 0x58, 0x70, 0x93, 0xa1, 0x0a, 0x46, 0xeb, 0x06, 0xfe, 0xca, - 0xf7, 0x67, 0xc1, 0x87, 0xf9, 0x6c, 0x9d, 0x54, 0xce, 0x69, 0xb5, 0x7a, 0xfa, 0xcb, 0xc3, 0xc3, - 0xc3, 0x50, 0xe8, 0x5c, 0x9b, 0x60, 0x2f, 0x4d, 0xd3, 0x30, 0x25, 0xf2, 0x7e, 0xca, 0x0b, 0xcc, - 0xeb, 0xe0, 0x06, 0x8c, 0xe4, 0x8a, 0xf7, 0xbf, 0x40, 0x3e, 0x07, 0x87, 0x82, 0xf7, 0x2d, 0x57, - 0xd6, 0x27, 0xbe, 0x98, 0x86, 0x12, 0x6d, 0x99, 0xf3, 0x3a, 0x48, 0x72, 0x2d, 0xee, 0xc2, 0x44, - 0x1b, 0x09, 0x26, 0x38, 0x28, 0x97, 0xcc, 0xea, 0x1c, 0x25, 0x6b, 0x75, 0x37, 0xab, 0xbe, 0xe1, - 0x12, 0x2b, 0x1b, 0x10, 0xd0, 0x2e, 0x15, 0xd2, 0xdb, 0xe4, 0xb0, 0xf8, 0x13, 0x82, 0x77, 0xf3, - 0x02, 0xd5, 0x7d, 0xe1, 0x0f, 0xfb, 0xad, 0xcf, 0x01, 0x39, 0x28, 0xba, 0xd4, 0xcc, 0x6b, 0xe6, - 0xb3, 0xb7, 0xd4, 0x52, 0xef, 0xbe, 0xa7, 0xf1, 0x7c, 0xc6, 0x78, 0xe5, 0x34, 0x1b, 0x85, 0xa2, - 0x32, 0x96, 0x2a, 0x2f, 0x35, 0x36, 0x44, 0x5a, 0xc8, 0x2d, 0xb2, 0x68, 0xb8, 0x99, 0xb1, 0x86, - 0x1c, 0xd3, 0x2a, 0xd7, 0x5c, 0xc6, 0x1e, 0xb9, 0x41, 0x70, 0x37, 0x08, 0x98, 0xab, 0x4b, 0x1a, - 0x09, 0x5b, 0x25, 0x05, 0x3a, 0x8f, 0x21, 0x6d, 0x27, 0x34, 0x28, 0x5a, 0x89, 0x1c, 0xc5, 0x5d, - 0xbc, 0xbf, 0x40, 0x25, 0xf5, 0x62, 0x40, 0xbd, 0xf1, 0xc6, 0x49, 0x32, 0xca, 0xdb, 0x9f, 0x1c, - 0x11, 0xb6, 0x68, 0xb8, 0x11, 0x98, 0xb0, 0xe7, 0x95, 0xfe, 0x22, 0x31, 0x78, 0x34, 0x7b, 0x81, - 0x29, 0x92, 0xe0, 0x2d, 0x9e, 0x60, 0x33, 0x80, 0x55, 0xf9, 0xa7, 0x6c, 0xe7, 0x77, 0xdd, 0x17, - 0xc9, 0xe6, 0x20, 0x2d, 0xc9, 0x36, 0x63, 0x7d, 0x61, 0x20, 0x05, 0x03, 0x4a, 0x80, 0xed, 0xfc, - 0xab, 0xe6, 0x17, 0x69, 0x8f, 0xa7, 0xa4, 0xdc, 0x19, 0x4f, 0xd9, 0x27, 0xad, 0x52, 0xcc, 0x2a, - 0xd3, 0x1e, 0xd9, 0x0d, 0x8e, 0xaa, 0x81, 0x71, 0x4d, 0x73, 0xc5, 0x4e, 0x1b, 0x1f, 0x53, 0x2e, - 0xe0, 0x19, 0x20, 0x8d, 0x49, 0xb2, 0x58, 0x26, 0x4e, 0x79, 0xac, 0xb5, 0x99, 0xc2, 0xed, 0x10, - 0x2a, 0xad, 0xc0, 0xfb, 0xaf, 0xd4, 0x24, 0x48, 0xb9, 0xa7, 0x67, 0xdf, 0xd8, 0x79, 0xe5, 0xca, - 0xca, 0xed, 0xc6, 0x08, 0x5b, 0x2b, 0x41, 0xb2, 0x97, 0xf4, 0x7a, 0x6c, 0x69, 0x47, 0x46, 0x38, - 0x2c, 0xa0, 0xb1, 0xe2, 0x8a, 0xde, 0xec, 0x0d, 0x3b, 0xe3, 0xc2, 0x68, 0xbb, 0x23, 0x1f, 0x8a, - 0xad, 0x0f, 0x85, 0x96, 0x76, 0x47, 0x24, 0xa0, 0x05, 0x01, 0x74, 0x53, 0xd1, 0xd5, 0x54, 0xef, - 0x75, 0x29, 0xb9, 0x7b, 0xca, 0x82, 0x3e, 0xe8, 0x96, 0x36, 0x57, 0xb6, 0xf9, 0xb3, 0xf8, 0x05, - 0x20, 0x89, 0x88, 0xc4, 0x3c, 0x06, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36, + 0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96, + 0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc, + 0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a, + 0x21, 0x5f, 0x6c, 0xf3, 0x78, 0x7c, 0x78, 0xf7, 0x3c, 0xcf, 0x11, 0x9e, 0xec, 0x1c, 0x7e, 0x38, + 0xb8, 0xf8, 0xf3, 0xec, 0x88, 0x2d, 0xb0, 0xae, 0xa6, 0x93, 0xf0, 0xc9, 0x2a, 0x61, 0xca, 0x9c, + 0x83, 0xe1, 0xb4, 0x06, 0xa1, 0xa6, 0x93, 0x1a, 0x50, 0x30, 0xb9, 0x10, 0xce, 0x03, 0xe6, 0xfc, + 0xf2, 0xe2, 0xb8, 0xff, 0x33, 0xdf, 0x46, 0x7b, 0xd2, 0x1a, 0x04, 0x43, 0xe1, 0x6b, 0xad, 0x70, + 0x91, 0x2b, 0x58, 0x6a, 0x09, 0xfd, 0x6e, 0x91, 0x68, 0xa3, 0x51, 0x8b, 0xaa, 0xef, 0xa5, 0xa8, + 0x20, 0xdf, 0x4b, 0x6a, 0x71, 0xa3, 0xeb, 0xb6, 0xbe, 0x5f, 0xb7, 0x1e, 0x5c, 0xb7, 0x10, 0x73, + 0x5a, 0x1b, 0xcb, 0x59, 0xcf, 0x88, 0x1a, 0x72, 0xbe, 0xd4, 0x70, 0xdd, 0x58, 0x87, 0x74, 0x0b, + 0x6a, 0xac, 0x60, 0xfa, 0xe9, 0xe4, 0xe8, 0x90, 0x9d, 0x03, 0xa2, 0x36, 0xa5, 0x9f, 0x0c, 0x36, + 0xc1, 0x89, 0x97, 0x4e, 0x37, 0x38, 0xed, 0x2d, 0x85, 0x63, 0x95, 0x95, 0xba, 0x49, 0x54, 0xae, + 0xac, 0x6c, 0x6b, 0x2a, 0x28, 0xa1, 0x40, 0xbe, 0xb3, 0x37, 0x2e, 0x5a, 0x23, 0x51, 0x5b, 0xc3, + 0xca, 0x99, 0x8a, 0x30, 0x5e, 0x3b, 0xc0, 0xd6, 0x19, 0xa6, 0xd2, 0x12, 0xf0, 0xa8, 0x82, 0x90, + 0xfa, 0x6e, 0xd5, 0x6d, 0xdd, 0xde, 0xa7, 0x56, 0x56, 0xa8, 0xdf, 0xcf, 0x23, 0x4c, 0x20, 0xdf, + 0x19, 0xc6, 0xeb, 0x0a, 0x90, 0xd9, 0x5c, 0xa5, 0xd2, 0x81, 0x40, 0xd8, 0x1e, 0x8a, 0xf8, 0xe6, + 0x76, 0x1e, 0x8f, 0x6d, 0x4a, 0xbc, 0xfc, 0x8a, 0xe8, 0xf4, 0xbc, 0x45, 0xa0, 0x0d, 0x27, 0x79, + 0x82, 0x71, 0xf2, 0x75, 0x1c, 0x57, 0x0d, 0xf0, 0x84, 0x23, 0xdc, 0xe0, 0xe0, 0xb3, 0x58, 0x8a, + 0x3b, 0x80, 0x6f, 0x12, 0x85, 0x5f, 0x19, 0x82, 0x80, 0x38, 0x51, 0xe9, 0xdc, 0xaa, 0x55, 0x2a, + 0x9a, 0x06, 0x8c, 0x3a, 0x58, 0xe8, 0x4a, 0x45, 0x36, 0xe4, 0x0b, 0xa5, 0x8e, 0x96, 0x54, 0xc5, + 0x89, 0xf6, 0xc4, 0x3e, 0xb8, 0x88, 0x87, 0x9a, 0x79, 0x12, 0xc5, 0xf9, 0x74, 0xfd, 0x1e, 0xf0, + 0x63, 0x14, 0xdf, 0x3e, 0x9f, 0x07, 0xce, 0x59, 0x47, 0xe5, 0x51, 0x1e, 0x49, 0xe7, 0x6d, 0x05, + 0x69, 0x65, 0xcb, 0x88, 0x1f, 0x85, 0x38, 0xdb, 0x36, 0x4f, 0x2c, 0xb3, 0x42, 0x57, 0xd0, 0xb5, + 0x41, 0x5a, 0x39, 0x6a, 0xf7, 0x64, 0x1b, 0xb7, 0x05, 0xa3, 0x83, 0x85, 0x2e, 0x5b, 0x27, 0x3a, + 0xb6, 0x36, 0x6d, 0xb0, 0x42, 0xd0, 0x01, 0x95, 0xfe, 0x65, 0x66, 0x46, 0xda, 0xba, 0x21, 0xd2, + 0x80, 0x35, 0xa2, 0x04, 0xa6, 0x04, 0x8a, 0x1d, 0x4e, 0xf5, 0x3c, 0x10, 0x7c, 0x1e, 0xc5, 0x6b, + 0x1e, 0x2e, 0xc8, 0x78, 0x9e, 0x5f, 0x6b, 0xa3, 0xec, 0x35, 0x55, 0x21, 0x3b, 0xbc, 0xb4, 0x71, + 0x16, 0xad, 0xb4, 0xd5, 0xeb, 0xd7, 0x51, 0xa7, 0xe1, 0x30, 0x89, 0x3a, 0x71, 0xf3, 0x90, 0x51, + 0x9d, 0xa3, 0x75, 0x84, 0x1a, 0xe4, 0x9b, 0x21, 0xd4, 0xa1, 0x71, 0x39, 0x6b, 0x78, 0x1c, 0x7f, + 0xf9, 0xb2, 0x4d, 0xa3, 0xf3, 0x75, 0x43, 0x05, 0x1f, 0x13, 0x3e, 0x3b, 0xb5, 0x0a, 0x52, 0x76, + 0x56, 0x81, 0xf0, 0xc0, 0x88, 0x08, 0x70, 0xac, 0xf3, 0xd2, 0xec, 0x8c, 0x4a, 0x4a, 0x9e, 0x20, + 0xfa, 0xa7, 0x88, 0x49, 0x87, 0x16, 0xc7, 0x21, 0xab, 0xb3, 0x43, 0x80, 0x7f, 0xcb, 0x17, 0x88, + 0x4d, 0x36, 0x18, 0xf0, 0x37, 0xdd, 0x76, 0xc6, 0x79, 0xfc, 0x86, 0x0f, 0xfc, 0xd6, 0x99, 0x03, + 0x9f, 0x7e, 0xf6, 0x6f, 0x9b, 0x7c, 0xc8, 0x93, 0x9d, 0xbd, 0xf8, 0xb6, 0x37, 0x19, 0x6c, 0x2d, + 0x3a, 0xf1, 0xb8, 0x22, 0xc7, 0xf6, 0x82, 0x9a, 0xeb, 0x60, 0x80, 0xbe, 0xa8, 0x74, 0x69, 0x32, + 0xd9, 0x95, 0x34, 0x9e, 0x0b, 0x79, 0x55, 0x3a, 0xdb, 0x1a, 0x95, 0xbd, 0x1a, 0x8d, 0x46, 0xe3, + 0x05, 0xe8, 0x72, 0x81, 0xd9, 0xde, 0x70, 0xd8, 0xdc, 0x8c, 0x6b, 0xe1, 0x4a, 0x6d, 0xb2, 0xe1, + 0x6d, 0x18, 0xce, 0x75, 0xbf, 0xbf, 0xc8, 0x7e, 0x59, 0x2e, 0x6e, 0xc9, 0x29, 0x68, 0xcd, 0xfa, + 0xf1, 0xc9, 0xfd, 0xfd, 0xfd, 0x31, 0xf1, 0x66, 0x5d, 0xf6, 0xaa, 0x28, 0x8a, 0x71, 0x41, 0x93, + 0xd9, 0x2f, 0x44, 0xad, 0xab, 0x55, 0xf6, 0x11, 0x9c, 0x12, 0x46, 0x24, 0xbf, 0x41, 0xb5, 0x04, + 0xd4, 0x52, 0x24, 0x5e, 0x18, 0xdf, 0xa7, 0xf9, 0xd3, 0xc5, 0x58, 0x69, 0xdf, 0x54, 0x62, 0x95, + 0xcd, 0xa9, 0xa5, 0xab, 0xf1, 0xdc, 0x3a, 0x05, 0x2e, 0xdb, 0x6b, 0x6e, 0x18, 0xb9, 0x43, 0x2b, + 0xd6, 0xe1, 0x6e, 0xa2, 0x7d, 0x47, 0x1e, 0x68, 0x7d, 0x46, 0x03, 0x17, 0x51, 0x21, 0xf1, 0xe6, + 0x0e, 0xaf, 0xff, 0x86, 0xec, 0xa7, 0x65, 0xad, 0xcd, 0x5d, 0xe1, 0xf7, 0xfb, 0xdd, 0x3b, 0x90, + 0x11, 0xc9, 0x32, 0xa2, 0x66, 0x7e, 0x60, 0x7d, 0xf6, 0x23, 0xb5, 0x14, 0xdf, 0xf5, 0x34, 0x5a, + 0x2e, 0x98, 0x68, 0xd1, 0xb2, 0xe1, 0x58, 0xb6, 0xce, 0x53, 0xe5, 0x8d, 0xd5, 0x81, 0x91, 0x8e, + 0xba, 0x8e, 0xb2, 0xc9, 0x60, 0xf3, 0x06, 0x05, 0xe6, 0xc8, 0x9e, 0x41, 0x8b, 0x9c, 0x93, 0x7f, + 0xe8, 0x69, 0xd8, 0x50, 0xc0, 0xc2, 0x58, 0xe5, 0xdc, 0xb7, 0xf3, 0x5a, 0x23, 0x67, 0x9a, 0xb6, + 0xe7, 0xf4, 0x90, 0x58, 0x23, 0x2b, 0x2d, 0xaf, 0xf2, 0xdd, 0xaf, 0xec, 0x95, 0xf3, 0x01, 0xdf, + 0x9d, 0xbe, 0x23, 0xda, 0x26, 0x83, 0x0d, 0xc0, 0x94, 0x3d, 0x8f, 0xf4, 0x2f, 0x10, 0xe9, 0x83, + 0xe2, 0xd7, 0xba, 0xd0, 0x04, 0xf8, 0x49, 0x1f, 0xeb, 0xf0, 0x40, 0xb5, 0xcd, 0xb7, 0xb0, 0xbd, + 0xa7, 0xb8, 0xdf, 0x05, 0x4b, 0xa3, 0xe4, 0x09, 0x36, 0x58, 0xf5, 0xcc, 0x41, 0x01, 0x0e, 0x8c, + 0x04, 0xdf, 0xfb, 0xaf, 0x9a, 0xbf, 0x0b, 0x7b, 0x74, 0x48, 0xc8, 0xbd, 0xd1, 0x21, 0x3b, 0x78, + 0x3c, 0xc7, 0x2f, 0x43, 0x47, 0x1b, 0xc8, 0xb8, 0x24, 0x5f, 0xb1, 0x59, 0xd0, 0xb1, 0x10, 0x12, + 0x9e, 0x21, 0x24, 0x88, 0xa4, 0xea, 0x9b, 0x39, 0x1a, 0xce, 0x3a, 0x99, 0x69, 0xb9, 0x35, 0xa1, + 0xb1, 0x06, 0xf8, 0xff, 0xba, 0x9a, 0x00, 0xe9, 0xee, 0xc3, 0xd3, 0x3f, 0xd8, 0x87, 0x16, 0x9b, + 0x16, 0x5f, 0x46, 0x88, 0xee, 0x29, 0xde, 0x9d, 0x9e, 0xd3, 0xd7, 0x43, 0x4b, 0x2f, 0x24, 0x04, + 0xea, 0x1a, 0x82, 0x14, 0x17, 0xf4, 0xcd, 0x5e, 0xb3, 0x53, 0x21, 0x9d, 0xf5, 0x2f, 0xa4, 0x43, + 0xbd, 0xd5, 0xa1, 0xb6, 0xca, 0xbf, 0x10, 0x13, 0xd0, 0x11, 0x01, 0x34, 0xa9, 0x1a, 0x57, 0x54, + 0xef, 0x65, 0x43, 0x4f, 0xfb, 0x63, 0x2e, 0xe8, 0x07, 0x4d, 0x69, 0x18, 0xd9, 0xf0, 0x67, 0xe2, + 0x1f, 0xb2, 0x41, 0x30, 0x32, 0x5c, 0x08, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_wifi.htm, do not edit!! -const uint16_t PAGE_settings_wifi_length = 1243; +const uint16_t PAGE_settings_wifi_length = 1557; const uint8_t PAGE_settings_wifi[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x57, 0x6d, 0x6f, 0xe2, 0x46, - 0x10, 0xfe, 0xee, 0x5f, 0xb1, 0xdd, 0x4a, 0x15, 0x48, 0x60, 0x02, 0x34, 0x69, 0x94, 0xda, 0xbe, - 0x12, 0xa0, 0x21, 0xea, 0x35, 0x47, 0x65, 0x74, 0x51, 0x3f, 0x9d, 0x8c, 0x3d, 0xe0, 0x6d, 0xec, - 0x5d, 0xd7, 0xbb, 0xc6, 0xa0, 0xeb, 0xfd, 0xf7, 0xce, 0xfa, 0x85, 0xd7, 0x90, 0x5c, 0xaf, 0x51, - 0x94, 0xc0, 0xee, 0xce, 0x3c, 0x33, 0xfb, 0xcc, 0xec, 0xcc, 0xc4, 0xfa, 0x6e, 0xf4, 0x61, 0x38, - 0xfb, 0x73, 0x3a, 0x26, 0xa1, 0x8a, 0x23, 0xc7, 0xd2, 0x7f, 0x49, 0xe4, 0xf1, 0xa5, 0x4d, 0x81, - 0x53, 0x5c, 0x83, 0x17, 0x38, 0x56, 0x0c, 0xca, 0x23, 0x7e, 0xe8, 0xa5, 0x12, 0x94, 0x4d, 0x33, - 0xb5, 0x68, 0x5f, 0xd3, 0x6a, 0xd7, 0xe0, 0x5e, 0x0c, 0x36, 0x5d, 0x31, 0xc8, 0x13, 0x91, 0x2a, - 0x4a, 0x7c, 0xc1, 0x15, 0x70, 0x14, 0xcb, 0x59, 0xa0, 0x42, 0xfb, 0xf2, 0xe2, 0x62, 0x2b, 0x7a, - 0x74, 0x14, 0xc0, 0x8a, 0xf9, 0xd0, 0x2e, 0x16, 0x2d, 0xc6, 0x99, 0x62, 0x5e, 0xd4, 0x96, 0xbe, - 0x17, 0x81, 0xdd, 0x6d, 0xc5, 0xde, 0x9a, 0xc5, 0x59, 0xbc, 0x5d, 0x67, 0x12, 0xd2, 0x62, 0xe1, - 0xcd, 0x71, 0xcd, 0x05, 0x3d, 0xb1, 0xec, 0x58, 0x8a, 0xa9, 0x08, 0x9c, 0x47, 0xf6, 0x2b, 0x23, - 0x2e, 0x28, 0xc5, 0xf8, 0x52, 0x5a, 0x9d, 0x72, 0xd3, 0x92, 0x7e, 0xca, 0x12, 0xe5, 0x18, 0x8b, - 0x8c, 0xfb, 0x8a, 0x09, 0x4e, 0x26, 0x8d, 0xe6, 0xe7, 0x9c, 0xf1, 0x40, 0xe4, 0xa6, 0x48, 0x80, - 0x37, 0x68, 0xa8, 0x54, 0x22, 0x6f, 0x3a, 0x9d, 0x27, 0x2e, 0xcc, 0x3c, 0x82, 0xc0, 0x5c, 0x42, - 0x67, 0x01, 0x9e, 0xca, 0x52, 0x90, 0x1d, 0x59, 0xe1, 0x75, 0xbe, 0xcf, 0xd9, 0x82, 0xb5, 0xeb, - 0x25, 0x6d, 0x7e, 0xd9, 0x02, 0xde, 0x1e, 0x03, 0x6e, 0x95, 0x68, 0x8b, 0x7e, 0x92, 0x10, 0x2d, - 0x50, 0xda, 0xb0, 0x3a, 0x95, 0x27, 0x95, 0x47, 0x44, 0xa6, 0xbe, 0xbd, 0x13, 0xed, 0x48, 0xf3, - 0x2f, 0xf9, 0x2e, 0xb1, 0xbb, 0x78, 0x9d, 0x9d, 0xa4, 0xda, 0xe0, 0x15, 0x8c, 0x5f, 0x58, 0xac, - 0x2f, 0x4a, 0xb2, 0x34, 0x6a, 0xd0, 0x62, 0xcf, 0xf4, 0x25, 0xba, 0xf0, 0x33, 0x4a, 0x16, 0x12, - 0x56, 0xa7, 0x0c, 0xd7, 0x5c, 0x04, 0x1b, 0x22, 0x78, 0x24, 0xbc, 0xc0, 0xa6, 0x77, 0xa0, 0x3e, - 0x36, 0x9a, 0x08, 0xb7, 0x10, 0x69, 0x4c, 0x18, 0xee, 0xe8, 0x2f, 0x9f, 0xe4, 0x96, 0x40, 0x77, - 0x41, 0x09, 0xc6, 0x27, 0x14, 0x78, 0x94, 0x08, 0xa9, 0x89, 0x0c, 0xd8, 0x8a, 0xf8, 0x91, 0x27, - 0xa5, 0x4d, 0x95, 0x48, 0x52, 0x91, 0x1f, 0xee, 0x85, 0x10, 0x25, 0xb7, 0xb8, 0x35, 0xcf, 0x94, - 0xc2, 0x8b, 0x1b, 0x6a, 0x93, 0x20, 0x4e, 0xb9, 0xa2, 0x68, 0xd8, 0x8f, 0x98, 0xff, 0x64, 0xd3, - 0x89, 0x36, 0xfb, 0xce, 0xea, 0x94, 0x07, 0xe8, 0x1d, 0x42, 0x6c, 0x95, 0xce, 0xe8, 0xdc, 0x6a, - 0x1d, 0xe3, 0xd6, 0xf3, 0x9f, 0x76, 0x7a, 0x07, 0x1a, 0x32, 0x9b, 0xc7, 0x0c, 0x7d, 0x74, 0xbd, - 0x15, 0x90, 0x1f, 0xc8, 0x50, 0x70, 0x0e, 0xbe, 0xda, 0x09, 0x87, 0x69, 0x6d, 0x28, 0xec, 0x39, - 0x46, 0x91, 0x0b, 0xc8, 0x6d, 0x96, 0x20, 0x37, 0x3d, 0xdc, 0xeb, 0x3b, 0x95, 0x06, 0x51, 0x82, - 0xc0, 0x9a, 0x49, 0xcd, 0x3a, 0xe1, 0xa0, 0x72, 0x91, 0xa2, 0x49, 0x3c, 0x37, 0x1e, 0xca, 0x05, - 0xd1, 0xec, 0x90, 0x86, 0xeb, 0xde, 0x8f, 0x5a, 0x04, 0xe2, 0x44, 0x6d, 0xb4, 0x0a, 0x17, 0x4a, - 0x67, 0xb8, 0x46, 0x68, 0xde, 0x58, 0x73, 0x34, 0xc6, 0x78, 0x92, 0xa9, 0xca, 0x39, 0x05, 0x6b, - 0x7c, 0x01, 0x25, 0xad, 0x43, 0x17, 0x19, 0xc6, 0x2c, 0x8e, 0x80, 0x2f, 0x31, 0xd9, 0x69, 0xbf, - 0xa7, 0x19, 0x4b, 0x9d, 0x1a, 0x3e, 0x41, 0x2a, 0xf1, 0x4b, 0x70, 0x8a, 0x52, 0x9f, 0x6c, 0x91, - 0xa6, 0x87, 0x48, 0x57, 0xfd, 0x12, 0xc9, 0x55, 0x9e, 0x62, 0x3e, 0xb9, 0x9f, 0x92, 0x46, 0x04, - 0x9a, 0x0e, 0x4f, 0x91, 0x0b, 0xb3, 0xf8, 0x21, 0x18, 0x63, 0x32, 0x9a, 0x0c, 0xa7, 0x07, 0x4e, - 0x96, 0x70, 0xf7, 0x17, 0xb4, 0x0e, 0x19, 0xcf, 0xe2, 0x39, 0xa4, 0xb4, 0x8e, 0x2b, 0xe6, 0x44, - 0xcc, 0xb8, 0x4d, 0x51, 0x00, 0xcd, 0xd9, 0xb4, 0x77, 0x79, 0x49, 0x49, 0x0a, 0x7f, 0x67, 0x2c, - 0x85, 0xc0, 0x21, 0x26, 0x39, 0xc4, 0xe9, 0xbe, 0x11, 0x4e, 0xef, 0x8d, 0x70, 0xfa, 0xdf, 0x86, - 0xb3, 0x47, 0xe5, 0xd2, 0x53, 0x90, 0x7b, 0x9b, 0x3d, 0xce, 0x8c, 0x0a, 0xfc, 0x0e, 0x75, 0xff, - 0x97, 0x8f, 0xd5, 0x63, 0xbb, 0xeb, 0xbe, 0x11, 0x4e, 0xef, 0x8d, 0x70, 0xfa, 0xdf, 0x84, 0xa3, - 0x09, 0x32, 0x2a, 0xd2, 0xf0, 0x45, 0xe2, 0xfb, 0x41, 0x29, 0xf9, 0x74, 0x9a, 0x6c, 0xee, 0x57, - 0xf0, 0x66, 0x7c, 0x45, 0x70, 0xdd, 0xee, 0x1b, 0xe1, 0xf4, 0xde, 0x08, 0xa7, 0xff, 0x6d, 0x38, - 0x9a, 0xa0, 0x78, 0xf4, 0xe0, 0x12, 0x2f, 0x08, 0xb0, 0xaf, 0xc8, 0xfa, 0xe9, 0x96, 0x05, 0x46, - 0xbf, 0x5a, 0x2e, 0x88, 0x16, 0x28, 0x1f, 0xae, 0xee, 0x49, 0xd8, 0x92, 0x48, 0x9d, 0x8c, 0xcf, - 0x94, 0x99, 0xdf, 0x8b, 0x00, 0xed, 0x57, 0x19, 0x62, 0x46, 0x02, 0x1b, 0xa5, 0xd6, 0x1f, 0x46, - 0x0c, 0x1b, 0x2e, 0x96, 0x88, 0x1b, 0x62, 0xc9, 0xc4, 0xe3, 0x5b, 0x2f, 0x59, 0x82, 0x65, 0xf6, - 0x61, 0x57, 0xcc, 0x20, 0xc0, 0x26, 0x82, 0x02, 0x85, 0x83, 0x55, 0x99, 0x5c, 0xb0, 0x25, 0xf6, - 0x3e, 0x32, 0xf0, 0x7d, 0xed, 0xe8, 0x54, 0x30, 0xae, 0xca, 0x0a, 0x39, 0x98, 0x12, 0x5d, 0x16, - 0x9f, 0xf5, 0x7d, 0x30, 0x7d, 0xa5, 0x2e, 0x0e, 0xdc, 0x13, 0x87, 0x0d, 0xad, 0x30, 0x61, 0x01, - 0xda, 0x9a, 0x16, 0x52, 0x37, 0xe4, 0x40, 0xdd, 0x0f, 0xc1, 0x7f, 0x9a, 0x8b, 0xf5, 0x16, 0x62, - 0x52, 0x16, 0x40, 0xed, 0x48, 0x5d, 0x2c, 0x4f, 0x9d, 0xd1, 0x4d, 0xb8, 0xf9, 0x7a, 0x75, 0x1d, - 0x9c, 0x56, 0x57, 0x04, 0x55, 0x0a, 0x52, 0x8c, 0x62, 0xc3, 0xfc, 0x7c, 0xdd, 0xba, 0xea, 0x7f, - 0x69, 0xfe, 0x83, 0x7d, 0x89, 0x14, 0xa3, 0x84, 0x4d, 0xc7, 0x85, 0x09, 0xb4, 0x80, 0x81, 0x36, - 0xc9, 0x75, 0x31, 0x18, 0x79, 0x48, 0x61, 0x2a, 0x6b, 0xb7, 0xf6, 0x18, 0x23, 0x45, 0x0b, 0x42, - 0x11, 0xa4, 0x39, 0xba, 0x39, 0x4c, 0xa2, 0xc1, 0xf0, 0x4c, 0x12, 0xad, 0xeb, 0x2c, 0xea, 0xd6, - 0x59, 0xd4, 0xed, 0x1f, 0x25, 0x11, 0x5e, 0x5d, 0x5f, 0x50, 0xea, 0xc0, 0x42, 0xa4, 0x1b, 0x5a, - 0x85, 0xa9, 0x1b, 0xb3, 0x48, 0x8a, 0x89, 0x64, 0xe5, 0x45, 0x19, 0xe8, 0x54, 0xd4, 0xa1, 0xae, - 0x23, 0xad, 0x0f, 0xbc, 0x05, 0x7a, 0x4b, 0xe6, 0x42, 0x60, 0x40, 0x4b, 0xd9, 0x63, 0x1d, 0x9c, - 0x3f, 0x46, 0x4c, 0xee, 0x25, 0xc7, 0x91, 0x98, 0x51, 0xc9, 0x61, 0xf4, 0x06, 0x11, 0x96, 0x4c, - 0x79, 0x0e, 0x08, 0x7b, 0xd5, 0x03, 0xac, 0xd0, 0x5a, 0x43, 0xb7, 0xce, 0x14, 0x7c, 0x11, 0xc7, - 0xc0, 0x03, 0x08, 0x9a, 0x5b, 0x0d, 0x3d, 0x13, 0x15, 0x57, 0xa8, 0x2f, 0xf6, 0x7c, 0xba, 0xea, - 0x6c, 0x45, 0x9a, 0xd9, 0x0a, 0x8e, 0x52, 0x75, 0xbc, 0x4e, 0x20, 0x65, 0x88, 0xaa, 0x30, 0xe9, - 0x8b, 0x04, 0x45, 0xd7, 0xf5, 0x98, 0x58, 0x72, 0x2f, 0x23, 0x80, 0xe4, 0x95, 0x8c, 0x7a, 0x74, - 0xcb, 0xd0, 0x59, 0xcc, 0x31, 0x86, 0x68, 0x57, 0x4f, 0x38, 0x24, 0x67, 0x2a, 0xdc, 0xb2, 0xb6, - 0x62, 0x18, 0x73, 0x26, 0x65, 0x06, 0xd2, 0x2c, 0x82, 0x3c, 0x2a, 0x87, 0x01, 0xe0, 0x85, 0x25, - 0xb6, 0x28, 0x8d, 0x31, 0x49, 0x74, 0x77, 0xd7, 0x43, 0x85, 0x2f, 0x52, 0xbc, 0xae, 0x8a, 0x36, - 0x2d, 0xc2, 0xb8, 0x9f, 0x82, 0x27, 0x41, 0x92, 0x44, 0xe4, 0xc8, 0x05, 0x82, 0xca, 0x2c, 0x2e, - 0x6e, 0x6f, 0x5a, 0x1d, 0x56, 0x0c, 0x57, 0x46, 0x31, 0x9b, 0xe1, 0x1c, 0x16, 0xd0, 0xf2, 0x56, - 0x2a, 0xc4, 0x14, 0xc4, 0xc2, 0x3a, 0x43, 0x8f, 0x8b, 0x6b, 0x1d, 0x06, 0x7a, 0x3c, 0x9b, 0x3c, - 0x17, 0xe9, 0x07, 0xc1, 0xc1, 0x38, 0x17, 0x0c, 0x8c, 0xd6, 0xd8, 0x9d, 0xf6, 0x7b, 0xed, 0xe9, - 0x87, 0xf1, 0x39, 0x99, 0xab, 0x4a, 0x66, 0x04, 0xd9, 0xfa, 0x2c, 0xd0, 0x4f, 0xd4, 0xf9, 0xed, - 0x7e, 0xd6, 0xfe, 0x78, 0x16, 0xe5, 0x47, 0xea, 0xfc, 0x91, 0x31, 0xfe, 0x7e, 0x3c, 0x6a, 0x17, - 0x68, 0x67, 0x91, 0x2e, 0xa9, 0x33, 0xcb, 0x59, 0xc4, 0x96, 0xa1, 0x7a, 0x8f, 0xaf, 0xb2, 0x94, - 0x7e, 0x21, 0x99, 0x1e, 0x5f, 0x86, 0xc3, 0xbc, 0x7d, 0x9c, 0xe1, 0x05, 0x91, 0x9d, 0x8b, 0xee, - 0x4e, 0x68, 0x3f, 0xc1, 0x8a, 0xdf, 0x6a, 0x44, 0x4c, 0xeb, 0xe9, 0xd2, 0x78, 0x71, 0x20, 0xfd, - 0xcf, 0xf3, 0xa8, 0xb1, 0x37, 0xf5, 0xea, 0x71, 0x1b, 0x3f, 0xf4, 0x50, 0xae, 0x27, 0x74, 0xfd, - 0x6f, 0xd6, 0xbf, 0x63, 0x22, 0x1f, 0x14, 0x76, 0x0d, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x57, 0xff, 0x4f, 0xdb, 0x38, + 0x14, 0xff, 0x3d, 0x7f, 0x85, 0xf1, 0x49, 0x53, 0xa3, 0x85, 0x94, 0xb6, 0xc7, 0x6e, 0x62, 0x49, + 0x76, 0x5d, 0xdb, 0x0d, 0xee, 0x18, 0xeb, 0x29, 0x68, 0xe8, 0xa4, 0x93, 0x26, 0x37, 0x79, 0x6d, + 0x3d, 0x9c, 0x38, 0x17, 0x3b, 0x2d, 0x88, 0xf1, 0xbf, 0xdf, 0xb3, 0x93, 0x96, 0x16, 0xe8, 0x36, + 0x71, 0x08, 0x01, 0xb5, 0xfd, 0xde, 0xe7, 0x7d, 0xfb, 0xf8, 0xf9, 0x35, 0xd8, 0x1b, 0x7e, 0x1a, + 0x9c, 0xff, 0x3d, 0x1e, 0x91, 0xb9, 0xce, 0x44, 0x14, 0x98, 0xbf, 0x44, 0xb0, 0x7c, 0x16, 0x52, + 0xc8, 0x29, 0xae, 0x81, 0xa5, 0x51, 0x90, 0x81, 0x66, 0x24, 0x99, 0xb3, 0x52, 0x81, 0x0e, 0x69, + 0xa5, 0xa7, 0xfb, 0xaf, 0x69, 0xb3, 0xeb, 0xe4, 0x2c, 0x83, 0x90, 0x2e, 0x38, 0x2c, 0x0b, 0x59, + 0x6a, 0x4a, 0x12, 0x99, 0x6b, 0xc8, 0x51, 0x6c, 0xc9, 0x53, 0x3d, 0x0f, 0x0f, 0x0f, 0x0e, 0xd6, + 0xa2, 0xf7, 0x8e, 0x52, 0x58, 0xf0, 0x04, 0xf6, 0xed, 0xc2, 0xe3, 0x39, 0xd7, 0x9c, 0x89, 0x7d, + 0x95, 0x30, 0x01, 0x61, 0xc7, 0xcb, 0xd8, 0x15, 0xcf, 0xaa, 0x6c, 0xbd, 0xae, 0x14, 0x94, 0x76, + 0xc1, 0x26, 0xb8, 0xce, 0x25, 0x7d, 0x60, 0x39, 0x0a, 0x34, 0xd7, 0x02, 0xa2, 0x0b, 0xfe, 0x9e, + 0x93, 0x18, 0xb4, 0xe6, 0xf9, 0x4c, 0x05, 0xed, 0x7a, 0x33, 0x50, 0x49, 0xc9, 0x0b, 0x1d, 0x39, + 0x0b, 0x56, 0x12, 0x21, 0x13, 0x5e, 0x78, 0x69, 0x98, 0xca, 0xa4, 0xca, 0xd0, 0x21, 0x0f, 0x37, + 0xc2, 0xbd, 0xce, 0x9b, 0x69, 0x95, 0x27, 0x9a, 0xcb, 0x9c, 0x1c, 0xb7, 0xdc, 0x9b, 0x25, 0xcf, + 0x53, 0xb9, 0xf4, 0x65, 0x01, 0x79, 0x8b, 0xce, 0xb5, 0x2e, 0xd4, 0x51, 0xbb, 0x7d, 0x99, 0x4b, + 0x7f, 0x29, 0x20, 0xf5, 0x67, 0xd0, 0x9e, 0x02, 0xd3, 0x55, 0x09, 0xaa, 0xad, 0x1a, 0x5b, 0xed, + 0x5f, 0x96, 0x7c, 0xca, 0xf7, 0x57, 0x4b, 0xea, 0xde, 0xae, 0x01, 0xdf, 0xdd, 0x07, 0x5c, 0x2b, + 0x51, 0x8f, 0x7e, 0x51, 0x20, 0xa6, 0x9b, 0xd2, 0x42, 0xb2, 0xf4, 0x8f, 0xb8, 0xa5, 0x3d, 0x08, + 0xf7, 0x0e, 0xdc, 0x1b, 0x01, 0x9a, 0xc8, 0x30, 0xf5, 0x93, 0x12, 0x2d, 0xc2, 0x48, 0x80, 0xf1, + 0xb9, 0x45, 0xeb, 0x88, 0xa8, 0xfb, 0x46, 0xfa, 0x08, 0xd6, 0xd7, 0xba, 0xe4, 0x93, 0x4a, 0x03, + 0x1e, 0x94, 0x09, 0xf5, 0xb4, 0xeb, 0xdd, 0xdf, 0xd7, 0xd7, 0x05, 0xa0, 0x39, 0x0d, 0x57, 0xba, + 0xfd, 0x95, 0x2d, 0xd8, 0x0a, 0xe0, 0x81, 0x20, 0x53, 0xd7, 0x39, 0x42, 0x80, 0xeb, 0xa5, 0xfe, + 0x44, 0xa6, 0xd7, 0x3e, 0x2b, 0xd0, 0xe9, 0x74, 0x30, 0xe7, 0x22, 0x6d, 0x49, 0x23, 0xcf, 0xd2, + 0x74, 0xb4, 0x40, 0x2f, 0x4e, 0xb9, 0xc2, 0x8a, 0x42, 0xd9, 0xa2, 0xc6, 0x67, 0xea, 0xb5, 0xdc, + 0x30, 0xba, 0xf9, 0x00, 0xfa, 0x73, 0xcb, 0xbd, 0x7d, 0x5c, 0x0e, 0xca, 0x52, 0x96, 0xe8, 0x1e, + 0xca, 0x21, 0x1d, 0x94, 0x14, 0xe0, 0x0b, 0x39, 0x6b, 0xd1, 0x91, 0xd9, 0x27, 0x4d, 0xf0, 0x98, + 0x18, 0x32, 0xe5, 0x02, 0x6c, 0x18, 0x58, 0xff, 0x12, 0xc3, 0x3d, 0x6d, 0xf6, 0xe5, 0xd4, 0x50, + 0x6c, 0xca, 0x67, 0x55, 0xc9, 0x6c, 0xb6, 0xea, 0x30, 0xc8, 0x94, 0x71, 0x53, 0x98, 0x7f, 0xf2, + 0x93, 0x3c, 0x91, 0x59, 0x81, 0x49, 0x03, 0x52, 0xb0, 0x19, 0x90, 0x94, 0x69, 0xb6, 0x87, 0xe9, + 0xdd, 0x48, 0x70, 0x8c, 0xe5, 0xa0, 0xc6, 0xc0, 0x11, 0x0d, 0xc3, 0xa6, 0x2e, 0xc8, 0x01, 0x8b, + 0xe7, 0x17, 0xa5, 0xd4, 0x32, 0x91, 0xe2, 0xc5, 0x8b, 0x96, 0xe5, 0xc5, 0x81, 0xd7, 0xb2, 0x84, + 0x09, 0x8d, 0x84, 0x88, 0xb5, 0x2c, 0x11, 0x15, 0x09, 0xa0, 0x4f, 0x34, 0x64, 0x26, 0xf0, 0xe4, + 0xa4, 0xa0, 0xae, 0xfb, 0xed, 0x5b, 0x23, 0x86, 0xfa, 0x59, 0x81, 0x0e, 0xbf, 0x47, 0x7c, 0xf2, + 0x51, 0xa6, 0xe0, 0x93, 0xb1, 0x00, 0xa6, 0x80, 0x60, 0x22, 0xa0, 0x24, 0x17, 0xa7, 0xa3, 0x21, + 0x39, 0x19, 0xa3, 0x4b, 0xde, 0x16, 0xa2, 0xda, 0x46, 0xf4, 0x2c, 0x9a, 0xeb, 0x1a, 0x29, 0x4b, + 0x07, 0x03, 0xff, 0xd6, 0x32, 0x11, 0x89, 0x48, 0x5f, 0xda, 0xe3, 0x23, 0x4a, 0xdd, 0x97, 0x77, + 0x64, 0x6a, 0x2b, 0xff, 0xab, 0x7a, 0x5b, 0x84, 0x1d, 0xea, 0xed, 0x75, 0xdc, 0x5b, 0x27, 0x68, + 0x37, 0xb4, 0x0f, 0x94, 0xbe, 0xc6, 0x5b, 0xf0, 0x3b, 0xcf, 0xcc, 0x55, 0x21, 0x55, 0x29, 0x90, + 0x26, 0x66, 0xcb, 0x4f, 0x14, 0x12, 0xf5, 0x0d, 0x0a, 0x5a, 0x81, 0xa0, 0x5d, 0x5f, 0x78, 0x53, + 0x75, 0x2c, 0x86, 0xb1, 0x1c, 0x52, 0xcc, 0x16, 0x5e, 0xae, 0xa9, 0x2c, 0x33, 0x87, 0x70, 0x5c, + 0x9b, 0x4f, 0x5f, 0x14, 0x25, 0xf5, 0xfd, 0x8b, 0xa7, 0x94, 0xe0, 0xf5, 0x9e, 0x4b, 0x3c, 0x29, + 0xa4, 0x32, 0xf7, 0x30, 0xe5, 0x0b, 0x92, 0x08, 0xa6, 0x54, 0x48, 0xb5, 0xc4, 0x74, 0x2c, 0xb7, + 0xf7, 0xe6, 0x20, 0x8a, 0x77, 0x34, 0x72, 0x02, 0x64, 0x9b, 0xc6, 0x6a, 0x18, 0x5e, 0x86, 0xb4, + 0x5e, 0x50, 0xb4, 0x9a, 0x08, 0x9e, 0x5c, 0x86, 0xf4, 0xd8, 0x98, 0x7d, 0x1b, 0xb4, 0xeb, 0x03, + 0x74, 0x0d, 0x21, 0xa2, 0xc7, 0x75, 0x9c, 0xb5, 0xd2, 0x3b, 0xa3, 0xf4, 0x8e, 0x25, 0x97, 0x77, + 0x7a, 0x5b, 0x1a, 0xaa, 0x9a, 0x64, 0x1c, 0x7d, 0x8c, 0xd9, 0x02, 0xc8, 0x0b, 0x32, 0x90, 0x79, + 0x0e, 0x89, 0xbe, 0x13, 0x9e, 0x97, 0xe8, 0x57, 0x6d, 0x69, 0xde, 0xad, 0x5b, 0x09, 0x26, 0xb7, + 0x2a, 0x30, 0x31, 0x5d, 0xdc, 0xea, 0x45, 0x8d, 0x06, 0xd1, 0x92, 0xc0, 0x15, 0xb2, 0xda, 0x50, + 0x32, 0x07, 0xbd, 0x94, 0x25, 0x9a, 0xc4, 0x73, 0xe7, 0xac, 0x5e, 0xd8, 0xec, 0x90, 0x56, 0x1c, + 0x9f, 0x0c, 0x3d, 0x02, 0x48, 0x88, 0x6b, 0xa3, 0x92, 0x4b, 0x6d, 0xd8, 0x6b, 0x10, 0xdc, 0xa3, + 0x60, 0x52, 0x46, 0x01, 0xcf, 0x8b, 0x4a, 0x37, 0xce, 0x99, 0x9b, 0xb9, 0x4a, 0xeb, 0x20, 0xc6, + 0xb0, 0xb0, 0x09, 0x0a, 0xc8, 0x67, 0xd8, 0x2b, 0x69, 0xaf, 0x8b, 0x49, 0x44, 0x85, 0x15, 0x7c, + 0x81, 0xa9, 0xc4, 0x0f, 0xe9, 0x43, 0x94, 0xd5, 0xc9, 0x1a, 0x69, 0xbc, 0x8d, 0xf4, 0xaa, 0x57, + 0x23, 0xc5, 0x1a, 0xf9, 0x9e, 0x20, 0x13, 0x49, 0x0b, 0xe9, 0x89, 0xe9, 0x60, 0x9a, 0x1c, 0xf8, + 0xf6, 0x87, 0x60, 0x89, 0xc9, 0xf0, 0x78, 0x30, 0xde, 0x72, 0xb2, 0x86, 0x3b, 0x39, 0x40, 0xb8, + 0xda, 0x52, 0x5e, 0x65, 0x13, 0x28, 0xe9, 0xaa, 0xae, 0x48, 0x89, 0x8c, 0xe7, 0x21, 0x45, 0x01, + 0x34, 0x17, 0xd2, 0xee, 0xe1, 0x21, 0x25, 0x25, 0xfc, 0x5b, 0xf1, 0x12, 0xd2, 0x88, 0xf8, 0x64, + 0x1b, 0xa7, 0xf3, 0x4c, 0x38, 0xdd, 0x67, 0xc2, 0xe9, 0x3d, 0x0d, 0x67, 0x23, 0x95, 0x33, 0x6c, + 0xcf, 0x4b, 0x76, 0xbd, 0x91, 0x33, 0xa7, 0x01, 0xff, 0x80, 0xba, 0xff, 0xcb, 0xc7, 0xe6, 0xb1, + 0xfb, 0xd0, 0x79, 0x26, 0x9c, 0xee, 0x33, 0xe1, 0xf4, 0x9e, 0x84, 0x63, 0x12, 0xe4, 0x34, 0x49, + 0xc3, 0x1b, 0x89, 0xf7, 0x07, 0xa5, 0xd4, 0xe5, 0x43, 0xb2, 0xc5, 0x3f, 0x91, 0x37, 0xe7, 0x27, + 0x8a, 0x1b, 0x77, 0x9e, 0x09, 0xa7, 0xfb, 0x4c, 0x38, 0xbd, 0xa7, 0xe1, 0x98, 0x04, 0x65, 0xc3, + 0xb3, 0x98, 0xe0, 0xc3, 0x8a, 0xa3, 0x87, 0x5a, 0x5d, 0xdd, 0xba, 0xc1, 0x98, 0x5b, 0x9b, 0x4b, + 0x62, 0x04, 0xea, 0x8b, 0xdb, 0x3c, 0x16, 0x64, 0x45, 0xc6, 0x47, 0xda, 0xcc, 0x47, 0x5b, 0xa0, + 0xcd, 0x2e, 0x43, 0xec, 0x53, 0x28, 0x8c, 0xfe, 0x40, 0x70, 0x7c, 0xb3, 0xb0, 0x45, 0x1c, 0x91, + 0x40, 0x15, 0x2c, 0x5f, 0x7b, 0xc9, 0x0b, 0xec, 0xdf, 0x67, 0x77, 0xcd, 0x0c, 0x52, 0x7c, 0x41, + 0x50, 0xc0, 0x3a, 0xd8, 0xb4, 0x49, 0xfb, 0x44, 0x03, 0xe9, 0x27, 0x89, 0x71, 0x74, 0x2c, 0x79, + 0xae, 0xeb, 0x0e, 0xd9, 0x1f, 0x13, 0xd3, 0x16, 0x1f, 0xf5, 0xbd, 0x3f, 0xfe, 0x41, 0x5f, 0xec, + 0xc7, 0x0f, 0x1c, 0x76, 0x8c, 0xc2, 0x31, 0x4f, 0xd1, 0xd6, 0xd8, 0x4a, 0x1d, 0x91, 0x2d, 0xf5, + 0x64, 0x0e, 0xc9, 0xe5, 0x44, 0x5e, 0xad, 0x21, 0x8e, 0xeb, 0x06, 0x68, 0x1c, 0x59, 0x35, 0xcb, + 0x87, 0xce, 0x98, 0x39, 0xcd, 0xfd, 0x71, 0x77, 0xed, 0x3f, 0xec, 0xae, 0x08, 0xaa, 0xf1, 0xa1, + 0xc7, 0x2a, 0xb6, 0xfc, 0x9b, 0xd7, 0xde, 0xab, 0xde, 0xad, 0xfb, 0x0d, 0x9f, 0x25, 0x62, 0x27, + 0xd1, 0x90, 0x8e, 0xac, 0x09, 0xb4, 0x80, 0x85, 0xf6, 0xc9, 0x6b, 0x3b, 0x57, 0x33, 0x4c, 0x61, + 0xa9, 0x56, 0x6e, 0x6d, 0x64, 0x8c, 0xd8, 0x27, 0x08, 0x45, 0x30, 0xcd, 0xe2, 0x68, 0x9b, 0x44, + 0xfd, 0xc1, 0x0e, 0x12, 0x5d, 0xad, 0x58, 0xd4, 0x59, 0xb1, 0xa8, 0xd3, 0xbb, 0x47, 0x22, 0x0c, + 0xdd, 0x04, 0xa8, 0x4c, 0x61, 0x41, 0x98, 0x07, 0xad, 0xc1, 0xc4, 0x87, 0x39, 0x90, 0x85, 0x9d, + 0x92, 0x16, 0x4c, 0x54, 0x60, 0xa8, 0x68, 0x4a, 0xbd, 0xaa, 0xb4, 0x39, 0x60, 0x53, 0x33, 0xc7, + 0x4c, 0xa4, 0xc4, 0x82, 0xd6, 0xb2, 0xf7, 0x75, 0x3a, 0x34, 0x1a, 0x72, 0xb5, 0x41, 0x8e, 0x7b, + 0x62, 0x4e, 0x23, 0x87, 0xd5, 0xeb, 0x0b, 0x6c, 0x99, 0x6a, 0x17, 0x10, 0xbe, 0x55, 0x67, 0xb0, + 0x40, 0x6b, 0x2d, 0xf3, 0x74, 0x96, 0x80, 0xa3, 0x1d, 0x4e, 0xbf, 0x29, 0xa4, 0xee, 0x5a, 0xc3, + 0x4c, 0x39, 0x36, 0x84, 0x55, 0x60, 0x8f, 0xd3, 0xd5, 0xb0, 0x15, 0xd3, 0xcc, 0x17, 0x70, 0x8f, + 0xaa, 0xa3, 0xab, 0x02, 0x4a, 0x6e, 0x66, 0x6a, 0x24, 0xbd, 0x25, 0x28, 0xba, 0x6e, 0xbe, 0x65, + 0xd4, 0xb9, 0x57, 0x02, 0xa0, 0xf8, 0x01, 0xa3, 0x2e, 0xe2, 0xba, 0x74, 0x01, 0x8f, 0x9c, 0x01, + 0xda, 0x35, 0x13, 0x0e, 0x59, 0x72, 0x3d, 0x5f, 0x67, 0x6d, 0xc1, 0xb1, 0xe6, 0x5c, 0xa9, 0x0a, + 0x94, 0x6f, 0x8b, 0x3c, 0xac, 0x87, 0x01, 0xc8, 0xad, 0x25, 0x3e, 0xad, 0x8d, 0x71, 0x45, 0xcc, + 0xeb, 0x6e, 0x86, 0x8a, 0x44, 0x96, 0x18, 0xae, 0x16, 0xd7, 0x1e, 0xe1, 0xb9, 0x19, 0xfd, 0x15, + 0x28, 0x52, 0xc8, 0x25, 0xe6, 0xc2, 0x0c, 0xce, 0x55, 0x66, 0xa3, 0xf7, 0x83, 0x36, 0xb7, 0xc3, + 0x55, 0x3d, 0x9a, 0xe1, 0x1c, 0x96, 0xd2, 0x3a, 0x2a, 0x3d, 0x47, 0x0a, 0x62, 0x63, 0x3d, 0x47, + 0x8f, 0x6d, 0x58, 0xdb, 0x85, 0x1e, 0x9d, 0x1f, 0x3f, 0x56, 0xe9, 0x33, 0x99, 0x83, 0xb3, 0xab, + 0x18, 0x58, 0xad, 0x51, 0x3c, 0xee, 0x75, 0xf7, 0xc7, 0x9f, 0x46, 0xbb, 0x64, 0x5e, 0x35, 0x32, + 0x43, 0xa8, 0xae, 0x76, 0x02, 0xfd, 0x46, 0xa3, 0x3f, 0x4f, 0xce, 0xf7, 0x3f, 0xef, 0x44, 0xf9, + 0x95, 0x46, 0x7f, 0x55, 0x3c, 0xc7, 0x49, 0x79, 0xdf, 0xa2, 0xed, 0x44, 0x3a, 0xa4, 0xd1, 0xf9, + 0x92, 0x0b, 0x3e, 0x9b, 0xeb, 0x53, 0xbc, 0x95, 0xb5, 0xf4, 0x77, 0xc8, 0x74, 0xf1, 0x7d, 0x38, + 0xe4, 0xed, 0xc5, 0x39, 0x06, 0x88, 0xd9, 0x39, 0xe8, 0xdc, 0x09, 0x6d, 0x12, 0xcc, 0xfe, 0x36, + 0x13, 0x62, 0xb9, 0x9a, 0x2e, 0x9d, 0x5d, 0x43, 0xec, 0xd3, 0xe6, 0x51, 0x67, 0x63, 0xea, 0x35, + 0xd3, 0x36, 0xfe, 0x33, 0x13, 0xb9, 0x19, 0xcf, 0xcd, 0xb7, 0xf4, 0xff, 0x00, 0x19, 0x0d, 0xc5, + 0x95, 0xb5, 0x0f, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_leds.htm, do not edit!! -const uint16_t PAGE_settings_leds_length = 7070; +const uint16_t PAGE_settings_leds_length = 7326; const uint8_t PAGE_settings_leds[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xdb, 0x56, 0xe3, 0x48, - 0x92, 0xef, 0xfe, 0x8a, 0x24, 0xbb, 0x9a, 0x96, 0x06, 0x61, 0x24, 0x5f, 0x68, 0xca, 0xb6, 0xcc, - 0x62, 0xea, 0xd2, 0xec, 0x40, 0xc3, 0xc1, 0x74, 0xd7, 0xec, 0xa9, 0xa9, 0xd3, 0x95, 0xb6, 0xd3, - 0xb6, 0x0a, 0x59, 0xf2, 0x48, 0x32, 0x94, 0x17, 0xbc, 0xdf, 0xb4, 0xdf, 0xb0, 0x5f, 0xb6, 0x11, - 0x79, 0xd1, 0xc5, 0x96, 0x0d, 0x3d, 0xb3, 0x4f, 0xdb, 0xe7, 0x54, 0xa3, 0x4b, 0x64, 0x44, 0x66, - 0x64, 0xdc, 0x33, 0xe4, 0xce, 0xde, 0xbb, 0xeb, 0xf3, 0xbb, 0xff, 0xb8, 0x79, 0x4f, 0xa6, 0xc9, - 0xcc, 0xef, 0x76, 0xf0, 0xff, 0xc4, 0x67, 0xc1, 0xc4, 0xa5, 0x3c, 0xa0, 0x70, 0xcf, 0xd9, 0xa8, - 0xdb, 0x99, 0xf1, 0x84, 0x91, 0xe1, 0x94, 0x45, 0x31, 0x4f, 0x5c, 0xba, 0x48, 0xc6, 0x87, 0x27, - 0x54, 0x3d, 0xad, 0x04, 0x6c, 0xc6, 0x5d, 0xfa, 0xe0, 0xf1, 0xc7, 0x79, 0x18, 0x25, 0x94, 0x0c, - 0xc3, 0x20, 0xe1, 0x01, 0x80, 0x3d, 0x7a, 0xa3, 0x64, 0xea, 0x36, 0x6d, 0x3b, 0x05, 0x5d, 0x7b, - 0x35, 0xe2, 0x0f, 0xde, 0x90, 0x1f, 0x8a, 0x1b, 0xcb, 0x0b, 0xbc, 0xc4, 0x63, 0xfe, 0x61, 0x3c, - 0x64, 0x3e, 0x77, 0x1d, 0x6b, 0xc6, 0xbe, 0x7b, 0xb3, 0xc5, 0x2c, 0xbd, 0x5f, 0xc4, 0x3c, 0x12, - 0x37, 0x6c, 0x00, 0xf7, 0x41, 0x48, 0x37, 0x28, 0x77, 0x3b, 0x89, 0x97, 0xf8, 0xbc, 0x7b, 0xf9, - 0xfe, 0x1d, 0xe9, 0xf3, 0x24, 0xf1, 0x82, 0x49, 0xdc, 0x39, 0x92, 0xcf, 0x3a, 0xf1, 0x30, 0xf2, - 0xe6, 0x49, 0xb7, 0xf2, 0xc0, 0x22, 0x92, 0x78, 0x33, 0x1e, 0x2e, 0x12, 0x6b, 0xe4, 0x8e, 0xc2, - 0xe1, 0x62, 0x06, 0x33, 0xb2, 0x7c, 0x36, 0x8f, 0xf8, 0x83, 0xdb, 0x6c, 0x22, 0xdd, 0x9e, 0x24, - 0x7f, 0xe5, 0x36, 0x78, 0x1d, 0x2f, 0x6e, 0x7a, 0x6e, 0xc3, 0x7e, 0x7b, 0x8c, 0x97, 0x97, 0xae, - 0x53, 0xaf, 0x8b, 0x87, 0x97, 0x83, 0x7f, 0x2c, 0xc2, 0xc4, 0xb5, 0xad, 0xe1, 0x22, 0x4e, 0xc2, - 0x59, 0x3f, 0x61, 0x51, 0x12, 0xbb, 0x7b, 0x8e, 0x15, 0x8b, 0xab, 0x77, 0x5e, 0x94, 0x2c, 0xdd, - 0xcf, 0x5f, 0x10, 0xf4, 0xfc, 0xfa, 0xfa, 0x81, 0x47, 0x91, 0x37, 0xe2, 0xb1, 0xdb, 0x6c, 0x8f, - 0x17, 0xc1, 0x30, 0xf1, 0xc2, 0x80, 0xfc, 0x62, 0x98, 0x4f, 0x8f, 0x5e, 0x30, 0x0a, 0x1f, 0xab, - 0xe1, 0x9c, 0x07, 0x06, 0x9d, 0x26, 0xc9, 0x3c, 0x6e, 0x1d, 0x1d, 0xdd, 0x07, 0x61, 0xf5, 0xd1, - 0xe7, 0xa3, 0xea, 0x84, 0x1f, 0x8d, 0x39, 0x4b, 0x16, 0x11, 0x8f, 0x8f, 0x62, 0xb5, 0xa2, 0xa3, - 0x1f, 0xe0, 0xcd, 0xa1, 0xbe, 0xa3, 0xe6, 0x2a, 0xc5, 0xd7, 0x5b, 0xc7, 0x97, 0x8e, 0xa1, 0x16, - 0xfd, 0x23, 0xe6, 0xfe, 0x38, 0x0f, 0x3d, 0xb9, 0x18, 0x19, 0xdc, 0x7c, 0x8a, 0x38, 0xa0, 0x0f, - 0x08, 0xd2, 0x4a, 0xde, 0xfb, 0x1c, 0x99, 0xd1, 0x5b, 0x8a, 0x57, 0x19, 0x68, 0x38, 0x1e, 0x23, - 0x68, 0x1e, 0x26, 0xee, 0x2d, 0x7f, 0x05, 0xee, 0xc3, 0xe3, 0xcf, 0xf6, 0x97, 0xea, 0x03, 0xf3, - 0x17, 0xdc, 0x3d, 0x74, 0xb2, 0x21, 0xf1, 0x34, 0x7c, 0xbc, 0x0b, 0x59, 0x9c, 0x18, 0xdc, 0x0a, - 0x80, 0x2b, 0xe6, 0x93, 0x60, 0xbc, 0x8b, 0x54, 0x69, 0x82, 0x2f, 0xa8, 0xd9, 0x4e, 0xaa, 0x5e, - 0x10, 0xf0, 0xe8, 0x97, 0xbb, 0xab, 0x4b, 0x97, 0x5b, 0x49, 0x75, 0xe8, 0xb3, 0x38, 0x46, 0xb4, - 0x6e, 0x70, 0x4a, 0x81, 0x61, 0x61, 0x44, 0x5b, 0x14, 0x31, 0x51, 0x6b, 0xe8, 0x73, 0x16, 0xdd, - 0xc9, 0x7d, 0x33, 0xd4, 0xfe, 0x99, 0x30, 0x24, 0x4e, 0x96, 0x3e, 0xaf, 0xb2, 0xc0, 0x9b, 0x31, - 0xa4, 0xeb, 0xd2, 0x20, 0x0c, 0x38, 0xb5, 0x14, 0x84, 0x0b, 0x0c, 0xd0, 0x83, 0x0c, 0x3d, 0x37, - 0xe0, 0x52, 0x9e, 0x54, 0xee, 0xba, 0x1a, 0xf1, 0xb9, 0xcf, 0x86, 0xdc, 0x50, 0x44, 0x29, 0xf0, - 0xcb, 0xb4, 0x6a, 0x6f, 0x6d, 0x3b, 0xc7, 0x8c, 0xc1, 0xa5, 0x37, 0xf3, 0x92, 0x18, 0xd7, 0x65, - 0x25, 0x96, 0x67, 0x3e, 0x09, 0x81, 0xe1, 0x52, 0x60, 0x12, 0x25, 0x2e, 0x81, 0x94, 0x15, 0x2f, - 0x1b, 0x36, 0xf7, 0x82, 0xf8, 0xfa, 0xaf, 0x86, 0xe4, 0x03, 0x77, 0xd7, 0x78, 0x79, 0xc7, 0x26, - 0x82, 0x9d, 0xd4, 0x0b, 0xe6, 0x0b, 0x64, 0xcd, 0x38, 0x8c, 0x0c, 0xcf, 0xb5, 0xdb, 0x5e, 0x87, - 0x57, 0x7d, 0x1e, 0x4c, 0x92, 0x69, 0xdb, 0x3b, 0x38, 0x90, 0xa3, 0x03, 0x97, 0x7f, 0xf6, 0xbe, - 0x54, 0x51, 0xfa, 0xab, 0xf1, 0x62, 0x10, 0x27, 0x11, 0xec, 0xb1, 0x61, 0x5b, 0x35, 0xb3, 0xed, - 0x8d, 0x0d, 0x7a, 0x69, 0x53, 0xd7, 0x0d, 0x9e, 0x9f, 0xe9, 0xa5, 0xa3, 0x2f, 0x6a, 0xfa, 0xa2, - 0x8e, 0x17, 0x7a, 0x2f, 0xca, 0xb0, 0x48, 0x1c, 0x73, 0x54, 0xf4, 0x8b, 0x20, 0x31, 0xca, 0xb6, - 0x9c, 0x5e, 0xde, 0xd1, 0x83, 0x24, 0xdb, 0x77, 0xcb, 0xb1, 0xcd, 0xae, 0x7b, 0x62, 0x9b, 0xa8, - 0xdd, 0x5e, 0xb0, 0xe0, 0x2b, 0xc0, 0xf0, 0x8a, 0x69, 0xe0, 0x45, 0x43, 0x5d, 0xdc, 0x5e, 0xaa, - 0x8b, 0xde, 0x9d, 0xba, 0xb8, 0xb8, 0x15, 0x53, 0xdd, 0xdf, 0xa7, 0x74, 0x4f, 0xce, 0x54, 0x10, - 0x83, 0xfb, 0x43, 0xa7, 0xf0, 0xc4, 0x7c, 0x02, 0x72, 0xa3, 0xea, 0x62, 0xf6, 0xc7, 0x7c, 0x7f, - 0x5f, 0xfe, 0xad, 0xc6, 0x21, 0xcc, 0x33, 0x70, 0xbb, 0x81, 0xeb, 0xa6, 0x4b, 0xc9, 0x46, 0xe0, - 0x84, 0x4d, 0x53, 0x09, 0x3e, 0x18, 0x97, 0x28, 0x31, 0xbe, 0xf6, 0xc3, 0x28, 0x5a, 0x5a, 0x62, - 0x97, 0xc8, 0x9b, 0xa7, 0x7f, 0xef, 0x5f, 0xff, 0x5a, 0x95, 0x1c, 0xf1, 0xc6, 0x4b, 0x85, 0xdd, - 0x5c, 0x91, 0x21, 0x0b, 0x7e, 0x4a, 0xc8, 0x80, 0x13, 0x30, 0x46, 0xa3, 0xea, 0x57, 0xd3, 0xca, - 0x90, 0xba, 0x94, 0xca, 0xbb, 0x31, 0x98, 0x94, 0xd8, 0x30, 0xad, 0x3d, 0x07, 0x39, 0x99, 0x01, - 0x74, 0x9b, 0xfb, 0xfb, 0xd9, 0x5d, 0xc7, 0xa9, 0x15, 0x67, 0x40, 0xf3, 0x33, 0x38, 0x3e, 0x74, - 0x1c, 0x24, 0x46, 0x82, 0x30, 0x23, 0x47, 0x5f, 0x41, 0x0e, 0xd9, 0xb6, 0xe7, 0x06, 0xc0, 0x25, - 0x60, 0xa4, 0xb8, 0xc8, 0x4d, 0xa0, 0x5e, 0xdf, 0x41, 0x12, 0xde, 0x12, 0x16, 0x71, 0x22, 0x04, - 0x90, 0x84, 0x81, 0xbf, 0x7c, 0x99, 0x20, 0x0a, 0xe9, 0x37, 0xd7, 0x3b, 0x70, 0xda, 0xdf, 0x32, - 0x31, 0xfd, 0xa6, 0xc5, 0x94, 0xc1, 0x26, 0x7d, 0x7b, 0x41, 0x4c, 0x99, 0x96, 0x0f, 0xa6, 0xe5, - 0x83, 0x69, 0xf9, 0x60, 0x5a, 0x3e, 0x98, 0x96, 0x0f, 0xa6, 0xe5, 0x83, 0x69, 0xf9, 0x60, 0x62, - 0xf3, 0x29, 0xbe, 0x74, 0x59, 0x81, 0x88, 0x63, 0xca, 0x49, 0xc4, 0xa5, 0x93, 0x78, 0xad, 0x94, - 0xc7, 0x2f, 0x48, 0xb9, 0x94, 0xcd, 0x6f, 0xa9, 0x6c, 0xe6, 0xd8, 0x95, 0x7b, 0xbe, 0x26, 0x6a, - 0x37, 0x5e, 0x80, 0x3e, 0x72, 0xec, 0x7b, 0x43, 0xdc, 0xdc, 0xe4, 0x91, 0xf3, 0x00, 0x64, 0x2e, - 0xd5, 0xc6, 0xd5, 0x11, 0xde, 0xa8, 0x49, 0xaf, 0xf6, 0x84, 0x94, 0x7d, 0x2b, 0xec, 0xc2, 0xb7, - 0xfc, 0x2e, 0xac, 0xe0, 0x3f, 0x49, 0x60, 0xcf, 0xce, 0xcc, 0x4d, 0x12, 0x2d, 0xfb, 0x8b, 0x01, - 0x18, 0x2a, 0x43, 0x2b, 0x48, 0x7f, 0x5c, 0x1d, 0xb1, 0x84, 0xe5, 0xf0, 0x54, 0xd1, 0xe5, 0xc1, - 0x92, 0xdf, 0xf1, 0x31, 0x5b, 0xf8, 0x09, 0x62, 0xd3, 0x56, 0x4a, 0x4f, 0x19, 0x98, 0x96, 0x84, - 0xf3, 0x9b, 0x28, 0x9c, 0xb3, 0x09, 0x93, 0xc6, 0x53, 0x49, 0x9a, 0xf0, 0x7e, 0x5d, 0x07, 0x4c, - 0xa3, 0xb2, 0x49, 0xf4, 0x2e, 0x0c, 0xc9, 0x8c, 0x05, 0x4b, 0x02, 0xfe, 0x37, 0x26, 0x20, 0x1b, - 0x64, 0xc6, 0x49, 0x12, 0x92, 0x29, 0x0b, 0x46, 0x3e, 0xdf, 0xa3, 0x6d, 0xb4, 0x90, 0x1d, 0x87, - 0x37, 0xf6, 0xf7, 0x8d, 0xe0, 0xc0, 0xa5, 0x7f, 0x0f, 0xfe, 0x1e, 0x9d, 0x87, 0x41, 0x0c, 0x6e, - 0x31, 0x02, 0x09, 0x87, 0x7d, 0x21, 0x20, 0xf1, 0xef, 0xfb, 0x37, 0xf5, 0x1a, 0x8a, 0x9e, 0xe4, - 0x56, 0x60, 0xae, 0xc4, 0xd4, 0x87, 0x53, 0x3e, 0xbc, 0xff, 0x9d, 0xf9, 0xde, 0xc8, 0x4b, 0x96, - 0x86, 0x89, 0x9a, 0x0e, 0x4f, 0x63, 0xb9, 0xc4, 0x9c, 0x75, 0xe6, 0xc1, 0x59, 0xef, 0x32, 0xb5, - 0xb2, 0xc2, 0xdb, 0x60, 0xbc, 0x40, 0x4d, 0x89, 0x81, 0x8f, 0xda, 0x62, 0xe0, 0xe5, 0x99, 0xe2, - 0x03, 0x3f, 0x95, 0x9e, 0xbf, 0x65, 0x5b, 0x1a, 0x18, 0x60, 0xa5, 0x57, 0x19, 0x79, 0x31, 0xb8, - 0x83, 0x25, 0xc0, 0x80, 0x59, 0xf6, 0x3d, 0xf0, 0x2b, 0x2d, 0xe5, 0x5e, 0x04, 0xe8, 0x3c, 0x5e, - 0xd4, 0x5e, 0x01, 0x5b, 0xa0, 0xd7, 0xb5, 0xf7, 0xf7, 0xc1, 0x27, 0x89, 0x39, 0xe6, 0x27, 0x7d, - 0x79, 0x96, 0xf3, 0x0c, 0x02, 0x1e, 0xdc, 0xb5, 0x1c, 0xb2, 0x3e, 0x61, 0x49, 0xfc, 0xf2, 0x0c, - 0x28, 0x6e, 0x50, 0x6f, 0xda, 0x6e, 0xc9, 0x0c, 0x7e, 0xbb, 0xc8, 0x13, 0xd3, 0xe4, 0x9f, 0xe2, - 0x47, 0x2f, 0x19, 0x4e, 0x8d, 0x12, 0x1e, 0xb9, 0x7b, 0xb6, 0xb5, 0x3e, 0x0d, 0xc0, 0x6d, 0xe5, - 0x14, 0x26, 0x37, 0x25, 0xd0, 0xb4, 0x21, 0x8b, 0x39, 0xb1, 0x5b, 0xa5, 0xa8, 0x1c, 0x4b, 0xed, - 0x49, 0x7b, 0x10, 0x71, 0x76, 0xdf, 0x16, 0xb0, 0x75, 0xbb, 0xb5, 0x41, 0xa0, 0x6e, 0x17, 0x20, - 0x9a, 0x25, 0x10, 0xcd, 0x3c, 0x44, 0xb3, 0x04, 0xa2, 0x59, 0x80, 0xa8, 0x95, 0x81, 0xd4, 0x52, - 0x98, 0x91, 0x94, 0xfb, 0xd6, 0x0e, 0x86, 0x6a, 0x56, 0xae, 0x04, 0xcc, 0xcc, 0x01, 0x80, 0x2c, - 0x64, 0x41, 0x79, 0xb6, 0x4a, 0x6d, 0x47, 0x1f, 0x22, 0x2d, 0xb4, 0x1c, 0x6c, 0x34, 0x7a, 0x8f, - 0x1a, 0x76, 0xe9, 0xc5, 0x10, 0xf7, 0xf2, 0x08, 0x02, 0x0b, 0x21, 0xb1, 0x10, 0xa0, 0x68, 0xfd, - 0x34, 0xd7, 0xb6, 0x07, 0xb0, 0x5d, 0xf1, 0x19, 0x46, 0x17, 0xe6, 0x93, 0xcf, 0x13, 0x70, 0xd3, - 0x2f, 0x98, 0xa9, 0x73, 0x7a, 0x10, 0x64, 0x66, 0xca, 0x6c, 0x2b, 0xcd, 0x4d, 0x0e, 0x5e, 0x18, - 0xd8, 0xbf, 0x2c, 0x0e, 0xb4, 0x78, 0xa7, 0x5e, 0x3b, 0xcd, 0x74, 0xb4, 0xee, 0xba, 0xe5, 0x04, - 0xed, 0xc2, 0xb8, 0x53, 0xde, 0xad, 0xbd, 0x3d, 0xad, 0xd9, 0x7f, 0x49, 0x5a, 0x4e, 0x13, 0xfe, - 0x87, 0x08, 0xba, 0x2e, 0x60, 0x90, 0x2f, 0x4e, 0xe0, 0xd1, 0x31, 0xfc, 0x13, 0x37, 0x0d, 0xb8, - 0xa8, 0x8b, 0x9b, 0xba, 0x03, 0xc6, 0xb2, 0xd3, 0x38, 0x39, 0x6d, 0xb6, 0x1a, 0x0d, 0x90, 0xd9, - 0xe7, 0xe7, 0x46, 0x13, 0x45, 0x57, 0x41, 0x64, 0xec, 0x00, 0xe6, 0xf0, 0x34, 0x7c, 0xc4, 0x40, - 0xd2, 0x82, 0x90, 0xbb, 0x2d, 0x05, 0x6d, 0x36, 0x7f, 0x64, 0x51, 0x00, 0x76, 0x63, 0x63, 0xdb, - 0xc4, 0xa6, 0x5f, 0x69, 0x9d, 0xfb, 0xb9, 0x66, 0xdb, 0x1b, 0x4a, 0x01, 0x62, 0xe0, 0xba, 0x05, - 0x39, 0x56, 0x96, 0xc0, 0x75, 0x6a, 0xad, 0x0d, 0x9d, 0x35, 0xd4, 0xbb, 0xa2, 0xe0, 0xb7, 0xa5, - 0x9b, 0xdb, 0x16, 0xcb, 0x81, 0xcc, 0xf1, 0x61, 0x31, 0x98, 0x63, 0xf9, 0x60, 0x4e, 0xb8, 0x2e, - 0xe1, 0xcf, 0xb6, 0x84, 0x73, 0xda, 0x85, 0xb1, 0xd2, 0x40, 0xcd, 0xf2, 0xb3, 0x1d, 0x66, 0x85, - 0xe0, 0x46, 0xf2, 0x67, 0x6e, 0x8f, 0xd0, 0x83, 0xe5, 0x04, 0xd6, 0x47, 0x07, 0xb6, 0xbf, 0xef, - 0x77, 0xde, 0x1e, 0x9f, 0xd2, 0x8b, 0x1b, 0x02, 0xe2, 0x09, 0x99, 0x45, 0xdc, 0xa2, 0x2d, 0xbf, - 0xdb, 0x78, 0x7b, 0x4a, 0xdf, 0x81, 0x7f, 0x20, 0x1f, 0x6f, 0x2e, 0xae, 0xe5, 0x13, 0xe7, 0x94, - 0xe2, 0x0d, 0xbe, 0xa7, 0xf2, 0xa9, 0x32, 0x7c, 0xce, 0x26, 0xe2, 0xc6, 0x5b, 0xc4, 0x7b, 0xdc, - 0x38, 0xa5, 0xe7, 0xfe, 0xbd, 0xc6, 0x41, 0xa9, 0xe0, 0x50, 0xb8, 0x45, 0x90, 0x1c, 0xe5, 0x60, - 0x05, 0x7f, 0x40, 0x5e, 0x95, 0xe8, 0xfb, 0x56, 0x6c, 0x5a, 0x4b, 0xd7, 0x69, 0x2f, 0x3b, 0xcd, - 0xf6, 0x12, 0xa3, 0x09, 0x63, 0x1b, 0x06, 0x7a, 0xb0, 0x94, 0x28, 0x4c, 0xdc, 0xa2, 0x6c, 0x75, - 0xfb, 0xfb, 0xcb, 0x4e, 0xe3, 0xf9, 0x59, 0x4e, 0xcb, 0x71, 0xdd, 0xa5, 0xb8, 0x76, 0xf0, 0x65, - 0x13, 0x40, 0x96, 0x07, 0x0d, 0xbb, 0xe3, 0x9f, 0x1a, 0xe1, 0x16, 0x6d, 0xb7, 0x42, 0xc8, 0x04, - 0xfe, 0xb1, 0xf0, 0x22, 0x61, 0x0a, 0xcd, 0xd6, 0x26, 0xa0, 0x94, 0xa1, 0x3c, 0x98, 0x03, 0x77, - 0xda, 0xb5, 0x9a, 0xe6, 0x0a, 0x82, 0x01, 0x69, 0x59, 0xa3, 0xb1, 0xe0, 0x95, 0x36, 0x87, 0x25, - 0xcf, 0x9e, 0x9f, 0xeb, 0x30, 0x45, 0xdf, 0xf2, 0x85, 0x56, 0xf8, 0xa0, 0x15, 0x30, 0x76, 0xab, - 0xae, 0xe7, 0x42, 0x12, 0x17, 0x82, 0x1c, 0x2b, 0x8f, 0x30, 0x0c, 0x86, 0x10, 0x54, 0xdc, 0xbb, - 0x02, 0xdf, 0x69, 0x2e, 0xdf, 0x51, 0xf1, 0x81, 0xb3, 0x6a, 0xe5, 0x1e, 0xae, 0xac, 0xe0, 0x19, - 0x8c, 0x2e, 0x80, 0xaa, 0x19, 0x08, 0x26, 0x09, 0x0e, 0x36, 0x80, 0x83, 0x8d, 0xfa, 0x1e, 0x4c, - 0x4a, 0xa0, 0x1f, 0x86, 0x02, 0x7d, 0x91, 0x07, 0x39, 0x76, 0xe3, 0x40, 0x57, 0x8d, 0x3c, 0x39, - 0x95, 0xcc, 0x69, 0xa5, 0xcc, 0x14, 0x28, 0x46, 0xde, 0x04, 0x70, 0x1c, 0xd0, 0xc7, 0x0d, 0x5d, - 0xcd, 0xcf, 0x60, 0x43, 0x4b, 0xeb, 0x36, 0x4c, 0x02, 0x6c, 0x91, 0x23, 0xfe, 0x94, 0x73, 0xe5, - 0xd3, 0x75, 0x91, 0x2b, 0xb6, 0x59, 0x24, 0x39, 0xa4, 0x25, 0x53, 0x7f, 0xdd, 0x6c, 0x23, 0xba, - 0x63, 0xd5, 0xbb, 0x87, 0xc6, 0xf4, 0xff, 0x86, 0x61, 0xe3, 0x32, 0x3c, 0xce, 0x31, 0x0e, 0xad, - 0xd7, 0x04, 0x9e, 0xa6, 0xad, 0x55, 0xaf, 0x2c, 0x4a, 0xd1, 0x78, 0xd8, 0x06, 0x1e, 0x48, 0x0e, - 0x1a, 0xc8, 0xde, 0xf2, 0x71, 0x60, 0xed, 0x36, 0xad, 0x47, 0x36, 0xe5, 0x8b, 0xe0, 0x01, 0xc2, - 0x33, 0x3e, 0x22, 0x90, 0x5a, 0x63, 0xc6, 0xda, 0xa2, 0xb7, 0x10, 0x4b, 0x82, 0x35, 0x1a, 0x11, - 0x23, 0x0a, 0x13, 0x86, 0xaf, 0x9c, 0x13, 0xfb, 0x7f, 0xfe, 0xdb, 0x4c, 0xa3, 0xa5, 0xd1, 0x6e, - 0x7c, 0x23, 0xfe, 0x1d, 0x4d, 0x86, 0xa8, 0xa3, 0xb4, 0xe8, 0x0a, 0x0d, 0x47, 0x04, 0x6a, 0xff, - 0x8f, 0x05, 0x07, 0x57, 0x29, 0x2c, 0x69, 0x18, 0x9d, 0xf9, 0xbe, 0x41, 0xab, 0x8f, 0xb0, 0xa3, - 0xd6, 0xc2, 0x8d, 0xb4, 0x2d, 0xcd, 0xcc, 0xeb, 0x42, 0xd8, 0xd5, 0x08, 0x8d, 0xe1, 0xda, 0x5a, - 0xd7, 0x17, 0x29, 0x0c, 0xd3, 0xfc, 0xa5, 0x34, 0xdc, 0x9a, 0xb9, 0xb6, 0xf5, 0x80, 0x35, 0x1e, - 0x40, 0x9f, 0x91, 0x99, 0x6f, 0xa4, 0xe4, 0x13, 0x77, 0xbe, 0x2d, 0x25, 0x8f, 0x4b, 0x5f, 0xe9, - 0x24, 0xe8, 0x1c, 0x32, 0x88, 0x89, 0xca, 0x62, 0x30, 0x21, 0x9a, 0xe8, 0x84, 0x68, 0x62, 0xbe, - 0x60, 0x02, 0xc0, 0xd1, 0xba, 0xa2, 0xd8, 0xd0, 0x2e, 0x19, 0xac, 0xb3, 0xa9, 0x89, 0xce, 0xa6, - 0x24, 0x0d, 0xc3, 0x77, 0xff, 0x54, 0xd2, 0x63, 0xca, 0x94, 0xe7, 0x49, 0xac, 0x00, 0x09, 0x82, - 0xd7, 0xb4, 0xe4, 0x8d, 0x17, 0x00, 0x5b, 0xe6, 0x19, 0xa7, 0x87, 0xa1, 0x1f, 0x46, 0x2e, 0xfd, - 0x61, 0x3c, 0x1e, 0xd3, 0x76, 0x9a, 0x23, 0xa5, 0x03, 0xeb, 0xf5, 0x6c, 0xdc, 0xa1, 0x93, 0xab, - 0x10, 0xec, 0x9a, 0xb3, 0xce, 0x00, 0x27, 0x3a, 0x03, 0x9c, 0xe8, 0x0c, 0x70, 0xa2, 0x33, 0xc0, - 0x89, 0xaa, 0x10, 0xcc, 0x37, 0x2a, 0x04, 0xf3, 0x5c, 0x85, 0x00, 0xb7, 0x08, 0x8b, 0x71, 0xed, - 0x5c, 0xa9, 0xe0, 0x2c, 0x8a, 0xd8, 0xb2, 0xea, 0xc5, 0xe2, 0xaf, 0x4e, 0xf1, 0x4d, 0xdc, 0xe4, - 0x7b, 0xd8, 0xe4, 0xfb, 0x8e, 0x2a, 0x25, 0xa8, 0x9d, 0xbe, 0x87, 0x9d, 0x5e, 0x56, 0xe7, 0x8b, - 0x78, 0xaa, 0x40, 0x3f, 0xdf, 0x7f, 0x31, 0x55, 0x02, 0x6c, 0x43, 0xfa, 0x3b, 0xcf, 0xa7, 0xbf, - 0x40, 0xc5, 0xdb, 0x73, 0xbf, 0x49, 0xba, 0x63, 0x98, 0xc9, 0x4b, 0x69, 0xf0, 0x58, 0x33, 0x61, - 0xac, 0x99, 0x30, 0xd6, 0x4c, 0x18, 0x6b, 0x26, 0x8c, 0x35, 0x13, 0xc6, 0x9a, 0x09, 0x63, 0xcd, - 0x84, 0x71, 0x2e, 0x0d, 0x1e, 0x97, 0xa6, 0xc1, 0x97, 0xa5, 0x93, 0x78, 0x6d, 0x1a, 0x7c, 0xb9, - 0x2b, 0x0d, 0x96, 0xdc, 0xff, 0xb6, 0xc1, 0xfd, 0xec, 0x89, 0xe2, 0x5b, 0x4a, 0x27, 0x7b, 0x27, - 0x2a, 0x31, 0xab, 0xd5, 0x52, 0x16, 0x6c, 0xb8, 0xdb, 0xe5, 0xb9, 0x82, 0xcd, 0xbc, 0x58, 0xb0, - 0x39, 0xdd, 0x14, 0x36, 0x70, 0xbc, 0xb4, 0xb5, 0xf1, 0x78, 0x0b, 0x82, 0x6e, 0xbd, 0x7e, 0x4a, - 0xc3, 0x88, 0x05, 0x13, 0x34, 0x02, 0x42, 0x4e, 0x57, 0x2b, 0xee, 0xc7, 0x5c, 0x30, 0xe8, 0x62, - 0xdb, 0xb0, 0x76, 0xbe, 0xbc, 0x0b, 0xc9, 0x5b, 0x56, 0xdc, 0xfd, 0x1c, 0x7f, 0x79, 0x7e, 0x96, - 0x4e, 0xde, 0x8f, 0x85, 0x6d, 0x93, 0xfe, 0x67, 0xa6, 0xfc, 0x8f, 0x7a, 0x08, 0x26, 0x08, 0x53, - 0x22, 0x08, 0x11, 0xf2, 0x98, 0xac, 0x0b, 0x70, 0x67, 0x06, 0xcb, 0xa8, 0x6e, 0xe0, 0x31, 0xcd, - 0x83, 0x8b, 0xee, 0x0c, 0xa0, 0x66, 0x2e, 0x3b, 0xb8, 0x30, 0xad, 0x8b, 0xee, 0x10, 0x6e, 0x86, - 0x2e, 0x5c, 0xfe, 0x79, 0x35, 0xee, 0xa0, 0xe7, 0x31, 0x1e, 0x0e, 0x60, 0x34, 0xf0, 0x5b, 0xd2, - 0x42, 0xbf, 0x98, 0xf0, 0xef, 0xc9, 0xb9, 0x2a, 0xca, 0xcf, 0x94, 0xa1, 0xde, 0x78, 0xee, 0xba, - 0x0f, 0xa7, 0x14, 0x78, 0x66, 0xd0, 0x83, 0x87, 0x03, 0x4a, 0xe6, 0xd3, 0x65, 0xec, 0x0d, 0x99, - 0xaf, 0x2d, 0xfb, 0xcc, 0x2e, 0x64, 0x45, 0x89, 0x25, 0x0b, 0xe3, 0xc9, 0x11, 0xa6, 0x02, 0x7f, - 0x71, 0x6c, 0x95, 0x59, 0x8f, 0x06, 0x2c, 0x73, 0xa7, 0x03, 0x36, 0xbc, 0x9f, 0x44, 0xe1, 0x22, - 0x18, 0xb9, 0x5f, 0xd1, 0x2c, 0xb3, 0xe8, 0x70, 0x12, 0xb1, 0x91, 0x07, 0xf4, 0x8c, 0xb7, 0xf6, - 0x88, 0x4f, 0x2c, 0xf2, 0xe6, 0x49, 0x96, 0x18, 0x8e, 0xed, 0x53, 0x79, 0xf1, 0x16, 0x82, 0x78, - 0xb1, 0xe3, 0xb9, 0x5d, 0x1c, 0x0e, 0x87, 0x74, 0x45, 0x6c, 0x0d, 0xbc, 0xfa, 0xd1, 0x22, 0x3f, - 0x34, 0x1a, 0x8d, 0xec, 0x9e, 0x00, 0xfd, 0x1f, 0xcd, 0xaf, 0x6a, 0x47, 0xf8, 0x68, 0x5b, 0xc6, - 0x30, 0xec, 0x5e, 0xb1, 0x64, 0x8a, 0xe6, 0xc9, 0x10, 0x46, 0xd5, 0x3a, 0xb1, 0x6d, 0xf3, 0xf9, - 0x59, 0x52, 0x3e, 0xb1, 0xcb, 0x7d, 0x64, 0x09, 0x3e, 0x29, 0x82, 0x1a, 0x1b, 0xfb, 0x5e, 0x82, - 0xcd, 0xb1, 0xd7, 0x17, 0x22, 0xb1, 0x3d, 0x42, 0x52, 0x1a, 0x87, 0x41, 0x81, 0x99, 0x19, 0xfd, - 0x13, 0xfb, 0x47, 0x12, 0x8e, 0x09, 0xa0, 0xab, 0x62, 0x81, 0x85, 0xcc, 0xf8, 0x2c, 0x8c, 0x96, - 0xf4, 0x20, 0x2b, 0xc4, 0x9c, 0x7e, 0x25, 0x46, 0x67, 0xd0, 0x7d, 0x7f, 0x7b, 0x7b, 0x7d, 0xdb, - 0x22, 0xbf, 0x89, 0x82, 0x4a, 0x08, 0x3e, 0x19, 0x98, 0x81, 0x3b, 0xb1, 0xea, 0xed, 0x75, 0x8e, - 0x06, 0x5d, 0xf3, 0x2b, 0x84, 0xe5, 0x66, 0x0b, 0xf0, 0xd9, 0xb2, 0x50, 0x33, 0x07, 0x08, 0xe5, - 0xc4, 0x85, 0x53, 0xec, 0xb9, 0x62, 0xee, 0x43, 0xee, 0xf9, 0x86, 0x01, 0x68, 0x0f, 0x1e, 0xfe, - 0x22, 0x93, 0x1f, 0xf3, 0xa8, 0x09, 0xab, 0x38, 0xaa, 0xb5, 0x7b, 0x6e, 0xaf, 0xdb, 0x3c, 0xcd, - 0xa0, 0x7a, 0x66, 0xab, 0xd7, 0x66, 0xae, 0x8a, 0xf6, 0xa7, 0x22, 0xa2, 0x5b, 0x4f, 0xbb, 0xad, - 0x81, 0x9b, 0xcf, 0xb8, 0xb2, 0xea, 0x46, 0xaf, 0xe3, 0x54, 0xed, 0xda, 0xfe, 0xfe, 0xde, 0x14, - 0xfe, 0x0d, 0x4e, 0x01, 0xcd, 0xfb, 0xfe, 0x0d, 0x69, 0xfe, 0x8e, 0x55, 0x49, 0xf2, 0xe8, 0x25, - 0x53, 0xe2, 0x9c, 0x91, 0xdf, 0xfa, 0x3d, 0x12, 0x2f, 0xe6, 0x73, 0x7f, 0x49, 0x5b, 0x06, 0x3b, - 0x70, 0xa7, 0xa7, 0xd4, 0xa9, 0xfd, 0x4e, 0x68, 0x6b, 0x70, 0x4a, 0x3f, 0xf5, 0x6b, 0x27, 0x4e, - 0x93, 0xc8, 0x7b, 0x0a, 0x03, 0xa9, 0x05, 0x10, 0x3d, 0xfc, 0x1f, 0x3d, 0x53, 0xa3, 0xb0, 0xde, - 0x16, 0x40, 0x04, 0x01, 0x41, 0x49, 0x12, 0x8a, 0x65, 0x53, 0x99, 0xbc, 0xf5, 0xb7, 0x2f, 0xd6, - 0x91, 0xab, 0xb5, 0xde, 0xb8, 0xd4, 0x10, 0xc5, 0xac, 0x30, 0x4e, 0x08, 0x1f, 0x8f, 0x01, 0x4d, - 0x6c, 0x91, 0xff, 0xa2, 0xed, 0x37, 0x07, 0x6e, 0xdf, 0xed, 0x17, 0x38, 0xd1, 0x37, 0x5b, 0x7d, - 0xeb, 0x8d, 0x20, 0xec, 0xc5, 0x84, 0x07, 0xe1, 0x62, 0x32, 0x35, 0x3b, 0x83, 0xa8, 0x9b, 0x95, - 0x8c, 0x0a, 0xdb, 0xcb, 0x0a, 0x95, 0xa4, 0xdc, 0xb6, 0xa3, 0xbe, 0xbd, 0x91, 0x2f, 0xbf, 0x49, - 0x99, 0x28, 0x8a, 0xeb, 0x89, 0xe2, 0xe4, 0xc5, 0x9d, 0xca, 0x5d, 0xa9, 0x96, 0xcc, 0x2c, 0x75, - 0xf6, 0x59, 0x9c, 0xbc, 0x0f, 0x46, 0xaa, 0x00, 0xc8, 0x3b, 0x8e, 0x2e, 0xea, 0xd9, 0xed, 0x87, - 0x97, 0xec, 0x47, 0x1f, 0x04, 0x8b, 0x1f, 0x82, 0xf7, 0xc8, 0x6c, 0xc8, 0xc1, 0xcb, 0x75, 0x88, - 0xf5, 0x21, 0x6d, 0x99, 0xb4, 0xbf, 0x6c, 0xab, 0x36, 0x06, 0xaa, 0x99, 0x06, 0x22, 0x25, 0x0a, - 0x64, 0x4a, 0x04, 0x99, 0xb9, 0x69, 0x79, 0xf1, 0xaf, 0xec, 0x57, 0xe3, 0xc1, 0x3c, 0xb5, 0x5b, - 0x0f, 0xd9, 0x52, 0x21, 0x91, 0xc5, 0x4d, 0x95, 0x67, 0x4d, 0xb6, 0x3e, 0xdf, 0x58, 0x23, 0x77, - 0xae, 0x8f, 0x79, 0x20, 0xbc, 0xeb, 0xdf, 0x41, 0x70, 0xe7, 0xb9, 0x49, 0x1a, 0xc8, 0x8d, 0x8d, - 0x3d, 0x03, 0x32, 0x10, 0xf0, 0x56, 0x5e, 0x17, 0xc3, 0xaa, 0xde, 0xf3, 0xf3, 0xa1, 0xbc, 0x07, - 0x61, 0xf6, 0x4c, 0x5d, 0xd1, 0x96, 0x06, 0x0f, 0xd6, 0x2a, 0x3c, 0x27, 0x02, 0xe8, 0x1c, 0xfd, - 0x6b, 0x67, 0xe4, 0x3d, 0x10, 0x71, 0x94, 0xe4, 0x0a, 0xfc, 0xdd, 0xbf, 0x07, 0x9d, 0x29, 0xbc, - 0xc1, 0x7d, 0x53, 0x07, 0x9e, 0xad, 0xda, 0xb1, 0x3d, 0xff, 0x8e, 0x6f, 0xde, 0x3c, 0x79, 0x07, - 0x90, 0x8d, 0x01, 0x88, 0x2c, 0x12, 0x10, 0x79, 0x94, 0x79, 0x79, 0x07, 0x2f, 0x56, 0x94, 0x40, - 0x22, 0x37, 0x45, 0xcb, 0xe0, 0xd2, 0xdf, 0x2e, 0x8c, 0x24, 0x02, 0x8e, 0x08, 0x74, 0xe1, 0x5c, - 0xac, 0x56, 0xa5, 0x99, 0xb5, 0x1a, 0x25, 0x72, 0x34, 0x1f, 0x75, 0x85, 0x16, 0x7c, 0xef, 0x1c, - 0x49, 0x90, 0x4d, 0xe0, 0xba, 0x4d, 0xbb, 0xfd, 0xbf, 0x1e, 0x9f, 0x38, 0x35, 0x72, 0xfb, 0xb1, - 0xf7, 0x69, 0x07, 0xa0, 0x43, 0xbb, 0x77, 0x57, 0xce, 0x89, 0xd3, 0xd8, 0x0e, 0x53, 0x6b, 0x50, - 0x48, 0x14, 0xed, 0xfb, 0x5f, 0xfe, 0x73, 0x3b, 0x4c, 0x13, 0x08, 0xe2, 0xa4, 0x6c, 0x67, 0x07, - 0x0c, 0xd0, 0x3a, 0xbb, 0x39, 0x73, 0xec, 0xda, 0x0e, 0x98, 0x1a, 0xed, 0x5e, 0xde, 0xbc, 0x3b, - 0x39, 0xb1, 0x8f, 0x77, 0x00, 0xd5, 0x69, 0xf7, 0xe6, 0xed, 0x89, 0x53, 0xdf, 0x0e, 0xd2, 0x80, - 0xf9, 0x5c, 0x07, 0x47, 0xd7, 0xe3, 0xf1, 0x0e, 0x18, 0x98, 0xcf, 0xcd, 0xa7, 0x2b, 0xf2, 0x69, - 0xea, 0x25, 0x7c, 0x07, 0x58, 0x4d, 0x82, 0x9d, 0x9f, 0xdf, 0xed, 0x00, 0xaa, 0x4b, 0x20, 0xe0, - 0xf6, 0x0e, 0xa0, 0x46, 0x0a, 0xb4, 0x63, 0x4b, 0x1a, 0xcd, 0x14, 0xea, 0xa0, 0x48, 0xf3, 0xef, - 0xdf, 0xeb, 0xc3, 0xbd, 0xc3, 0xc3, 0x35, 0xf0, 0xe3, 0x0c, 0xfc, 0x5d, 0x0e, 0xfe, 0xf0, 0x10, - 0xc0, 0xf9, 0x06, 0xf6, 0x13, 0x60, 0xcc, 0xbb, 0x77, 0x37, 0x08, 0x4e, 0x8c, 0x80, 0x27, 0x8f, - 0x61, 0x74, 0x6f, 0xbe, 0x44, 0xe3, 0x04, 0x38, 0xf5, 0xde, 0xa9, 0xd6, 0x9d, 0xf2, 0x61, 0x9a, - 0x54, 0xf9, 0x58, 0x60, 0xdf, 0x59, 0x94, 0xfc, 0xca, 0x93, 0xdd, 0x83, 0x3b, 0x47, 0x52, 0xba, - 0xbb, 0x68, 0x40, 0xe1, 0x16, 0xf5, 0xcb, 0x1b, 0xb9, 0x74, 0x18, 0x4a, 0x25, 0x51, 0x9a, 0xa5, - 0x4c, 0x62, 0x4b, 0x39, 0xe8, 0xee, 0x39, 0x7a, 0x60, 0x72, 0x1d, 0x8d, 0x78, 0xb4, 0xa1, 0x5f, - 0xe7, 0xd7, 0x62, 0xe8, 0x26, 0x8b, 0x81, 0x07, 0x1f, 0x6f, 0x77, 0x6c, 0x14, 0x2c, 0x77, 0xe7, - 0x46, 0xc2, 0x92, 0x7a, 0xb7, 0x1f, 0x77, 0x68, 0x15, 0x8c, 0xef, 0xed, 0x78, 0x0f, 0x72, 0xd0, - 0xfb, 0x78, 0xbb, 0x43, 0xc0, 0x61, 0x7e, 0xbd, 0xc2, 0xfb, 0x94, 0x39, 0x47, 0xc0, 0x97, 0x3c, - 0x7b, 0x20, 0xe1, 0xc7, 0x45, 0x3e, 0x6e, 0x30, 0x48, 0xb8, 0x87, 0x6e, 0xff, 0x91, 0xcd, 0x5b, - 0xa4, 0xc8, 0x96, 0x4f, 0x8a, 0x2d, 0x9b, 0x4c, 0xf9, 0x15, 0xc6, 0xa4, 0x54, 0x37, 0x79, 0xf2, - 0x89, 0xec, 0x93, 0xde, 0xb6, 0xf7, 0x35, 0xf9, 0xfe, 0xe3, 0xb6, 0xf7, 0x75, 0xf9, 0x3e, 0x5b, - 0x55, 0xe9, 0x9a, 0xf0, 0x4f, 0x3c, 0x67, 0x81, 0x58, 0xdb, 0x3c, 0x1e, 0xc9, 0x99, 0xca, 0x2a, - 0x01, 0x0c, 0x80, 0x37, 0x5d, 0xd2, 0x91, 0x87, 0x96, 0xc9, 0x72, 0x0e, 0x68, 0x83, 0xc5, 0x6c, - 0xc0, 0x23, 0xaa, 0x2d, 0x6a, 0x5f, 0x0a, 0x0b, 0x8e, 0xf6, 0x63, 0x79, 0xad, 0x8c, 0xb4, 0x4f, - 0x64, 0x30, 0x4f, 0x09, 0x26, 0xa5, 0xb0, 0x5a, 0x0c, 0xae, 0x50, 0xb4, 0xdf, 0x3a, 0x54, 0xcf, - 0xf1, 0xcd, 0x93, 0xf6, 0xa2, 0x9e, 0x29, 0xec, 0xb2, 0xa0, 0xe4, 0xd2, 0x7c, 0x1a, 0x80, 0x48, - 0xbf, 0xb8, 0x68, 0xa5, 0xdb, 0x58, 0xca, 0x6f, 0x53, 0xa2, 0xab, 0x82, 0xe4, 0xa8, 0xbb, 0x1f, - 0x0c, 0xe2, 0x79, 0x7b, 0x73, 0x7b, 0x86, 0x5b, 0xe5, 0xf7, 0x52, 0x78, 0xa4, 0xd6, 0xce, 0x45, - 0x9d, 0x17, 0x17, 0xa2, 0x56, 0xe0, 0xa8, 0x15, 0x88, 0x78, 0xef, 0xa6, 0xb7, 0xa2, 0xd9, 0x4e, - 0x65, 0x53, 0x4a, 0x97, 0x80, 0x73, 0xa5, 0x30, 0x43, 0xc9, 0x6c, 0xa5, 0x63, 0x47, 0x1b, 0x1c, - 0xb7, 0x15, 0xc7, 0x45, 0x49, 0xf7, 0x35, 0x0c, 0xb7, 0xe5, 0xdc, 0x0a, 0x3c, 0xad, 0xd7, 0x73, - 0x33, 0x50, 0xb3, 0x8e, 0xd7, 0xdc, 0x9c, 0x49, 0x8f, 0x8a, 0x94, 0x1d, 0x45, 0x59, 0x11, 0xdd, - 0x45, 0xd3, 0xd9, 0x42, 0xf3, 0xb5, 0xa4, 0x6a, 0xaf, 0x27, 0x55, 0xfb, 0x17, 0x49, 0xd5, 0x5f, - 0x4f, 0xaa, 0xfe, 0x2f, 0x92, 0x6a, 0xbc, 0x9e, 0x54, 0xe3, 0x9f, 0x22, 0xb5, 0x26, 0xd3, 0xd1, - 0x56, 0x99, 0x46, 0xe9, 0xca, 0x26, 0x06, 0xe1, 0xb5, 0x9c, 0x98, 0x2e, 0x19, 0xaa, 0x09, 0xae, - 0xc9, 0xbc, 0x28, 0x8f, 0x0f, 0xc2, 0xef, 0x7a, 0x92, 0xe7, 0xbf, 0xeb, 0xe5, 0x94, 0x5b, 0xbc, - 0x78, 0x27, 0xf9, 0xfe, 0xbd, 0x37, 0x27, 0x63, 0x2f, 0x82, 0x20, 0x1e, 0x43, 0xc5, 0x9d, 0xfa, - 0xd5, 0xbf, 0x2c, 0x61, 0x07, 0xa4, 0x2f, 0x74, 0x4d, 0x7b, 0xb6, 0x4e, 0x65, 0xbc, 0x73, 0x2a, - 0x10, 0x83, 0x90, 0x5b, 0x3e, 0x8e, 0x78, 0x9c, 0xa9, 0xb9, 0xe0, 0xcb, 0x58, 0x92, 0x2d, 0x5f, - 0xfe, 0xed, 0x87, 0xdd, 0xcb, 0x67, 0x3b, 0x69, 0x9e, 0x2d, 0x92, 0xf0, 0x10, 0x92, 0xf6, 0xe1, - 0xc2, 0x67, 0x09, 0x27, 0x8f, 0x18, 0xe1, 0x60, 0x43, 0x1f, 0xa4, 0x1c, 0x3e, 0x19, 0x47, 0xe1, - 0x0c, 0x7d, 0x71, 0x4b, 0xee, 0x53, 0xde, 0x35, 0x9c, 0x7d, 0x2a, 0x73, 0x0d, 0xf6, 0x2e, 0xc7, - 0xe0, 0x74, 0x7b, 0x91, 0x37, 0x99, 0x26, 0x3c, 0xda, 0x02, 0x50, 0xeb, 0x9e, 0x0d, 0x87, 0x8b, - 0x88, 0x25, 0xdb, 0x30, 0xd4, 0xbb, 0xef, 0x16, 0xcc, 0xdf, 0xf4, 0x0b, 0xd2, 0x98, 0xa6, 0x0c, - 0x10, 0x7f, 0xbf, 0xb6, 0x19, 0x24, 0x4e, 0x31, 0x8f, 0x92, 0xb3, 0xd1, 0x37, 0x36, 0x84, 0x50, - 0x1f, 0x33, 0x28, 0x83, 0x0e, 0x38, 0x24, 0x6d, 0x9c, 0x07, 0x23, 0x6a, 0xc5, 0xe6, 0x4a, 0xc5, - 0xf2, 0x46, 0xf2, 0xf9, 0xf0, 0xd0, 0xfb, 0x52, 0x8d, 0x20, 0x79, 0x7e, 0xe0, 0x86, 0x69, 0xc1, - 0x9d, 0xaa, 0xd6, 0x1c, 0x6c, 0xe4, 0x58, 0x5e, 0x07, 0xf3, 0x80, 0x43, 0xa7, 0x3c, 0xf7, 0x3f, - 0xdc, 0x84, 0xef, 0x6e, 0x96, 0x09, 0x82, 0xe7, 0x67, 0x71, 0xbc, 0x5b, 0x48, 0x55, 0xce, 0xaf, - 0xaf, 0x0c, 0xe0, 0x21, 0xe4, 0x2a, 0xe2, 0x34, 0x53, 0x66, 0x10, 0xde, 0x8e, 0x74, 0x65, 0x18, - 0xce, 0xfe, 0x80, 0x87, 0x90, 0xee, 0x9b, 0x85, 0x84, 0x05, 0x52, 0x15, 0xac, 0x8c, 0xa9, 0xdc, - 0xa4, 0x90, 0x81, 0x64, 0x43, 0x5e, 0x93, 0x87, 0x10, 0xe9, 0x4f, 0x77, 0xe9, 0xc4, 0xdf, 0x72, - 0x8e, 0xf4, 0xfb, 0xab, 0x1c, 0xe9, 0x71, 0xb3, 0x59, 0x6f, 0xe6, 0x3c, 0x29, 0x5f, 0xad, 0xe9, - 0x4f, 0xce, 0x53, 0xba, 0x94, 0xa6, 0xae, 0xf2, 0x15, 0x0e, 0xf0, 0x6f, 0xe7, 0xb9, 0xc9, 0x0c, - 0x77, 0x3a, 0xc3, 0xf5, 0x59, 0x04, 0xab, 0x02, 0xd5, 0x75, 0x8d, 0x56, 0x7a, 0xf5, 0xa7, 0x62, - 0x4b, 0x31, 0x0b, 0x15, 0x94, 0xaa, 0xf9, 0xfd, 0xff, 0x8b, 0x33, 0xb5, 0xbe, 0x09, 0x13, 0xa1, - 0x34, 0x4f, 0x1d, 0x0e, 0x4a, 0x49, 0xf3, 0x78, 0x2c, 0x6a, 0x18, 0x3b, 0x55, 0x91, 0x29, 0x6d, - 0xfb, 0x1e, 0xd2, 0x03, 0x4f, 0x17, 0x4c, 0x13, 0x6b, 0x90, 0x04, 0xa8, 0x14, 0x20, 0x8b, 0xaa, - 0x1d, 0x22, 0xd3, 0x17, 0x50, 0x55, 0x7c, 0xb5, 0xa5, 0x6f, 0xb2, 0x5c, 0x49, 0x40, 0xb3, 0xd2, - 0x76, 0x34, 0x7b, 0xcf, 0xc5, 0x93, 0x2e, 0x83, 0x7f, 0x0e, 0x0e, 0x9d, 0x9c, 0xe6, 0x2b, 0x92, - 0xf0, 0x50, 0x92, 0x34, 0xf3, 0x24, 0x63, 0x9e, 0x08, 0x25, 0x35, 0x9f, 0xd0, 0x68, 0xac, 0x75, - 0xf0, 0x72, 0x59, 0xf7, 0xc7, 0xe6, 0x0c, 0x8e, 0x25, 0xb9, 0x57, 0x4d, 0xc9, 0xe4, 0x29, 0xe9, - 0xb6, 0x22, 0x5d, 0x68, 0x2a, 0x95, 0x8f, 0x80, 0x60, 0xca, 0x53, 0x30, 0x14, 0x9b, 0xdd, 0x45, - 0x9d, 0xe2, 0x5c, 0xca, 0x4d, 0x13, 0x8e, 0x06, 0x62, 0x9b, 0xa3, 0x37, 0x0d, 0x54, 0xc1, 0x2e, - 0xf5, 0x92, 0x40, 0x76, 0xb5, 0x6a, 0x8b, 0x24, 0xb0, 0xc1, 0xd4, 0xe2, 0x7c, 0x71, 0xca, 0x62, - 0x2e, 0x1e, 0x3f, 0x1c, 0xf4, 0xc5, 0x19, 0x42, 0x15, 0x7d, 0xc7, 0xf9, 0x94, 0x45, 0xe7, 0xe1, - 0x88, 0x1b, 0x58, 0x65, 0xb2, 0x4f, 0x1b, 0x27, 0xad, 0x66, 0xd3, 0x3c, 0x00, 0x3e, 0x79, 0x07, - 0xee, 0xd7, 0xde, 0x22, 0x49, 0x42, 0xd1, 0xe0, 0xb6, 0x92, 0x7d, 0x01, 0xe5, 0x8a, 0x2d, 0x94, - 0xf6, 0x50, 0x6b, 0x2d, 0x64, 0xeb, 0x4a, 0x95, 0xde, 0x3c, 0xb1, 0xd5, 0x46, 0xf4, 0xa1, 0x95, - 0xfd, 0x7b, 0x5c, 0xd4, 0xec, 0xee, 0x57, 0x0b, 0x49, 0x2a, 0x3f, 0x51, 0x70, 0x64, 0x6f, 0x9e, - 0x68, 0xef, 0xfd, 0xab, 0x66, 0x9d, 0xa2, 0xd9, 0xd0, 0x5d, 0x58, 0x84, 0xed, 0xba, 0xc9, 0x29, - 0xd5, 0x65, 0x17, 0x6c, 0x71, 0x58, 0x75, 0xdf, 0xa9, 0x0a, 0x7f, 0xaa, 0x36, 0xa5, 0xc3, 0x6b, - 0x38, 0xbc, 0x56, 0x32, 0xfc, 0x66, 0x11, 0x4f, 0x07, 0x82, 0x49, 0xbb, 0x11, 0xd4, 0x11, 0x41, - 0x7d, 0x0b, 0x02, 0xe2, 0xa9, 0x03, 0xd9, 0xdd, 0x38, 0x1a, 0x88, 0xa3, 0x51, 0x82, 0xa3, 0x2f, - 0x9a, 0xc1, 0x76, 0x0f, 0x6e, 0xe2, 0xe0, 0x66, 0xd9, 0x04, 0x2e, 0x6e, 0x49, 0xcc, 0x83, 0x38, - 0x8c, 0x76, 0x23, 0x38, 0x46, 0x04, 0xc7, 0x25, 0x08, 0xee, 0xc2, 0xc5, 0x4b, 0xc4, 0x7f, 0xc6, - 0xb1, 0x3f, 0x97, 0x8c, 0x3d, 0x0b, 0x98, 0x1f, 0x4e, 0x76, 0x0f, 0x3e, 0xc1, 0xc1, 0x27, 0x5b, - 0x07, 0x6f, 0x61, 0x1e, 0x4d, 0x8d, 0x1f, 0x95, 0x48, 0x45, 0x04, 0xab, 0x5c, 0x03, 0x04, 0x30, - 0xb0, 0xde, 0x16, 0x99, 0x87, 0x5e, 0x00, 0xa1, 0x4e, 0x5b, 0xc8, 0xa8, 0xe8, 0xbe, 0xa0, 0xd8, - 0x2e, 0xff, 0x13, 0xca, 0xed, 0x4f, 0xa6, 0xf6, 0x6a, 0xfb, 0x3f, 0x7c, 0xaf, 0xfd, 0xec, 0x34, - 0xdb, 0x3a, 0x14, 0x07, 0x23, 0xaa, 0xce, 0x24, 0xd6, 0xd5, 0x2b, 0xdf, 0x33, 0x9e, 0x4c, 0xfc, - 0xbe, 0x87, 0x46, 0xc1, 0x28, 0x7c, 0x63, 0xc0, 0xcd, 0xe7, 0x67, 0xa3, 0xf8, 0x95, 0xc1, 0x7a, - 0x17, 0x99, 0x08, 0x1e, 0x61, 0xac, 0xf9, 0x84, 0xa6, 0x4a, 0x9a, 0xce, 0x3d, 0x07, 0x23, 0x8e, - 0x36, 0x38, 0xb8, 0xdd, 0x75, 0x51, 0x6d, 0x39, 0x03, 0x3c, 0xdc, 0xde, 0x3c, 0x9f, 0x12, 0x26, - 0xd3, 0xfc, 0x13, 0x45, 0xe1, 0xa0, 0x58, 0xdb, 0xdd, 0x2b, 0x39, 0xf3, 0x0a, 0x34, 0x3e, 0x34, - 0xd4, 0xd8, 0x7d, 0x98, 0xcf, 0xaf, 0x83, 0x2f, 0x58, 0xd3, 0x55, 0x87, 0x56, 0xb1, 0x4d, 0x01, - 0xc8, 0xde, 0x44, 0x82, 0x87, 0x50, 0xdb, 0x71, 0xd8, 0x02, 0x87, 0xe4, 0x78, 0xec, 0xe5, 0xda, - 0x13, 0xb9, 0xa5, 0x99, 0x9c, 0x31, 0x6f, 0x31, 0xf7, 0x43, 0x36, 0xfa, 0xe0, 0xf9, 0xf8, 0x79, - 0x83, 0x6a, 0x3c, 0x0b, 0xf8, 0x23, 0xf9, 0xdb, 0xd5, 0xe5, 0x2f, 0x49, 0x32, 0xbf, 0x85, 0xe8, - 0x81, 0xc7, 0x49, 0x3b, 0x28, 0x69, 0xef, 0xc3, 0x81, 0xd4, 0xca, 0x7f, 0x6a, 0x90, 0x7d, 0x08, - 0x91, 0x4c, 0xbd, 0x18, 0x9c, 0x40, 0x3c, 0x0f, 0xc1, 0x47, 0xde, 0xf1, 0xef, 0x89, 0x25, 0x9e, - 0xc0, 0x34, 0x93, 0x45, 0x8c, 0xbd, 0x10, 0xb0, 0x48, 0x13, 0x7c, 0x57, 0x09, 0x5a, 0xf9, 0x2d, - 0x44, 0x0e, 0x2f, 0xcf, 0x23, 0xc6, 0x26, 0x5d, 0x36, 0xbc, 0xb7, 0xf6, 0x34, 0x02, 0xf9, 0xf5, - 0xc7, 0xcd, 0x35, 0xec, 0xa6, 0x45, 0x8f, 0xe4, 0x72, 0xd4, 0x81, 0x47, 0x22, 0x56, 0xf2, 0x21, - 0x8c, 0x66, 0xd8, 0xec, 0x95, 0x36, 0x0b, 0x56, 0xd9, 0x1c, 0xc6, 0xe0, 0x29, 0x1d, 0x3c, 0x55, - 0x3d, 0xab, 0xa2, 0x5b, 0x78, 0x0c, 0x5c, 0x88, 0x81, 0x7d, 0x16, 0x47, 0xc4, 0x31, 0xc2, 0x24, - 0xa6, 0x55, 0xd2, 0x4d, 0xbc, 0x97, 0xfb, 0xf8, 0x03, 0xe9, 0x9d, 0x8f, 0x27, 0x29, 0xf7, 0xac, - 0xa4, 0x4d, 0xf5, 0x4b, 0x0a, 0x5a, 0x08, 0x86, 0x1f, 0xfc, 0xa6, 0xfa, 0x54, 0x05, 0xf9, 0x7c, - 0xcb, 0x19, 0x84, 0x54, 0xa7, 0xb0, 0x12, 0x41, 0xef, 0x94, 0xa7, 0x74, 0x4f, 0x0d, 0xf4, 0xe5, - 0xe9, 0x2c, 0x0c, 0x35, 0xff, 0x74, 0x0c, 0x36, 0x3d, 0x21, 0x39, 0x37, 0xcf, 0x1a, 0x74, 0xcd, - 0x38, 0x0c, 0x04, 0x00, 0x84, 0x12, 0x79, 0xbe, 0xf0, 0x13, 0xb5, 0x7c, 0xd1, 0xda, 0x2f, 0x84, - 0xc7, 0x08, 0x44, 0x11, 0x3f, 0xa9, 0x4e, 0x1f, 0xc5, 0x09, 0x09, 0x5e, 0x80, 0xec, 0x8f, 0x32, - 0x9d, 0x91, 0xdd, 0x1e, 0x8e, 0x2d, 0xfa, 0x3c, 0xf4, 0x19, 0x03, 0x48, 0x73, 0x5b, 0x83, 0x62, - 0xb8, 0x53, 0x05, 0xe8, 0xf7, 0x6c, 0x38, 0x35, 0x94, 0xef, 0x74, 0xbb, 0x4f, 0x1a, 0xd4, 0x91, - 0x91, 0x42, 0x86, 0x8a, 0x57, 0xe7, 0x5e, 0x90, 0x6f, 0x1e, 0x29, 0xd3, 0x9a, 0xaf, 0x22, 0xfb, - 0x44, 0x7f, 0xf6, 0x35, 0xd7, 0xd5, 0x24, 0x86, 0x7e, 0xf6, 0xbe, 0xb4, 0xb7, 0x1e, 0xa2, 0x04, - 0x05, 0x68, 0x64, 0xb2, 0xb5, 0xf5, 0x70, 0xa7, 0x08, 0x2b, 0x34, 0xc5, 0x7a, 0x4d, 0x7b, 0xa9, - 0x8c, 0xab, 0xca, 0x41, 0xcf, 0xaf, 0xd7, 0x41, 0x43, 0x0c, 0x94, 0xad, 0xd7, 0x74, 0x9f, 0xe2, - 0x24, 0x20, 0x41, 0x2f, 0x87, 0xbd, 0xfd, 0xa0, 0x61, 0x53, 0xad, 0x85, 0x3d, 0x1d, 0x6f, 0x99, - 0xc5, 0xef, 0x65, 0xc0, 0x0f, 0x2b, 0x73, 0xa5, 0xb7, 0x18, 0xc2, 0x23, 0x30, 0x11, 0x69, 0x90, - 0x87, 0x5f, 0x11, 0xc9, 0xa7, 0xe9, 0x4e, 0x72, 0xb9, 0x87, 0x22, 0x22, 0x53, 0xcc, 0x91, 0xeb, - 0x56, 0x4b, 0x12, 0x6a, 0x26, 0x46, 0x81, 0xf5, 0xd6, 0xe9, 0x97, 0xbe, 0x6f, 0x17, 0x1b, 0x4b, - 0x44, 0x76, 0x6a, 0xea, 0x6e, 0xc0, 0x0d, 0x6b, 0x4f, 0xb1, 0xd3, 0x7d, 0xbb, 0x18, 0x61, 0x48, - 0x86, 0x64, 0x71, 0xef, 0x51, 0x09, 0xc5, 0xb6, 0xe2, 0x47, 0x49, 0xa5, 0x6b, 0xbf, 0xbb, 0xa3, - 0x39, 0x96, 0xb2, 0x6a, 0x92, 0xac, 0xc4, 0xac, 0xbc, 0x68, 0x5b, 0xef, 0xdc, 0xc5, 0x6d, 0x7e, - 0x84, 0x02, 0x46, 0x6a, 0xe5, 0x04, 0x2e, 0xee, 0xca, 0xc0, 0xc5, 0x9c, 0x24, 0x3f, 0x22, 0x0e, - 0x81, 0xe6, 0x36, 0x62, 0xb7, 0x97, 0x1b, 0xa3, 0x05, 0xfc, 0x76, 0x7a, 0xb7, 0x57, 0xb4, 0xb0, - 0x95, 0xb9, 0x31, 0xe0, 0xb2, 0x75, 0xae, 0x60, 0xa1, 0x8a, 0xb3, 0xd1, 0x59, 0x8c, 0x46, 0x15, - 0xb4, 0xda, 0x6c, 0xa9, 0xef, 0x5b, 0x6e, 0x7c, 0x8e, 0x6d, 0xe0, 0x2a, 0x0e, 0x64, 0x04, 0x75, - 0x9f, 0xa0, 0x2d, 0x91, 0x85, 0xa0, 0x3d, 0x9a, 0x42, 0xde, 0x81, 0x25, 0x26, 0x83, 0x28, 0x7c, - 0x84, 0xec, 0x85, 0x8c, 0x42, 0x1e, 0xe3, 0x77, 0x3e, 0x78, 0x76, 0x1c, 0x46, 0x10, 0xa8, 0x4e, - 0x39, 0xf9, 0x2a, 0x4c, 0xd0, 0x57, 0x32, 0x8f, 0xc0, 0xb8, 0x82, 0x47, 0xc1, 0xc0, 0x5f, 0x60, - 0x12, 0xb1, 0x6c, 0x2c, 0xbe, 0x95, 0xc9, 0xfa, 0x3f, 0x33, 0xb4, 0x5c, 0x42, 0x9d, 0xdd, 0x5c, - 0x10, 0x2f, 0x8f, 0x54, 0x54, 0x62, 0x49, 0x92, 0x27, 0xbb, 0x04, 0x53, 0x95, 0xff, 0x40, 0xaf, - 0x0f, 0xde, 0xe3, 0x23, 0x4f, 0x7e, 0x07, 0x09, 0x4d, 0xdd, 0xb9, 0x95, 0x7e, 0x3c, 0x50, 0x81, - 0x50, 0x42, 0x7e, 0xd2, 0xa8, 0x3e, 0x6d, 0x24, 0x71, 0x34, 0x74, 0xb3, 0x4f, 0xfe, 0x8e, 0xe2, - 0xea, 0xb7, 0xf8, 0x74, 0xee, 0xd6, 0x44, 0xfd, 0x4f, 0x43, 0x62, 0xec, 0xd2, 0xad, 0xfc, 0x9b, - 0x37, 0x13, 0x0b, 0x5b, 0x44, 0x3e, 0xb8, 0x43, 0xd9, 0xb7, 0x10, 0xe3, 0x91, 0x38, 0x40, 0x0a, - 0x88, 0xce, 0x91, 0xfc, 0xec, 0x73, 0x10, 0x8e, 0x96, 0x44, 0x19, 0x58, 0xda, 0x17, 0x15, 0x2f, - 0x10, 0xd3, 0x99, 0xc8, 0x78, 0xf1, 0xe2, 0x8f, 0x38, 0xfd, 0x0a, 0xb3, 0x3f, 0x86, 0xd0, 0x9d, - 0x27, 0xd3, 0x10, 0x2b, 0x8f, 0x61, 0x8c, 0x5f, 0x63, 0xe6, 0xca, 0x11, 0x49, 0x08, 0x8c, 0x7b, - 0x2c, 0x3e, 0x9b, 0x72, 0x7f, 0xde, 0xc3, 0xea, 0x94, 0x4c, 0x10, 0x2a, 0x32, 0x1f, 0x90, 0x77, - 0xb9, 0x68, 0xea, 0x17, 0x24, 0x7b, 0xda, 0x39, 0x92, 0x2f, 0xd2, 0x72, 0xb5, 0x1c, 0xb4, 0x65, - 0x4c, 0x0f, 0xc7, 0x54, 0x7a, 0xe0, 0x14, 0xb3, 0x71, 0x85, 0x11, 0xaa, 0x0d, 0xbf, 0xdb, 0x67, - 0x0f, 0x3c, 0x03, 0x99, 0xea, 0xd4, 0xb6, 0x33, 0xad, 0x75, 0x2b, 0xd8, 0x65, 0xb1, 0xcf, 0x66, - 0xf3, 0x36, 0xf9, 0x85, 0x45, 0xd8, 0xe8, 0x81, 0x92, 0x94, 0x2c, 0xe6, 0xc0, 0x9c, 0x1a, 0x44, - 0xac, 0x09, 0xf3, 0x75, 0x25, 0x31, 0xad, 0x6c, 0xfa, 0x43, 0x31, 0x55, 0x55, 0x24, 0xcf, 0x2a, - 0xb1, 0xf0, 0xb8, 0x92, 0x0b, 0xfd, 0x3a, 0x5e, 0xf7, 0x96, 0x83, 0xc1, 0x01, 0x59, 0x1f, 0x81, - 0x20, 0xcc, 0xc3, 0x47, 0xd8, 0x7e, 0xd5, 0xa9, 0x80, 0xad, 0x06, 0x03, 0x59, 0x3f, 0x8b, 0x13, - 0x59, 0xa7, 0x6b, 0x75, 0x8e, 0x3c, 0x39, 0x6e, 0xa0, 0xaa, 0xa8, 0x15, 0x79, 0x18, 0xb2, 0xc8, - 0xa8, 0x61, 0x6b, 0x47, 0xb1, 0xca, 0x2a, 0x9a, 0x0a, 0x54, 0xba, 0x9e, 0x52, 0xae, 0xbc, 0x0f, - 0x30, 0x55, 0x21, 0x6c, 0x01, 0xe1, 0x24, 0x4b, 0xbc, 0xa1, 0xa2, 0x15, 0xf0, 0x38, 0x26, 0x3e, - 0x7e, 0xd8, 0xc8, 0xa3, 0x17, 0xca, 0xb0, 0x67, 0x3d, 0x0e, 0xac, 0xae, 0x64, 0x19, 0x99, 0xfa, - 0xbc, 0x43, 0x56, 0x63, 0xc4, 0xd7, 0x1f, 0x92, 0xaa, 0xae, 0x4f, 0xe2, 0x27, 0x35, 0xdd, 0x2b, - 0xf9, 0x35, 0x2f, 0x39, 0x5f, 0x44, 0x11, 0x68, 0x78, 0x4a, 0x43, 0x49, 0xcf, 0xd5, 0x19, 0x5d, - 0xcb, 0x07, 0xd7, 0xca, 0x39, 0xb5, 0x66, 0x56, 0x56, 0xb2, 0x6d, 0x7b, 0xbd, 0x6e, 0x93, 0x96, - 0x74, 0xba, 0x15, 0x32, 0x3b, 0x2b, 0x92, 0xcf, 0x3e, 0x13, 0x48, 0x63, 0x77, 0x2c, 0xe3, 0xb4, - 0x64, 0xf3, 0x4d, 0xbb, 0x78, 0x3c, 0x56, 0xd9, 0xff, 0xe1, 0xed, 0xc9, 0xc9, 0x49, 0x9b, 0xfc, - 0x47, 0xb8, 0x88, 0x8a, 0x3b, 0x03, 0x12, 0xfc, 0x80, 0x49, 0x37, 0x99, 0x02, 0xc7, 0xc8, 0x50, - 0x2e, 0xa4, 0x2a, 0xb8, 0x7a, 0x17, 0x12, 0x50, 0x29, 0x78, 0xcf, 0x85, 0xb1, 0x88, 0xd9, 0x98, - 0x4b, 0x13, 0xb1, 0x44, 0x2c, 0x42, 0x6a, 0x2c, 0x04, 0x9c, 0x4b, 0x83, 0xb4, 0x88, 0x11, 0x0e, - 0x24, 0x95, 0x0c, 0x91, 0x5f, 0xb1, 0x78, 0x57, 0x99, 0x41, 0x90, 0xe2, 0x01, 0x84, 0xa2, 0xea, - 0x05, 0xdf, 0xb8, 0xfa, 0x74, 0x14, 0x53, 0x8c, 0x98, 0xb0, 0x60, 0x04, 0x36, 0x6c, 0x0c, 0x83, - 0xf7, 0xb2, 0x22, 0x0c, 0x88, 0x52, 0xe5, 0x4c, 0x6f, 0x26, 0xf3, 0x61, 0x9a, 0x62, 0x17, 0xe3, - 0xfc, 0xbe, 0x26, 0x21, 0x16, 0xe8, 0x96, 0xc0, 0xd2, 0x30, 0x16, 0x5f, 0x64, 0xe1, 0x1c, 0x05, - 0x98, 0x9c, 0xfd, 0x5f, 0x39, 0x9f, 0x13, 0x96, 0x90, 0x7d, 0x08, 0x92, 0x9c, 0x33, 0xe2, 0x8d, - 0xe5, 0x0c, 0xb0, 0x7f, 0x48, 0x74, 0x08, 0x8d, 0x80, 0xb1, 0xc3, 0x04, 0x65, 0x13, 0xeb, 0xc4, - 0x38, 0x38, 0x6b, 0xd1, 0x11, 0x53, 0xa9, 0x5c, 0x88, 0x95, 0x8a, 0xef, 0x07, 0xd3, 0x0f, 0xb9, - 0xc0, 0x16, 0xf3, 0x08, 0xd2, 0xab, 0x02, 0x13, 0x2d, 0xc2, 0x31, 0x5b, 0x22, 0x38, 0xc3, 0x88, - 0xa1, 0xa1, 0x92, 0x53, 0x30, 0x94, 0x5c, 0x10, 0x10, 0x7a, 0xfc, 0x94, 0x17, 0xb4, 0x62, 0x11, - 0xb3, 0x09, 0xd7, 0xca, 0xa5, 0xa4, 0x61, 0x8e, 0x36, 0x64, 0x11, 0xdc, 0x07, 0xe1, 0x63, 0xa0, - 0xa4, 0xda, 0xcc, 0x94, 0x23, 0x92, 0x3a, 0xfb, 0x10, 0xfa, 0x09, 0x0c, 0x25, 0xc6, 0x15, 0xf6, - 0x4a, 0xa9, 0x7d, 0x12, 0x7a, 0xc5, 0x08, 0x4e, 0x0e, 0x38, 0x0c, 0x60, 0x66, 0x49, 0xb1, 0x5b, - 0xf4, 0x25, 0xad, 0xc9, 0x36, 0x7e, 0x99, 0xb5, 0x71, 0x32, 0x8a, 0x47, 0x01, 0x3a, 0x91, 0x74, - 0xb3, 0x94, 0xb2, 0x0b, 0x3c, 0x51, 0x1f, 0x15, 0x11, 0xa3, 0xd9, 0x9c, 0x9d, 0x99, 0x95, 0xad, - 0x87, 0x9f, 0x4d, 0x01, 0xcd, 0xc7, 0x63, 0x6f, 0x88, 0x5d, 0x6f, 0xc4, 0xa8, 0x23, 0xfc, 0x56, - 0x70, 0x1b, 0x44, 0x13, 0x5b, 0x9c, 0x8c, 0xba, 0xbd, 0x03, 0x0c, 0xcf, 0x28, 0xba, 0xaa, 0x21, - 0xca, 0x70, 0x6a, 0x3b, 0x20, 0xb1, 0x3d, 0xa3, 0x72, 0x2e, 0xb2, 0xca, 0x92, 0xf3, 0xd7, 0x82, - 0x21, 0x91, 0x5f, 0x46, 0x95, 0x9f, 0x26, 0x2b, 0x14, 0xb2, 0x2d, 0x4d, 0xb3, 0x1a, 0x3b, 0xca, - 0x80, 0xc3, 0xa9, 0x8e, 0x6b, 0xe6, 0xd2, 0xb2, 0x92, 0x4f, 0xe1, 0x78, 0x45, 0xd8, 0x35, 0x9f, - 0x6d, 0xd7, 0x6e, 0xad, 0xdc, 0xfa, 0x44, 0x2b, 0x13, 0x5e, 0xcd, 0x77, 0x2f, 0x27, 0x8a, 0x41, - 0xbc, 0x80, 0x3f, 0x6c, 0x10, 0xc2, 0x24, 0x84, 0x26, 0x22, 0x7d, 0x54, 0x4b, 0x14, 0xeb, 0x6a, - 0x2a, 0x38, 0xca, 0xe4, 0xd7, 0xbb, 0x95, 0x0d, 0x43, 0x5f, 0xcf, 0xec, 0x08, 0x76, 0xfd, 0x88, - 0x9f, 0x16, 0x90, 0xcd, 0x72, 0x71, 0x4b, 0x8f, 0x2b, 0xaf, 0xad, 0x57, 0xca, 0x5d, 0x14, 0x62, - 0x3a, 0xc8, 0x79, 0xaa, 0x34, 0x55, 0x80, 0x04, 0x0a, 0xe4, 0xec, 0x20, 0x75, 0x46, 0x64, 0x8b, - 0x5f, 0x44, 0x04, 0x87, 0x25, 0x08, 0x0e, 0x15, 0x86, 0xc3, 0x9c, 0xc7, 0x8b, 0xc4, 0x7c, 0xaf, - 0x44, 0xa7, 0x20, 0xf9, 0x4d, 0xea, 0x53, 0x25, 0xdb, 0xd8, 0x19, 0xc8, 0x80, 0xad, 0xbd, 0xd5, - 0x51, 0xce, 0x5f, 0xcd, 0x9c, 0x9c, 0x1b, 0xeb, 0x15, 0xac, 0xa9, 0xe8, 0xe2, 0x24, 0x95, 0xd2, - 0xfa, 0xf8, 0xe1, 0xc0, 0x0f, 0x87, 0xf7, 0x6d, 0xc9, 0x06, 0xc7, 0x06, 0x36, 0xb4, 0xa7, 0x1c, - 0xad, 0x10, 0xdc, 0xc0, 0xf5, 0x40, 0xc4, 0xce, 0x87, 0xd8, 0xe6, 0xb9, 0x88, 0x5b, 0x35, 0xc1, - 0x25, 0xc9, 0xc3, 0x4a, 0x81, 0x44, 0xae, 0xab, 0xf2, 0x4f, 0x1a, 0x6c, 0x90, 0x28, 0xa0, 0x46, - 0xa2, 0x05, 0x2c, 0x23, 0x90, 0x56, 0x6f, 0xe0, 0xf9, 0x1e, 0x9a, 0xe2, 0x88, 0xf8, 0x6c, 0x02, - 0x21, 0x58, 0x0c, 0xa9, 0xbb, 0x30, 0x39, 0xbf, 0x81, 0x29, 0xf4, 0x85, 0x75, 0x04, 0x55, 0x27, - 0x39, 0xb7, 0xaa, 0xdb, 0x30, 0xbb, 0x25, 0x1d, 0x92, 0x9a, 0x27, 0x68, 0x4c, 0xd0, 0x0e, 0x0e, - 0xd0, 0x47, 0xf3, 0xef, 0x00, 0x00, 0x3a, 0x3c, 0x2c, 0xd8, 0x65, 0x10, 0x8b, 0x4a, 0x99, 0x5c, - 0x5c, 0xb1, 0x7b, 0x8e, 0x86, 0x88, 0x4f, 0x66, 0xda, 0x2c, 0x71, 0x08, 0xfb, 0x15, 0x81, 0xad, - 0xbe, 0x57, 0xfb, 0xc9, 0xbe, 0x74, 0xae, 0x4a, 0xed, 0x06, 0x8b, 0x58, 0x9e, 0xbd, 0xc0, 0x7a, - 0x47, 0xde, 0x90, 0xc7, 0xdb, 0xc7, 0x67, 0x36, 0x4d, 0x16, 0x3c, 0x44, 0xed, 0x41, 0xc5, 0xd5, - 0xca, 0x77, 0xc7, 0x9e, 0xf2, 0xdc, 0x5b, 0x44, 0x5a, 0xec, 0x50, 0x45, 0xb6, 0xe0, 0xc0, 0x7e, - 0xfc, 0x21, 0xf6, 0xf3, 0x8f, 0x19, 0x9b, 0xcf, 0x71, 0xaf, 0xf2, 0x87, 0x23, 0x44, 0x57, 0xa8, - 0x5b, 0xb9, 0xae, 0x9d, 0xec, 0x98, 0xe0, 0x25, 0x1e, 0x6d, 0x57, 0x1d, 0x5d, 0x18, 0x2f, 0xc8, - 0xbf, 0xc8, 0xe2, 0x40, 0x77, 0x2a, 0x9b, 0xca, 0x53, 0x8e, 0x01, 0x8b, 0xe3, 0x19, 0x06, 0x7d, - 0xc2, 0xb0, 0xae, 0x3b, 0x95, 0xdd, 0x0a, 0x9e, 0xae, 0x4c, 0xe4, 0x74, 0x6a, 0x49, 0xa2, 0x90, - 0x09, 0xa2, 0x81, 0x67, 0xbb, 0xa1, 0x3f, 0xca, 0xc2, 0x9c, 0xd2, 0xe0, 0x66, 0xfd, 0xc4, 0xcc, - 0xb1, 0xd3, 0xb2, 0x37, 0xa4, 0x72, 0x99, 0xd5, 0xc3, 0xd9, 0x5c, 0xdc, 0x16, 0xaa, 0xe7, 0x95, - 0x57, 0x96, 0xcf, 0x21, 0xc1, 0xdb, 0x51, 0x3c, 0x4f, 0xfd, 0x9f, 0x12, 0x2f, 0xc8, 0xef, 0xd6, - 0xa1, 0x4b, 0x9a, 0x82, 0x6e, 0xc1, 0xa0, 0x24, 0x9c, 0x8c, 0xd6, 0xcb, 0xde, 0x1a, 0xb2, 0x92, - 0x1d, 0x66, 0xd5, 0x1a, 0x87, 0xf7, 0x7c, 0x59, 0x68, 0x82, 0xdb, 0x3c, 0xd1, 0x52, 0x40, 0xa2, - 0xd9, 0x37, 0xd7, 0xde, 0xb6, 0x8e, 0xae, 0x8e, 0x4d, 0x87, 0x02, 0x72, 0x80, 0x3f, 0xa0, 0xb0, - 0x05, 0x1f, 0xb6, 0x26, 0x6e, 0x27, 0x5a, 0xc9, 0xce, 0xb9, 0x6a, 0xce, 0x4b, 0x53, 0x3b, 0xa6, - 0xdd, 0x63, 0x45, 0x4f, 0x64, 0x12, 0x5b, 0x70, 0xfd, 0x4c, 0xbb, 0x6f, 0x05, 0x58, 0x54, 0xc2, - 0x8b, 0xb4, 0x00, 0xdd, 0x15, 0xc9, 0x67, 0x24, 0x58, 0x57, 0xe2, 0x71, 0xd1, 0xae, 0x54, 0xd6, - 0x6a, 0xcb, 0xaa, 0xb4, 0x9c, 0x89, 0xea, 0x4f, 0x58, 0x59, 0x16, 0x39, 0xfb, 0x4f, 0xdb, 0xeb, - 0xca, 0x95, 0x33, 0x11, 0xad, 0x82, 0xbc, 0xc8, 0x7d, 0xc4, 0x80, 0x6f, 0xc6, 0xbc, 0x20, 0x35, - 0x39, 0xf8, 0xdb, 0x0e, 0x2f, 0xc4, 0xf8, 0x57, 0xfd, 0xeb, 0x2c, 0x88, 0xaf, 0x08, 0x29, 0x17, - 0x6d, 0xc8, 0xe5, 0x41, 0x40, 0x9a, 0x56, 0xaf, 0x61, 0xc5, 0x47, 0x1a, 0xa3, 0xa8, 0x2b, 0x92, - 0x0a, 0x1b, 0x0e, 0xf9, 0x1c, 0xdc, 0x7a, 0x55, 0xa0, 0xdb, 0xa2, 0xe8, 0x5a, 0x3b, 0x66, 0x2a, - 0x16, 0x93, 0x6b, 0xcf, 0x55, 0x65, 0xe9, 0x91, 0x17, 0x49, 0x0c, 0xc0, 0x88, 0xdf, 0xc4, 0xf3, - 0x82, 0xe6, 0x2a, 0xc5, 0x65, 0xa4, 0x02, 0x8a, 0x38, 0x76, 0x4b, 0x7f, 0x57, 0x47, 0xb0, 0x76, - 0xcc, 0xc0, 0x66, 0xc2, 0xe5, 0x38, 0x02, 0xa7, 0x3f, 0x3a, 0x82, 0x00, 0x45, 0x54, 0x0c, 0x5d, - 0xfa, 0x07, 0x6c, 0x79, 0x70, 0x4f, 0x51, 0xeb, 0xe0, 0x6d, 0xd8, 0x39, 0x62, 0x92, 0xb7, 0xb7, - 0x58, 0x7b, 0x78, 0xfd, 0x31, 0x16, 0xb6, 0xd0, 0xa8, 0xee, 0x8d, 0xcb, 0x4d, 0x3d, 0xac, 0xe4, - 0x14, 0x91, 0xc8, 0x0f, 0xea, 0x76, 0x6f, 0xcb, 0xed, 0x15, 0xd5, 0x09, 0xe0, 0xab, 0x24, 0x05, - 0x0b, 0x2e, 0x3b, 0x24, 0x65, 0xbb, 0xfd, 0x85, 0xb8, 0x47, 0xfd, 0x28, 0x44, 0x2c, 0x82, 0xa0, - 0x3b, 0x2c, 0x12, 0x0b, 0x5f, 0x88, 0x27, 0x85, 0x63, 0x8c, 0xe0, 0x65, 0x54, 0xbf, 0x98, 0x1f, - 0x89, 0x42, 0xda, 0xba, 0xa1, 0x5b, 0x9f, 0x79, 0x4f, 0xc9, 0x93, 0xc2, 0x9a, 0xcb, 0x4e, 0xd6, - 0xa2, 0xc4, 0x73, 0x88, 0x12, 0xcb, 0x8d, 0xe5, 0xac, 0x2c, 0x60, 0xcc, 0x02, 0x43, 0xc3, 0x3e, - 0x84, 0x27, 0xa6, 0xce, 0x04, 0xce, 0x54, 0xca, 0x86, 0x93, 0x83, 0x98, 0x27, 0x4f, 0xa2, 0x77, - 0xb3, 0x25, 0xd7, 0xdc, 0xa4, 0x60, 0x17, 0x12, 0x4b, 0x88, 0x32, 0x07, 0x61, 0x08, 0xa1, 0xba, - 0x8d, 0x19, 0x5c, 0xac, 0x43, 0xce, 0x38, 0x25, 0x8a, 0x31, 0xc5, 0x47, 0x36, 0x9b, 0x31, 0x32, - 0x0c, 0xa3, 0x48, 0x65, 0x6f, 0xe8, 0xe1, 0x65, 0xfc, 0xf2, 0x02, 0x8f, 0x3e, 0x42, 0x7c, 0x49, - 0x8c, 0x38, 0x89, 0x42, 0xc8, 0x51, 0xd0, 0x9a, 0xa4, 0x15, 0x02, 0x41, 0xa0, 0xb2, 0x15, 0x7b, - 0x09, 0x33, 0xb7, 0x50, 0xe8, 0x41, 0xbc, 0x44, 0x0c, 0xfc, 0x51, 0x99, 0x75, 0xec, 0xf8, 0xaf, - 0x97, 0xa5, 0x8c, 0xa0, 0x18, 0x49, 0x6e, 0xc6, 0x8a, 0x71, 0x1f, 0xd6, 0x19, 0x57, 0x59, 0xe3, - 0x9c, 0x53, 0xbe, 0x37, 0x3f, 0xa2, 0x40, 0xdd, 0x41, 0xf4, 0x16, 0x7b, 0x38, 0x69, 0x29, 0x53, - 0xe7, 0x51, 0x18, 0xc7, 0x63, 0x36, 0xe2, 0x2f, 0xf1, 0xe5, 0xee, 0x83, 0x94, 0x9d, 0x0c, 0x01, - 0xc1, 0xdf, 0x74, 0x5a, 0x9b, 0xdc, 0xdd, 0xbb, 0x6d, 0x93, 0xfb, 0xee, 0x6f, 0x36, 0xa6, 0xe0, - 0x6f, 0x92, 0x91, 0x59, 0x8c, 0x68, 0x55, 0x45, 0xe4, 0x86, 0xf9, 0x3c, 0x01, 0xaf, 0x96, 0x64, - 0xd3, 0x7c, 0x69, 0x62, 0x37, 0x1f, 0xa4, 0xaa, 0xe0, 0x6c, 0x46, 0x90, 0x50, 0x03, 0xf3, 0xc4, - 0xca, 0xb4, 0x90, 0xbf, 0xc3, 0x1e, 0x27, 0x40, 0xb4, 0x5e, 0xec, 0xb8, 0xbb, 0x7c, 0x41, 0x00, - 0xb7, 0xb0, 0x11, 0xde, 0x09, 0x41, 0xd0, 0xf8, 0xef, 0x84, 0xb1, 0xda, 0xae, 0x4b, 0x77, 0xbd, - 0x97, 0x05, 0xbd, 0x52, 0x42, 0x08, 0x89, 0x5c, 0x85, 0x62, 0x63, 0x0a, 0xe9, 0xf1, 0xdd, 0xa7, - 0xb2, 0x68, 0xe0, 0x13, 0xf3, 0x12, 0x51, 0x9b, 0x00, 0x4d, 0xab, 0xec, 0xe8, 0x15, 0xfe, 0x00, - 0x5b, 0xbd, 0x23, 0x08, 0xc0, 0xd7, 0x44, 0x84, 0x90, 0x29, 0x50, 0x65, 0xb3, 0xb9, 0xa5, 0xbf, - 0x08, 0x22, 0x2f, 0x2e, 0x73, 0xa0, 0xc0, 0x77, 0xd1, 0xb6, 0x8f, 0x3f, 0x41, 0x03, 0x89, 0x0e, - 0x7a, 0x3a, 0xb1, 0x19, 0x15, 0xf9, 0xb4, 0xc7, 0xc0, 0xa0, 0x0f, 0x79, 0x4e, 0x75, 0x5e, 0xea, - 0x36, 0x3c, 0xbf, 0xcb, 0xf7, 0x2d, 0x6a, 0x61, 0x7a, 0x1c, 0xd2, 0xee, 0x47, 0x3f, 0x1c, 0x30, - 0x5f, 0x7c, 0x5b, 0x85, 0x31, 0xae, 0xd0, 0xc1, 0xb2, 0xfe, 0xba, 0xd2, 0x76, 0x3a, 0xba, 0xb1, - 0x2c, 0x91, 0xb4, 0xbf, 0xdb, 0x16, 0x4c, 0xbd, 0xd0, 0x8b, 0x9d, 0x8b, 0xb5, 0x5e, 0xe8, 0xba, - 0x43, 0x26, 0xbf, 0xd0, 0x77, 0x87, 0x1c, 0xae, 0x94, 0xb7, 0xde, 0x89, 0xa4, 0x23, 0x5d, 0x1e, - 0x30, 0x27, 0x6b, 0x1a, 0x7c, 0x21, 0x65, 0x39, 0xbf, 0x55, 0x29, 0x0b, 0x8c, 0x81, 0x60, 0x1d, - 0x54, 0xeb, 0x01, 0x12, 0x27, 0x1f, 0x4c, 0x0f, 0x64, 0x0d, 0x5b, 0xbc, 0xe8, 0x66, 0x7c, 0x5c, - 0x59, 0x0f, 0x90, 0xcf, 0x7b, 0x45, 0x0b, 0xa3, 0xdc, 0x1a, 0xec, 0xf8, 0xd9, 0xe8, 0x01, 0xb7, - 0x7a, 0x24, 0xb6, 0x5f, 0xab, 0x75, 0x8e, 0xa0, 0x5c, 0x51, 0x45, 0x2b, 0x71, 0xaf, 0x4c, 0xa8, - 0x2f, 0xc5, 0x37, 0x89, 0xc4, 0x78, 0x8c, 0xd8, 0x1c, 0x4b, 0x0a, 0xb3, 0xf0, 0x01, 0x06, 0x9b, - 0x3b, 0xc4, 0xbb, 0xa2, 0x87, 0x30, 0xff, 0x91, 0x2d, 0x63, 0x82, 0x23, 0xcd, 0x1d, 0x5b, 0xa1, - 0xc1, 0x03, 0xec, 0x81, 0x5d, 0x83, 0x2e, 0x11, 0x7c, 0xdc, 0xfc, 0x12, 0xcb, 0x5d, 0xba, 0x4f, - 0x15, 0x65, 0x18, 0x22, 0xd9, 0x63, 0x8a, 0x85, 0x36, 0xfe, 0x3a, 0x46, 0x6b, 0xc3, 0xe3, 0xd4, - 0x52, 0x3e, 0x7f, 0x80, 0x04, 0xa2, 0x92, 0x31, 0xfa, 0xc3, 0x4d, 0xff, 0xc5, 0x84, 0x68, 0x38, - 0x16, 0xd9, 0x60, 0x30, 0xf6, 0x26, 0x24, 0xe1, 0xb3, 0xb9, 0x9f, 0xa7, 0x5f, 0x29, 0x8f, 0x0d, - 0x6b, 0x94, 0xfc, 0xf3, 0xb1, 0x21, 0xd5, 0x07, 0xce, 0xe9, 0xb9, 0x74, 0x0d, 0x12, 0x17, 0x11, - 0x02, 0x94, 0xc5, 0x85, 0x58, 0xe6, 0x2f, 0x45, 0x5e, 0x29, 0x1e, 0x20, 0xfc, 0xe9, 0xf3, 0x83, - 0x23, 0x3c, 0x13, 0xc9, 0xa5, 0xc9, 0xf2, 0x77, 0x0e, 0x35, 0xd9, 0x23, 0x3c, 0x4d, 0xc1, 0xa3, - 0x15, 0xfc, 0x9d, 0xcd, 0xff, 0x05, 0xc7, 0x1d, 0x45, 0x1c, 0x77, 0x53, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdd, 0x3c, 0xed, 0x76, 0xe2, 0xc6, + 0x92, 0xff, 0x79, 0x8a, 0x76, 0x27, 0x71, 0xa4, 0x8b, 0x0c, 0x12, 0x1f, 0x8e, 0x07, 0x10, 0xac, + 0xf1, 0x78, 0x26, 0xbe, 0xd7, 0x8e, 0x7d, 0x8c, 0x93, 0xb9, 0x7b, 0x26, 0x73, 0x32, 0x42, 0x34, + 0xa0, 0xb1, 0x90, 0x74, 0x25, 0x61, 0x9b, 0xb5, 0xd9, 0x67, 0xda, 0x67, 0xd8, 0x27, 0xdb, 0xaa, + 0xee, 0xd6, 0x17, 0x08, 0xec, 0xdc, 0xbb, 0xfb, 0x67, 0x73, 0xce, 0xc4, 0x20, 0x55, 0x57, 0x55, + 0x57, 0xd7, 0x77, 0x77, 0xd3, 0x3b, 0x78, 0x7f, 0x7d, 0x76, 0xf7, 0xef, 0x37, 0xe7, 0x64, 0x1e, + 0x2f, 0xdc, 0x7e, 0x0f, 0xff, 0x4f, 0x5c, 0xcb, 0x9b, 0x99, 0x94, 0x79, 0x14, 0xbe, 0x33, 0x6b, + 0xd2, 0xef, 0x2d, 0x58, 0x6c, 0x11, 0x7b, 0x6e, 0x85, 0x11, 0x8b, 0x4d, 0xba, 0x8c, 0xa7, 0x47, + 0x27, 0x54, 0x3e, 0xad, 0x78, 0xd6, 0x82, 0x99, 0xf4, 0xc1, 0x61, 0x8f, 0x81, 0x1f, 0xc6, 0x94, + 0xd8, 0xbe, 0x17, 0x33, 0x0f, 0xc0, 0x1e, 0x9d, 0x49, 0x3c, 0x37, 0xdb, 0xba, 0x9e, 0x82, 0x6e, + 0xbc, 0x9a, 0xb0, 0x07, 0xc7, 0x66, 0x47, 0xfc, 0x8b, 0xe6, 0x78, 0x4e, 0xec, 0x58, 0xee, 0x51, + 0x64, 0x5b, 0x2e, 0x33, 0x0d, 0x6d, 0x61, 0x3d, 0x39, 0x8b, 0xe5, 0x22, 0xfd, 0xbe, 0x8c, 0x58, + 0xc8, 0xbf, 0x58, 0x63, 0xf8, 0xee, 0xf9, 0x74, 0x8b, 0x72, 0xbf, 0x17, 0x3b, 0xb1, 0xcb, 0xfa, + 0x97, 0xe7, 0xef, 0xc9, 0x88, 0xc5, 0xb1, 0xe3, 0xcd, 0xa2, 0x5e, 0x5d, 0x3c, 0xeb, 0x45, 0x76, + 0xe8, 0x04, 0x71, 0xbf, 0xf2, 0x60, 0x85, 0xc4, 0xf5, 0x6d, 0x27, 0xd0, 0x62, 0x67, 0xc1, 0xfc, + 0x65, 0xac, 0x4d, 0xcc, 0x89, 0x6f, 0x2f, 0x17, 0xc0, 0x97, 0xe6, 0x5a, 0x41, 0xc8, 0x1e, 0xcc, + 0x76, 0x1b, 0xa9, 0x0f, 0x05, 0x13, 0x57, 0x66, 0x8b, 0x35, 0xf1, 0xc3, 0xcd, 0xd0, 0x6c, 0xe9, + 0xef, 0x8e, 0xf1, 0xe3, 0xa5, 0x69, 0x34, 0x9b, 0xfc, 0xe1, 0xe5, 0xf8, 0x1f, 0x4b, 0x3f, 0x36, + 0x75, 0xcd, 0x5e, 0x46, 0xb1, 0xbf, 0x18, 0xc5, 0x56, 0x18, 0x47, 0xe6, 0x81, 0xa1, 0x45, 0xfc, + 0xd3, 0x7b, 0x27, 0x8c, 0x57, 0xe6, 0xe7, 0x2f, 0x08, 0x7a, 0x76, 0x7d, 0xfd, 0xc0, 0xc2, 0xd0, + 0x99, 0xb0, 0xc8, 0x6c, 0x6b, 0xc0, 0x03, 0x80, 0x75, 0xa7, 0x4b, 0xcf, 0x8e, 0x1d, 0xdf, 0x23, + 0x3f, 0x2b, 0xea, 0xf3, 0xa3, 0xe3, 0x4d, 0xfc, 0xc7, 0x9a, 0x1f, 0x30, 0x4f, 0xa1, 0xf3, 0x38, + 0x0e, 0xa2, 0x4e, 0xbd, 0x7e, 0xef, 0xf9, 0xb5, 0x47, 0x97, 0x4d, 0x6a, 0x33, 0x56, 0x9f, 0x32, + 0x2b, 0x5e, 0x86, 0x2c, 0xaa, 0x47, 0x72, 0x7a, 0xf5, 0xef, 0xe0, 0xcd, 0x51, 0xf2, 0x8d, 0xaa, + 0xeb, 0x14, 0xdf, 0x70, 0x13, 0x5f, 0x3a, 0x86, 0x6a, 0xf4, 0x8f, 0x88, 0xb9, 0xd3, 0x3c, 0xf4, + 0xec, 0x62, 0xa2, 0x30, 0xf5, 0x39, 0x64, 0x80, 0xde, 0x23, 0x48, 0x2b, 0x3e, 0x77, 0x19, 0xca, + 0x64, 0xb8, 0xe2, 0xaf, 0x32, 0x50, 0x7f, 0x3a, 0x45, 0xd0, 0x3c, 0x4c, 0x34, 0x5c, 0xfd, 0x02, + 0x4b, 0x01, 0x8f, 0x3f, 0xeb, 0x5f, 0x6a, 0x0f, 0x96, 0xbb, 0x64, 0xe6, 0x91, 0x91, 0x0d, 0x71, + 0x7d, 0x6b, 0xf2, 0xd7, 0x91, 0xc2, 0x34, 0xcf, 0x3c, 0xd0, 0xd5, 0x67, 0x97, 0xc5, 0x24, 0x36, + 0x27, 0x35, 0x3b, 0x84, 0xe9, 0x30, 0x89, 0x43, 0xa1, 0x62, 0x85, 0xa8, 0xda, 0x8d, 0x6b, 0xc0, + 0xea, 0x69, 0x1c, 0x87, 0xce, 0x78, 0x19, 0x33, 0x78, 0x11, 0xda, 0x54, 0x63, 0xaa, 0xb6, 0xf9, + 0x3c, 0x5e, 0x05, 0x0c, 0x26, 0x13, 0xb3, 0xa7, 0xb8, 0xfe, 0xcd, 0x7a, 0xb0, 0x12, 0x04, 0x5b, + 0x80, 0x56, 0xb4, 0xf2, 0x00, 0x85, 0xa7, 0x6a, 0x93, 0xda, 0xd8, 0x9f, 0xac, 0x6a, 0x56, 0x00, + 0x22, 0x99, 0x9c, 0xcd, 0x1d, 0x77, 0xa2, 0xc4, 0x08, 0x6f, 0x4d, 0x26, 0xe7, 0x0f, 0xc0, 0xc5, + 0xa5, 0x13, 0x81, 0x82, 0xb2, 0x50, 0xa1, 0xc8, 0x33, 0xd5, 0x14, 0xd5, 0xec, 0x3f, 0x7f, 0x64, + 0xf1, 0x6f, 0x8a, 0xaa, 0xd9, 0x73, 0x66, 0xdf, 0x8f, 0x1c, 0xf8, 0x84, 0xd8, 0x87, 0x97, 0x8a, + 0xba, 0x2e, 0x1f, 0x0a, 0x8b, 0xec, 0x87, 0xc0, 0x31, 0x0c, 0x05, 0x85, 0x8f, 0x7c, 0x97, 0xd5, + 0x5c, 0x7f, 0xa6, 0xd0, 0x73, 0x7c, 0x4e, 0xa4, 0x3c, 0x60, 0x25, 0xc8, 0xd4, 0x71, 0x19, 0x9f, + 0x19, 0x68, 0x78, 0x08, 0x12, 0xb8, 0x94, 0xcf, 0xfd, 0x29, 0x1a, 0xd1, 0xd4, 0x99, 0x2d, 0x43, + 0x8b, 0x0b, 0x50, 0xcc, 0x8c, 0x4c, 0x2d, 0x07, 0x15, 0xe1, 0x77, 0xef, 0xc2, 0xb3, 0xfd, 0x45, + 0x00, 0x72, 0x64, 0x24, 0xb0, 0x66, 0x8c, 0x4c, 0xac, 0xd8, 0x3a, 0x80, 0xf5, 0xcc, 0x2d, 0x53, + 0x34, 0xf7, 0x1f, 0xef, 0x7c, 0x2b, 0x8a, 0x85, 0xd8, 0x0d, 0xf5, 0x19, 0x35, 0x3f, 0x36, 0x71, + 0xa5, 0x69, 0x8c, 0x2f, 0xb8, 0xa4, 0x1d, 0x0f, 0x58, 0xfe, 0xf9, 0xee, 0xea, 0xd2, 0x64, 0x30, + 0x17, 0xdb, 0xb5, 0xa2, 0x08, 0x97, 0xd2, 0xf4, 0x06, 0x72, 0x1a, 0x1d, 0x8a, 0x98, 0xa8, 0x66, + 0xbb, 0xcc, 0x0a, 0xef, 0x84, 0xc9, 0x28, 0xd2, 0x74, 0xb8, 0xa4, 0xe3, 0x15, 0xcc, 0xcf, 0xf2, + 0x9c, 0x05, 0x67, 0xd5, 0xa4, 0x9e, 0xef, 0xc1, 0xa4, 0x24, 0x84, 0x09, 0xa2, 0x4a, 0x06, 0x29, + 0x09, 0x6f, 0xa0, 0x99, 0x79, 0x52, 0xb9, 0xcf, 0xb5, 0x90, 0x05, 0xae, 0x65, 0xe3, 0x9a, 0x73, + 0xa2, 0x14, 0xe7, 0xa4, 0x35, 0xde, 0xe9, 0x7a, 0x6e, 0x66, 0xe3, 0x4b, 0x67, 0xe1, 0xc4, 0x11, + 0xce, 0x4b, 0x8b, 0x35, 0x47, 0x7d, 0xe6, 0xb6, 0xca, 0x84, 0xad, 0xc6, 0xd2, 0x52, 0x3d, 0x61, + 0xa6, 0x4e, 0x36, 0x2c, 0x70, 0xbc, 0xe8, 0xfa, 0x6f, 0x8a, 0x90, 0x03, 0x33, 0x37, 0xf4, 0xf7, + 0xce, 0x9a, 0x71, 0x15, 0xa6, 0x8e, 0x17, 0x2c, 0x51, 0x34, 0x53, 0x3f, 0x54, 0x1c, 0x53, 0xef, + 0x3a, 0x3d, 0x58, 0x3d, 0xe6, 0xcd, 0xe2, 0x79, 0xd7, 0xa9, 0x56, 0xc5, 0x68, 0xcf, 0x64, 0x9f, + 0x9d, 0x2f, 0x35, 0x74, 0x3f, 0xb5, 0x68, 0x39, 0x8e, 0x40, 0xd1, 0xbc, 0x99, 0xa2, 0x6b, 0x0d, + 0xb5, 0xeb, 0x4c, 0x61, 0x19, 0x75, 0x6a, 0x9a, 0xde, 0xcb, 0x0b, 0xbd, 0x34, 0x92, 0x0f, 0x8d, + 0xe4, 0x43, 0x13, 0x3f, 0x24, 0x6b, 0x51, 0x86, 0x45, 0xe0, 0x08, 0xd0, 0xd3, 0x5e, 0x80, 0x55, + 0x94, 0x99, 0x19, 0xbd, 0xbc, 0xa3, 0xd5, 0x38, 0xb3, 0x35, 0xcd, 0xd0, 0xd5, 0xbe, 0x79, 0xa2, + 0xab, 0xe8, 0x5e, 0x1d, 0x6f, 0xc9, 0xd6, 0x80, 0xe1, 0x0d, 0x6c, 0xe0, 0x87, 0x96, 0xfc, 0x70, + 0x7b, 0x29, 0x3f, 0x0c, 0xef, 0xe4, 0x87, 0x8b, 0x5b, 0xce, 0xea, 0xe1, 0x21, 0xa5, 0x07, 0x82, + 0x53, 0x4e, 0x0c, 0xbe, 0x1f, 0x19, 0x85, 0x27, 0xea, 0x33, 0x90, 0x9b, 0xd4, 0x96, 0x8b, 0x3f, + 0x82, 0xc3, 0x43, 0xf1, 0xb7, 0x16, 0xf9, 0xc0, 0xa7, 0x67, 0xf6, 0x3d, 0xd3, 0x4c, 0xa7, 0x92, + 0x8d, 0x40, 0x86, 0x55, 0x55, 0x3a, 0x1b, 0xa1, 0xfb, 0x5f, 0x47, 0x7e, 0x18, 0xae, 0x34, 0xbe, + 0x4a, 0xe4, 0xfb, 0xe7, 0xbf, 0x8e, 0xae, 0x7f, 0xa9, 0x09, 0x89, 0x38, 0xd3, 0x95, 0xc4, 0xae, + 0xae, 0x89, 0x6d, 0x79, 0x3f, 0xc6, 0x64, 0xcc, 0x08, 0x44, 0x83, 0x49, 0xed, 0xab, 0xaa, 0x65, + 0x48, 0x4d, 0x4a, 0xc5, 0xb7, 0x29, 0x78, 0xf3, 0x08, 0xac, 0x14, 0xbc, 0x2b, 0x30, 0x96, 0x01, + 0xf4, 0xdb, 0x87, 0x87, 0xd9, 0xb7, 0x9e, 0xd1, 0x28, 0x72, 0x40, 0xf3, 0x1c, 0x1c, 0x1f, 0x19, + 0x06, 0x12, 0x23, 0x9e, 0x9f, 0x91, 0xa3, 0x6f, 0x20, 0x87, 0x62, 0x3b, 0x30, 0x3d, 0x90, 0x12, + 0x08, 0x92, 0x7f, 0xc8, 0x31, 0xd0, 0x6c, 0xee, 0x21, 0x09, 0x6f, 0x89, 0x15, 0x32, 0xc2, 0x15, + 0x10, 0xbc, 0x84, 0xbb, 0x7a, 0x9d, 0x20, 0x2a, 0xe9, 0x37, 0xd3, 0xa9, 0x1a, 0xdd, 0x6f, 0x99, + 0x9a, 0x7e, 0x4b, 0xd4, 0xd4, 0x82, 0x45, 0xfa, 0xf6, 0x8a, 0x9a, 0x5a, 0x89, 0x7e, 0x58, 0x89, + 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, 0x58, 0x89, 0x7e, + 0x58, 0x7c, 0xf1, 0x29, 0xbe, 0x34, 0xad, 0x02, 0x11, 0x43, 0x15, 0x4c, 0xf8, 0xa5, 0x4c, 0xbc, + 0x55, 0xcb, 0xfd, 0x57, 0xb4, 0x5c, 0xe8, 0xe6, 0xb7, 0x54, 0x37, 0x73, 0xe2, 0xca, 0x3d, 0xdf, + 0x50, 0xb5, 0x1b, 0xc7, 0xe3, 0xfe, 0xd5, 0x75, 0x6c, 0x5c, 0xdc, 0xf8, 0x91, 0x31, 0x0f, 0x74, + 0x2e, 0xb5, 0xc6, 0x75, 0x1d, 0xbf, 0x48, 0xa6, 0xd7, 0x07, 0x5c, 0xcb, 0xbe, 0x15, 0x56, 0xe1, + 0x5b, 0x7e, 0x15, 0xd6, 0xf0, 0x9f, 0x20, 0x70, 0xa0, 0x67, 0xee, 0x26, 0x0e, 0x57, 0xa3, 0xe5, + 0x18, 0x1c, 0x95, 0x92, 0x18, 0xc8, 0x68, 0x5a, 0x43, 0x3f, 0x9d, 0xc3, 0x53, 0xc3, 0x6c, 0x03, + 0xa6, 0xfc, 0x9e, 0x4d, 0xad, 0xa5, 0x1b, 0x23, 0xb6, 0xc4, 0x4b, 0x25, 0x2c, 0x83, 0xd0, 0x62, + 0x3f, 0xb8, 0x09, 0x7d, 0xf0, 0xf3, 0x96, 0x70, 0x9e, 0x52, 0xd3, 0x78, 0xe2, 0xd1, 0x37, 0xc0, + 0x35, 0x4a, 0x9f, 0x44, 0xef, 0x7c, 0x9f, 0x2c, 0x2c, 0x6f, 0x45, 0x20, 0x01, 0x8a, 0x08, 0xe8, + 0x06, 0x59, 0x30, 0x12, 0xfb, 0x64, 0x6e, 0x79, 0x13, 0x97, 0x1d, 0xd0, 0x2e, 0x7a, 0xc8, 0x9e, + 0xc1, 0x5a, 0x87, 0x87, 0x8a, 0x57, 0x35, 0xe9, 0xef, 0xde, 0xef, 0xe1, 0x19, 0x04, 0x28, 0xc8, + 0x48, 0x42, 0xd0, 0x70, 0x8c, 0x3c, 0xa0, 0xf1, 0xe7, 0xa3, 0x9b, 0x66, 0x03, 0x55, 0x4f, 0x48, + 0xcb, 0x53, 0xd7, 0x9c, 0x75, 0x1e, 0xfd, 0x7e, 0xb3, 0x5c, 0x67, 0xe2, 0xc4, 0x2b, 0x45, 0x45, + 0x4b, 0x87, 0xa7, 0x91, 0x98, 0x62, 0xce, 0x3b, 0x33, 0x8f, 0x87, 0x46, 0xe9, 0x65, 0x79, 0xb4, + 0xc1, 0x84, 0x8d, 0xaa, 0x02, 0x03, 0x9b, 0x74, 0xf9, 0xc0, 0xcb, 0x53, 0x29, 0x07, 0x36, 0x10, + 0x49, 0x57, 0x47, 0xd7, 0x12, 0x60, 0x80, 0x15, 0x51, 0x65, 0xe2, 0x44, 0x10, 0x0e, 0x56, 0x00, + 0x03, 0x6e, 0xd9, 0x75, 0x20, 0xae, 0x74, 0x64, 0x78, 0xe1, 0xa0, 0x41, 0xb4, 0x6c, 0xbc, 0x01, + 0xb6, 0x40, 0xaf, 0xaf, 0x1f, 0x1e, 0xa6, 0xe1, 0x3b, 0xc7, 0xf4, 0xe5, 0x69, 0x2e, 0x32, 0x70, + 0x78, 0x48, 0x91, 0xc4, 0x90, 0x4d, 0x86, 0x05, 0xf1, 0xcb, 0x53, 0xa0, 0xb8, 0x45, 0xbd, 0xad, + 0x9b, 0x25, 0x1c, 0xfc, 0x7a, 0x91, 0x27, 0x96, 0x90, 0x7f, 0x8e, 0x1e, 0x9d, 0xd8, 0x9e, 0x2b, + 0x25, 0x32, 0x82, 0x34, 0x49, 0xdb, 0x64, 0x03, 0x70, 0x6b, 0x39, 0x83, 0xc9, 0xb1, 0x04, 0x96, + 0x66, 0x5b, 0x11, 0x23, 0x7a, 0xa7, 0x14, 0x95, 0xa1, 0xc9, 0x35, 0xe9, 0x8e, 0x21, 0xe1, 0xba, + 0xef, 0x72, 0xd8, 0xa6, 0xde, 0xd9, 0x22, 0xd0, 0xd4, 0x0b, 0x10, 0xed, 0x12, 0x88, 0x76, 0x1e, + 0xa2, 0x5d, 0x02, 0xd1, 0x2e, 0x40, 0x34, 0xca, 0x40, 0x1a, 0x29, 0xcc, 0x44, 0xe8, 0x7d, 0x67, + 0x8f, 0x40, 0x13, 0x51, 0xae, 0x39, 0xcc, 0xc2, 0x00, 0x80, 0x2c, 0x65, 0x41, 0x7d, 0xd6, 0x4a, + 0x7d, 0xc7, 0x08, 0xb2, 0x5b, 0xf4, 0x1c, 0xdb, 0xc9, 0x99, 0xd0, 0x58, 0x48, 0x50, 0x12, 0xfb, + 0x54, 0x37, 0x96, 0x07, 0xb0, 0x5d, 0xb1, 0x05, 0x66, 0x17, 0x49, 0xa6, 0xfa, 0x8a, 0x9b, 0x3a, + 0xa3, 0x55, 0x2f, 0x73, 0x53, 0x6a, 0x57, 0x5a, 0x6e, 0x5c, 0x7d, 0x65, 0xe0, 0xe8, 0xb2, 0x38, + 0x50, 0x63, 0xbd, 0x66, 0x63, 0x90, 0xd9, 0x68, 0xd3, 0x34, 0xcb, 0x09, 0xea, 0x85, 0x71, 0x03, + 0xd6, 0x6f, 0xbc, 0x1b, 0x34, 0xf4, 0xbf, 0xc4, 0x1d, 0xa3, 0x0d, 0xff, 0x43, 0x04, 0x7d, 0x13, + 0x30, 0x88, 0x17, 0x27, 0xf0, 0xe8, 0x18, 0xfe, 0xf1, 0x2f, 0x2d, 0xf8, 0xd0, 0xe4, 0x5f, 0x9a, + 0x06, 0x38, 0xcb, 0x5e, 0xeb, 0x64, 0xd0, 0xee, 0xb4, 0x5a, 0xa0, 0xb3, 0x2f, 0x2f, 0xad, 0x36, + 0xaa, 0xae, 0x84, 0xc8, 0xc4, 0x01, 0xc2, 0x61, 0x69, 0xfa, 0x88, 0x89, 0xa4, 0x06, 0xd5, 0x4e, + 0x57, 0x28, 0xda, 0x22, 0x78, 0xb4, 0x42, 0x0f, 0xfc, 0xc6, 0xd6, 0xb2, 0xf1, 0x45, 0xbf, 0x4a, + 0x6c, 0xee, 0xa7, 0x86, 0xae, 0x6f, 0x19, 0x05, 0xa8, 0x81, 0x69, 0x16, 0xf4, 0x58, 0x7a, 0x02, + 0xd3, 0x68, 0x74, 0xb6, 0x6c, 0x56, 0x91, 0xef, 0x8a, 0x8a, 0xdf, 0x15, 0x61, 0x6e, 0x57, 0x2e, + 0x07, 0x3a, 0xc7, 0xec, 0x62, 0x32, 0x67, 0xe5, 0x93, 0x39, 0x1e, 0xba, 0x78, 0x3c, 0xdb, 0x91, + 0xce, 0x25, 0x21, 0xcc, 0x2a, 0x4d, 0xd4, 0x34, 0x37, 0x5b, 0x61, 0xab, 0x90, 0xdc, 0x08, 0xf9, + 0x04, 0xfa, 0x04, 0x23, 0x58, 0x4e, 0x61, 0x5d, 0x0c, 0x60, 0x87, 0x87, 0x6e, 0xef, 0xdd, 0xf1, + 0x80, 0x5e, 0xdc, 0x10, 0x50, 0x4f, 0xa8, 0xe6, 0xa2, 0x0e, 0xed, 0xb8, 0xfd, 0xd6, 0xbb, 0x01, + 0x7d, 0x0f, 0xf1, 0x81, 0x7c, 0xbc, 0xb9, 0xb8, 0x16, 0x4f, 0x8c, 0x01, 0xc5, 0x2f, 0xf8, 0x9e, + 0x8a, 0xa7, 0xd2, 0xf1, 0x19, 0xdb, 0x88, 0x5b, 0xef, 0x10, 0xef, 0x71, 0x6b, 0x40, 0xcf, 0xdc, + 0xfb, 0x04, 0x07, 0xa5, 0x5c, 0x42, 0xd1, 0x0e, 0x45, 0x32, 0x64, 0x80, 0xe5, 0xf2, 0x01, 0x7d, + 0x95, 0xaa, 0xef, 0x6a, 0xbe, 0xaa, 0x4d, 0x4d, 0x48, 0x2f, 0x7a, 0xed, 0xee, 0x14, 0xb3, 0x09, + 0x65, 0x17, 0x06, 0x5a, 0x9d, 0x0a, 0x14, 0x2a, 0x2e, 0x51, 0x36, 0xbb, 0xc3, 0xc3, 0x69, 0xaf, + 0xf5, 0xf2, 0x22, 0xd8, 0x32, 0x4c, 0x73, 0xca, 0x3f, 0x1b, 0xf8, 0xb2, 0x0d, 0x20, 0xd3, 0x6a, + 0x4b, 0xef, 0xb9, 0x03, 0x25, 0xda, 0x61, 0xed, 0x5a, 0x04, 0x95, 0xc0, 0x3f, 0x96, 0x4e, 0xc8, + 0x5d, 0xa1, 0xda, 0xd9, 0x06, 0x14, 0x3a, 0x94, 0x07, 0x83, 0x92, 0x3b, 0x0d, 0xad, 0xaa, 0xba, + 0x86, 0x64, 0x40, 0x78, 0xd6, 0x70, 0xca, 0x65, 0x95, 0xb8, 0xc3, 0x92, 0x67, 0x2f, 0x2f, 0x4d, + 0x60, 0xd1, 0xd5, 0x5c, 0x6e, 0x15, 0x2e, 0x58, 0x05, 0x8c, 0xdd, 0x69, 0xeb, 0xb9, 0x94, 0xc4, + 0x84, 0x24, 0x47, 0xcb, 0x23, 0xf4, 0x3d, 0x1b, 0x92, 0x8a, 0x7b, 0x93, 0xe3, 0x1b, 0xe4, 0xea, + 0x1d, 0x99, 0x1f, 0x18, 0xeb, 0x4e, 0xee, 0xe1, 0x5a, 0xf3, 0x5e, 0xc0, 0xe9, 0x02, 0xa8, 0xe4, + 0x80, 0x0b, 0x89, 0x4b, 0xb0, 0x05, 0x12, 0x6c, 0x35, 0x0f, 0x80, 0x29, 0x8e, 0xde, 0xf6, 0x39, + 0xfa, 0xa2, 0x0c, 0x72, 0xe2, 0xc6, 0x81, 0xa6, 0x1c, 0x79, 0x32, 0x10, 0xc2, 0xe9, 0xa4, 0xc2, + 0xe4, 0x28, 0x26, 0xce, 0x0c, 0x70, 0x54, 0xe9, 0xe3, 0x96, 0xad, 0xe6, 0x39, 0xd8, 0xb2, 0xd2, + 0xa6, 0x0e, 0x4c, 0x80, 0x2f, 0x32, 0xf8, 0x9f, 0x72, 0xa9, 0x7c, 0xba, 0x2e, 0x4a, 0x45, 0x57, + 0x8b, 0x24, 0x6d, 0x5a, 0xc2, 0xfa, 0xdb, 0xb8, 0x0d, 0xe9, 0x9e, 0x59, 0xef, 0x1f, 0x1a, 0xd1, + 0xff, 0x1d, 0x81, 0x4d, 0xcb, 0xf0, 0x18, 0xc7, 0x38, 0xb4, 0xd9, 0xe0, 0x78, 0xda, 0x7a, 0x62, + 0x7a, 0x65, 0x59, 0x4a, 0x82, 0xc7, 0xda, 0xc2, 0x03, 0xc5, 0x41, 0x0b, 0xc5, 0x5b, 0x3e, 0x0e, + 0xbc, 0xdd, 0xb6, 0xf7, 0xc8, 0x58, 0xbe, 0xf0, 0x1e, 0x20, 0x3d, 0x63, 0x13, 0x02, 0xa5, 0x35, + 0x56, 0xac, 0x1d, 0x7a, 0x0b, 0xb9, 0x24, 0x78, 0xa3, 0x09, 0x51, 0x42, 0x3f, 0xb6, 0xf0, 0x95, + 0x71, 0xa2, 0xff, 0xf7, 0x7f, 0xa9, 0x69, 0xb6, 0x34, 0xd9, 0x8f, 0x6f, 0xc2, 0x9e, 0xd0, 0x65, + 0xf0, 0x16, 0x56, 0x87, 0xae, 0xd1, 0x71, 0x84, 0x60, 0xf6, 0xff, 0x58, 0x32, 0x08, 0x95, 0xdc, + 0x93, 0xfa, 0xe1, 0xa9, 0xeb, 0x2a, 0xb4, 0xf6, 0x08, 0x2b, 0xaa, 0x2d, 0xcd, 0x30, 0xf1, 0xa5, + 0x99, 0x7b, 0x5d, 0x72, 0xbf, 0x1a, 0xa2, 0x33, 0xdc, 0x98, 0xeb, 0xe6, 0x24, 0xb9, 0x63, 0x0a, + 0x5e, 0x2b, 0xc3, 0xb5, 0x85, 0xa9, 0x6b, 0x0f, 0xd8, 0x5e, 0x03, 0xf4, 0x19, 0x99, 0x60, 0xab, + 0x24, 0x9f, 0x99, 0xc1, 0xae, 0x92, 0xdc, 0x2f, 0x7d, 0x95, 0x14, 0x41, 0x67, 0x50, 0x41, 0xcc, + 0x64, 0x15, 0x83, 0x05, 0xd1, 0x2c, 0x29, 0x88, 0x66, 0xea, 0x2b, 0x2e, 0x00, 0x02, 0xad, 0xc9, + 0x9b, 0x0d, 0xdd, 0x92, 0xc1, 0x49, 0x35, 0x35, 0x4b, 0xaa, 0x29, 0x41, 0x43, 0x71, 0xcd, 0x3f, + 0x55, 0xf4, 0xa8, 0xa2, 0xe4, 0x79, 0xe6, 0x33, 0x40, 0x82, 0x10, 0x35, 0x35, 0xf1, 0xc5, 0xf1, + 0x40, 0x2c, 0x41, 0x26, 0x69, 0xdb, 0x77, 0xfd, 0xd0, 0xa4, 0xdf, 0x4d, 0xa7, 0x53, 0xda, 0x4d, + 0x6b, 0xa4, 0x74, 0x60, 0xb3, 0x99, 0x8d, 0x3b, 0x32, 0x72, 0x1d, 0x82, 0x7d, 0x3c, 0x27, 0x15, + 0xe0, 0x2c, 0xa9, 0x00, 0x67, 0x49, 0x05, 0x38, 0x4b, 0x2a, 0xc0, 0x99, 0xec, 0x10, 0x04, 0x5b, + 0x1d, 0x82, 0x20, 0xd7, 0x21, 0xc0, 0x25, 0x9a, 0x9a, 0x9f, 0xbf, 0x74, 0x73, 0xad, 0x82, 0xd3, + 0x30, 0xb4, 0x56, 0x35, 0x27, 0xe2, 0x7f, 0x93, 0x12, 0x5f, 0xc5, 0x45, 0xbe, 0x87, 0x45, 0xbe, + 0xef, 0xc9, 0x56, 0x82, 0x5c, 0xe9, 0x7b, 0x58, 0xe9, 0x69, 0x2d, 0x58, 0x46, 0x73, 0x09, 0xfa, + 0xf9, 0xfe, 0x8b, 0x2a, 0x0b, 0x60, 0x1d, 0xca, 0xdf, 0x20, 0x5f, 0xfe, 0x02, 0x15, 0xe7, 0xc0, + 0xfc, 0x26, 0xe8, 0xae, 0x80, 0x93, 0xd7, 0xca, 0xe0, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, + 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0x22, 0x84, 0x55, 0xae, + 0x0c, 0x5e, 0x95, 0x96, 0xc1, 0x97, 0xa5, 0x4c, 0xbc, 0xb5, 0x0c, 0xbe, 0xdc, 0x57, 0x06, 0x0b, + 0xe9, 0x7f, 0xdb, 0x92, 0x7e, 0xf6, 0x44, 0xca, 0x2d, 0xa5, 0x93, 0xbd, 0xe3, 0x9d, 0x98, 0xf5, + 0x7a, 0x2a, 0x1a, 0x36, 0xcc, 0xec, 0xb3, 0x5c, 0xc3, 0x26, 0x28, 0x36, 0x6c, 0x06, 0xdb, 0xca, + 0x06, 0x81, 0x97, 0x76, 0xb6, 0x1e, 0xef, 0x40, 0xd0, 0x6f, 0x36, 0x07, 0xd4, 0x0f, 0x2d, 0x6f, + 0x86, 0x4e, 0x80, 0xeb, 0xe9, 0x7a, 0xcd, 0xdc, 0x88, 0x71, 0x01, 0x5d, 0xec, 0x1a, 0xd6, 0xcd, + 0x77, 0xd6, 0xa1, 0x78, 0xcb, 0xfa, 0xea, 0x9f, 0xfd, 0x2f, 0x2f, 0x2f, 0x22, 0xc8, 0xbb, 0x11, + 0xf7, 0x6d, 0x22, 0xfe, 0x2c, 0x64, 0xfc, 0x91, 0x0f, 0xc1, 0x05, 0x61, 0x49, 0x04, 0x29, 0x42, + 0x1e, 0x93, 0x76, 0x01, 0xe1, 0x4c, 0xb1, 0x32, 0xaa, 0x5b, 0x78, 0x54, 0xb5, 0x7a, 0xd1, 0x5f, + 0x00, 0xd4, 0xc2, 0xb4, 0xaa, 0x17, 0xaa, 0x76, 0xd1, 0xb7, 0xe1, 0x8b, 0x6d, 0xc2, 0xc7, 0x3f, + 0x6f, 0xc6, 0x3d, 0x8c, 0x3c, 0xca, 0x43, 0x15, 0x46, 0x83, 0xbc, 0x05, 0x2d, 0x8c, 0x8b, 0xd8, + 0xbc, 0x3e, 0x93, 0xbb, 0x22, 0x0b, 0xe9, 0xa8, 0xb7, 0x9e, 0x9b, 0xe6, 0xc3, 0x80, 0x82, 0xcc, + 0x14, 0x5a, 0x7d, 0xa8, 0x52, 0x12, 0xcc, 0x57, 0x91, 0x63, 0x5b, 0x6e, 0xe2, 0xd9, 0x17, 0x7a, + 0xa1, 0x2a, 0x8a, 0x35, 0xb1, 0x27, 0x11, 0xd7, 0xb1, 0x14, 0xf8, 0x8b, 0xa1, 0xcb, 0xca, 0x7a, + 0x32, 0xb6, 0xb2, 0x70, 0x3a, 0xb6, 0xec, 0xfb, 0x59, 0xe8, 0x2f, 0xbd, 0x89, 0xf9, 0x15, 0xdd, + 0xb2, 0x15, 0x1e, 0xcd, 0x42, 0x6b, 0xe2, 0x60, 0x27, 0xfe, 0x9d, 0x3e, 0x61, 0x33, 0x8d, 0x7c, + 0xff, 0x2c, 0x5a, 0x0c, 0xc7, 0xfa, 0x40, 0x7c, 0x78, 0x07, 0x49, 0x3c, 0x5f, 0xf1, 0xdc, 0x2a, + 0xda, 0xb6, 0x4d, 0xd7, 0x44, 0x4f, 0x80, 0xd7, 0x3f, 0x68, 0xe4, 0xbb, 0x56, 0xab, 0x95, 0x7d, + 0x27, 0x40, 0xff, 0x07, 0xf5, 0xab, 0x5c, 0x11, 0x36, 0xd9, 0x55, 0x31, 0xd8, 0xfd, 0x2b, 0x2b, + 0x9e, 0xa3, 0x7b, 0x52, 0xb8, 0x53, 0xd5, 0x4e, 0x74, 0x5d, 0x7d, 0x79, 0x11, 0x94, 0x4f, 0xf4, + 0xf2, 0x18, 0x59, 0x82, 0x4f, 0xa8, 0x60, 0x82, 0xcd, 0x7a, 0x2a, 0xc1, 0x66, 0xe8, 0x9b, 0x13, + 0x11, 0xd8, 0x1e, 0xa1, 0x28, 0x8d, 0x7c, 0xaf, 0x20, 0xcc, 0x8c, 0xfe, 0x89, 0xfe, 0x03, 0x36, + 0xe6, 0x01, 0x5d, 0x0d, 0x1b, 0x2c, 0x64, 0xc1, 0x16, 0x7e, 0xb8, 0xa2, 0xd5, 0xac, 0x11, 0x33, + 0xf8, 0x4a, 0x94, 0xde, 0xb8, 0x7f, 0x7e, 0x7b, 0x7b, 0x7d, 0xdb, 0x21, 0xbf, 0xf2, 0x86, 0x8a, + 0x0f, 0x31, 0x19, 0x84, 0x81, 0x2b, 0xb1, 0x1e, 0x1e, 0xf4, 0xea, 0xe3, 0xbe, 0xfa, 0x15, 0xd2, + 0x72, 0xb5, 0x03, 0xf8, 0x74, 0xd1, 0xa8, 0x09, 0x00, 0x42, 0x06, 0x71, 0x1e, 0x14, 0xe7, 0x26, + 0xe7, 0xdd, 0x66, 0x8e, 0xab, 0x28, 0x80, 0xb6, 0xfa, 0xf0, 0x17, 0x51, 0xfc, 0xa8, 0xf5, 0x36, + 0xcc, 0xa2, 0xde, 0xe8, 0xce, 0xcd, 0x79, 0xbf, 0x3d, 0xc8, 0xa0, 0xe6, 0x6a, 0x67, 0xde, 0xb5, + 0x4c, 0x99, 0xed, 0x8f, 0x79, 0x46, 0xb7, 0x59, 0x76, 0x6b, 0x43, 0x33, 0x5f, 0x71, 0x65, 0xdd, + 0x8d, 0x79, 0xcf, 0xa8, 0xe9, 0x8d, 0xc3, 0xc3, 0x83, 0x31, 0xfc, 0x1b, 0x0e, 0x00, 0xcd, 0xf9, + 0xe8, 0x86, 0xb4, 0x7f, 0xc3, 0xae, 0x24, 0x79, 0x74, 0xe2, 0x39, 0x31, 0x4e, 0xc9, 0xaf, 0xa3, + 0x21, 0x89, 0x96, 0x41, 0xe0, 0xae, 0x68, 0x47, 0xb1, 0xaa, 0xe6, 0x78, 0x40, 0x8d, 0xc6, 0x6f, + 0x84, 0x76, 0x86, 0x03, 0xfa, 0x69, 0xd4, 0x38, 0x31, 0xda, 0x44, 0x7c, 0xa7, 0x30, 0x90, 0x6a, + 0x00, 0x31, 0xc7, 0xff, 0xd1, 0x53, 0x39, 0x0a, 0xfb, 0x6d, 0x1e, 0x64, 0x10, 0x90, 0x94, 0xc4, + 0x3e, 0x9f, 0x36, 0x15, 0xc5, 0xdb, 0x68, 0xf7, 0x64, 0x0d, 0x31, 0x5b, 0xed, 0xdc, 0xa4, 0x0a, + 0x6f, 0x66, 0xf9, 0x51, 0x4c, 0xd8, 0x74, 0x0a, 0x68, 0x22, 0x8d, 0xfc, 0x27, 0xed, 0x9e, 0x57, + 0xcd, 0x91, 0x39, 0x2a, 0x48, 0x62, 0xa4, 0x76, 0x46, 0xda, 0x39, 0x27, 0xec, 0x44, 0x84, 0x79, + 0xfe, 0x72, 0x36, 0x57, 0x7b, 0xe3, 0xb0, 0x9f, 0xb5, 0x8c, 0x0a, 0xcb, 0x6b, 0x15, 0x3a, 0x49, + 0xd9, 0xf3, 0x21, 0xda, 0xdb, 0xb9, 0x78, 0xf9, 0x4d, 0xe8, 0x44, 0x51, 0x5d, 0x4f, 0xa4, 0x24, + 0x2f, 0xee, 0x64, 0xed, 0x4a, 0x13, 0xcd, 0xcc, 0x6d, 0x7b, 0x59, 0x51, 0x7c, 0xee, 0x4d, 0x64, + 0x03, 0x90, 0xf5, 0x8c, 0xa4, 0xa9, 0xa7, 0x77, 0x1f, 0x5e, 0xf3, 0x1f, 0x23, 0x50, 0x2c, 0x76, + 0x04, 0xd1, 0x23, 0xf3, 0x21, 0xd5, 0xd7, 0xfb, 0x10, 0x9b, 0x43, 0xba, 0xa2, 0x68, 0x7f, 0xdd, + 0x57, 0x6d, 0x0d, 0x94, 0x9c, 0x7a, 0xbc, 0x24, 0xf2, 0x44, 0x49, 0x04, 0x95, 0xb9, 0xaa, 0x39, + 0xd1, 0x2f, 0xd6, 0x2f, 0xca, 0x83, 0x3a, 0xd0, 0x3b, 0x0f, 0xd9, 0x54, 0xa1, 0x90, 0xc5, 0x45, + 0x4d, 0xb7, 0xf8, 0xc4, 0xfe, 0xc6, 0x06, 0xb9, 0xb3, 0x64, 0x9b, 0x07, 0xd2, 0xbb, 0xd1, 0x1d, + 0x24, 0x77, 0x8e, 0x19, 0xa7, 0x89, 0xdc, 0x54, 0x39, 0x50, 0xa0, 0x02, 0x81, 0x68, 0xe5, 0xf4, + 0x31, 0xad, 0x1a, 0xbe, 0xbc, 0x1c, 0x89, 0xef, 0xa0, 0xcc, 0x8e, 0x9a, 0x74, 0xb4, 0x85, 0xc3, + 0x83, 0xb9, 0xf2, 0xc8, 0x89, 0x00, 0x49, 0x8d, 0xfe, 0xb5, 0x37, 0x71, 0x1e, 0x08, 0xdf, 0x4a, + 0x32, 0x39, 0xfe, 0xfe, 0xef, 0x5e, 0x6f, 0x0e, 0xc5, 0x2f, 0xae, 0x9b, 0xdc, 0x71, 0xee, 0x34, + 0x8e, 0xf5, 0xe0, 0x09, 0xdf, 0x7c, 0xff, 0xec, 0x54, 0xa1, 0x1a, 0x03, 0x10, 0xd1, 0x24, 0x20, + 0x62, 0x2f, 0xf9, 0xf2, 0x0e, 0x5e, 0xac, 0x29, 0x81, 0x42, 0x6e, 0x8e, 0x9e, 0xc1, 0xa4, 0xbf, + 0x5e, 0x28, 0x71, 0x08, 0x12, 0xe1, 0xe8, 0xfc, 0x80, 0xcf, 0x56, 0x96, 0x99, 0x8d, 0x06, 0x25, + 0x62, 0x34, 0x9b, 0xf4, 0xb9, 0x15, 0x3c, 0xf5, 0xea, 0x02, 0x64, 0x1b, 0xb8, 0xa9, 0xd3, 0xfe, + 0xe8, 0x6f, 0xc7, 0x27, 0x46, 0x83, 0xdc, 0x7e, 0x1c, 0x7e, 0xda, 0x03, 0x68, 0xd0, 0xfe, 0xdd, + 0x95, 0x71, 0x62, 0xb4, 0x76, 0xc3, 0x34, 0x5a, 0x14, 0x0a, 0x45, 0xfd, 0xfe, 0xe7, 0xff, 0xd8, + 0x0d, 0xd3, 0x06, 0x82, 0xc8, 0x94, 0x6e, 0xec, 0x81, 0x01, 0x5a, 0xa7, 0x37, 0xa7, 0x86, 0xde, + 0xd8, 0x03, 0xd3, 0xa0, 0xfd, 0xcb, 0x9b, 0xf7, 0x27, 0x27, 0xfa, 0xf1, 0x1e, 0xa0, 0x26, 0xed, + 0xdf, 0xbc, 0x3b, 0x31, 0x9a, 0xbb, 0x41, 0x5a, 0xc0, 0xcf, 0xb5, 0x57, 0xbf, 0x9e, 0x4e, 0xf7, + 0xc0, 0x00, 0x3f, 0x37, 0x9f, 0xae, 0xc8, 0xa7, 0xb9, 0x13, 0xb3, 0x3d, 0x60, 0x0d, 0x01, 0x76, + 0x76, 0x76, 0xb7, 0x07, 0xa8, 0x29, 0x80, 0x40, 0xda, 0x7b, 0x80, 0x5a, 0x29, 0xd0, 0x9e, 0x25, + 0x69, 0xb5, 0x53, 0xa8, 0x6a, 0x91, 0xe6, 0xef, 0x4f, 0x4d, 0xfb, 0xe0, 0xe8, 0x68, 0x03, 0xfc, + 0x38, 0x03, 0x7f, 0x9f, 0x83, 0x3f, 0x3a, 0x02, 0x70, 0xb6, 0x85, 0xfd, 0x04, 0x04, 0xf3, 0xfe, + 0xfd, 0x0d, 0x82, 0x13, 0xc5, 0x63, 0xf1, 0xa3, 0x1f, 0xde, 0xab, 0xaf, 0xd1, 0x38, 0x01, 0x49, + 0x9d, 0x1b, 0xb5, 0xa6, 0x51, 0x3e, 0x2c, 0x21, 0x55, 0x3e, 0x16, 0xc4, 0x77, 0x1a, 0xc6, 0xbf, + 0xb0, 0x78, 0xff, 0xe0, 0x5e, 0x5d, 0x68, 0x77, 0x1f, 0x1d, 0x28, 0x7c, 0x45, 0xfb, 0x72, 0x26, + 0x26, 0xb5, 0x7d, 0x61, 0x24, 0xd2, 0xb2, 0xa4, 0x4b, 0xec, 0xc8, 0x00, 0xdd, 0x3f, 0xc3, 0x08, + 0x4c, 0xae, 0xc3, 0x09, 0x0b, 0xb7, 0xec, 0xeb, 0xec, 0x9a, 0x0f, 0xdd, 0x16, 0x31, 0xc8, 0xe0, + 0xe3, 0xed, 0x9e, 0x85, 0x82, 0xe9, 0xee, 0x5d, 0x48, 0x98, 0xd2, 0xf0, 0xf6, 0xe3, 0x1e, 0xab, + 0x82, 0xf1, 0xc3, 0x3d, 0xef, 0x41, 0x0f, 0x86, 0x1f, 0x6f, 0xf7, 0x28, 0x38, 0xf0, 0x37, 0x2c, + 0xbc, 0x4f, 0x85, 0x53, 0x07, 0xb9, 0xe4, 0xc5, 0x03, 0x05, 0x3f, 0x4e, 0xf2, 0x71, 0x4b, 0x40, + 0x3c, 0x3c, 0xf4, 0x47, 0x8f, 0x56, 0xd0, 0x21, 0x45, 0xb1, 0x7c, 0x92, 0x62, 0xd9, 0x16, 0xca, + 0x2f, 0x30, 0x26, 0xa5, 0xba, 0x2d, 0x93, 0x4f, 0xe4, 0x90, 0x0c, 0x77, 0xbd, 0x6f, 0x88, 0xf7, + 0x1f, 0x77, 0xbd, 0x6f, 0x8a, 0xf7, 0xd9, 0xac, 0x4a, 0xe7, 0x84, 0x7f, 0xa2, 0xc0, 0xf2, 0xf8, + 0xdc, 0x82, 0x68, 0x22, 0x38, 0x15, 0x5d, 0x02, 0x18, 0x00, 0x6f, 0xfa, 0xa4, 0x27, 0x36, 0x2d, + 0xf1, 0x40, 0x86, 0x49, 0xbd, 0xe5, 0x62, 0xcc, 0x42, 0x9a, 0x78, 0xd4, 0x91, 0x50, 0x16, 0x1c, + 0xed, 0x46, 0xe2, 0xb3, 0x74, 0xd2, 0x2e, 0x11, 0xc9, 0x3c, 0x25, 0x58, 0x94, 0xc2, 0x6c, 0x31, + 0xb9, 0x42, 0xd5, 0x7e, 0x67, 0xd0, 0x84, 0xc7, 0xef, 0x9f, 0x93, 0x28, 0xea, 0xa8, 0xdc, 0x2f, + 0x73, 0x4a, 0x26, 0xcd, 0x97, 0x01, 0x88, 0xf4, 0x8b, 0x89, 0x5e, 0xba, 0x8b, 0xad, 0xfc, 0x2e, + 0x25, 0x49, 0x57, 0x90, 0xd4, 0xfb, 0x87, 0xde, 0x38, 0x0a, 0xba, 0xdb, 0xcb, 0x63, 0xef, 0xd4, + 0xdf, 0x4b, 0x1e, 0x91, 0x3a, 0x7b, 0x27, 0x75, 0x56, 0x9c, 0x88, 0x9c, 0x81, 0x21, 0x67, 0xc0, + 0xf3, 0xbd, 0x9b, 0xe1, 0x9a, 0x66, 0x2b, 0x95, 0xb1, 0x94, 0x4e, 0x01, 0x79, 0xa5, 0xc0, 0xa1, + 0x10, 0xb6, 0xb4, 0xb1, 0xfa, 0x96, 0xc4, 0x75, 0x29, 0x71, 0xde, 0xd2, 0x7d, 0x8b, 0xc0, 0x75, + 0xc1, 0x5b, 0x41, 0xa6, 0xcd, 0x66, 0x8e, 0x03, 0xc9, 0x75, 0xb4, 0x11, 0xe6, 0x54, 0x5a, 0x2f, + 0x52, 0x36, 0x24, 0x65, 0x49, 0x74, 0x1f, 0x4d, 0x63, 0x07, 0xcd, 0xb7, 0x92, 0x6a, 0xbc, 0x9d, + 0x54, 0xe3, 0x5f, 0x24, 0xd5, 0x7c, 0x3b, 0xa9, 0xe6, 0xbf, 0x48, 0xaa, 0xf5, 0x76, 0x52, 0xad, + 0x7f, 0x8a, 0xd4, 0x86, 0x4e, 0x87, 0x3b, 0x75, 0x1a, 0xb5, 0x2b, 0x63, 0x0c, 0xd2, 0x6b, 0xc1, + 0x58, 0xd2, 0x32, 0x94, 0x0c, 0x6e, 0xe8, 0x3c, 0x6f, 0x8f, 0x8f, 0xfd, 0xa7, 0x84, 0xc9, 0xb3, + 0xdf, 0x92, 0xe9, 0x94, 0x7b, 0xbc, 0x68, 0x2f, 0xf9, 0xd1, 0xbd, 0x13, 0x90, 0xa9, 0x13, 0x42, + 0x12, 0x8f, 0xa9, 0xe2, 0x5e, 0xfb, 0x1a, 0x5d, 0x96, 0x88, 0x03, 0xca, 0x17, 0xba, 0x61, 0x3d, + 0x3b, 0x59, 0x99, 0xee, 0x65, 0x05, 0x72, 0x10, 0x72, 0xcb, 0xa6, 0x21, 0x8b, 0x32, 0x33, 0xe7, + 0x72, 0x99, 0x0a, 0xb2, 0xe5, 0xd3, 0xbf, 0xfd, 0xb0, 0x7f, 0xfa, 0xd6, 0x5e, 0x9a, 0xa7, 0xcb, + 0xd8, 0x3f, 0x82, 0xa2, 0xdd, 0x5e, 0xba, 0x56, 0xcc, 0xc8, 0x23, 0x66, 0x38, 0x78, 0xa2, 0x12, + 0x4a, 0x0e, 0x97, 0x4c, 0x43, 0x7f, 0x81, 0xb1, 0xb8, 0x23, 0xd6, 0x29, 0x1f, 0x1a, 0x4e, 0x3f, + 0x95, 0x85, 0x06, 0x7d, 0x5f, 0x60, 0x30, 0xfa, 0xc3, 0xd0, 0x99, 0xcd, 0x63, 0x16, 0xee, 0x00, + 0x68, 0xf4, 0x4f, 0x6d, 0x1b, 0xcf, 0x96, 0xed, 0xc2, 0xd0, 0xec, 0xbf, 0x5f, 0x5a, 0xee, 0x76, + 0x5c, 0x10, 0xce, 0x34, 0x15, 0x00, 0xff, 0xfb, 0xb5, 0x6b, 0x41, 0xe1, 0x14, 0xb1, 0x30, 0x3e, + 0x9d, 0x7c, 0xb3, 0x6c, 0x48, 0xf5, 0xb1, 0x82, 0x52, 0xe8, 0x98, 0x41, 0xd1, 0xc6, 0x98, 0x37, + 0xa1, 0x9a, 0xaf, 0xae, 0x65, 0x2e, 0xaf, 0xc4, 0x9f, 0x8f, 0x8e, 0x9c, 0x2f, 0xb5, 0x10, 0x8a, + 0xe7, 0x07, 0xa6, 0xa8, 0x1a, 0x7c, 0x93, 0xdd, 0x9a, 0xea, 0x56, 0x8d, 0xe5, 0xf4, 0xb0, 0x0e, + 0x38, 0x32, 0xca, 0x6b, 0xff, 0xa3, 0x6d, 0xf8, 0xfe, 0x76, 0x9b, 0xc0, 0x7b, 0x79, 0xe1, 0xdb, + 0xbb, 0x85, 0x52, 0xe5, 0xec, 0xfa, 0x4a, 0x01, 0x19, 0x42, 0xad, 0xc2, 0x77, 0x33, 0x45, 0x05, + 0xe1, 0xec, 0x29, 0x57, 0x6c, 0x7f, 0xf1, 0x07, 0x3c, 0x84, 0x72, 0x5f, 0x2d, 0x14, 0x2c, 0x50, + 0xaa, 0x60, 0x67, 0x4c, 0xd6, 0x26, 0x85, 0x0a, 0x24, 0x1b, 0xf2, 0x96, 0x3a, 0x84, 0x88, 0x78, + 0xba, 0xcf, 0x26, 0xfe, 0x9e, 0x0b, 0xa4, 0x4f, 0x6f, 0x0a, 0xa4, 0xc7, 0xed, 0x76, 0xb3, 0x9d, + 0x8b, 0xa4, 0x6c, 0xbd, 0x61, 0x3f, 0xb9, 0x48, 0x69, 0x52, 0x9a, 0x86, 0xca, 0x37, 0x04, 0xc0, + 0xbf, 0x9f, 0xe5, 0x98, 0xb1, 0xf7, 0x06, 0xc3, 0x4d, 0x2e, 0xbc, 0x75, 0x81, 0xea, 0xa6, 0x45, + 0x4b, 0xbb, 0xfa, 0x53, 0xb9, 0x25, 0xe7, 0x42, 0x26, 0xa5, 0x92, 0xbf, 0xff, 0x7f, 0x79, 0x66, + 0x62, 0x6f, 0xdc, 0x45, 0x48, 0xcb, 0x93, 0x9b, 0x83, 0x42, 0xd3, 0x1c, 0x16, 0xf1, 0x1e, 0xc6, + 0x5e, 0x53, 0xb4, 0xa4, 0xb5, 0x3d, 0xf9, 0xb4, 0xea, 0x24, 0x0d, 0xd3, 0x58, 0x1b, 0xc7, 0x1e, + 0x1a, 0x05, 0xe8, 0xa2, 0x3c, 0x0e, 0x91, 0xd9, 0x0b, 0x98, 0x2a, 0xbe, 0xda, 0x71, 0x6e, 0xb2, + 0xdc, 0x48, 0xc0, 0xb2, 0xd2, 0xe3, 0x68, 0xfa, 0x81, 0x89, 0x3b, 0x5d, 0x0a, 0xfb, 0xec, 0x1d, + 0x19, 0x39, 0xcb, 0x97, 0x24, 0xe1, 0xa1, 0x20, 0xa9, 0xe6, 0x49, 0x46, 0x2c, 0xe6, 0x46, 0xaa, + 0x3e, 0xa3, 0xd3, 0xd8, 0x38, 0x3c, 0xcd, 0x44, 0xdf, 0x1f, 0x0f, 0x67, 0x30, 0x6c, 0xc9, 0xbd, + 0x89, 0x25, 0x95, 0xa5, 0xa4, 0xbb, 0x92, 0x74, 0xe1, 0x50, 0xa9, 0x78, 0x04, 0x04, 0x53, 0x99, + 0x82, 0xa3, 0xd8, 0x3e, 0x5d, 0xd4, 0x2b, 0xf2, 0x52, 0xee, 0x9a, 0x70, 0x34, 0x10, 0xdb, 0x1e, + 0xbd, 0xed, 0xa0, 0x0a, 0x7e, 0x69, 0x18, 0x7b, 0xe2, 0x54, 0x6b, 0xe2, 0x91, 0x38, 0x36, 0x60, + 0x2d, 0xca, 0x37, 0xa7, 0x34, 0xcb, 0xc4, 0xed, 0x87, 0xea, 0x88, 0xef, 0x21, 0xd4, 0x30, 0x76, + 0x9c, 0xcd, 0xad, 0xf0, 0xcc, 0x9f, 0x30, 0x05, 0xbb, 0x4c, 0xfa, 0xa0, 0x75, 0xd2, 0x69, 0xb7, + 0xd5, 0x2a, 0xc8, 0xc9, 0xa9, 0x9a, 0x5f, 0x87, 0xcb, 0x38, 0xf6, 0xf9, 0x01, 0xb7, 0xb5, 0x38, + 0x17, 0x50, 0x6e, 0xd8, 0xdc, 0x68, 0x8f, 0x12, 0xab, 0x85, 0x6a, 0x5d, 0x9a, 0xd2, 0xf7, 0xcf, + 0xd6, 0x7a, 0x2b, 0xfb, 0x48, 0x8c, 0xfd, 0x29, 0x2a, 0x5a, 0x76, 0xff, 0xab, 0x86, 0x24, 0x65, + 0x9c, 0x28, 0x04, 0xb2, 0xef, 0x9f, 0xe9, 0xf0, 0xfc, 0x4d, 0x5c, 0xa7, 0x68, 0xb6, 0x6c, 0x17, + 0x26, 0xa1, 0x9b, 0x66, 0x3c, 0xa0, 0x49, 0xdb, 0x05, 0x8f, 0x38, 0xac, 0xfb, 0xef, 0x65, 0x87, + 0x3f, 0x35, 0x9b, 0xd2, 0xe1, 0x0d, 0x1c, 0xde, 0x28, 0x19, 0x7e, 0xb3, 0x8c, 0xe6, 0x63, 0x2e, + 0xa4, 0xfd, 0x08, 0x9a, 0x88, 0xa0, 0xb9, 0x03, 0x01, 0x71, 0xe4, 0x86, 0xec, 0x7e, 0x1c, 0x2d, + 0xc4, 0xd1, 0x2a, 0xc1, 0x31, 0xe2, 0x87, 0xc1, 0xf6, 0x0f, 0x6e, 0xe3, 0xe0, 0x76, 0x19, 0x03, + 0x17, 0xb7, 0x24, 0x62, 0x5e, 0xe4, 0x87, 0xfb, 0x11, 0x1c, 0x23, 0x82, 0xe3, 0x12, 0x04, 0x77, + 0xfe, 0xf2, 0x35, 0xe2, 0x3f, 0xe1, 0xd8, 0x9f, 0x4a, 0xc6, 0x9e, 0x7a, 0x96, 0xeb, 0xcf, 0xf6, + 0x0f, 0x3e, 0xc1, 0xc1, 0x27, 0x3b, 0x07, 0xef, 0x10, 0x1e, 0x4d, 0x9d, 0x1f, 0x15, 0x48, 0x79, + 0x06, 0x2b, 0x43, 0x03, 0x24, 0x30, 0x30, 0xdf, 0x0e, 0x09, 0x7c, 0xc7, 0x83, 0x54, 0xa7, 0xcb, + 0x75, 0x94, 0x9f, 0xbe, 0xa0, 0x78, 0x45, 0xe1, 0x47, 0xd4, 0xdb, 0x1f, 0xd5, 0x24, 0xaa, 0x1d, + 0x7e, 0xf7, 0xd4, 0xf8, 0xc9, 0x68, 0x77, 0x93, 0x54, 0x1c, 0x9c, 0xa8, 0xdc, 0x93, 0xd8, 0x34, + 0xaf, 0xfc, 0x99, 0xf1, 0x78, 0xe6, 0x8e, 0x1c, 0x74, 0x0a, 0x4a, 0xe1, 0x7a, 0x07, 0x53, 0x5f, + 0x5e, 0x94, 0xe2, 0x05, 0x8f, 0xcd, 0x53, 0x64, 0xe9, 0x65, 0x81, 0x67, 0x74, 0x55, 0xc2, 0x75, + 0x1e, 0x18, 0x98, 0x71, 0x74, 0x21, 0xc0, 0xed, 0xef, 0x8b, 0x26, 0x9e, 0xd3, 0xc3, 0xcd, 0xed, + 0xed, 0xfd, 0x29, 0xee, 0x32, 0xd5, 0x3f, 0xd1, 0x14, 0xf6, 0x8a, 0xbd, 0xdd, 0x83, 0x92, 0x3d, + 0x2f, 0x2f, 0xc1, 0x87, 0x8e, 0x1a, 0x4f, 0x1f, 0xe6, 0xeb, 0x6b, 0xef, 0x0b, 0xf6, 0x74, 0xe5, + 0xa6, 0x55, 0xa4, 0x53, 0x00, 0xd2, 0xb7, 0x91, 0xe0, 0x26, 0xd4, 0x6e, 0x1c, 0x3a, 0xc7, 0x21, + 0x24, 0x1e, 0x39, 0xb9, 0xe3, 0x89, 0x4c, 0x4b, 0x84, 0x9c, 0x09, 0x6f, 0x19, 0xe0, 0x0d, 0x89, + 0x0f, 0x8e, 0x8b, 0x57, 0x4a, 0xe4, 0xc1, 0x33, 0x8f, 0x3d, 0x92, 0xbf, 0x5f, 0x5d, 0xfe, 0x1c, + 0xc7, 0xc1, 0x2d, 0x64, 0x0f, 0x2c, 0x8a, 0xbb, 0xde, 0xee, 0x6b, 0x1b, 0xb9, 0x53, 0x36, 0xd9, + 0x45, 0x88, 0x78, 0xee, 0xe0, 0x81, 0xa1, 0x28, 0xf0, 0x21, 0x46, 0xde, 0xb1, 0xa7, 0x58, 0xe3, + 0x4f, 0x80, 0xcd, 0x78, 0x19, 0xe1, 0x59, 0x08, 0x98, 0xa4, 0x0a, 0xb1, 0x6b, 0xf7, 0x95, 0x8e, + 0x0c, 0x2f, 0xcb, 0x23, 0xc6, 0x43, 0xba, 0x96, 0x7d, 0xaf, 0x1d, 0x24, 0x08, 0xc4, 0x8d, 0x9b, + 0x9b, 0x6b, 0x58, 0x4d, 0x8d, 0xd6, 0xc5, 0x74, 0xe4, 0x86, 0x47, 0xcc, 0x67, 0xf2, 0xc1, 0x0f, + 0x17, 0x78, 0xd8, 0x2b, 0x3d, 0x2c, 0x28, 0xaf, 0xa4, 0x28, 0x14, 0x8f, 0x08, 0xcb, 0x33, 0xab, + 0xfc, 0xb4, 0x30, 0xde, 0x11, 0x89, 0x40, 0x7c, 0x78, 0x4d, 0xc4, 0xab, 0x45, 0x08, 0x13, 0xab, + 0x5a, 0xc9, 0x69, 0xe2, 0x83, 0x8d, 0x0b, 0x37, 0x67, 0xd3, 0x59, 0x2a, 0x3d, 0x2d, 0xee, 0xd2, + 0xe4, 0x25, 0x05, 0x2b, 0x04, 0xc7, 0x0f, 0x71, 0x53, 0x5e, 0x0f, 0x42, 0x39, 0xdf, 0x32, 0x0b, + 0x52, 0xaa, 0x01, 0xcc, 0x84, 0xd3, 0x1b, 0xb0, 0x94, 0xee, 0x40, 0xc1, 0x58, 0x9e, 0x72, 0xa1, + 0x48, 0xfe, 0xd3, 0x31, 0x78, 0xe8, 0x09, 0xc9, 0x99, 0x79, 0xd1, 0x60, 0x68, 0xc6, 0x61, 0xa0, + 0x00, 0xa0, 0x94, 0x28, 0xf3, 0xa5, 0x1b, 0xcb, 0xe9, 0xf3, 0xa3, 0xfd, 0x5c, 0x79, 0x14, 0x8f, + 0x37, 0xf1, 0xe3, 0xda, 0xfc, 0x91, 0xef, 0x90, 0xe0, 0x07, 0xd0, 0xfd, 0x49, 0x66, 0x33, 0xe2, + 0xb4, 0x87, 0xa1, 0xf3, 0x73, 0x1e, 0xc9, 0x1e, 0x03, 0x68, 0x73, 0x37, 0x01, 0xc5, 0x74, 0xa7, + 0x06, 0xd0, 0xe7, 0x96, 0x3d, 0x57, 0x64, 0xec, 0x34, 0xfb, 0xcf, 0x09, 0xa8, 0x21, 0x32, 0x85, + 0x0c, 0x15, 0xab, 0x05, 0x8e, 0x97, 0x3f, 0x3c, 0x52, 0x66, 0x35, 0x5f, 0x79, 0xf5, 0x89, 0xf1, + 0xec, 0x6b, 0xee, 0x54, 0x13, 0x1f, 0xfa, 0xd9, 0xf9, 0xd2, 0xdd, 0xb9, 0x89, 0xe2, 0x15, 0xa0, + 0x51, 0xc8, 0xda, 0xce, 0xcd, 0x9d, 0x22, 0x2c, 0xb7, 0x14, 0xed, 0x2d, 0xc7, 0x4b, 0x45, 0x5e, + 0x55, 0x0e, 0x7a, 0x76, 0xbd, 0x09, 0xea, 0x63, 0xa2, 0xac, 0xbd, 0xe5, 0xf4, 0x29, 0x32, 0x01, + 0x05, 0x7a, 0x39, 0xec, 0xed, 0x87, 0x04, 0x36, 0xb5, 0x5a, 0x58, 0xd3, 0xe9, 0x0e, 0x2e, 0x7e, + 0x2b, 0x03, 0x7e, 0x58, 0xab, 0xeb, 0x64, 0x89, 0x21, 0x3d, 0x02, 0x17, 0x91, 0x26, 0x79, 0x78, + 0x8b, 0x48, 0x3c, 0x4d, 0x57, 0x92, 0x89, 0x35, 0xe4, 0x19, 0x99, 0x14, 0x8e, 0x98, 0xb7, 0x9c, + 0x12, 0x37, 0x33, 0x3e, 0x0a, 0xbc, 0x77, 0x52, 0x7e, 0x25, 0xdf, 0xbb, 0xc5, 0x83, 0x25, 0xbc, + 0x3a, 0x55, 0x93, 0xd3, 0x80, 0x5b, 0xde, 0x9e, 0xe2, 0x49, 0xf7, 0xdd, 0x6a, 0x84, 0x29, 0x19, + 0x92, 0xc5, 0xb5, 0x47, 0x23, 0xe4, 0xcb, 0x8a, 0x97, 0x92, 0x4a, 0xe7, 0x7e, 0x77, 0x47, 0x73, + 0x22, 0xb5, 0x6a, 0x71, 0xbc, 0xe6, 0x5c, 0x39, 0xe1, 0xae, 0xb3, 0x73, 0x17, 0xb7, 0xf9, 0x11, + 0x12, 0x18, 0xa9, 0x95, 0x13, 0xb8, 0xb8, 0x2b, 0x03, 0xe7, 0x3c, 0x09, 0x79, 0x84, 0x0c, 0x12, + 0xcd, 0x5d, 0xc4, 0x6e, 0x2f, 0xb7, 0x46, 0x73, 0xf8, 0xdd, 0xf4, 0x6e, 0xaf, 0x68, 0x61, 0x29, + 0x73, 0x63, 0x20, 0x64, 0x27, 0xb5, 0x82, 0x86, 0x26, 0x6e, 0x4d, 0x4e, 0x23, 0x74, 0xaa, 0x60, + 0xd5, 0x6a, 0x47, 0xde, 0x6f, 0xb9, 0x71, 0x19, 0x1e, 0x03, 0x97, 0x79, 0xa0, 0x45, 0xd0, 0xf6, + 0xf9, 0xad, 0x37, 0xd1, 0x08, 0x3a, 0xa0, 0x29, 0xe4, 0x1d, 0x78, 0x62, 0x32, 0x0e, 0xfd, 0x47, + 0xa8, 0x5e, 0xc8, 0xc4, 0x67, 0x11, 0xde, 0xf3, 0xc1, 0xbd, 0x63, 0x3f, 0x84, 0x44, 0x75, 0xce, + 0xc8, 0x57, 0xee, 0x82, 0xbe, 0x92, 0x20, 0x04, 0xe7, 0x0a, 0x11, 0x05, 0x13, 0x7f, 0x8e, 0x89, + 0xe7, 0xb2, 0x11, 0xbf, 0x2b, 0x93, 0x9d, 0xff, 0xcc, 0xd0, 0x32, 0x01, 0x75, 0x7a, 0x73, 0x41, + 0x9c, 0x3c, 0x52, 0xde, 0x89, 0x25, 0x71, 0x9e, 0xec, 0x0a, 0x5c, 0x55, 0xfe, 0x52, 0xe4, 0x08, + 0xa2, 0x07, 0xc5, 0xd1, 0x1d, 0xf0, 0x99, 0xd2, 0x59, 0xba, 0xbe, 0xcd, 0xaf, 0x61, 0xd4, 0x80, + 0x8f, 0xd8, 0xb7, 0x7d, 0x3c, 0x14, 0xc9, 0xaf, 0x72, 0xea, 0x9a, 0xc2, 0xaf, 0x95, 0x9a, 0x08, + 0xe1, 0x8e, 0x62, 0x3f, 0xb4, 0x66, 0x0c, 0x45, 0x7a, 0x11, 0xb3, 0x05, 0xc6, 0x25, 0xfb, 0x22, + 0x80, 0x2a, 0x04, 0x12, 0x07, 0x01, 0x06, 0xe3, 0x17, 0x01, 0x70, 0x88, 0x9e, 0x94, 0x5c, 0x41, + 0x16, 0x5c, 0x23, 0x52, 0x5a, 0x0c, 0xd3, 0x19, 0xf2, 0x09, 0xcf, 0x18, 0x5c, 0xdc, 0x80, 0x88, + 0xb4, 0x02, 0xc6, 0xa8, 0x88, 0x51, 0xe3, 0xd8, 0x54, 0x15, 0xa1, 0xf8, 0x25, 0x4b, 0x44, 0x3f, + 0xe0, 0x97, 0x47, 0x3b, 0xf5, 0x3a, 0xad, 0xf2, 0xd7, 0x78, 0xe0, 0xa0, 0x9a, 0x5d, 0x00, 0xad, + 0x47, 0xb5, 0x6f, 0xd1, 0x20, 0x30, 0x1b, 0x18, 0x34, 0xd4, 0x75, 0x05, 0x72, 0x22, 0x71, 0x39, + 0xb6, 0xc7, 0x53, 0xab, 0xfe, 0xbf, 0x39, 0x0b, 0x2e, 0xf6, 0x65, 0xe8, 0x42, 0xb0, 0x16, 0xa7, + 0x2a, 0x22, 0xdc, 0xb0, 0x07, 0x40, 0x0e, 0xd0, 0xab, 0x8b, 0x5b, 0xc1, 0x78, 0x97, 0x92, 0x48, + 0xf7, 0x4f, 0x47, 0xbc, 0x1f, 0x07, 0x46, 0xb4, 0xa8, 0xf0, 0x82, 0x1c, 0x3f, 0xfd, 0x11, 0xa5, + 0x1d, 0xbd, 0x29, 0x14, 0x16, 0x2c, 0x9e, 0xfb, 0xd8, 0x17, 0xf5, 0x23, 0xbc, 0xac, 0x9b, 0x6b, + 0x96, 0xc4, 0x3e, 0x88, 0xe3, 0xb1, 0xf8, 0x6c, 0xce, 0xdc, 0x60, 0x48, 0xfb, 0x95, 0x9e, 0x48, + 0xcd, 0x65, 0xb5, 0x22, 0xbe, 0xe4, 0x72, 0xbd, 0x9f, 0x91, 0xec, 0xa0, 0x57, 0x17, 0x2f, 0xd2, + 0x66, 0x7a, 0xd9, 0x98, 0x4a, 0x3a, 0x68, 0x88, 0x83, 0x86, 0x10, 0xb2, 0xb3, 0x71, 0x85, 0x11, + 0xf2, 0x92, 0x40, 0x7f, 0x64, 0x3d, 0xb0, 0x0c, 0x64, 0x9e, 0x14, 0xde, 0xbd, 0x79, 0xa3, 0x5f, + 0xc1, 0xf5, 0x39, 0xb4, 0x16, 0x41, 0x97, 0xfc, 0x6c, 0x85, 0x78, 0x0c, 0x05, 0xf5, 0x3c, 0x5e, + 0x06, 0x20, 0x9c, 0x06, 0xe4, 0xd3, 0xb1, 0xe5, 0x26, 0x7d, 0xce, 0xb4, 0xef, 0xea, 0xda, 0x9c, + 0x55, 0xd9, 0xc2, 0xcf, 0xfa, 0xc4, 0x36, 0x4e, 0x33, 0x4b, 0x4c, 0x7b, 0x4e, 0xff, 0x96, 0x81, + 0x3b, 0x04, 0x4b, 0x9c, 0x80, 0x9a, 0x06, 0xfe, 0x23, 0xe8, 0x83, 0x3c, 0x47, 0x81, 0x07, 0x21, + 0xc6, 0xa2, 0xbb, 0x17, 0xc5, 0xa2, 0x8b, 0xd8, 0xe9, 0xd5, 0x1d, 0x31, 0x6e, 0x2c, 0x7b, 0xbc, + 0x15, 0xb1, 0x55, 0xb3, 0xcc, 0xa8, 0xe1, 0xc1, 0x93, 0x62, 0x0f, 0x98, 0x1f, 0x79, 0x90, 0xcd, + 0x84, 0x94, 0x72, 0xe5, 0xdc, 0xc3, 0x42, 0x8a, 0x58, 0x4b, 0x48, 0x76, 0x41, 0xcf, 0x6d, 0x49, + 0xcb, 0x63, 0x51, 0x44, 0x5c, 0xbc, 0x76, 0xc9, 0xc2, 0x57, 0x9a, 0xc4, 0xa7, 0x43, 0x26, 0x45, + 0x2d, 0xeb, 0x45, 0x79, 0xf9, 0x44, 0xf4, 0x8a, 0xf8, 0xdd, 0x14, 0x41, 0x35, 0xe9, 0x9e, 0xe2, + 0x85, 0x9f, 0xfe, 0x95, 0xb8, 0xec, 0x4d, 0xce, 0x96, 0x61, 0x08, 0xfa, 0x9f, 0xd2, 0x90, 0x57, + 0xbc, 0xaf, 0x4e, 0xe9, 0x46, 0xb5, 0xba, 0xd1, 0x6c, 0x6a, 0xb4, 0xb3, 0xa6, 0x97, 0xae, 0xeb, + 0x9b, 0x5d, 0xa5, 0xb4, 0xe1, 0xd4, 0xaf, 0x90, 0xc5, 0x69, 0x91, 0x7c, 0x76, 0x89, 0x21, 0xad, + 0x2c, 0xb0, 0xc9, 0xd4, 0x11, 0x47, 0x83, 0xba, 0xc5, 0xcd, 0xbb, 0xca, 0xe1, 0x77, 0xef, 0x4e, + 0x4e, 0x4e, 0xba, 0xe4, 0xdf, 0xfd, 0x65, 0x58, 0x5c, 0x19, 0xd0, 0xe0, 0x07, 0x6c, 0x09, 0x90, + 0x39, 0x48, 0x8c, 0xd8, 0x62, 0x22, 0x35, 0x2e, 0xd5, 0x3b, 0x9f, 0x80, 0x49, 0xc1, 0x7b, 0xc6, + 0x5d, 0x59, 0x64, 0x4d, 0x99, 0x70, 0x60, 0x2b, 0xc4, 0xc2, 0xb5, 0x46, 0x43, 0xc0, 0x40, 0x38, + 0x80, 0x65, 0x84, 0x70, 0xa0, 0xa8, 0xc4, 0x46, 0x79, 0x45, 0xfc, 0x5d, 0x65, 0x01, 0x29, 0x94, + 0x03, 0x10, 0x92, 0xaa, 0xe3, 0x7d, 0x63, 0xf2, 0x62, 0x2b, 0x16, 0x40, 0x11, 0xb1, 0xbc, 0x09, + 0x78, 0xd8, 0x29, 0x0c, 0x3e, 0xc8, 0x5a, 0x44, 0xa0, 0x4a, 0x95, 0xd3, 0x64, 0x31, 0x2d, 0x17, + 0xd8, 0xe4, 0xab, 0x18, 0xe5, 0xd7, 0x35, 0xf6, 0xb1, 0x7d, 0xb8, 0x02, 0x91, 0xfa, 0x11, 0xbf, + 0x2f, 0x86, 0x3c, 0x72, 0x30, 0xc1, 0xfd, 0xdf, 0x18, 0x0b, 0x88, 0x15, 0x93, 0x43, 0x48, 0xe1, + 0x8c, 0x53, 0xe2, 0x4c, 0x05, 0x07, 0x78, 0xba, 0x89, 0x9f, 0x5f, 0x9a, 0x80, 0x60, 0xed, 0x18, + 0x75, 0x13, 0xbb, 0xd8, 0x38, 0x38, 0x3b, 0x40, 0xc4, 0x59, 0xa9, 0x5c, 0xf0, 0x99, 0xf2, 0xdb, + 0x8d, 0xe9, 0x35, 0x33, 0x88, 0x14, 0x2c, 0x84, 0xe2, 0xaf, 0x20, 0x44, 0x4d, 0x3a, 0x3f, 0xe4, + 0x10, 0xaf, 0x3e, 0x7b, 0x33, 0xc1, 0x82, 0x22, 0xf5, 0x82, 0x80, 0xd2, 0xe3, 0x45, 0x63, 0xb0, + 0x8a, 0x65, 0x04, 0xde, 0x30, 0x31, 0x2e, 0xa9, 0x0d, 0x01, 0xfa, 0x90, 0xa5, 0x77, 0xef, 0xf9, + 0x8f, 0x9e, 0xd4, 0x6a, 0x35, 0x33, 0x8e, 0x50, 0xd8, 0xec, 0x83, 0xef, 0xc6, 0x78, 0x67, 0x5a, + 0xb9, 0xc2, 0x93, 0x5c, 0x72, 0x9d, 0xb8, 0x5d, 0x59, 0x04, 0x99, 0x03, 0x09, 0x03, 0x98, 0x5a, + 0xd2, 0x8a, 0xe7, 0xa7, 0xa6, 0x36, 0x74, 0x1b, 0xef, 0x8d, 0x6d, 0xed, 0xdb, 0xe2, 0x46, 0x45, + 0x52, 0xe6, 0x9a, 0x59, 0xc1, 0xdb, 0x07, 0x99, 0xc8, 0x2b, 0x4f, 0x44, 0x69, 0xb7, 0x17, 0xa7, + 0x6a, 0x65, 0xe7, 0xd6, 0x6c, 0x9b, 0x43, 0xb3, 0xe9, 0xd4, 0xb1, 0xf1, 0x4c, 0x1e, 0x51, 0x9a, + 0x08, 0xbf, 0x13, 0x5c, 0x07, 0xd5, 0xc4, 0x03, 0x58, 0x4a, 0x53, 0xdf, 0x03, 0x86, 0x3b, 0x28, + 0x7d, 0x79, 0x5c, 0x4b, 0x31, 0x1a, 0x7b, 0x20, 0xf1, 0xf0, 0x48, 0xe5, 0x8c, 0xd7, 0xbc, 0x25, + 0xbb, 0xc3, 0x05, 0x47, 0x22, 0xee, 0x6d, 0x95, 0xef, 0x75, 0x4b, 0x14, 0xe2, 0xd0, 0x5c, 0x22, + 0x6a, 0x3c, 0xef, 0x06, 0x12, 0x4e, 0x6d, 0x3c, 0x11, 0x2e, 0x2d, 0x6b, 0x48, 0x15, 0x36, 0x7f, + 0xb8, 0x5f, 0x73, 0xad, 0xdd, 0xd6, 0x9d, 0x18, 0x77, 0xb2, 0xdf, 0x96, 0x29, 0x6f, 0x22, 0x77, + 0x27, 0xa7, 0x8a, 0x5e, 0xb4, 0x84, 0x3f, 0xd6, 0xd8, 0x07, 0x26, 0xb8, 0x25, 0x22, 0x7d, 0x34, + 0x4b, 0x54, 0xeb, 0x5a, 0xaa, 0x38, 0xd2, 0xe5, 0x37, 0xfb, 0x95, 0x2d, 0x47, 0xdf, 0xcc, 0xfc, + 0x08, 0x9e, 0x49, 0xe2, 0xbf, 0x3c, 0x21, 0x8e, 0xf2, 0x45, 0x9d, 0x64, 0x5c, 0x79, 0xe7, 0x7f, + 0x47, 0x58, 0x43, 0x4c, 0xd5, 0x5c, 0x74, 0x4b, 0x0b, 0x19, 0x8c, 0xd4, 0xb4, 0x5f, 0x4d, 0x83, + 0x11, 0x49, 0xc6, 0x57, 0xb6, 0x11, 0x1c, 0x95, 0x20, 0x38, 0x92, 0x18, 0x8e, 0x72, 0x11, 0x2f, + 0xe4, 0xfc, 0x5e, 0xf1, 0x73, 0x8c, 0xe4, 0x57, 0x61, 0x4f, 0x95, 0x6c, 0x61, 0x17, 0xa0, 0x03, + 0x7a, 0x12, 0xad, 0xea, 0xb9, 0x78, 0xb5, 0x30, 0x72, 0x61, 0x6c, 0x58, 0xf0, 0xa6, 0xfc, 0x8c, + 0x29, 0xa9, 0x94, 0x76, 0xef, 0x8f, 0xc6, 0x90, 0x8c, 0xdc, 0x77, 0x85, 0x18, 0x0c, 0x1d, 0xc4, + 0xd0, 0x9d, 0x33, 0xf4, 0x42, 0xf0, 0x05, 0x3e, 0x8f, 0x79, 0x66, 0x7f, 0x84, 0x87, 0x50, 0x97, + 0x51, 0xa7, 0xc1, 0xa5, 0x24, 0x64, 0x58, 0x29, 0x90, 0xc8, 0x9d, 0xf9, 0xfc, 0x93, 0x0e, 0x1b, + 0x34, 0x0a, 0xa8, 0x91, 0x70, 0x09, 0xd3, 0xf0, 0x84, 0xd7, 0x1b, 0x3b, 0xae, 0x83, 0xae, 0x38, + 0x24, 0xae, 0x35, 0x83, 0x04, 0x31, 0x5a, 0xb2, 0x88, 0xbb, 0x9c, 0x5f, 0xc1, 0x15, 0xba, 0xdc, + 0x3b, 0x82, 0xa9, 0x93, 0x5c, 0x58, 0x4d, 0x0e, 0x89, 0xf6, 0x4b, 0xce, 0x6f, 0x26, 0x32, 0x41, + 0x67, 0x82, 0x7e, 0x70, 0x8c, 0x31, 0x9a, 0x3d, 0x01, 0x00, 0xd8, 0xb0, 0x5d, 0xf0, 0xcb, 0xa0, + 0x16, 0x95, 0x32, 0xbd, 0xb8, 0xb2, 0xee, 0x19, 0x3a, 0x22, 0x36, 0x5b, 0x24, 0x6e, 0x89, 0x41, + 0x51, 0x22, 0x09, 0xec, 0x8c, 0xbd, 0x49, 0x9c, 0x1c, 0x89, 0xe0, 0x2a, 0xcd, 0x6e, 0xbc, 0x8c, + 0xc4, 0xce, 0x10, 0xcc, 0x77, 0xe2, 0xd8, 0x2c, 0xda, 0x3d, 0x3e, 0xf3, 0x69, 0xa2, 0x1d, 0xc3, + 0x3b, 0x23, 0x32, 0xeb, 0x97, 0xb1, 0x3b, 0x72, 0x64, 0xe4, 0xde, 0xa1, 0xd2, 0x7c, 0x85, 0x2a, + 0xe2, 0x80, 0x10, 0xac, 0xc7, 0x1f, 0x7c, 0x3d, 0xff, 0x58, 0x58, 0x41, 0x80, 0x6b, 0x95, 0xdf, + 0xba, 0x21, 0x49, 0xff, 0xbc, 0x93, 0x3b, 0x53, 0x94, 0x6d, 0x62, 0xbc, 0x26, 0xa3, 0xdd, 0xa6, + 0x93, 0xb4, 0xed, 0x0b, 0xfa, 0xcf, 0x6b, 0x4c, 0xb0, 0x9d, 0xca, 0xb6, 0xf1, 0x94, 0x63, 0xc0, + 0xd6, 0x7d, 0x86, 0x21, 0xd9, 0xff, 0xd8, 0xb4, 0x9d, 0xca, 0x7e, 0x03, 0x4f, 0x67, 0xc6, 0x2b, + 0x4e, 0x39, 0x25, 0xde, 0x66, 0x05, 0xd5, 0xc0, 0x9d, 0x67, 0xdf, 0x9d, 0x64, 0x69, 0x4e, 0x69, + 0x72, 0xb3, 0xb9, 0x9f, 0x67, 0xe8, 0x69, 0x53, 0x1e, 0x0a, 0xcd, 0xcc, 0xeb, 0x21, 0x37, 0x17, + 0xb7, 0x85, 0xde, 0x7e, 0xe5, 0x8d, 0xcd, 0x7d, 0x28, 0x3f, 0xf7, 0xb4, 0xf6, 0xd3, 0xf8, 0x27, + 0xd5, 0x0b, 0xaa, 0xcf, 0x4d, 0xe8, 0x92, 0x23, 0x4b, 0xb7, 0xe0, 0x50, 0x62, 0x46, 0x26, 0x9b, + 0x4d, 0xf9, 0x04, 0xb2, 0x92, 0x6d, 0xb5, 0x35, 0x5a, 0x47, 0xf7, 0x6c, 0x55, 0x38, 0xa2, 0xb7, + 0xbd, 0xdf, 0x26, 0x81, 0xf8, 0x51, 0xe4, 0xdc, 0xe1, 0xbb, 0x4d, 0x74, 0x4d, 0x3c, 0x12, 0xc9, + 0x21, 0xc7, 0xf8, 0xf3, 0x0e, 0x3b, 0xf0, 0xe1, 0xc1, 0xc9, 0xdd, 0x44, 0x2b, 0xd9, 0x2e, 0x5c, + 0xc3, 0x78, 0x8d, 0xb5, 0x63, 0xda, 0x3f, 0x96, 0xf4, 0x78, 0x25, 0xb1, 0x03, 0xd7, 0x4f, 0xb4, + 0xff, 0x8e, 0x83, 0x85, 0x25, 0xb2, 0x48, 0xdb, 0xe3, 0x7d, 0x5e, 0x1a, 0x87, 0x5c, 0x74, 0x25, + 0x11, 0x17, 0xfd, 0x4a, 0x65, 0xa3, 0xf3, 0x2d, 0x1b, 0xdf, 0x99, 0xaa, 0xfe, 0x88, 0x7d, 0x6f, + 0xde, 0x51, 0xf8, 0x71, 0x77, 0xd7, 0xbb, 0x72, 0xca, 0xb3, 0x55, 0xd0, 0x17, 0xb1, 0x8e, 0x98, + 0xf0, 0x2d, 0x2c, 0xc7, 0x4b, 0x5d, 0x0e, 0xfe, 0xf2, 0xc4, 0x2b, 0x39, 0xfe, 0xd5, 0xe8, 0x3a, + 0x4b, 0xe2, 0x45, 0xb5, 0xc7, 0x0f, 0x49, 0x97, 0x27, 0x01, 0x69, 0xd1, 0xbf, 0x81, 0x95, 0xff, + 0xfa, 0x8d, 0xc4, 0xc8, 0xbb, 0x9e, 0xa4, 0x62, 0xd9, 0x36, 0x0b, 0x20, 0xac, 0xd7, 0x38, 0xba, + 0x1d, 0x86, 0x9e, 0x58, 0xc7, 0xc2, 0xcd, 0x95, 0x74, 0x3f, 0xe6, 0x7a, 0xc6, 0xb4, 0xee, 0x84, + 0x02, 0x03, 0x08, 0xe2, 0x57, 0xfe, 0xbc, 0x60, 0xb9, 0xd2, 0x70, 0x2d, 0x52, 0x01, 0x43, 0x9c, + 0x9a, 0xa5, 0xbf, 0xb4, 0xc4, 0x45, 0x3b, 0xb5, 0xc0, 0x67, 0xc2, 0xc7, 0x69, 0x08, 0x41, 0x7f, + 0x52, 0x87, 0x04, 0x85, 0xf7, 0x33, 0x4d, 0xfa, 0x07, 0x2c, 0xb9, 0x77, 0x4f, 0xd1, 0xea, 0xe0, + 0xad, 0xdf, 0xab, 0x5b, 0x42, 0xb6, 0xb7, 0xd8, 0x19, 0x79, 0xfb, 0x26, 0x1b, 0x1e, 0xf0, 0x91, + 0x67, 0x4b, 0x2e, 0xb7, 0xed, 0xb0, 0x92, 0x33, 0x44, 0x22, 0xae, 0xfb, 0xed, 0x5f, 0x96, 0xdb, + 0x2b, 0x9a, 0x14, 0x80, 0x6f, 0xd2, 0x14, 0x6c, 0x07, 0xed, 0xd1, 0x94, 0xdd, 0xfe, 0x17, 0xf2, + 0x1e, 0xf9, 0x93, 0x15, 0x11, 0x4f, 0x82, 0xee, 0xb0, 0x85, 0xcd, 0x63, 0x21, 0xee, 0x63, 0x4e, + 0x31, 0x83, 0x17, 0x59, 0xfd, 0x32, 0xa8, 0xf3, 0x36, 0xdf, 0xa6, 0xa3, 0xdb, 0xe4, 0x7c, 0x28, + 0xf5, 0x49, 0x62, 0xcd, 0x55, 0x27, 0x1b, 0x59, 0xe2, 0x19, 0x64, 0x89, 0xe5, 0xce, 0x72, 0x51, + 0x96, 0x30, 0x66, 0x89, 0xa1, 0xa2, 0x1f, 0xc1, 0x13, 0x35, 0xa9, 0x04, 0x4e, 0x65, 0xc9, 0x86, + 0xcc, 0x41, 0xce, 0x93, 0x27, 0x31, 0xbc, 0xd9, 0x51, 0x6b, 0x6e, 0x53, 0xd0, 0x0b, 0x85, 0x25, + 0x64, 0x99, 0x63, 0xdf, 0x87, 0x54, 0x5d, 0xc7, 0x0a, 0x2e, 0x4a, 0x52, 0xce, 0x28, 0x25, 0x8a, + 0x39, 0xc5, 0x47, 0x6b, 0xb1, 0xb0, 0x88, 0xed, 0x87, 0xa1, 0xac, 0xde, 0x30, 0xc2, 0x8b, 0xfc, + 0xe5, 0x15, 0x19, 0x7d, 0x84, 0xfc, 0x92, 0x28, 0x51, 0x1c, 0xfa, 0x50, 0xa3, 0xa0, 0x37, 0x49, + 0x3b, 0x04, 0x9c, 0x40, 0x65, 0x27, 0xf6, 0x12, 0x61, 0xee, 0xa0, 0x80, 0xed, 0x16, 0xa2, 0xe0, + 0x4f, 0xde, 0x6c, 0x62, 0xc7, 0x7f, 0xc3, 0xac, 0x64, 0x04, 0xc3, 0x88, 0x73, 0x1c, 0x4b, 0xc1, + 0x7d, 0xd8, 0x14, 0x5c, 0x65, 0x43, 0x72, 0x46, 0xf9, 0xda, 0xfc, 0x80, 0x0a, 0x75, 0x07, 0xd9, + 0x5b, 0xe4, 0x20, 0xd3, 0x42, 0xa7, 0xce, 0x42, 0x3f, 0x8a, 0xa6, 0xd6, 0x84, 0xbd, 0x26, 0x97, + 0xbb, 0x0f, 0x42, 0x77, 0x32, 0x04, 0x04, 0x7f, 0x71, 0x6a, 0x83, 0xb9, 0xbb, 0xf7, 0xbb, 0x98, + 0x7b, 0x72, 0xb7, 0x8f, 0xcd, 0xe0, 0x4f, 0xd6, 0x91, 0x45, 0x84, 0x68, 0x65, 0x47, 0xe4, 0xc6, + 0x72, 0x59, 0x0c, 0x51, 0x2d, 0xce, 0xd8, 0x7c, 0x8d, 0xb1, 0x9b, 0x0f, 0xc2, 0x54, 0x90, 0x9b, + 0x09, 0x14, 0xd4, 0x20, 0x3c, 0x3e, 0xb3, 0x44, 0xc9, 0xdf, 0xcb, 0x5f, 0xf7, 0xda, 0x6c, 0x76, + 0xdc, 0x5d, 0xbe, 0xa2, 0x80, 0x3b, 0xc4, 0x08, 0xef, 0xb8, 0x22, 0x24, 0xf8, 0xef, 0xb8, 0xb3, + 0xda, 0x6d, 0x4b, 0x77, 0xc3, 0xd7, 0x15, 0xbd, 0x52, 0x42, 0x08, 0x89, 0x60, 0xc3, 0x72, 0xf3, + 0x10, 0xf3, 0xdd, 0xa7, 0xb2, 0x6c, 0xe0, 0x93, 0xe5, 0xc4, 0xbc, 0x37, 0x01, 0x96, 0x56, 0xd9, + 0x73, 0x92, 0xf9, 0x03, 0x2c, 0xf5, 0x9e, 0x24, 0x00, 0x5f, 0x13, 0x9e, 0x42, 0xa6, 0x40, 0x95, + 0xed, 0xa3, 0x37, 0xa3, 0xa5, 0x17, 0x3a, 0x51, 0x59, 0x00, 0x05, 0xb9, 0xf3, 0x4b, 0x05, 0xf8, + 0x03, 0x39, 0x50, 0xe8, 0x60, 0xa4, 0xe3, 0x8b, 0x51, 0x11, 0x4f, 0x87, 0x16, 0x38, 0x74, 0x9b, + 0xe5, 0x4c, 0xe7, 0xb5, 0xb3, 0x90, 0x67, 0x77, 0xf9, 0x53, 0x95, 0x89, 0x32, 0x3d, 0xda, 0xb4, + 0xff, 0xd1, 0xf5, 0xc7, 0x96, 0xcb, 0x6f, 0x7e, 0x61, 0x8e, 0xcb, 0x6d, 0xb0, 0xec, 0xf4, 0x5f, + 0xe9, 0x61, 0x3f, 0xba, 0x35, 0x2d, 0x5e, 0xb4, 0xbf, 0xdf, 0x95, 0x4c, 0xbd, 0x72, 0x52, 0x3c, + 0x97, 0x6b, 0xbd, 0x72, 0x26, 0x10, 0x85, 0xfc, 0xca, 0xa9, 0x40, 0x94, 0x70, 0xa5, 0xfc, 0x60, + 0x20, 0x2f, 0x3a, 0xd2, 0xe9, 0x81, 0x70, 0xb2, 0x23, 0x8d, 0xaf, 0x94, 0x2c, 0x67, 0xb7, 0xb2, + 0x64, 0x81, 0x31, 0x90, 0xac, 0x83, 0x69, 0x3d, 0x40, 0xe1, 0xe4, 0x82, 0xeb, 0x81, 0xaa, 0x61, + 0x47, 0x14, 0xdd, 0xce, 0x8f, 0x2b, 0x9b, 0x09, 0xf2, 0xd9, 0xb0, 0xe8, 0x61, 0x64, 0x58, 0x83, + 0x15, 0x3f, 0x9d, 0x3c, 0xe0, 0x52, 0x4f, 0xf8, 0xf2, 0x27, 0x66, 0x9d, 0x23, 0x28, 0x66, 0x54, + 0x49, 0x8c, 0x78, 0x58, 0xa6, 0xd4, 0x97, 0xfc, 0xc6, 0x24, 0x51, 0x1e, 0x43, 0x2b, 0xc0, 0x96, + 0xc2, 0xc2, 0x7f, 0x80, 0xc1, 0xea, 0x1e, 0xf5, 0xae, 0x24, 0x43, 0x2c, 0xf7, 0xd1, 0x5a, 0x45, + 0x04, 0x47, 0xaa, 0x7b, 0x96, 0x22, 0x01, 0xf7, 0xf0, 0x84, 0xee, 0x06, 0x74, 0x89, 0xe2, 0xe3, + 0xe2, 0x97, 0x78, 0xee, 0xd2, 0x75, 0xaa, 0x48, 0xc7, 0x10, 0x8a, 0x13, 0xb0, 0xd8, 0x68, 0x63, + 0x6f, 0x13, 0x74, 0xe2, 0x78, 0x8c, 0x46, 0x2a, 0xe7, 0x0f, 0x50, 0x40, 0x54, 0x32, 0x41, 0x7f, + 0xb8, 0x19, 0xbd, 0x5a, 0x10, 0xd9, 0x53, 0x5e, 0x0d, 0xe2, 0xef, 0x1b, 0x92, 0x98, 0x2d, 0x02, + 0x37, 0x4f, 0xbf, 0x52, 0x9e, 0x1b, 0x36, 0x28, 0xf9, 0xe7, 0x73, 0x43, 0x9a, 0x6c, 0x87, 0xa7, + 0xbb, 0xe6, 0x0d, 0x28, 0x5c, 0x78, 0x0a, 0x50, 0x96, 0x17, 0x62, 0x9b, 0xff, 0xff, 0x64, 0xff, + 0xa0, 0x8e, 0x5b, 0x22, 0xb9, 0x32, 0x59, 0xfc, 0x0a, 0x63, 0x42, 0xb6, 0x8e, 0xbb, 0x29, 0xb8, + 0xb5, 0x82, 0x3f, 0xc3, 0xfa, 0x3f, 0x59, 0xcf, 0xc5, 0xe9, 0x96, 0x55, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_dmx.htm, do not edit!! -const uint16_t PAGE_settings_dmx_length = 1328; +const uint16_t PAGE_settings_dmx_length = 1612; const uint8_t PAGE_settings_dmx[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x56, 0x5b, 0x53, 0xe3, 0x36, - 0x14, 0x7e, 0xf7, 0xaf, 0xd0, 0xea, 0x25, 0xf6, 0x10, 0xec, 0x18, 0x9a, 0x6d, 0x09, 0xb6, 0xe9, - 0x26, 0x30, 0x81, 0x19, 0xa0, 0x0c, 0x61, 0xbb, 0xed, 0x94, 0x4e, 0x47, 0xb1, 0x95, 0x58, 0x8b, - 0x2d, 0xb9, 0x92, 0x9c, 0x90, 0xed, 0xf4, 0xbf, 0xf7, 0xc8, 0xb7, 0x04, 0x76, 0xb3, 0xdd, 0x7d, - 0x89, 0x23, 0x9d, 0x9b, 0xce, 0xed, 0x3b, 0x27, 0x78, 0x73, 0xfe, 0xcb, 0xe4, 0xe1, 0xf7, 0xbb, - 0x0b, 0x94, 0xea, 0x3c, 0x8b, 0x02, 0xf3, 0x8b, 0x32, 0xc2, 0x97, 0x21, 0xa6, 0x1c, 0xc3, 0x99, - 0x92, 0x24, 0x0a, 0x72, 0xaa, 0x09, 0xe2, 0x24, 0xa7, 0x21, 0x5e, 0x31, 0xba, 0x2e, 0x84, 0xd4, - 0x18, 0xc5, 0x82, 0x6b, 0xca, 0x75, 0x88, 0xd7, 0x2c, 0xd1, 0x69, 0x38, 0x1c, 0x0c, 0x70, 0x64, - 0xd5, 0xac, 0xd6, 0x2b, 0x5a, 0x42, 0x57, 0x2c, 0xa6, 0x87, 0xd5, 0xa1, 0xcf, 0x38, 0xd3, 0x8c, - 0x64, 0x87, 0x2a, 0x26, 0x19, 0x0d, 0xfd, 0x7e, 0x4e, 0x9e, 0x59, 0x5e, 0xe6, 0xdd, 0xb9, 0x54, - 0x54, 0x56, 0x07, 0x32, 0x87, 0x33, 0x17, 0x18, 0x59, 0xaf, 0x4c, 0x37, 0x0f, 0x8a, 0x53, 0x22, - 0x15, 0x05, 0x23, 0xa5, 0x5e, 0x1c, 0xfe, 0x04, 0xb7, 0x9a, 0xe9, 0x8c, 0x46, 0xe7, 0x37, 0xbf, - 0xa1, 0x19, 0xd5, 0x9a, 0xf1, 0xa5, 0x0a, 0xbc, 0xfa, 0x2e, 0x50, 0xb1, 0x64, 0x85, 0x8e, 0xac, - 0x45, 0xc9, 0x63, 0xcd, 0x04, 0x47, 0xd3, 0xc9, 0xa5, 0x4d, 0x9d, 0x7f, 0x16, 0x42, 0xda, 0x49, - 0x98, 0x88, 0xb8, 0xcc, 0xe1, 0xbd, 0xfd, 0xc4, 0x5d, 0x52, 0x7d, 0x91, 0x51, 0x73, 0x18, 0x6f, - 0xae, 0x12, 0x1b, 0x27, 0xf9, 0x33, 0xd8, 0xe1, 0x9c, 0x66, 0x0a, 0x3b, 0x2e, 0x83, 0x3f, 0xf2, - 0xf2, 0xe1, 0xe6, 0xfa, 0x20, 0xc4, 0xb8, 0xcf, 0xc2, 0xc1, 0x29, 0x0b, 0xe8, 0x29, 0x3b, 0x38, - 0x70, 0xbe, 0x47, 0x32, 0x50, 0x05, 0xe1, 0x88, 0x25, 0xe1, 0xe4, 0x12, 0x1f, 0xd8, 0xec, 0xc0, - 0x77, 0x0e, 0xb0, 0x42, 0xd1, 0xa4, 0xe6, 0x46, 0xdd, 0xdd, 0x08, 0x05, 0x8a, 0x66, 0x34, 0xd6, - 0x75, 0xec, 0xb7, 0xdc, 0x3d, 0x23, 0x8c, 0x27, 0x97, 0xbd, 0xf6, 0x0c, 0xce, 0x8b, 0xa2, 0xf2, - 0x6b, 0x45, 0xb2, 0x92, 0x86, 0x83, 0x08, 0x22, 0x80, 0xb4, 0x40, 0x83, 0xc0, 0xab, 0x09, 0xaf, - 0x18, 0xfc, 0xe8, 0x9e, 0x26, 0x7b, 0x68, 0x47, 0xd1, 0x54, 0x52, 0xca, 0xf7, 0x50, 0x8f, 0xa3, - 0x31, 0x7c, 0xf6, 0x10, 0x7f, 0x88, 0x3e, 0xa4, 0x4c, 0xef, 0xa3, 0x0e, 0xa3, 0x59, 0x5a, 0x6a, - 0x4d, 0x25, 0xb2, 0xc7, 0x92, 0x2d, 0x53, 0xcd, 0xa9, 0x52, 0xce, 0x1e, 0xe6, 0xb7, 0xad, 0x0b, - 0x47, 0xc3, 0xe1, 0x96, 0xc5, 0xab, 0x03, 0x62, 0xfe, 0x40, 0x0c, 0xa3, 0x60, 0x2e, 0x91, 0x17, - 0x3d, 0xf2, 0xde, 0xbf, 0x5d, 0x62, 0xf3, 0x1b, 0x52, 0xd8, 0x9f, 0x25, 0x96, 0x97, 0xf9, 0x24, - 0xed, 0x8e, 0xee, 0x6c, 0xe1, 0x4e, 0x6e, 0xdd, 0xca, 0x90, 0x21, 0x4d, 0x49, 0xf1, 0x92, 0x36, - 0x6d, 0x68, 0x85, 0xa9, 0xb0, 0x2b, 0xae, 0xed, 0x4a, 0xde, 0x89, 0x76, 0xcf, 0x20, 0xe4, 0x9c, - 0x7d, 0x9e, 0xf6, 0x25, 0x29, 0xd6, 0x44, 0x72, 0xa8, 0x3e, 0xc8, 0xba, 0xd2, 0x9b, 0x8c, 0xba, - 0x09, 0x53, 0x45, 0x46, 0x36, 0x21, 0x9e, 0x67, 0x22, 0x7e, 0xc2, 0xa3, 0xef, 0x13, 0xe2, 0x82, - 0xd3, 0xb6, 0xd6, 0xfc, 0x61, 0x55, 0x6c, 0x2c, 0x0a, 0xab, 0x07, 0x9d, 0xd9, 0x9f, 0xab, 0xda, - 0xad, 0xa9, 0x4e, 0x99, 0x28, 0x48, 0xcc, 0x34, 0x28, 0x1b, 0xb8, 0x43, 0xdc, 0xff, 0x8a, 0x90, - 0x63, 0xec, 0x9a, 0xc6, 0x4b, 0xc2, 0x37, 0x03, 0x67, 0xf4, 0xdd, 0xfa, 0xfd, 0x6f, 0xd6, 0xee, - 0x3b, 0xdb, 0x9c, 0xcd, 0x20, 0x61, 0xa6, 0x21, 0xfd, 0xa1, 0xd3, 0x9f, 0x52, 0xfd, 0xab, 0xed, - 0xf4, 0xeb, 0x34, 0x6e, 0x59, 0x2e, 0x81, 0x65, 0xcd, 0x78, 0x22, 0xd6, 0x60, 0x8c, 0x72, 0x1b, - 0xa7, 0x5a, 0x17, 0x6a, 0xe4, 0x79, 0x4b, 0xa6, 0xd3, 0x72, 0xee, 0xc6, 0x22, 0xf7, 0xde, 0x31, - 0x19, 0x0b, 0x21, 0x9e, 0x18, 0xf5, 0x3e, 0x5c, 0x5f, 0x9c, 0x7b, 0x6b, 0xf6, 0xc4, 0x3c, 0x80, - 0x03, 0xbc, 0xa3, 0x67, 0xbc, 0xd5, 0x93, 0x32, 0xa5, 0x85, 0xdc, 0xb8, 0x73, 0x12, 0x3f, 0x81, - 0x29, 0x0b, 0x6a, 0xaa, 0x46, 0x89, 0x06, 0x2d, 0x90, 0x92, 0x71, 0x88, 0xa1, 0xe2, 0x6a, 0x2c, - 0xf1, 0x94, 0xfb, 0x51, 0x9d, 0x15, 0xe1, 0x8f, 0x38, 0xda, 0xe1, 0x34, 0xee, 0x47, 0xd6, 0xcf, - 0x2c, 0x37, 0xc8, 0x84, 0x4a, 0x99, 0xd9, 0xb8, 0x0e, 0x49, 0xac, 0x20, 0x3c, 0xa7, 0xc0, 0x59, - 0x71, 0x04, 0x5e, 0x8d, 0xa4, 0x73, 0x91, 0x6c, 0x90, 0xe0, 0x99, 0x20, 0xd0, 0xc0, 0xe0, 0x36, - 0xe8, 0x82, 0x4a, 0xcd, 0xab, 0x7e, 0x36, 0x7f, 0xfe, 0x52, 0x1d, 0xdc, 0xcd, 0x16, 0x18, 0x01, - 0xce, 0xa5, 0x02, 0x48, 0x85, 0x50, 0x06, 0xf6, 0x12, 0xb6, 0x42, 0x71, 0x46, 0x94, 0x0a, 0xb1, - 0x16, 0x85, 0x14, 0xeb, 0x97, 0x77, 0x29, 0xcd, 0x8a, 0x31, 0x5c, 0xcd, 0xa1, 0xc9, 0xc0, 0x55, - 0x4b, 0x6f, 0x0a, 0xd0, 0x53, 0x9f, 0x30, 0x58, 0x8d, 0x33, 0x16, 0x3f, 0x85, 0xf8, 0xd2, 0x98, - 0x3d, 0x0b, 0xbc, 0x9a, 0x00, 0x4f, 0x03, 0x15, 0x9d, 0xd0, 0x1e, 0x99, 0xb1, 0x91, 0xb1, 0xc6, - 0x10, 0xa9, 0xad, 0xdc, 0x0b, 0x09, 0x55, 0xce, 0x73, 0x06, 0x6f, 0x9c, 0x91, 0x15, 0xdd, 0xb2, - 0xa4, 0xb2, 0x55, 0x9f, 0x1e, 0x45, 0xd6, 0x55, 0x9e, 0x13, 0xb4, 0x60, 0x92, 0x41, 0x97, 0x12, - 0x98, 0x32, 0x9f, 0x0c, 0x12, 0xb0, 0x05, 0x62, 0x1a, 0xa5, 0x44, 0x21, 0x03, 0xdc, 0xaa, 0x2c, - 0x4c, 0x20, 0x01, 0x14, 0x40, 0xe0, 0x4e, 0x8a, 0xe7, 0x0d, 0x7a, 0xcf, 0xd9, 0x8a, 0x42, 0xdb, - 0xa1, 0x80, 0xf1, 0xa2, 0x6c, 0xb0, 0x10, 0xdf, 0xbd, 0xc7, 0xad, 0x83, 0xd0, 0x0a, 0x73, 0x2a, - 0x21, 0x58, 0x8c, 0x43, 0x81, 0xc3, 0x97, 0x3c, 0x87, 0xf8, 0xed, 0xf1, 0xc9, 0xc9, 0x09, 0x46, - 0x92, 0xfe, 0x5d, 0x32, 0x49, 0x93, 0x08, 0x2d, 0xa4, 0xc8, 0xd1, 0x85, 0xef, 0x1e, 0xfb, 0x06, - 0x54, 0x8c, 0x2d, 0x7b, 0x10, 0xb6, 0xe5, 0xe8, 0x00, 0x90, 0xc0, 0xf0, 0x62, 0xd1, 0x03, 0x14, - 0x05, 0x5a, 0xb3, 0x2c, 0x43, 0x0d, 0x09, 0xe9, 0x94, 0x22, 0x28, 0x26, 0x94, 0x10, 0x18, 0x39, - 0xa2, 0xd4, 0xe6, 0x09, 0x8d, 0x02, 0x98, 0x72, 0x0b, 0xb6, 0x2c, 0x65, 0xc5, 0x37, 0xa7, 0x99, - 0x58, 0x07, 0x1e, 0x33, 0x98, 0x14, 0xb5, 0xea, 0x6e, 0xab, 0xa7, 0x21, 0xb1, 0x00, 0xb7, 0x9f, - 0x75, 0x29, 0xa9, 0x42, 0xa0, 0x5f, 0x93, 0x27, 0xca, 0xeb, 0x07, 0x19, 0xcd, 0xb5, 0x1a, 0x54, - 0x90, 0x25, 0x6d, 0xe5, 0xad, 0x66, 0x16, 0x28, 0x54, 0x80, 0x78, 0x23, 0x8b, 0xa0, 0x3f, 0x8c, - 0x73, 0xce, 0xa8, 0x0d, 0xc5, 0x17, 0xfc, 0xf7, 0x1b, 0xff, 0xfd, 0x21, 0x6e, 0x22, 0x35, 0xb9, - 0x85, 0x48, 0xc1, 0x5d, 0x46, 0xf9, 0x12, 0x66, 0x31, 0x3e, 0xaa, 0xd2, 0x0a, 0xfa, 0x97, 0x40, - 0xac, 0xdb, 0x0c, 0x57, 0x46, 0x67, 0x9a, 0x40, 0x09, 0x37, 0x33, 0xeb, 0x7f, 0x6c, 0x58, 0x95, - 0x91, 0xa1, 0x7f, 0xd4, 0x59, 0x99, 0x55, 0x86, 0xb7, 0x46, 0x6a, 0x95, 0x06, 0x17, 0xf8, 0x12, - 0x82, 0xa3, 0xd7, 0x30, 0x52, 0x90, 0xda, 0x35, 0xa1, 0x3a, 0x1b, 0xd6, 0x57, 0x1c, 0xd9, 0xb5, - 0x31, 0x7d, 0x65, 0xe3, 0x0b, 0x8e, 0xa0, 0x3f, 0x50, 0x00, 0x0b, 0x48, 0x2a, 0xe9, 0x22, 0xc4, - 0x1f, 0xc9, 0x8a, 0xd4, 0x9d, 0x3a, 0x82, 0xdd, 0x42, 0x6a, 0xbb, 0x07, 0xd5, 0xa6, 0xea, 0xb1, - 0xe2, 0x0f, 0xfa, 0xa6, 0x16, 0x95, 0xee, 0xc2, 0x5b, 0xa5, 0xbd, 0x7e, 0x21, 0xd1, 0x86, 0xfe, - 0xc8, 0x15, 0x85, 0xe4, 0x24, 0xaf, 0x28, 0x47, 0x03, 0x44, 0x75, 0xec, 0x3e, 0xf2, 0x7b, 0xba, - 0x24, 0x32, 0xc9, 0x60, 0x88, 0x99, 0x0c, 0x9b, 0x42, 0x69, 0x3c, 0x83, 0x94, 0x96, 0x30, 0x49, - 0x1e, 0xf9, 0x0d, 0x64, 0x5a, 0x41, 0x17, 0xe7, 0x42, 0xb2, 0x4f, 0x26, 0x10, 0x2d, 0x43, 0xed, - 0xaa, 0x42, 0x94, 0x28, 0x46, 0xa5, 0xdb, 0x73, 0x4e, 0xa1, 0xbd, 0x18, 0x5f, 0x88, 0xc0, 0x23, - 0x11, 0xfa, 0xb3, 0xaa, 0x21, 0xd3, 0xd9, 0x06, 0x17, 0x76, 0x86, 0x03, 0xaa, 0xd0, 0x24, 0xc4, - 0xb1, 0xc8, 0x84, 0x1c, 0x09, 0x69, 0x7c, 0x3f, 0x6d, 0x26, 0xc5, 0xa8, 0x1a, 0x14, 0x91, 0xf5, - 0xe1, 0xdd, 0xfd, 0xed, 0xd5, 0xed, 0x74, 0x84, 0xda, 0x7d, 0x02, 0xe4, 0x4d, 0xd5, 0x41, 0x79, - 0x42, 0x2d, 0x69, 0xb8, 0xec, 0x12, 0xb0, 0x5b, 0x5d, 0x6e, 0x55, 0x77, 0xdb, 0xfa, 0x8f, 0x09, - 0x2c, 0x62, 0x48, 0x40, 0xeb, 0x65, 0xa4, 0x70, 0xbf, 0x06, 0x12, 0x56, 0x8b, 0x12, 0x3d, 0x18, - 0x6f, 0xc4, 0xa0, 0xac, 0x5b, 0x87, 0xdf, 0x83, 0x15, 0x28, 0x27, 0x05, 0xee, 0x55, 0x3b, 0x19, - 0x24, 0x68, 0x07, 0x3b, 0x64, 0x75, 0xd7, 0x75, 0x45, 0x1d, 0x5c, 0xe8, 0x86, 0x11, 0xb2, 0xf6, - 0x17, 0xde, 0xa0, 0x2b, 0x6e, 0x58, 0x36, 0x9b, 0xa2, 0x98, 0x5d, 0x9b, 0x35, 0xf5, 0xb8, 0xdb, - 0x9e, 0x5a, 0xa4, 0x87, 0xdd, 0x0f, 0x6e, 0x4d, 0x10, 0xad, 0x2a, 0x8a, 0xbb, 0xeb, 0x58, 0x07, - 0x4a, 0xf2, 0x9b, 0x70, 0xef, 0x05, 0xec, 0x59, 0xdf, 0x82, 0x7b, 0x9e, 0xc1, 0x72, 0xf8, 0x18, - 0xb8, 0x37, 0xd8, 0x6f, 0x76, 0xeb, 0xff, 0x00, 0xc6, 0x40, 0x2d, 0xa1, 0x6b, 0x0b, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x57, 0xdb, 0x72, 0xdb, 0x36, + 0x10, 0x7d, 0xd7, 0x57, 0x20, 0x78, 0x88, 0xc9, 0x31, 0x43, 0x4a, 0x4e, 0x95, 0x36, 0x32, 0x49, + 0x37, 0x56, 0x5c, 0xdb, 0x1d, 0xdb, 0xf5, 0x44, 0x49, 0xd3, 0x4e, 0xd3, 0xe9, 0x40, 0xe4, 0x4a, + 0x44, 0x4c, 0x02, 0x2c, 0x00, 0x4a, 0x76, 0x2e, 0xff, 0xde, 0x05, 0x48, 0x5d, 0xec, 0xd8, 0x69, + 0xf2, 0x22, 0x09, 0xd8, 0x2b, 0x76, 0x0f, 0xce, 0x42, 0xf1, 0xa3, 0x97, 0xbf, 0x8d, 0x5f, 0xff, + 0x79, 0x79, 0x44, 0x0a, 0x53, 0x95, 0x69, 0x6c, 0x3f, 0x49, 0xc9, 0xc4, 0x3c, 0xa1, 0x20, 0x28, + 0xae, 0x81, 0xe5, 0x69, 0x5c, 0x81, 0x61, 0x44, 0xb0, 0x0a, 0x12, 0xba, 0xe0, 0xb0, 0xac, 0xa5, + 0x32, 0x94, 0x64, 0x52, 0x18, 0x10, 0x26, 0xa1, 0x4b, 0x9e, 0x9b, 0x22, 0x19, 0xf6, 0xfb, 0x34, + 0xed, 0xb5, 0xaa, 0xbd, 0x3b, 0xb2, 0x1c, 0x16, 0x3c, 0x83, 0x27, 0x6e, 0x11, 0x70, 0xc1, 0x0d, + 0x67, 0xe5, 0x13, 0x9d, 0xb1, 0x12, 0x92, 0x41, 0x50, 0xb1, 0x6b, 0x5e, 0x35, 0xd5, 0x7a, 0xdd, + 0x68, 0x50, 0x6e, 0xc1, 0xa6, 0xb8, 0x16, 0x92, 0x92, 0xde, 0x9d, 0xd0, 0x5d, 0x42, 0x59, 0xc1, + 0x94, 0x06, 0x0c, 0xd2, 0x98, 0xd9, 0x93, 0x9f, 0x70, 0xd7, 0x70, 0x53, 0x42, 0xfa, 0xf2, 0xfc, + 0x0f, 0x32, 0x01, 0x63, 0xb8, 0x98, 0xeb, 0x38, 0x6a, 0xf7, 0x62, 0x9d, 0x29, 0x5e, 0x9b, 0xb4, + 0xb7, 0x60, 0x8a, 0x94, 0x32, 0xe3, 0x75, 0x90, 0x27, 0xb9, 0xcc, 0x9a, 0x0a, 0xb3, 0x0c, 0x70, + 0x23, 0x79, 0x34, 0xd8, 0x9f, 0x35, 0x22, 0x33, 0x5c, 0x0a, 0x72, 0xe2, 0xf9, 0x1f, 0x97, 0x5c, + 0xe4, 0x72, 0x19, 0xca, 0x1a, 0x84, 0x47, 0x0b, 0x63, 0x6a, 0x3d, 0x8a, 0xa2, 0x39, 0x37, 0x45, + 0x33, 0x0d, 0x33, 0x59, 0x45, 0x2f, 0xb8, 0xca, 0xa4, 0x94, 0x57, 0x1c, 0xa2, 0xb7, 0x67, 0x47, + 0x2f, 0xa3, 0x25, 0xbf, 0xe2, 0x11, 0x86, 0xa6, 0xfe, 0xe7, 0xb5, 0x9f, 0xc3, 0x8d, 0x9f, 0x82, + 0x6b, 0x23, 0xd5, 0x4d, 0x38, 0x65, 0xd9, 0x95, 0xb7, 0xa5, 0x72, 0x3c, 0x3e, 0xf1, 0xc0, 0xff, + 0x38, 0x93, 0xca, 0xcb, 0xc3, 0x39, 0x98, 0xa3, 0x12, 0x6c, 0x4a, 0x87, 0x37, 0xa7, 0xb9, 0x47, + 0xf3, 0xea, 0x1a, 0xcf, 0x28, 0x04, 0x94, 0x9a, 0xfa, 0x21, 0xc7, 0x1f, 0xea, 0xe4, 0xf5, 0xf9, + 0xd9, 0x6e, 0x42, 0x69, 0xc0, 0x93, 0xfe, 0x3e, 0x8f, 0x61, 0x9f, 0xef, 0xee, 0xfa, 0xdf, 0x63, + 0x19, 0xeb, 0x9a, 0x09, 0xc2, 0xf3, 0x64, 0x7c, 0x42, 0x77, 0x3d, 0xbe, 0x3b, 0xf0, 0x77, 0xa9, + 0x26, 0xe9, 0xb8, 0xd5, 0x26, 0xeb, 0xbd, 0x11, 0x89, 0x35, 0x94, 0x90, 0x99, 0xb6, 0xef, 0x1b, + 0xed, 0x1d, 0x6b, 0x4c, 0xc7, 0x27, 0x3b, 0xab, 0x35, 0x16, 0x5e, 0xd6, 0xee, 0x30, 0x0b, 0x56, + 0x36, 0x90, 0xf4, 0x53, 0xac, 0x3e, 0x31, 0x92, 0xf4, 0xe3, 0xa8, 0x15, 0xdc, 0x51, 0x18, 0xa4, + 0xaf, 0x20, 0x7f, 0x40, 0xb6, 0x97, 0x1e, 0x2b, 0x00, 0xf1, 0x80, 0xf4, 0x69, 0x7a, 0x88, 0x5f, + 0x0f, 0x08, 0x7f, 0x48, 0xdf, 0x16, 0xdc, 0x3c, 0x24, 0x1d, 0xa6, 0x93, 0xa2, 0x31, 0x06, 0x14, + 0xf1, 0x0e, 0x15, 0x9f, 0x17, 0x46, 0x80, 0xd6, 0xfe, 0x03, 0xca, 0xcf, 0x56, 0x47, 0xd8, 0x1b, + 0x0e, 0x37, 0x2a, 0x51, 0x5b, 0x10, 0xfb, 0x03, 0x6b, 0x98, 0xc6, 0x53, 0x45, 0xa2, 0xf4, 0x9d, + 0xd8, 0xd9, 0x74, 0xb3, 0x3a, 0x67, 0xb5, 0xd7, 0x76, 0x53, 0x34, 0xd5, 0xb8, 0x58, 0x43, 0x2c, + 0x9c, 0xcc, 0xc2, 0xf1, 0x45, 0xe8, 0xbc, 0x07, 0x28, 0x3a, 0x66, 0xf5, 0x6d, 0xd9, 0x71, 0x27, + 0xab, 0x2d, 0xa4, 0x4f, 0x85, 0x69, 0xed, 0xfd, 0x74, 0x7b, 0x8d, 0x46, 0xfe, 0xc1, 0x97, 0xbd, + 0x9e, 0xb3, 0x7a, 0xc9, 0x94, 0x40, 0xb8, 0x63, 0xab, 0xb5, 0xb9, 0x29, 0x21, 0xcc, 0xb9, 0xae, + 0x4b, 0x76, 0x93, 0xd0, 0x29, 0x42, 0xfb, 0x8a, 0x8e, 0xbe, 0xcf, 0x48, 0x48, 0x01, 0x2b, 0x80, + 0x0d, 0x86, 0x0e, 0x61, 0x3c, 0x4d, 0x5c, 0x42, 0x07, 0xf7, 0xa0, 0x74, 0x1b, 0x48, 0x6b, 0x67, + 0xb2, 0x66, 0x19, 0x37, 0xe8, 0xac, 0x1f, 0x0e, 0x69, 0xf0, 0x15, 0x23, 0xdf, 0xc6, 0xb5, 0x37, + 0x3d, 0x4f, 0x1e, 0xf5, 0xfd, 0xd1, 0x77, 0xfb, 0x1f, 0x7c, 0xb3, 0xf7, 0xc1, 0xd6, 0xb5, 0x2b, + 0x25, 0xcb, 0x7f, 0x9d, 0x78, 0x10, 0x18, 0x1b, 0xf5, 0x63, 0x89, 0xdd, 0x96, 0x49, 0x1e, 0x66, + 0x0a, 0x98, 0x81, 0xce, 0x95, 0x47, 0x5b, 0xd2, 0xa0, 0xfe, 0xbe, 0x0c, 0x91, 0x67, 0x5e, 0x18, + 0xa3, 0xf8, 0xb4, 0x31, 0x80, 0x02, 0x95, 0xd1, 0x00, 0xfc, 0xe0, 0xee, 0xbe, 0xb9, 0xa9, 0xb1, + 0x72, 0xd4, 0xc0, 0xb5, 0x89, 0xde, 0xb3, 0x05, 0x5b, 0x39, 0xf8, 0x42, 0x91, 0xe9, 0x1b, 0x81, + 0x2e, 0x8c, 0x8f, 0xc9, 0x4f, 0x65, 0x7e, 0x13, 0xb2, 0x1a, 0x89, 0x26, 0x1f, 0x17, 0xbc, 0xcc, + 0x3d, 0x69, 0xf5, 0x59, 0x9e, 0x1f, 0x2d, 0x30, 0x8b, 0x33, 0x24, 0x0e, 0xc0, 0xeb, 0xeb, 0x51, + 0x9b, 0x33, 0x0d, 0x3c, 0x3f, 0x49, 0x3f, 0x5a, 0xd6, 0x18, 0x0c, 0xfd, 0xe0, 0x18, 0xcc, 0xef, + 0x9e, 0x1f, 0xb4, 0xb0, 0xfb, 0x7c, 0xbf, 0x19, 0x28, 0x25, 0x15, 0x66, 0x8b, 0x66, 0xc8, 0xca, + 0x5a, 0x62, 0xf1, 0x4a, 0x39, 0xf7, 0xe8, 0x91, 0xdd, 0x27, 0x5d, 0x2d, 0x10, 0x07, 0x64, 0xc6, + 0x4b, 0x70, 0xa7, 0x42, 0x1a, 0x56, 0x78, 0xfa, 0xb3, 0x6e, 0x5f, 0xce, 0x2c, 0xd5, 0xcf, 0xf8, + 0xbc, 0x51, 0xcc, 0x15, 0xaf, 0x3d, 0x15, 0x99, 0x31, 0x34, 0xc8, 0xc3, 0x77, 0xe2, 0x54, 0x20, + 0x21, 0xd6, 0x58, 0x43, 0x20, 0x35, 0x9b, 0x03, 0xc9, 0x99, 0x61, 0x8f, 0x90, 0x07, 0xb7, 0xea, + 0x3d, 0xc1, 0x5b, 0x41, 0x6d, 0x80, 0x11, 0x4d, 0x92, 0x8e, 0x12, 0x11, 0x9a, 0xce, 0x5f, 0x58, + 0x2b, 0x69, 0x64, 0x26, 0xcb, 0xc7, 0x8f, 0x3d, 0xc7, 0xc4, 0xfd, 0xc0, 0x73, 0x14, 0x9d, 0x58, + 0x8d, 0x72, 0x82, 0xbc, 0x89, 0x5e, 0x6d, 0x8f, 0x4f, 0x0d, 0x54, 0xb6, 0x0e, 0xd9, 0x69, 0x4d, + 0x7d, 0xff, 0xd3, 0xa7, 0x4e, 0x0d, 0xed, 0xab, 0x1a, 0x13, 0xfe, 0x05, 0xfd, 0x93, 0x73, 0x99, + 0x43, 0x48, 0x2e, 0x4b, 0x60, 0x1a, 0x08, 0x16, 0x02, 0x2f, 0xbc, 0xe5, 0x67, 0x72, 0x7a, 0x89, + 0x29, 0x05, 0xb7, 0x3c, 0xea, 0xdb, 0x1e, 0x03, 0xe7, 0xcd, 0xf7, 0xad, 0x96, 0x43, 0x87, 0x75, + 0x7f, 0xe0, 0xb8, 0x1f, 0xa9, 0x9f, 0xee, 0x3a, 0xf1, 0x88, 0x52, 0xc4, 0x21, 0x32, 0x41, 0x3b, + 0x5f, 0x22, 0x1d, 0xbe, 0xd7, 0x07, 0x75, 0xf2, 0x23, 0x0d, 0x2c, 0xbe, 0x7a, 0x48, 0x0d, 0xed, + 0xa0, 0x89, 0x1d, 0x4c, 0xd3, 0x9f, 0x79, 0x65, 0x27, 0x16, 0x69, 0x54, 0x89, 0xa8, 0x71, 0xc8, + 0xcd, 0x34, 0xa2, 0x78, 0x1f, 0x15, 0x9d, 0x42, 0x1c, 0xb5, 0x13, 0xd6, 0x82, 0x00, 0x9b, 0x61, + 0x23, 0x27, 0x14, 0xab, 0x85, 0xa4, 0x8a, 0x2c, 0x52, 0xf5, 0x1c, 0xd9, 0xda, 0x5f, 0xff, 0x68, + 0xda, 0x4d, 0xe0, 0xc9, 0x8c, 0x12, 0x9c, 0x7f, 0x85, 0x44, 0x49, 0x2d, 0xb5, 0x1d, 0x87, 0x39, + 0x5f, 0x90, 0xac, 0x64, 0x5a, 0x27, 0xd4, 0x48, 0x2c, 0xc7, 0xf2, 0xf6, 0x5e, 0x01, 0x65, 0x7d, + 0x68, 0x87, 0x33, 0x82, 0xcf, 0x60, 0x37, 0x2c, 0x4c, 0x91, 0x1b, 0xdc, 0x82, 0x62, 0xd4, 0xac, + 0xe4, 0xd9, 0x55, 0x42, 0x4f, 0x6c, 0xd8, 0x83, 0x38, 0x6a, 0x05, 0x98, 0x1a, 0xba, 0x48, 0xef, + 0xb7, 0xe9, 0xad, 0x8d, 0x0e, 0xad, 0xd1, 0x21, 0x4e, 0xb5, 0x8d, 0xdd, 0x2d, 0x0b, 0xdd, 0x4c, + 0x2b, 0x8e, 0x39, 0x4e, 0xd8, 0x02, 0x36, 0x2a, 0x85, 0x5a, 0xb9, 0x2f, 0xf6, 0xd2, 0xde, 0x69, + 0x55, 0x31, 0x84, 0x9f, 0xe2, 0xc8, 0xa0, 0x0c, 0x5f, 0x1f, 0x1f, 0x2c, 0x4b, 0xf3, 0x19, 0xe1, + 0x86, 0x14, 0x4c, 0x13, 0x3b, 0xd0, 0x75, 0x53, 0xdb, 0x42, 0x22, 0x61, 0xa3, 0xc1, 0xa5, 0x92, + 0xd7, 0x37, 0xe4, 0x8d, 0xe0, 0x0b, 0x40, 0x76, 0x24, 0x31, 0x17, 0x75, 0xd3, 0xcd, 0x29, 0x7a, + 0xf9, 0x06, 0xb3, 0x6b, 0x43, 0x23, 0x63, 0x4d, 0x41, 0x61, 0xb1, 0xb8, 0x40, 0x1e, 0xc2, 0x6f, + 0x76, 0x9d, 0xd0, 0x67, 0x4f, 0x9f, 0x3f, 0x7f, 0x4e, 0x89, 0x82, 0x7f, 0x1b, 0xae, 0x20, 0x4f, + 0xc9, 0x0c, 0xd1, 0x43, 0x8e, 0x06, 0xe1, 0xd3, 0x81, 0x25, 0x7c, 0x1b, 0xcb, 0xeb, 0x27, 0x2b, + 0xd6, 0xf0, 0x91, 0xe4, 0xb1, 0x6e, 0x3c, 0x7d, 0x8d, 0x03, 0x9c, 0x2c, 0x79, 0x59, 0x92, 0x4e, + 0x44, 0x4c, 0x01, 0xc4, 0x02, 0xcb, 0xa2, 0x9d, 0xc8, 0xc6, 0xd8, 0x14, 0x3a, 0x07, 0xeb, 0xeb, + 0x62, 0xf5, 0xa6, 0x50, 0xca, 0x65, 0x1c, 0x71, 0x3b, 0x2f, 0xd2, 0x95, 0xbb, 0x0b, 0x97, 0x9a, + 0xbd, 0x5a, 0x33, 0x7e, 0x6d, 0x1a, 0x05, 0x9a, 0xa0, 0x7f, 0xc3, 0xae, 0x40, 0xb4, 0x09, 0x59, + 0xcf, 0xad, 0x1b, 0x77, 0xa7, 0x56, 0xf6, 0xbd, 0x6e, 0x4e, 0x6b, 0x52, 0xa3, 0x79, 0x67, 0x4b, + 0x90, 0x0b, 0xec, 0xe1, 0xfc, 0xd1, 0xaa, 0x14, 0xf7, 0x9c, 0x7f, 0xd0, 0x9d, 0x7f, 0x30, 0x5c, + 0xe1, 0x68, 0x7c, 0x81, 0x95, 0xc2, 0xbd, 0x12, 0xc4, 0x1c, 0xdf, 0x68, 0x74, 0xcf, 0x41, 0x01, + 0xfd, 0xcf, 0x51, 0xd8, 0x52, 0x0a, 0x75, 0x41, 0x27, 0x86, 0x21, 0x84, 0xbb, 0xf7, 0xc4, 0xff, + 0xc4, 0xe8, 0xb9, 0x20, 0xc3, 0xc1, 0xde, 0x3a, 0xca, 0xc4, 0x05, 0xde, 0x04, 0x69, 0x5d, 0x5a, + 0xfa, 0x46, 0x6e, 0x99, 0x82, 0x59, 0xe2, 0xb8, 0x27, 0x7a, 0x3b, 0x84, 0x5e, 0xc7, 0xe8, 0x7d, + 0xe5, 0x20, 0xdb, 0x31, 0x8e, 0xef, 0xc4, 0xb8, 0xe7, 0x20, 0xe4, 0x2f, 0x12, 0xe3, 0xc3, 0xb4, + 0x50, 0x30, 0x4b, 0xe8, 0x86, 0x9b, 0x47, 0x2d, 0xd9, 0xed, 0x20, 0xda, 0x74, 0x3b, 0xf2, 0x07, + 0xfd, 0xc0, 0x62, 0x51, 0x9b, 0x75, 0x79, 0x5d, 0xdb, 0xdb, 0x0c, 0x99, 0xb1, 0xf2, 0x77, 0x42, + 0x03, 0x36, 0x27, 0xbf, 0x23, 0xd9, 0xeb, 0x13, 0x30, 0x19, 0x12, 0xe2, 0x2b, 0x98, 0x33, 0x95, + 0x97, 0xf8, 0xc0, 0xb0, 0x1d, 0xb6, 0x40, 0xe9, 0x4e, 0x86, 0x2d, 0x6d, 0x70, 0xe0, 0xbf, 0x13, + 0xe7, 0xd8, 0x69, 0x8d, 0xb7, 0xb8, 0x92, 0x8a, 0x7f, 0xb0, 0x85, 0x58, 0x29, 0xb4, 0x47, 0xd5, + 0x04, 0xe9, 0x8b, 0x83, 0x0a, 0x77, 0xfc, 0x7d, 0xbc, 0xb7, 0x5c, 0xcc, 0x64, 0x1c, 0xb1, 0x94, + 0xfc, 0xed, 0x30, 0x64, 0x6f, 0xb6, 0xa5, 0x85, 0xad, 0x19, 0x4e, 0x1c, 0x9b, 0x24, 0x14, 0x59, + 0x54, 0xaa, 0x11, 0xd2, 0x1b, 0x9e, 0x7d, 0xbf, 0x1b, 0xe8, 0x23, 0x37, 0xcf, 0xd3, 0xde, 0xdb, + 0x17, 0xaf, 0x2e, 0x4e, 0x2f, 0x8e, 0x47, 0x64, 0xf5, 0xd6, 0x43, 0x7b, 0x8b, 0x3a, 0x84, 0x27, + 0x62, 0xc9, 0xe0, 0xe6, 0xba, 0x01, 0xdb, 0xe8, 0x0a, 0x1d, 0xee, 0x36, 0xf8, 0xcf, 0x18, 0x3e, + 0xd0, 0x89, 0xc4, 0xab, 0x57, 0xb2, 0x3a, 0xfc, 0x26, 0x92, 0xd8, 0x59, 0x53, 0x7d, 0x5b, 0xfe, + 0x08, 0x9f, 0xa7, 0x15, 0xab, 0xe9, 0x8e, 0x7b, 0xab, 0x63, 0x83, 0xb6, 0xb8, 0x43, 0xb9, 0xbd, + 0xf5, 0xad, 0x68, 0x8b, 0x8b, 0xb7, 0x61, 0x44, 0x7a, 0x0f, 0x03, 0xaf, 0xbf, 0x06, 0x37, 0xfe, + 0x09, 0x59, 0xd1, 0xe4, 0x99, 0xfd, 0xfb, 0xf2, 0x74, 0xfd, 0xb2, 0x5d, 0xcd, 0x22, 0xfc, 0x4f, + 0x80, 0xbb, 0xb6, 0x88, 0x2d, 0xb9, 0x6e, 0x3f, 0x95, 0xd7, 0xa4, 0xa4, 0xd2, 0xff, 0xe1, 0xca, + 0x2f, 0x69, 0xaf, 0xf7, 0x2d, 0xbc, 0x17, 0x59, 0x2a, 0xc7, 0x2f, 0x4b, 0xf7, 0x96, 0xfb, 0xed, + 0x7f, 0xae, 0xff, 0x00, 0x37, 0x61, 0x9f, 0x05, 0x83, 0x0d, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_ui.htm, do not edit!! -const uint16_t PAGE_settings_ui_length = 2827; +const uint16_t PAGE_settings_ui_length = 3090; const uint8_t PAGE_settings_ui[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xdb, 0x36, - 0x16, 0xfd, 0xae, 0x5f, 0x81, 0x20, 0x19, 0x57, 0x1c, 0x33, 0x94, 0xec, 0x74, 0x67, 0x13, 0x49, - 0x94, 0x37, 0x7e, 0x34, 0x76, 0xc7, 0xdd, 0x64, 0x23, 0x7b, 0xd3, 0x4e, 0xc6, 0xe3, 0x42, 0x24, - 0x24, 0xa1, 0x26, 0x01, 0x96, 0x00, 0x2d, 0x6b, 0x15, 0xfd, 0xf7, 0xbd, 0x17, 0x20, 0x45, 0x4a, - 0x7e, 0xa5, 0x3b, 0xfb, 0xc5, 0x92, 0xf0, 0xb8, 0xef, 0x7b, 0x70, 0x00, 0x0f, 0x5e, 0x1c, 0x7f, - 0x3c, 0xba, 0xf8, 0xed, 0xd3, 0x09, 0x99, 0x99, 0x34, 0x19, 0x0e, 0xca, 0xbf, 0x9c, 0xc5, 0x24, - 0x61, 0x72, 0x1a, 0x52, 0x2e, 0xe9, 0x70, 0x90, 0x72, 0xc3, 0x48, 0x34, 0x63, 0xb9, 0xe6, 0x26, - 0xa4, 0x85, 0x99, 0xbc, 0x7e, 0x5b, 0x8d, 0xb6, 0x24, 0x4b, 0x79, 0x48, 0x6f, 0x05, 0x9f, 0x67, - 0x2a, 0x37, 0x94, 0x44, 0x4a, 0x1a, 0x2e, 0x61, 0xd9, 0x5c, 0xc4, 0x66, 0x16, 0xfe, 0xad, 0xdb, - 0x5d, 0x2f, 0xdd, 0x9a, 0x8a, 0xf9, 0xad, 0x88, 0xf8, 0x6b, 0xfb, 0xc3, 0x17, 0x52, 0x18, 0xc1, - 0x92, 0xd7, 0x3a, 0x62, 0x09, 0x0f, 0xf7, 0xfc, 0x94, 0xdd, 0x89, 0xb4, 0x48, 0xd7, 0xbf, 0x0b, - 0xcd, 0x73, 0xfb, 0x83, 0x8d, 0xe1, 0xb7, 0x54, 0xf4, 0x9e, 0xe6, 0xe1, 0xc0, 0x08, 0x93, 0xf0, - 0xe1, 0xe5, 0x19, 0x19, 0x71, 0x63, 0x84, 0x9c, 0xea, 0x41, 0xc7, 0x0d, 0x0d, 0x74, 0x94, 0x8b, - 0xcc, 0x0c, 0x5b, 0xb7, 0x2c, 0x27, 0xa5, 0xa6, 0xeb, 0x58, 0x57, 0x4a, 0xaf, 0xb5, 0xa9, 0xbf, - 0x16, 0xbe, 0x11, 0x29, 0x57, 0x85, 0xf1, 0xe3, 0x30, 0x56, 0x51, 0x91, 0x82, 0xc5, 0x3e, 0xf8, - 0x6d, 0x42, 0x59, 0x24, 0x89, 0x9f, 0x84, 0xcb, 0x48, 0xa5, 0x59, 0x6f, 0x09, 0x86, 0xf0, 0x44, - 0xf7, 0xe8, 0x68, 0xa6, 0xe6, 0x64, 0x5c, 0x18, 0xa3, 0x24, 0x71, 0x63, 0xd4, 0x8f, 0x54, 0xa2, - 0x72, 0xdd, 0x5b, 0x9e, 0xbf, 0x3f, 0x3c, 0x39, 0xef, 0xd1, 0x23, 0xfc, 0x49, 0x34, 0x4f, 0x78, - 0x64, 0x04, 0x2c, 0x83, 0x68, 0xcc, 0x54, 0x0c, 0xeb, 0x32, 0x11, 0xdd, 0xf0, 0xbc, 0x5a, 0xf0, - 0x65, 0xc6, 0x79, 0x42, 0xfd, 0x7c, 0x3a, 0xee, 0xd1, 0xcf, 0x1f, 0x0e, 0x89, 0x4e, 0x44, 0xcc, - 0x73, 0x58, 0xf6, 0x67, 0x01, 0xeb, 0x7a, 0xf4, 0x5f, 0xf8, 0x41, 0xa2, 0x86, 0x30, 0x85, 0xb3, - 0x33, 0x7e, 0xd7, 0xa3, 0xa7, 0x27, 0xbf, 0x96, 0x33, 0x42, 0x66, 0x85, 0xa1, 0x2b, 0x3f, 0x8b, - 0xd2, 0xb1, 0x32, 0x95, 0x7d, 0x0a, 0xec, 0x4b, 0x89, 0x61, 0x63, 0x32, 0xb6, 0x21, 0x20, 0x9f, - 0x8e, 0x48, 0xaa, 0x62, 0x8e, 0x36, 0xc4, 0xe5, 0xa2, 0x2c, 0xe7, 0xe0, 0x27, 0x39, 0x3b, 0x06, - 0xa1, 0x9a, 0x4f, 0x13, 0x2e, 0x61, 0x02, 0x06, 0xe0, 0x3b, 0x06, 0x81, 0xc0, 0xc0, 0xd4, 0xcc, - 0x60, 0xb3, 0x36, 0x58, 0x1f, 0x6a, 0x42, 0xb4, 0x51, 0x19, 0x39, 0x3f, 0x39, 0xb6, 0xeb, 0xb3, - 0x39, 0x78, 0x72, 0x0a, 0x26, 0xaf, 0x37, 0x64, 0x6a, 0xce, 0x73, 0xb2, 0xc3, 0xd2, 0xac, 0x4f, - 0xc6, 0xb9, 0x98, 0xce, 0x8c, 0xe4, 0x1a, 0xc3, 0xa3, 0x21, 0x6e, 0x27, 0x12, 0x33, 0x49, 0xa2, - 0x42, 0xa3, 0x65, 0x47, 0xa3, 0x11, 0x78, 0x12, 0xb3, 0xc5, 0xbd, 0x99, 0x53, 0x05, 0x61, 0x80, - 0x71, 0x92, 0x08, 0x8d, 0x7e, 0x99, 0x19, 0x4f, 0x79, 0x6f, 0xc9, 0x92, 0x6c, 0xc6, 0x7a, 0xcb, - 0xf1, 0xb4, 0x47, 0x0f, 0x59, 0x74, 0x33, 0xcd, 0x55, 0x21, 0xc1, 0xa6, 0x8c, 0x45, 0xc2, 0x2c, - 0xa8, 0x0f, 0x9e, 0xc2, 0x84, 0xcb, 0x4a, 0x35, 0xb8, 0xf2, 0x61, 0xf5, 0xb2, 0xc8, 0x13, 0x98, - 0xf9, 0x40, 0x44, 0xca, 0xa6, 0x9c, 0x5c, 0x7e, 0x3e, 0x87, 0x88, 0x33, 0x19, 0xab, 0x14, 0x82, - 0x6e, 0x3f, 0x49, 0x35, 0x09, 0x1b, 0x6c, 0x48, 0x4b, 0x2d, 0x1f, 0xc8, 0x3a, 0xc8, 0x74, 0xb5, - 0x5a, 0xf5, 0x27, 0x85, 0x74, 0xe9, 0x9c, 0x9e, 0xc5, 0x6d, 0xee, 0x2d, 0x73, 0x6e, 0x8a, 0x5c, - 0x92, 0x38, 0x98, 0x72, 0x73, 0x92, 0x70, 0x8c, 0xc0, 0xe1, 0xc2, 0x4e, 0xad, 0xd6, 0x4b, 0x85, - 0xfe, 0x38, 0xfe, 0x03, 0x12, 0xd7, 0x58, 0xcf, 0x77, 0x76, 0xa8, 0xb2, 0x83, 0x34, 0x0c, 0xcd, - 0x22, 0xe3, 0x10, 0x57, 0x18, 0x7b, 0xf1, 0x3e, 0xcf, 0xd9, 0x22, 0x10, 0xda, 0x7e, 0x6e, 0x08, - 0x81, 0x24, 0xb5, 0xb9, 0x0f, 0x25, 0xeb, 0x2d, 0x27, 0x2a, 0x6f, 0x63, 0x4d, 0xcb, 0x10, 0x6a, - 0x34, 0xe4, 0x81, 0xce, 0x12, 0x61, 0xda, 0xf4, 0x9a, 0x7a, 0xbe, 0x0a, 0x75, 0xe0, 0x32, 0xe6, - 0xb3, 0xb0, 0xdb, 0x67, 0x03, 0xf5, 0x7a, 0xaf, 0xcf, 0x76, 0x77, 0xbd, 0x25, 0x6e, 0x48, 0x42, - 0xfd, 0x95, 0x5d, 0xf5, 0xe5, 0xd7, 0xe4, 0xea, 0xdb, 0xb7, 0x36, 0x7e, 0x84, 0xcb, 0x95, 0xe7, - 0xcb, 0x10, 0xbf, 0xae, 0xe4, 0x57, 0xfd, 0x15, 0x96, 0x5f, 0x5d, 0x85, 0xa2, 0xa1, 0x16, 0x6a, - 0xe4, 0x42, 0x31, 0x6d, 0x95, 0x87, 0x2f, 0xf6, 0x9c, 0x20, 0x11, 0xa2, 0xfb, 0xd4, 0xe0, 0x04, - 0xf5, 0xfa, 0x22, 0x10, 0x52, 0xf2, 0xfc, 0xf4, 0xe2, 0x97, 0xf3, 0x90, 0xfb, 0x22, 0x88, 0x12, - 0xa6, 0xf5, 0x39, 0x64, 0x2e, 0x60, 0x71, 0xdc, 0x36, 0x07, 0x94, 0xe7, 0x39, 0xc4, 0xaf, 0x47, - 0x51, 0x1a, 0x58, 0x19, 0x25, 0x9c, 0xe5, 0x17, 0xae, 0xe1, 0xda, 0x65, 0xe3, 0x79, 0xb0, 0x4f, - 0x9b, 0x45, 0xc2, 0x03, 0x26, 0x21, 0x11, 0xa8, 0x3c, 0xa4, 0x52, 0x49, 0x28, 0xd6, 0x72, 0x45, - 0x08, 0x21, 0xa8, 0x36, 0xb5, 0x2b, 0x03, 0xdb, 0xde, 0xb2, 0xa9, 0x2f, 0xe7, 0xa9, 0xba, 0xe5, - 0xed, 0x52, 0x11, 0xf8, 0xb6, 0xff, 0xae, 0xdb, 0x6d, 0x44, 0x11, 0xec, 0xf9, 0xcc, 0x23, 0xeb, - 0x0b, 0xa5, 0xe8, 0x38, 0x74, 0xb7, 0x73, 0x49, 0xc3, 0x40, 0x1f, 0x23, 0x2b, 0xb0, 0x51, 0xb8, - 0x1b, 0x54, 0xa1, 0xd9, 0x45, 0xfb, 0xaf, 0xc1, 0x76, 0xea, 0xed, 0x8a, 0xbe, 0x98, 0xb4, 0xeb, - 0x6c, 0x7e, 0x15, 0x57, 0x9e, 0x27, 0x77, 0x76, 0x24, 0x7c, 0x71, 0x7f, 0x03, 0xdb, 0xfb, 0x3b, - 0x3b, 0x6d, 0xbd, 0x1b, 0xfe, 0x3e, 0x98, 0xbd, 0x19, 0xbe, 0x5a, 0xd6, 0xc3, 0xab, 0x41, 0x07, - 0x46, 0x7e, 0xf7, 0x7c, 0x98, 0xac, 0xec, 0x80, 0x49, 0x5f, 0xf9, 0xf2, 0x00, 0x57, 0xf5, 0xac, - 0x31, 0x7d, 0xc0, 0x12, 0x6e, 0x95, 0xb3, 0x50, 0xa1, 0xbe, 0x52, 0xc1, 0x01, 0x0b, 0xed, 0x22, - 0xd8, 0xb2, 0x4b, 0xad, 0x3c, 0x0a, 0x4a, 0xdb, 0x2c, 0x6c, 0x0e, 0x60, 0x10, 0x85, 0x8c, 0xf9, - 0xdd, 0xc7, 0x49, 0xbb, 0x1c, 0xf3, 0x86, 0x5d, 0x0f, 0x21, 0x58, 0xc8, 0x82, 0xf7, 0x5d, 0x11, - 0x54, 0xf5, 0x06, 0xe2, 0xfa, 0x98, 0x47, 0xe5, 0x1d, 0xb4, 0xe9, 0x58, 0x29, 0xc8, 0x8a, 0x84, - 0x72, 0x0c, 0x93, 0x03, 0x37, 0x1a, 0x44, 0x33, 0x0e, 0x50, 0x15, 0xa3, 0x8a, 0xab, 0x5e, 0x39, - 0x76, 0xcb, 0x92, 0x82, 0xdb, 0x11, 0xbf, 0x1c, 0x01, 0x04, 0xb9, 0x15, 0xaa, 0xd0, 0x65, 0xf9, - 0x8f, 0xc4, 0x38, 0x01, 0x18, 0x0e, 0x20, 0x87, 0xb0, 0x5f, 0xb7, 0x69, 0x90, 0x50, 0x0f, 0x2c, - 0x7d, 0x7a, 0x75, 0x5d, 0x40, 0xcc, 0xf3, 0x7a, 0x9b, 0xd6, 0x60, 0x30, 0x5f, 0x2d, 0xd9, 0xaa, - 0x47, 0x06, 0x16, 0xe7, 0x88, 0xcd, 0x77, 0x48, 0xd9, 0x54, 0x90, 0x68, 0x4c, 0x09, 0xfa, 0x13, - 0x52, 0x6b, 0xec, 0x58, 0xdd, 0x51, 0x22, 0xe2, 0xf0, 0xd5, 0x52, 0xad, 0xc8, 0xab, 0x25, 0x9a, - 0x79, 0x40, 0x4b, 0x37, 0x30, 0x87, 0xab, 0xe1, 0x60, 0x9c, 0x0f, 0x7f, 0xef, 0x51, 0x59, 0xa4, - 0x63, 0x9e, 0x3f, 0x2b, 0xbf, 0x12, 0x5e, 0x2e, 0x5f, 0x8b, 0x76, 0x51, 0x70, 0x0a, 0xd6, 0x32, - 0xb5, 0xc9, 0xc1, 0x15, 0x2b, 0xb3, 0x2c, 0x01, 0x2b, 0x15, 0x67, 0x1f, 0x10, 0xfc, 0x84, 0x28, - 0x6f, 0xb5, 0x2a, 0x71, 0x42, 0xd7, 0xa5, 0x3b, 0xe5, 0xf2, 0x27, 0x95, 0xa7, 0xed, 0xb2, 0x34, - 0x4d, 0xdf, 0xac, 0xab, 0xc8, 0x87, 0x5a, 0x4e, 0x3c, 0x9b, 0x0f, 0x0a, 0xcb, 0xa8, 0xd7, 0x08, - 0xa7, 0xa9, 0x25, 0x7c, 0xe0, 0xe6, 0x7c, 0x04, 0x0d, 0xd3, 0xb6, 0x07, 0x5b, 0xa2, 0xe0, 0x5c, - 0x1d, 0xc1, 0x69, 0x02, 0xa0, 0x87, 0xe8, 0x75, 0x66, 0x78, 0xda, 0xa6, 0xf3, 0x84, 0xc7, 0x97, - 0xe2, 0x68, 0x32, 0xa5, 0x9e, 0x07, 0x18, 0x61, 0x45, 0x42, 0x41, 0xe6, 0x39, 0x08, 0x75, 0xed, - 0x19, 0x0b, 0xc0, 0x1b, 0xb6, 0x08, 0xa9, 0x90, 0x90, 0x39, 0x0e, 0xed, 0x6f, 0xf2, 0xc5, 0xd2, - 0x8a, 0xfc, 0x79, 0xf4, 0xf1, 0x9f, 0x41, 0x86, 0x84, 0xc1, 0xaa, 0xf0, 0x56, 0x11, 0xd6, 0x00, - 0x5a, 0x6c, 0xa7, 0x97, 0x2b, 0xff, 0x3b, 0xe4, 0x6d, 0xae, 0xa9, 0x1d, 0xa1, 0x3b, 0x2f, 0xdf, - 0xbd, 0x7d, 0xfb, 0xb6, 0xbf, 0x3e, 0xe7, 0x09, 0xaa, 0x23, 0xa8, 0x0e, 0x7e, 0x91, 0x09, 0x13, - 0x60, 0x7a, 0x40, 0xda, 0x74, 0x97, 0xef, 0x52, 0x8f, 0xae, 0xaa, 0x78, 0x59, 0x4b, 0x9c, 0xd0, - 0x38, 0xa5, 0x75, 0x51, 0xd3, 0x04, 0xcf, 0x26, 0xcc, 0x96, 0xc3, 0x32, 0x3c, 0x61, 0xae, 0xc7, - 0x4c, 0x83, 0x47, 0xae, 0xc8, 0xeb, 0xc0, 0x8d, 0xca, 0xc0, 0x55, 0xc0, 0xcb, 0xc3, 0x38, 0xf8, - 0xb3, 0xe0, 0xf9, 0x62, 0x54, 0x1e, 0xc8, 0xef, 0x93, 0x04, 0xea, 0x1c, 0xd3, 0xea, 0x01, 0xb2, - 0x74, 0xfb, 0x66, 0xc0, 0x4b, 0x18, 0xee, 0x9b, 0x0a, 0x7c, 0x05, 0x34, 0x8d, 0xb9, 0x02, 0xcc, - 0x69, 0xe2, 0x15, 0x76, 0x26, 0x83, 0xb3, 0xb5, 0x4d, 0xa1, 0x90, 0xbd, 0x03, 0x51, 0x59, 0xd7, - 0x13, 0xce, 0x86, 0x3e, 0xc2, 0x3e, 0xf4, 0x74, 0x6c, 0xc9, 0x88, 0x2f, 0x01, 0x3b, 0x95, 0xd4, - 0xd0, 0x1b, 0x41, 0xa2, 0xa6, 0x6d, 0xa8, 0x2f, 0x9c, 0x5b, 0xe1, 0xe1, 0x40, 0x8c, 0x82, 0x82, - 0x97, 0x2b, 0x28, 0x1e, 0xcc, 0xc7, 0x46, 0x76, 0xf5, 0xfd, 0xec, 0xfa, 0x36, 0x57, 0xae, 0x62, - 0xc5, 0x64, 0xe1, 0xa2, 0xe4, 0x55, 0xb1, 0xd7, 0x45, 0xf4, 0x68, 0x7e, 0xca, 0xa4, 0xc2, 0x39, - 0xf4, 0xd4, 0x62, 0x87, 0xdc, 0xff, 0xff, 0x74, 0x6b, 0x76, 0xbb, 0x95, 0x6d, 0x61, 0xb3, 0x5d, - 0x27, 0x2b, 0xb2, 0xa9, 0xda, 0xf0, 0xdf, 0x9d, 0x0a, 0x75, 0x08, 0x3e, 0x41, 0x9a, 0x9e, 0x5e, - 0x90, 0x9a, 0x67, 0x97, 0xb0, 0xe4, 0x0e, 0xd6, 0xd4, 0xe7, 0x23, 0x3d, 0xc2, 0x53, 0x0d, 0x8c, - 0xa2, 0x8d, 0xf3, 0x66, 0xc4, 0xe0, 0x34, 0xf2, 0x96, 0x65, 0x01, 0xf9, 0x71, 0x30, 0x9a, 0x04, - 0xc7, 0xa3, 0x12, 0x44, 0xc3, 0x9a, 0x94, 0xee, 0xec, 0xd8, 0xa9, 0xd1, 0xc5, 0xba, 0x3c, 0xc3, - 0x9a, 0xa6, 0x56, 0x93, 0x97, 0x0f, 0x4c, 0x16, 0xdf, 0xbe, 0xd9, 0x49, 0x5d, 0x8c, 0x53, 0x20, - 0x01, 0x4d, 0xd5, 0xa0, 0x17, 0x3a, 0xfe, 0xdf, 0xa0, 0xb6, 0xd6, 0x13, 0x6e, 0x58, 0xd0, 0xa0, - 0xc2, 0xe1, 0x96, 0xfe, 0x06, 0x35, 0x0e, 0xb7, 0xb4, 0xfb, 0x25, 0x8e, 0xd4, 0xaa, 0x4e, 0x41, - 0xd5, 0x1c, 0xce, 0x1d, 0x35, 0x0f, 0x54, 0xc6, 0x65, 0x9b, 0xce, 0x8c, 0xc9, 0x74, 0xaf, 0xd3, - 0xb9, 0x91, 0x2a, 0xc0, 0x60, 0x01, 0xbe, 0x74, 0x26, 0x9c, 0x01, 0xa4, 0x71, 0xdd, 0xd1, 0x65, - 0x42, 0x3b, 0x2f, 0x2d, 0xbd, 0x17, 0x70, 0x3d, 0xc8, 0x27, 0x0c, 0xee, 0x04, 0xd5, 0x44, 0x33, - 0x80, 0x87, 0xdb, 0xa2, 0xd7, 0xdb, 0xa9, 0x4f, 0xaf, 0x81, 0x10, 0x4f, 0x9a, 0xab, 0x2f, 0xcf, - 0xda, 0x65, 0x59, 0x8a, 0x18, 0x3a, 0x6b, 0xc6, 0x0c, 0x5f, 0xa8, 0xe2, 0x5e, 0xed, 0xdd, 0x03, - 0x83, 0x83, 0xaa, 0x1a, 0x7b, 0xae, 0x70, 0xfb, 0xae, 0xcb, 0xef, 0x01, 0x43, 0x1f, 0x38, 0x5a, - 0x9b, 0x97, 0xe9, 0x7b, 0x40, 0x8a, 0x83, 0x94, 0x1e, 0x8d, 0x59, 0x7e, 0x43, 0x37, 0xc9, 0x9b, - 0xa3, 0x99, 0x87, 0xd3, 0xca, 0xc0, 0x52, 0xec, 0xf4, 0xda, 0xf1, 0xd0, 0x86, 0x94, 0xcd, 0x69, - 0x60, 0xae, 0x15, 0x20, 0x85, 0xeb, 0xb8, 0xc2, 0x15, 0x42, 0x17, 0x69, 0x90, 0xcd, 0x94, 0x51, - 0xba, 0xb3, 0xf7, 0x6e, 0xbf, 0xdb, 0xd9, 0xeb, 0xbe, 0xed, 0xd2, 0xde, 0x13, 0x7b, 0x69, 0xa3, - 0x45, 0x50, 0x53, 0xc3, 0xa0, 0x67, 0xe5, 0x6e, 0x81, 0xe4, 0x86, 0xe4, 0x83, 0xa7, 0xdd, 0x09, - 0x5f, 0x74, 0x7b, 0xcf, 0xad, 0xd8, 0xab, 0x4d, 0x2b, 0xb2, 0x44, 0xb1, 0xf8, 0x27, 0xe8, 0x6e, - 0x24, 0x69, 0x15, 0x72, 0x4a, 0x3e, 0x27, 0xbf, 0xfe, 0x72, 0x7e, 0x0a, 0x66, 0x7e, 0xe6, 0x80, - 0xbc, 0xda, 0x00, 0xe7, 0x84, 0xd3, 0xef, 0xe4, 0x16, 0x28, 0x04, 0x02, 0x29, 0x07, 0xd8, 0x00, - 0x14, 0x81, 0xad, 0xd4, 0x6f, 0x72, 0xc3, 0xba, 0x3d, 0xcd, 0x4c, 0x68, 0x68, 0x62, 0x9d, 0x01, - 0x7e, 0xf2, 0x0b, 0x7e, 0x67, 0x7c, 0x3b, 0xa2, 0x0d, 0x54, 0xa5, 0x1e, 0x86, 0x3f, 0x22, 0x4d, - 0xf4, 0x90, 0x3f, 0xdd, 0x17, 0xeb, 0xd8, 0x6b, 0x43, 0x2e, 0x6f, 0x0a, 0xe6, 0x28, 0x23, 0xba, - 0xf1, 0x5f, 0x54, 0x02, 0x5c, 0x9d, 0x7e, 0xfa, 0x38, 0xba, 0x80, 0x12, 0xed, 0x38, 0x87, 0xa0, - 0x74, 0x1c, 0x63, 0x47, 0x4f, 0xf0, 0x58, 0x3a, 0x66, 0x86, 0xf5, 0xcb, 0x43, 0x5e, 0x06, 0x2c, - 0x83, 0x3d, 0x58, 0x4d, 0x30, 0x4a, 0x7d, 0x1e, 0x4c, 0xc0, 0x7f, 0xfd, 0xb5, 0x7b, 0xe5, 0x3b, - 0x5a, 0x8c, 0x73, 0x00, 0xfd, 0x7c, 0x9d, 0x4a, 0x1f, 0x42, 0xd6, 0x1a, 0x74, 0xca, 0x0b, 0x6e, - 0x79, 0xd1, 0x25, 0x3a, 0x8f, 0xc2, 0xba, 0x3f, 0x3a, 0x3a, 0xf8, 0x43, 0x1f, 0x64, 0xe1, 0x1b, - 0xb8, 0x23, 0xd7, 0x2b, 0xb1, 0x0f, 0x86, 0xad, 0x7f, 0x88, 0x14, 0x6f, 0xcf, 0x04, 0xd2, 0x08, - 0x5c, 0xd9, 0xf6, 0x06, 0x5c, 0xcf, 0xc0, 0x48, 0x58, 0x69, 0x57, 0x00, 0x55, 0x85, 0xdb, 0x1e, - 0xb0, 0x11, 0x15, 0x2f, 0x88, 0x92, 0xe8, 0x42, 0x48, 0xa1, 0xe7, 0x41, 0x16, 0x1c, 0x82, 0x29, - 0x92, 0x17, 0x8a, 0x5f, 0xae, 0xf5, 0xfa, 0x4a, 0x3e, 0x9a, 0xd0, 0xf2, 0x8e, 0x1b, 0xd2, 0x4c, - 0x69, 0xbc, 0x9a, 0xc7, 0xe2, 0xb6, 0xa2, 0x3c, 0x70, 0x67, 0xcc, 0x81, 0x92, 0x6f, 0x8c, 0xcd, - 0x78, 0x92, 0x1d, 0xc2, 0x50, 0x79, 0x8f, 0x6e, 0x39, 0xaa, 0xe5, 0x7e, 0x51, 0xd0, 0x1a, 0x25, - 0x70, 0xf5, 0x0d, 0xe9, 0x29, 0xaa, 0x3d, 0x18, 0x74, 0xdc, 0x04, 0x98, 0x06, 0x22, 0xd6, 0x9b, - 0x1e, 0xd9, 0x73, 0x88, 0x7b, 0x5a, 0x78, 0x47, 0xac, 0xf7, 0x3d, 0xbd, 0xc3, 0x21, 0x35, 0x1d, - 0xe2, 0x67, 0x63, 0x0f, 0x50, 0x37, 0x9d, 0x31, 0x30, 0x0e, 0x3d, 0x76, 0x67, 0x1d, 0xb1, 0x21, - 0x02, 0xc2, 0x69, 0xaf, 0x89, 0xd3, 0x9c, 0x73, 0xd9, 0x2f, 0x91, 0xa5, 0x67, 0xd1, 0x63, 0xb8, - 0xf3, 0x72, 0xaf, 0xdb, 0xed, 0xfe, 0xd8, 0x27, 0xe7, 0x78, 0x82, 0x00, 0x2a, 0x91, 0x2a, 0x29, - 0x78, 0x7e, 0xf1, 0xf8, 0x05, 0xe6, 0x0e, 0xa4, 0x0e, 0x89, 0x13, 0xee, 0x64, 0xe3, 0x09, 0xb8, - 0x29, 0x1b, 0x4e, 0x93, 0x2d, 0xc9, 0xad, 0xea, 0x54, 0x3c, 0x52, 0x45, 0x12, 0x13, 0xa9, 0x0c, - 0x61, 0x51, 0x04, 0xf7, 0x6b, 0x62, 0x0f, 0x2b, 0xbc, 0x9b, 0xdb, 0xd3, 0x8a, 0xfc, 0xc2, 0x6e, - 0xe0, 0x4a, 0x0e, 0x78, 0x4b, 0x84, 0x81, 0x0b, 0x28, 0xe1, 0xf6, 0x7a, 0x1d, 0xe3, 0xdd, 0x06, - 0x10, 0x31, 0x87, 0x9b, 0xb9, 0x9a, 0x83, 0xc6, 0xa0, 0xb2, 0x64, 0x30, 0xcb, 0xab, 0xc8, 0xce, - 0xf6, 0x87, 0x5f, 0xf8, 0x18, 0xcf, 0xdd, 0x22, 0x83, 0x3a, 0xd8, 0x1f, 0x8e, 0x78, 0x7e, 0x0b, - 0x57, 0xfa, 0x98, 0xbb, 0x2a, 0x82, 0x0e, 0x58, 0x33, 0x65, 0x17, 0x4c, 0x03, 0xed, 0xb4, 0xae, - 0x83, 0xe3, 0x11, 0xd4, 0x01, 0xbb, 0x73, 0xf4, 0x27, 0xa4, 0x6f, 0xf6, 0xa9, 0x0d, 0xe3, 0x68, - 0x21, 0xa3, 0xea, 0xc5, 0xc4, 0xa8, 0xe9, 0x14, 0x0a, 0x1c, 0x1f, 0x28, 0x66, 0x04, 0xab, 0x9b, - 0x00, 0x24, 0x90, 0x9c, 0x47, 0x5c, 0xdc, 0xf2, 0xb5, 0xec, 0xd6, 0x36, 0xaf, 0x2f, 0xeb, 0xec, - 0xc2, 0x09, 0x2c, 0x1f, 0x0c, 0x34, 0x94, 0x72, 0x22, 0x26, 0x02, 0x7c, 0xbb, 0x3c, 0xdb, 0xb2, - 0xab, 0xde, 0x5a, 0xd5, 0xe8, 0xa5, 0xdb, 0x3b, 0x10, 0xc3, 0xd6, 0xc5, 0x8c, 0x93, 0x89, 0x4a, - 0x12, 0x35, 0x47, 0x42, 0x01, 0x39, 0x72, 0x4f, 0x0f, 0xe2, 0x3f, 0xac, 0x82, 0x6c, 0x97, 0x31, - 0x38, 0xd3, 0x49, 0x21, 0x05, 0xa0, 0x8e, 0xb3, 0x17, 0x78, 0x16, 0x40, 0x19, 0xf9, 0x72, 0x7e, - 0x72, 0x4c, 0xdc, 0x63, 0x96, 0xb5, 0x1e, 0xd1, 0xa4, 0x11, 0x55, 0x50, 0xd2, 0xfa, 0x4d, 0x15, - 0x64, 0x2e, 0x92, 0x84, 0x48, 0x0e, 0xd6, 0xc1, 0x3e, 0x4b, 0xd3, 0x00, 0x06, 0x09, 0x9b, 0x02, - 0xe9, 0x23, 0x62, 0x42, 0x0a, 0xcb, 0x5d, 0x19, 0x89, 0xc5, 0x64, 0xc2, 0x73, 0x7c, 0x3e, 0x29, - 0x45, 0xf8, 0x95, 0x6c, 0x7c, 0x22, 0x42, 0x55, 0x67, 0x9f, 0xf0, 0xf2, 0x0a, 0x00, 0xa6, 0x9d, - 0xf4, 0xcf, 0x7c, 0x02, 0x3f, 0x66, 0xd6, 0x96, 0x14, 0xa5, 0x81, 0x07, 0xa0, 0x02, 0x90, 0x24, - 0x59, 0xe0, 0xab, 0x9d, 0x9c, 0x72, 0x1d, 0x0c, 0x3a, 0xc2, 0xf9, 0x8b, 0x5d, 0x87, 0x55, 0x86, - 0xb7, 0x83, 0x61, 0xeb, 0x1c, 0xda, 0x19, 0xf5, 0x56, 0x3e, 0x06, 0x41, 0x50, 0xe5, 0xfe, 0x0d, - 0xbe, 0xa4, 0xbd, 0x07, 0x38, 0x62, 0x00, 0xd3, 0x11, 0xb7, 0x57, 0x56, 0x57, 0xa4, 0x65, 0xd3, - 0x26, 0x16, 0x4e, 0xb0, 0x64, 0x1e, 0x4f, 0x14, 0x6a, 0xc2, 0xf7, 0xb2, 0xeb, 0xf2, 0x69, 0x6c, - 0xeb, 0xc2, 0xd6, 0x68, 0xab, 0x07, 0x84, 0xb6, 0x1e, 0x49, 0xe1, 0x5a, 0xa8, 0x7b, 0xe3, 0xfa, - 0x2e, 0xa1, 0xad, 0x6d, 0x53, 0x1f, 0x17, 0x2a, 0xe2, 0x27, 0x24, 0xb6, 0x1e, 0x77, 0xfe, 0x51, - 0x89, 0xee, 0x31, 0xed, 0x41, 0xa1, 0xad, 0xe7, 0x22, 0xfa, 0x94, 0xd0, 0x6c, 0x9e, 0xdf, 0x13, - 0x6a, 0x2b, 0xe2, 0x8c, 0x20, 0xdf, 0x21, 0xc8, 0x3d, 0xec, 0x2b, 0xdf, 0x93, 0xd2, 0x80, 0xb7, - 0x20, 0xf6, 0xd9, 0x3a, 0x09, 0x29, 0xf2, 0x26, 0xba, 0x8d, 0x76, 0x1b, 0x14, 0xaa, 0x02, 0xa6, - 0x4d, 0x38, 0x82, 0x3e, 0xfa, 0x32, 0x5b, 0x90, 0xb9, 0x05, 0x23, 0x58, 0x76, 0x40, 0xb0, 0xe2, - 0x76, 0x5e, 0xde, 0xed, 0xfd, 0xf4, 0xee, 0xef, 0xef, 0xfb, 0xce, 0xd7, 0x12, 0x60, 0xbe, 0xcb, - 0xe5, 0xea, 0x9e, 0x9d, 0x0a, 0x19, 0xd2, 0x6e, 0xd0, 0xb5, 0x50, 0x12, 0xd2, 0x3d, 0xfc, 0xd6, - 0x82, 0xf3, 0x38, 0xb3, 0xa3, 0x7b, 0xce, 0x07, 0xc7, 0x28, 0xec, 0x9b, 0xe0, 0xb5, 0x61, 0xe3, - 0x66, 0x54, 0x9e, 0xa9, 0x31, 0xa7, 0xb3, 0xf5, 0x1d, 0x4a, 0x9f, 0xd2, 0x39, 0x9e, 0x6e, 0xaa, - 0x6c, 0x7d, 0x87, 0xce, 0x0d, 0xc4, 0xac, 0x05, 0x5a, 0xbc, 0xb7, 0x02, 0x5b, 0x0d, 0xec, 0x7c, - 0xf7, 0xbc, 0x4b, 0xcd, 0x37, 0xcd, 0x47, 0xfa, 0x72, 0x5b, 0x57, 0x49, 0xdf, 0x36, 0x1e, 0x23, - 0x94, 0xb4, 0x5b, 0xca, 0x2a, 0xa9, 0xa9, 0xe1, 0x23, 0x4d, 0xb0, 0xf5, 0x66, 0xfa, 0x3d, 0xe5, - 0xbb, 0x4d, 0xff, 0xd6, 0xe2, 0xaa, 0x57, 0x9c, 0xba, 0x1a, 0x37, 0xd8, 0x72, 0x05, 0xd8, 0x56, - 0x70, 0x43, 0x10, 0xf2, 0xf1, 0x0d, 0x17, 0x5a, 0x0f, 0x56, 0x28, 0xf9, 0xab, 0xad, 0xd6, 0x5a, - 0xf7, 0x1a, 0x32, 0xa2, 0x07, 0x21, 0xa1, 0x02, 0x53, 0x7d, 0x23, 0x00, 0x4d, 0x8f, 0xd6, 0x6f, - 0xd9, 0x5b, 0x32, 0x91, 0xc4, 0xad, 0x4f, 0x1e, 0xcb, 0xec, 0xec, 0x59, 0x9d, 0x41, 0x94, 0x2d, - 0xdb, 0x1a, 0x6e, 0x2e, 0xaf, 0x18, 0x49, 0xc9, 0xf1, 0x2e, 0x1d, 0x6f, 0x24, 0xad, 0x8a, 0xa1, - 0xfc, 0xd0, 0xa0, 0xc6, 0xf6, 0x46, 0x86, 0x22, 0x81, 0x60, 0xa2, 0x15, 0x8e, 0xbd, 0xfd, 0xe0, - 0xcc, 0x73, 0x48, 0xfe, 0x3f, 0xc3, 0xab, 0x7d, 0x8f, 0x7f, 0xda, 0xf1, 0x59, 0xf9, 0x3a, 0x0f, - 0x25, 0x5f, 0x3d, 0xd4, 0x3f, 0xe8, 0x7b, 0xed, 0xfa, 0x7e, 0xc3, 0xf7, 0x3f, 0x34, 0xb8, 0xf9, - 0x88, 0xf3, 0xad, 0x2d, 0xef, 0x9f, 0x74, 0x7e, 0x1f, 0xbc, 0xaf, 0x4c, 0x71, 0x52, 0x37, 0x43, - 0x80, 0xe6, 0xda, 0x74, 0xba, 0x77, 0xea, 0x35, 0xbf, 0xc9, 0x9f, 0xe3, 0x82, 0xf6, 0x09, 0x01, - 0x32, 0x8b, 0x17, 0xfa, 0x4d, 0x62, 0xd5, 0xaa, 0xa9, 0xe1, 0xf3, 0x62, 0x2c, 0x09, 0x7d, 0x90, - 0x83, 0xb6, 0xfe, 0x12, 0x09, 0xed, 0x20, 0xd3, 0x86, 0x0f, 0x24, 0xe3, 0xc8, 0xcc, 0xf1, 0xbf, - 0x75, 0xff, 0x05, 0x58, 0x60, 0xfa, 0xd9, 0xc3, 0x1b, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x59, 0x6b, 0x73, 0xda, 0x48, + 0x16, 0xfd, 0xce, 0xaf, 0xe8, 0x74, 0x52, 0x1e, 0x54, 0x56, 0x04, 0x4e, 0x66, 0x6b, 0x13, 0x40, + 0x78, 0x63, 0xc7, 0x93, 0x78, 0xca, 0xd9, 0x64, 0x83, 0xbd, 0x99, 0xad, 0xac, 0xcb, 0x23, 0xa4, + 0x06, 0x3a, 0x16, 0x92, 0x46, 0xdd, 0x32, 0x66, 0x09, 0xff, 0x7d, 0xcf, 0xed, 0x96, 0x40, 0x60, + 0x1b, 0x67, 0xa7, 0xf6, 0x8b, 0x0d, 0xfd, 0xb8, 0xef, 0x3e, 0xf7, 0x74, 0xd3, 0x7b, 0xf2, 0xf6, + 0xe3, 0xf1, 0xf9, 0xbf, 0x3e, 0x9d, 0xb0, 0x89, 0x9e, 0xc6, 0xfd, 0x5e, 0xf9, 0x57, 0x04, 0x11, + 0x8b, 0x83, 0x64, 0xec, 0x73, 0x91, 0xf0, 0x7e, 0x6f, 0x2a, 0x74, 0xc0, 0xc2, 0x49, 0x90, 0x2b, + 0xa1, 0x7d, 0x5e, 0xe8, 0xd1, 0xf3, 0x57, 0xd5, 0x68, 0x23, 0x09, 0xa6, 0xc2, 0xe7, 0x37, 0x52, + 0xcc, 0xb2, 0x34, 0xd7, 0x9c, 0x85, 0x69, 0xa2, 0x45, 0x82, 0x65, 0x33, 0x19, 0xe9, 0x89, 0xff, + 0x97, 0x76, 0x7b, 0xb5, 0x74, 0x6b, 0x2a, 0x12, 0x37, 0x32, 0x14, 0xcf, 0xcd, 0x17, 0x57, 0x26, + 0x52, 0xcb, 0x20, 0x7e, 0xae, 0xc2, 0x20, 0x16, 0xfe, 0x81, 0x3b, 0x0d, 0x6e, 0xe5, 0xb4, 0x98, + 0xae, 0xbe, 0x17, 0x4a, 0xe4, 0xe6, 0x4b, 0x30, 0xc4, 0xf7, 0x24, 0xe5, 0x77, 0x34, 0xf7, 0x7b, + 0x5a, 0xea, 0x58, 0xf4, 0x2f, 0x4e, 0xd9, 0x40, 0x68, 0x2d, 0x93, 0xb1, 0xea, 0xb5, 0xec, 0x50, + 0x4f, 0x85, 0xb9, 0xcc, 0x74, 0xbf, 0x71, 0x13, 0xe4, 0x2c, 0x4e, 0x43, 0x99, 0x55, 0xfa, 0xae, + 0x22, 0xb5, 0xfa, 0xa8, 0xf4, 0xfa, 0x63, 0xe1, 0x6a, 0x39, 0x15, 0x69, 0xa1, 0xdd, 0xc8, 0x8f, + 0xd2, 0xb0, 0x98, 0xc2, 0x6e, 0x17, 0x3b, 0xfd, 0x27, 0x07, 0x2e, 0x82, 0xa0, 0xfd, 0xa4, 0x88, + 0x63, 0x37, 0xf6, 0x17, 0x61, 0x3a, 0xcd, 0x3a, 0x0b, 0x58, 0x25, 0x62, 0xd5, 0xe1, 0x83, 0x49, + 0x3a, 0x63, 0xc3, 0x42, 0xeb, 0x34, 0x61, 0x76, 0x8c, 0xbb, 0x61, 0x1a, 0xa7, 0xb9, 0xea, 0x2c, + 0xce, 0xde, 0x1c, 0x9d, 0x9c, 0x75, 0xf8, 0x31, 0x7d, 0x65, 0x4a, 0xc4, 0x22, 0xd4, 0x12, 0xcb, + 0x10, 0x9a, 0x49, 0x1a, 0x61, 0x5d, 0x26, 0xc3, 0x6b, 0x91, 0x57, 0x0b, 0xbe, 0x4c, 0x84, 0x88, + 0xb9, 0x9b, 0x8f, 0x87, 0x1d, 0xfe, 0xf9, 0xdd, 0x11, 0x53, 0xb1, 0x8c, 0x44, 0x8e, 0x65, 0x7f, + 0x14, 0x58, 0xd7, 0xe1, 0xff, 0xa0, 0x7f, 0x2c, 0xac, 0x09, 0x4b, 0x69, 0x76, 0x22, 0x6e, 0x3b, + 0xfc, 0xfd, 0xc9, 0x6f, 0xe5, 0x8c, 0x4c, 0xb2, 0x42, 0xf3, 0xa5, 0x9b, 0x85, 0xd3, 0x61, 0xaa, + 0x2b, 0xfb, 0x52, 0xd8, 0x37, 0x65, 0x3a, 0x18, 0xb2, 0x61, 0x40, 0x6b, 0xd8, 0xa7, 0x63, 0x36, + 0x4d, 0x23, 0x41, 0x36, 0x44, 0xe5, 0xa2, 0x2c, 0x17, 0xf0, 0x93, 0x9d, 0xbe, 0x85, 0x50, 0x25, + 0xc6, 0xb1, 0x48, 0x30, 0x81, 0x01, 0x7c, 0xa6, 0x58, 0x30, 0x0c, 0x8c, 0xf5, 0x04, 0x9b, 0x95, + 0xa6, 0x62, 0x49, 0x47, 0x4c, 0xe9, 0x34, 0x63, 0x67, 0x27, 0x6f, 0xcd, 0xfa, 0x6c, 0x06, 0x4f, + 0xde, 0xc3, 0xe4, 0xd5, 0x86, 0x2c, 0x9d, 0x89, 0x9c, 0xed, 0x05, 0xd3, 0xac, 0xcb, 0x86, 0xb9, + 0x1c, 0x4f, 0x74, 0x22, 0x94, 0x15, 0x2e, 0x6e, 0xb3, 0x0e, 0x7f, 0x13, 0xcf, 0x82, 0xb9, 0x62, + 0xf8, 0x1c, 0x24, 0x11, 0x1b, 0xc9, 0x5c, 0xad, 0x94, 0x21, 0x86, 0x0a, 0xc1, 0x3d, 0x49, 0x28, + 0xf7, 0x2c, 0x2c, 0x14, 0x99, 0x7f, 0x3c, 0x18, 0xc0, 0xdd, 0x08, 0x7b, 0xb6, 0x67, 0xde, 0xa7, + 0x88, 0x15, 0xc9, 0x8a, 0xa5, 0x22, 0xe7, 0xf5, 0x44, 0x4c, 0x45, 0x67, 0x11, 0xc4, 0xd9, 0x24, + 0xe8, 0x2c, 0x86, 0xe3, 0x0e, 0x3f, 0x0a, 0xc2, 0xeb, 0x71, 0x9e, 0x16, 0x50, 0x94, 0x66, 0x41, + 0x28, 0xf5, 0x9c, 0xbb, 0x08, 0x07, 0x26, 0x6c, 0xea, 0xaa, 0xc1, 0xa5, 0x8b, 0xd5, 0x8b, 0x22, + 0x8f, 0x31, 0xf3, 0x8e, 0xc9, 0x69, 0x30, 0x16, 0xec, 0xe2, 0xf3, 0x19, 0xd2, 0x02, 0x1b, 0xd3, + 0x29, 0x32, 0x63, 0xfe, 0xb3, 0x6a, 0x12, 0x1b, 0x4c, 0xdc, 0x4b, 0x2d, 0xef, 0xd8, 0x2a, 0x13, + 0x7c, 0xb9, 0x5c, 0x76, 0x47, 0x45, 0x62, 0x73, 0x3e, 0x3e, 0x8d, 0x9a, 0xc2, 0x59, 0xe4, 0x42, + 0x17, 0x79, 0xc2, 0x22, 0x6f, 0x2c, 0xf4, 0x49, 0x2c, 0xc8, 0xd5, 0xa3, 0xb9, 0x99, 0x5a, 0xae, + 0x96, 0x4a, 0xf5, 0x71, 0xf8, 0x0d, 0xd9, 0xad, 0xad, 0x17, 0x7b, 0x7b, 0x3c, 0x35, 0x83, 0xdc, + 0xf7, 0xf5, 0x3c, 0x13, 0x08, 0x3e, 0xc6, 0x9e, 0xbc, 0xc9, 0xf3, 0x60, 0xee, 0x49, 0x65, 0xfe, + 0x6f, 0x08, 0x41, 0x26, 0x9b, 0xc2, 0x45, 0x79, 0x3b, 0x8b, 0x51, 0x9a, 0x37, 0xe9, 0x14, 0x24, + 0xbe, 0x76, 0x53, 0x5f, 0x78, 0x2a, 0x8b, 0xa5, 0x6e, 0xf2, 0x2b, 0xee, 0xb8, 0xca, 0x4f, 0x3d, + 0x9b, 0x56, 0x14, 0x76, 0xbb, 0x1b, 0xf7, 0xd4, 0xf3, 0x83, 0x6e, 0xbc, 0xbf, 0xef, 0x2c, 0x68, + 0x43, 0xe0, 0xa7, 0x5f, 0xe3, 0xcb, 0x6e, 0xf2, 0x35, 0xb8, 0xfc, 0xfe, 0xbd, 0x49, 0xff, 0xfc, + 0xc5, 0xd2, 0x71, 0x13, 0x9f, 0x3e, 0x2e, 0x93, 0xaf, 0xe9, 0x57, 0x2c, 0xbf, 0xbc, 0xf4, 0x65, + 0x4d, 0x2d, 0x0a, 0xe9, 0x3c, 0x0d, 0x94, 0x51, 0x8e, 0x93, 0x63, 0x05, 0x49, 0x9f, 0xdc, 0xe7, + 0x9a, 0x26, 0xb8, 0xd3, 0x95, 0x9e, 0x4c, 0x12, 0x91, 0xbf, 0x3f, 0xff, 0x70, 0xe6, 0x0b, 0x57, + 0x7a, 0x61, 0x1c, 0x28, 0x75, 0x86, 0xcc, 0x79, 0x41, 0x14, 0x35, 0xf5, 0x21, 0x17, 0x79, 0x8e, + 0xf8, 0x75, 0x38, 0x49, 0x83, 0x95, 0x61, 0x2c, 0x82, 0xfc, 0xdc, 0x1e, 0xce, 0x66, 0x79, 0x48, + 0x1d, 0xec, 0x53, 0x7a, 0x1e, 0x0b, 0x2f, 0x48, 0x90, 0x08, 0x52, 0xee, 0xf3, 0x24, 0x4d, 0x50, + 0xd1, 0xe5, 0x0a, 0x1f, 0x21, 0xa8, 0x36, 0x35, 0x2b, 0x03, 0x9b, 0xce, 0xa2, 0xae, 0x2f, 0x17, + 0xd3, 0xf4, 0x46, 0x34, 0x4b, 0x45, 0xf0, 0xed, 0xc5, 0xeb, 0x76, 0xbb, 0x16, 0x45, 0xd8, 0xf3, + 0x59, 0x84, 0xc6, 0x17, 0xce, 0xc9, 0x71, 0x40, 0x80, 0x75, 0x29, 0xc5, 0x40, 0x97, 0x22, 0x2b, + 0xe9, 0x34, 0x09, 0x3b, 0xa8, 0x7c, 0xbd, 0x4f, 0xf6, 0x5f, 0xc1, 0x76, 0xee, 0xec, 0xcb, 0xae, + 0x1c, 0x35, 0xd7, 0xd9, 0xfc, 0x2a, 0x2f, 0x1d, 0x27, 0xd9, 0xdb, 0x4b, 0xf0, 0xc1, 0xfe, 0xf5, + 0x0c, 0x40, 0xec, 0xed, 0x35, 0xd3, 0x7d, 0xff, 0xf7, 0xde, 0xe4, 0x65, 0xff, 0xd9, 0x62, 0x3d, + 0xbc, 0xec, 0xb5, 0x30, 0xf2, 0xbb, 0xe3, 0x62, 0xb2, 0xb2, 0x03, 0x93, 0xae, 0x72, 0x93, 0x43, + 0x5a, 0xd5, 0x31, 0xc6, 0x74, 0x01, 0x38, 0xc2, 0x28, 0x8f, 0x7d, 0x45, 0xfa, 0x4a, 0x05, 0x87, + 0xb1, 0x6f, 0x16, 0x61, 0xcb, 0x3e, 0x37, 0xf2, 0x38, 0x94, 0x36, 0x63, 0xbf, 0x3e, 0x40, 0x41, + 0x94, 0x49, 0x24, 0x6e, 0x3f, 0x8e, 0x9a, 0xe5, 0x98, 0xd3, 0x6f, 0x3b, 0x04, 0xda, 0x32, 0x29, + 0x44, 0xd7, 0x16, 0x41, 0x55, 0x6f, 0x10, 0xd7, 0xa5, 0x3c, 0x2a, 0xe7, 0xb0, 0xc9, 0x87, 0x69, + 0x8a, 0xac, 0x24, 0x28, 0x47, 0x3f, 0x38, 0xb4, 0xa3, 0x5e, 0x38, 0x11, 0xc0, 0xb3, 0x88, 0x54, + 0x5c, 0x76, 0xca, 0xb1, 0x9b, 0x20, 0x2e, 0x84, 0x19, 0x71, 0xcb, 0x11, 0xc0, 0xcc, 0x8d, 0x4c, + 0x0b, 0x55, 0x96, 0xff, 0x40, 0x0e, 0x63, 0x00, 0xb7, 0x87, 0x1c, 0x62, 0xbf, 0x6a, 0x72, 0x2f, + 0xe6, 0x0e, 0x2c, 0xdd, 0xbd, 0x7a, 0x5d, 0x40, 0xb1, 0xe3, 0x74, 0x36, 0xad, 0xa1, 0x60, 0x3e, + 0x5b, 0xc4, 0xcb, 0x0e, 0xeb, 0x19, 0x30, 0x64, 0x26, 0xdf, 0x3e, 0x0f, 0xc6, 0x92, 0x85, 0x43, + 0xce, 0xc8, 0x1f, 0x9f, 0x1b, 0x63, 0x87, 0xe9, 0x2d, 0x67, 0x32, 0xf2, 0x9f, 0x2d, 0xd4, 0x92, + 0x3d, 0x5b, 0x90, 0x99, 0x87, 0xbc, 0x74, 0x83, 0x72, 0xb8, 0xec, 0xf7, 0x86, 0x79, 0xff, 0xf7, + 0x0e, 0x4f, 0x8a, 0xe9, 0x50, 0xe4, 0x8f, 0xca, 0xaf, 0x84, 0x97, 0xcb, 0x57, 0xa2, 0x6d, 0x14, + 0xac, 0x82, 0x95, 0x4c, 0xa5, 0x73, 0xb8, 0x62, 0x64, 0x96, 0x25, 0x60, 0xa4, 0xd2, 0xec, 0x3d, + 0x82, 0x77, 0x88, 0x72, 0x96, 0xcb, 0x12, 0x27, 0xd2, 0x75, 0xe9, 0x8e, 0x45, 0xf2, 0x4b, 0x9a, + 0x4f, 0x9b, 0x65, 0x69, 0xea, 0xae, 0x5e, 0x55, 0x91, 0x8b, 0x5a, 0x8e, 0x1d, 0x93, 0x0f, 0x8e, + 0x65, 0xdc, 0xa9, 0x85, 0x53, 0xaf, 0x25, 0xbc, 0x13, 0xfa, 0x6c, 0x80, 0x03, 0xd3, 0x34, 0xdd, + 0x0f, 0x9d, 0x30, 0x88, 0x07, 0x68, 0x39, 0x00, 0x3d, 0x42, 0xaf, 0x53, 0x2d, 0xa6, 0x4d, 0x3e, + 0x8b, 0x45, 0x74, 0x21, 0x8f, 0x47, 0x63, 0xee, 0x38, 0xc0, 0x08, 0x23, 0x12, 0x05, 0x99, 0xe7, + 0x10, 0x6a, 0x8f, 0x67, 0x24, 0x81, 0x37, 0xc1, 0xdc, 0xe7, 0x32, 0x41, 0xe6, 0x04, 0x8e, 0xbf, + 0xce, 0xe7, 0x0b, 0x23, 0xf2, 0xd7, 0xc1, 0xc7, 0xbf, 0x7b, 0x19, 0x51, 0x0c, 0xa3, 0xc2, 0x59, + 0x86, 0x54, 0x03, 0x64, 0xb1, 0x99, 0x5e, 0x2c, 0xdd, 0x1f, 0x90, 0xb7, 0xb9, 0x66, 0xed, 0x08, + 0xdf, 0x7b, 0xfa, 0xfa, 0xd5, 0xab, 0x57, 0xdd, 0x15, 0x33, 0x60, 0xa4, 0x8e, 0x91, 0x3a, 0x7c, + 0x63, 0xa3, 0x40, 0xc2, 0x74, 0x8f, 0x35, 0xf9, 0xbe, 0xd8, 0xe7, 0x0e, 0x5f, 0x56, 0xf1, 0x32, + 0x96, 0x58, 0xa1, 0xd1, 0x94, 0xaf, 0x8b, 0x9a, 0xc7, 0xd4, 0xc0, 0x28, 0x5b, 0x16, 0xcb, 0xa8, + 0xc3, 0x5c, 0x0d, 0x03, 0x05, 0x8f, 0x6c, 0x91, 0xaf, 0x03, 0x37, 0x28, 0x03, 0x57, 0x01, 0xaf, + 0xf0, 0x23, 0xef, 0x8f, 0x42, 0xe4, 0xf3, 0x41, 0xd9, 0xb5, 0xdf, 0xc4, 0x31, 0xea, 0x9c, 0xd2, + 0xea, 0x00, 0x59, 0xda, 0x5d, 0xdd, 0x13, 0x25, 0x0c, 0x77, 0x75, 0x05, 0xbe, 0x12, 0x87, 0x46, + 0x5f, 0x02, 0x73, 0xea, 0x78, 0x45, 0x27, 0x33, 0x40, 0x03, 0x6e, 0x72, 0x14, 0xb2, 0x73, 0x28, + 0x2b, 0xeb, 0x3a, 0xd2, 0xda, 0xd0, 0x25, 0xd8, 0xc7, 0x99, 0x8e, 0x0c, 0x63, 0x71, 0x13, 0x60, + 0x67, 0x9a, 0x28, 0x9c, 0x0d, 0x2f, 0x4e, 0xc7, 0x4d, 0xd4, 0x17, 0xcd, 0x2d, 0xa9, 0x39, 0x30, + 0x9d, 0xa2, 0xe0, 0x93, 0x25, 0x8a, 0x87, 0xf2, 0xb1, 0x91, 0x5d, 0x75, 0x37, 0xbb, 0xae, 0xc9, + 0x95, 0xad, 0x58, 0x39, 0x9a, 0xdb, 0x28, 0x39, 0x55, 0xec, 0x55, 0x11, 0x3e, 0x98, 0x9f, 0x32, + 0xa9, 0xe8, 0x43, 0xbb, 0x16, 0x5b, 0xe4, 0xfe, 0xff, 0xa7, 0x5b, 0x05, 0x37, 0x5b, 0xd9, 0x96, + 0x26, 0xdb, 0xeb, 0x64, 0x85, 0x26, 0x55, 0x1b, 0xfe, 0xdb, 0xae, 0xb0, 0x0e, 0xc1, 0x27, 0xa4, + 0x69, 0xf7, 0x82, 0xa9, 0x7e, 0x74, 0x49, 0x10, 0xdf, 0x52, 0xc3, 0x5d, 0xf5, 0x47, 0x7e, 0x4c, + 0x5d, 0x0d, 0x46, 0xf1, 0x5a, 0xbf, 0x19, 0x04, 0xe8, 0x46, 0xce, 0xa2, 0x2c, 0x20, 0x37, 0xf2, + 0x06, 0x23, 0xef, 0xed, 0xa0, 0x04, 0x51, 0x7f, 0x4d, 0x60, 0xf7, 0xf6, 0xcc, 0xd4, 0xe0, 0x7c, + 0x55, 0x9e, 0xfe, 0x9a, 0xd2, 0x56, 0x93, 0x17, 0xf7, 0x4c, 0x16, 0xdf, 0xbf, 0x9b, 0x49, 0x55, + 0x0c, 0xa7, 0x20, 0x01, 0x35, 0xd5, 0x71, 0x1a, 0x44, 0xbf, 0x0e, 0x6c, 0xdb, 0x6e, 0x23, 0x20, + 0x28, 0x11, 0x89, 0xba, 0x0d, 0x73, 0x11, 0x68, 0x51, 0xa2, 0x2f, 0x1a, 0xa5, 0x61, 0xd5, 0xa6, + 0x87, 0xa3, 0x04, 0xde, 0x68, 0x14, 0x04, 0xb8, 0x2f, 0x75, 0xd0, 0x3c, 0xe4, 0xae, 0x30, 0x5d, + 0x79, 0x63, 0x9c, 0xf0, 0x90, 0xbb, 0x5c, 0x8b, 0x5b, 0xdd, 0xfa, 0x16, 0xdc, 0x04, 0x95, 0x80, + 0x3b, 0x0b, 0x03, 0x35, 0x4f, 0x20, 0x42, 0x93, 0xd7, 0xc3, 0x34, 0x9a, 0x7b, 0x41, 0x96, 0x89, + 0x24, 0x3a, 0x9e, 0xc8, 0x38, 0x42, 0xf5, 0x60, 0x3d, 0xe0, 0xeb, 0xe4, 0x06, 0x56, 0xd0, 0x49, + 0x10, 0xc8, 0x3b, 0xca, 0x00, 0x36, 0x73, 0xb7, 0xe9, 0xf8, 0xfd, 0x05, 0xc0, 0xea, 0x9f, 0x88, + 0xd8, 0x3a, 0x44, 0xfe, 0x46, 0xf0, 0x6a, 0x8c, 0xdf, 0xdf, 0x0a, 0x5d, 0xed, 0x06, 0xe0, 0x6f, + 0x05, 0xce, 0x2d, 0x21, 0x70, 0x79, 0xbf, 0x7a, 0x4b, 0x53, 0x5c, 0x01, 0xf5, 0xf5, 0x63, 0xc6, + 0x4f, 0x68, 0x9c, 0x95, 0x31, 0x35, 0xe5, 0x87, 0xea, 0x33, 0xd1, 0xc1, 0xc5, 0x26, 0x47, 0x14, + 0xcf, 0xca, 0x71, 0x74, 0x55, 0x6c, 0x1c, 0xc9, 0x71, 0x91, 0x07, 0x96, 0x3e, 0x99, 0xe8, 0x54, + 0xe5, 0xfa, 0xef, 0xe4, 0x34, 0xa1, 0xcb, 0x06, 0x72, 0x21, 0x00, 0x5c, 0x60, 0xa2, 0x51, 0xa0, + 0x83, 0x27, 0x44, 0x54, 0x6a, 0x25, 0x83, 0x7a, 0xe1, 0xa4, 0xa0, 0x03, 0x6c, 0x9a, 0xa1, 0x9b, + 0xa7, 0x33, 0x8f, 0x2a, 0x91, 0x26, 0xd1, 0x3d, 0x53, 0x9d, 0x82, 0x8d, 0x52, 0xe7, 0xa7, 0x9b, + 0x4c, 0xdb, 0x6d, 0x9a, 0xbb, 0xd0, 0x03, 0x68, 0x8e, 0xd1, 0xd3, 0xcc, 0x22, 0xb9, 0x5d, 0x86, + 0xfd, 0xd3, 0x0c, 0x06, 0xff, 0x02, 0xf9, 0xec, 0x03, 0xee, 0x0b, 0x1e, 0xfb, 0x84, 0xb2, 0x55, + 0x82, 0x21, 0x10, 0xe0, 0xf6, 0x5f, 0x40, 0xfe, 0xd9, 0xe9, 0xa7, 0x27, 0xdb, 0xd5, 0xaf, 0x36, + 0x25, 0xba, 0x46, 0x9a, 0xe3, 0xd0, 0x2a, 0x53, 0x65, 0x24, 0xfe, 0x90, 0x4f, 0xb4, 0xce, 0x3a, + 0xad, 0x16, 0xdf, 0x37, 0xd3, 0x86, 0x32, 0xf1, 0x96, 0x2a, 0xcf, 0x6f, 0x4b, 0x79, 0xdf, 0xd4, + 0x61, 0xe6, 0xbf, 0xe4, 0x2e, 0x68, 0xe4, 0xda, 0xdf, 0xf7, 0xf0, 0xb7, 0x74, 0x33, 0x45, 0x81, + 0x34, 0x8d, 0x14, 0x05, 0x31, 0xd7, 0x49, 0xea, 0xd1, 0x49, 0x83, 0x3b, 0xad, 0x11, 0x8a, 0xb6, + 0xc0, 0x75, 0x66, 0x2d, 0xed, 0xa9, 0xb9, 0x4d, 0x4a, 0xb2, 0x7a, 0x14, 0xe0, 0x0a, 0x5a, 0x4d, + 0xd4, 0x4f, 0xdf, 0xd1, 0xb6, 0xe8, 0xd5, 0x76, 0x54, 0xf0, 0x15, 0xae, 0x5c, 0xa3, 0xfa, 0xea, + 0x8b, 0xd3, 0x66, 0x89, 0x69, 0x32, 0x02, 0x2c, 0x4f, 0x70, 0x4c, 0xe6, 0x69, 0x71, 0x07, 0xb8, + 0xee, 0x74, 0x92, 0xc3, 0x0a, 0xca, 0x3a, 0x16, 0xf5, 0xba, 0xb6, 0x45, 0xdc, 0xe9, 0x2a, 0x5d, + 0x10, 0xfc, 0xa6, 0x28, 0xcf, 0xfe, 0x3d, 0x52, 0x6c, 0x3f, 0xea, 0xf0, 0x28, 0xc8, 0xaf, 0xf9, + 0x26, 0xf3, 0xb7, 0x77, 0x94, 0xa3, 0x71, 0x65, 0x60, 0x29, 0x76, 0x7c, 0x65, 0x2f, 0x31, 0x35, + 0x29, 0x9b, 0xd3, 0xb8, 0xf6, 0x54, 0xdd, 0xcc, 0x5f, 0xc5, 0x15, 0x97, 0x54, 0x55, 0x4c, 0xbd, + 0x6c, 0x82, 0x52, 0x52, 0xad, 0x83, 0xd7, 0x2f, 0xda, 0xad, 0x83, 0xf6, 0xab, 0x36, 0xef, 0xec, + 0xd8, 0xcb, 0x6b, 0xf8, 0x4a, 0x9a, 0x6a, 0x06, 0x3d, 0x2a, 0x77, 0xab, 0xc3, 0x6e, 0x48, 0x3e, + 0xdc, 0xed, 0x0e, 0x0a, 0xbc, 0xf3, 0xd8, 0x8a, 0x83, 0xb5, 0x69, 0x45, 0x46, 0xe5, 0x48, 0xb5, + 0x4d, 0xb0, 0x57, 0xb5, 0xdd, 0x44, 0xcc, 0xd8, 0x6f, 0x1f, 0xce, 0xde, 0xc3, 0xcc, 0xcf, 0x02, + 0x6d, 0x5b, 0xe9, 0xee, 0x0e, 0xec, 0xa9, 0x5d, 0x2c, 0xd6, 0xd8, 0xae, 0x27, 0x52, 0xa1, 0x03, + 0xa8, 0x0c, 0xa8, 0x20, 0xce, 0x01, 0x7d, 0xae, 0x19, 0x51, 0x1a, 0x55, 0xa9, 0xfa, 0xfe, 0xcf, + 0x74, 0xc7, 0x70, 0x76, 0x62, 0xca, 0x5a, 0xae, 0xa8, 0x0b, 0x16, 0x24, 0x23, 0xbc, 0x76, 0x9f, + 0x54, 0x02, 0x6c, 0x9d, 0x7e, 0xfa, 0x38, 0x38, 0x47, 0x89, 0xb6, 0xac, 0x43, 0x28, 0x1d, 0x7b, + 0xdd, 0x23, 0x4f, 0x88, 0xd3, 0xbc, 0x05, 0x6a, 0x74, 0x4b, 0x86, 0x98, 0x94, 0xb8, 0x8a, 0x6a, + 0xc2, 0x28, 0x40, 0xc9, 0x23, 0xec, 0x50, 0x5f, 0xdb, 0x97, 0xae, 0xbd, 0x53, 0xd1, 0x1c, 0x78, + 0x83, 0x58, 0xa5, 0x12, 0xc7, 0x6f, 0xd9, 0xe8, 0xb5, 0xca, 0xf7, 0x94, 0x9e, 0xa9, 0xee, 0xfe, + 0xdf, 0xe4, 0x94, 0x5e, 0x60, 0x18, 0x72, 0x03, 0xec, 0x37, 0x05, 0x8f, 0x0b, 0x3b, 0x34, 0x63, + 0xa1, 0x59, 0x80, 0xcb, 0x8b, 0x08, 0x22, 0xf0, 0x53, 0x40, 0x39, 0xa0, 0x90, 0xec, 0xf2, 0x39, + 0xb0, 0x8a, 0xf7, 0x7b, 0xa0, 0x45, 0xd3, 0x06, 0xf1, 0x59, 0x4e, 0x9f, 0xae, 0x14, 0x67, 0xf6, + 0x59, 0x67, 0x30, 0xe2, 0xe5, 0xd3, 0x88, 0xcf, 0xb3, 0x54, 0xd1, 0xf3, 0x4e, 0x24, 0x6f, 0x2a, + 0x12, 0xac, 0x53, 0x80, 0xd1, 0x6c, 0x73, 0x6c, 0x22, 0xe2, 0xec, 0x88, 0xf7, 0x1b, 0xbd, 0xf2, + 0xfd, 0xc5, 0x92, 0x6f, 0xfb, 0x85, 0x43, 0x6b, 0x18, 0xcb, 0xf0, 0xda, 0xe7, 0xef, 0x49, 0xed, + 0x61, 0xaf, 0x65, 0x27, 0x60, 0x1a, 0x44, 0xf4, 0xef, 0xdf, 0xd3, 0x58, 0x6d, 0x3a, 0xa2, 0x4d, + 0xf4, 0x6a, 0xb0, 0xde, 0xb7, 0x5b, 0x8b, 0xed, 0xdd, 0xbc, 0x4f, 0xff, 0x57, 0x7b, 0x1a, 0x86, + 0xcd, 0xab, 0x2c, 0x48, 0x8c, 0xc3, 0x96, 0xfd, 0x30, 0x13, 0x22, 0x5c, 0x41, 0xcc, 0xc3, 0xc1, + 0x38, 0x17, 0x22, 0xe9, 0x96, 0x70, 0xd1, 0x31, 0x90, 0xd0, 0x6f, 0xec, 0x3d, 0x3d, 0x68, 0xb7, + 0xdb, 0x3f, 0x77, 0xd9, 0x19, 0xc1, 0x2a, 0xb0, 0x86, 0x55, 0x50, 0x44, 0x94, 0x46, 0x44, 0x4f, + 0x10, 0x67, 0x08, 0xed, 0xb3, 0xba, 0x6c, 0xe2, 0x44, 0xac, 0xb1, 0x21, 0x1c, 0x04, 0xe3, 0xae, + 0x68, 0x4b, 0x94, 0x8e, 0xd3, 0x22, 0x8e, 0x58, 0x92, 0x6a, 0x16, 0x84, 0xa1, 0x50, 0x8a, 0x19, + 0x04, 0xa7, 0x37, 0x1d, 0x03, 0xe1, 0xec, 0x43, 0x70, 0x2d, 0x98, 0x02, 0x8a, 0x32, 0x09, 0x2a, + 0xa0, 0x80, 0xf8, 0xf4, 0xe2, 0x12, 0xd1, 0x75, 0x17, 0x38, 0x97, 0xb3, 0x21, 0xd2, 0x01, 0x95, + 0x5e, 0xa3, 0x34, 0xa5, 0x37, 0xc9, 0xab, 0xd0, 0x4e, 0x5e, 0xf4, 0xbf, 0x88, 0x21, 0x51, 0xb1, + 0x22, 0x43, 0x21, 0xbc, 0xe8, 0x0f, 0x44, 0x7e, 0x83, 0x76, 0x11, 0x09, 0x5b, 0x45, 0xa8, 0xeb, + 0xd5, 0xe5, 0xc9, 0x46, 0x93, 0xf8, 0xc1, 0xea, 0x7d, 0xef, 0xed, 0x00, 0x85, 0x10, 0xdc, 0x5a, + 0x46, 0xec, 0xf3, 0x97, 0x2f, 0xb8, 0xb9, 0xe7, 0x0c, 0x40, 0x10, 0xaa, 0x97, 0x36, 0x9d, 0x8e, + 0xc7, 0x28, 0x5b, 0x7a, 0xd8, 0x9a, 0x30, 0xaa, 0x59, 0x46, 0x4f, 0x48, 0xb9, 0x08, 0x85, 0xbc, + 0x11, 0x2b, 0xd9, 0x8d, 0xed, 0xab, 0x5e, 0x59, 0x68, 0xe7, 0x56, 0x60, 0xf9, 0x86, 0xa4, 0x50, + 0xcb, 0xb1, 0x1c, 0x49, 0xf8, 0x76, 0x71, 0xba, 0x65, 0xd7, 0x7a, 0x6b, 0x69, 0xdb, 0xe0, 0xc2, + 0xee, 0xed, 0xc9, 0x7e, 0xe3, 0x7c, 0x22, 0xd8, 0x28, 0x8d, 0xe3, 0x74, 0x46, 0xcd, 0x1c, 0x39, + 0xb2, 0xaf, 0x51, 0xf2, 0x3f, 0x41, 0x05, 0xc4, 0x36, 0x63, 0xa0, 0x79, 0xac, 0x48, 0x24, 0xb0, + 0xc4, 0xda, 0x0b, 0xea, 0x0d, 0x80, 0xb2, 0xcd, 0xd3, 0xbe, 0x88, 0x1a, 0xeb, 0x09, 0x23, 0x6a, + 0x51, 0x85, 0x92, 0xc6, 0xbf, 0xd2, 0x82, 0xcd, 0x64, 0x1c, 0xb3, 0x44, 0xc0, 0x3a, 0xec, 0x33, + 0xcc, 0x1d, 0xe0, 0xc6, 0x82, 0x31, 0xee, 0x01, 0x4c, 0x8e, 0x58, 0x61, 0xae, 0x33, 0x01, 0x8b, + 0xe4, 0x68, 0x24, 0x72, 0x7a, 0x76, 0x2b, 0x45, 0xb8, 0x95, 0xec, 0x74, 0xd5, 0xa7, 0xe9, 0x3d, + 0x03, 0xb0, 0xa4, 0xac, 0xf4, 0xcf, 0x62, 0x84, 0x2f, 0x13, 0x63, 0xcb, 0x94, 0xa4, 0xc1, 0x03, + 0xa8, 0x00, 0x3e, 0xc4, 0x73, 0x7a, 0xfa, 0x4d, 0xc6, 0x42, 0x79, 0xbd, 0x96, 0xb4, 0xfe, 0xd2, + 0xb1, 0xa3, 0x32, 0xa3, 0x0b, 0x63, 0xbf, 0x51, 0x31, 0x98, 0xca, 0x47, 0xcf, 0xf3, 0xaa, 0xdc, + 0xbf, 0xa4, 0xe7, 0xd8, 0x37, 0x00, 0x99, 0x00, 0xe0, 0x1b, 0x0a, 0xf3, 0x8a, 0x61, 0xab, 0xb4, + 0x3c, 0xb5, 0x31, 0x22, 0x68, 0x4b, 0xe6, 0xe1, 0x44, 0x91, 0x26, 0xa2, 0x3e, 0x57, 0xe5, 0x93, + 0xea, 0xd6, 0x1d, 0xbe, 0xbf, 0x3e, 0x56, 0xf7, 0x08, 0x6d, 0x3c, 0x90, 0xc2, 0x95, 0x50, 0xfb, + 0x36, 0xfa, 0x43, 0x42, 0x1b, 0xdb, 0xa6, 0x3e, 0x2c, 0x54, 0x46, 0x3b, 0x24, 0x36, 0x1e, 0x76, + 0xfe, 0x41, 0x89, 0xf6, 0x11, 0xf6, 0x5e, 0xa1, 0x8d, 0xc7, 0x22, 0xba, 0x4b, 0x68, 0x36, 0xcb, + 0xef, 0x08, 0x6d, 0xec, 0x8c, 0xe8, 0x0f, 0x08, 0x15, 0xb7, 0x19, 0x5f, 0x79, 0x59, 0x37, 0xf5, + 0x94, 0x11, 0x35, 0x62, 0x44, 0x53, 0xcc, 0x93, 0xf3, 0x4e, 0x69, 0xa0, 0x38, 0x06, 0x83, 0x4d, + 0xf5, 0xf9, 0x9c, 0x38, 0x56, 0x3d, 0x8a, 0xb4, 0x64, 0x83, 0x6d, 0x55, 0x50, 0xba, 0x89, 0x71, + 0x74, 0x38, 0xbf, 0x4c, 0xe6, 0x6c, 0x66, 0x20, 0x0e, 0xeb, 0x0e, 0x19, 0xd5, 0xf1, 0xde, 0xd3, + 0xdb, 0x83, 0x5f, 0x5e, 0xff, 0xf5, 0x4d, 0xd7, 0x08, 0x2c, 0x51, 0xeb, 0xc7, 0x2a, 0xb3, 0x7a, + 0xd0, 0x99, 0xca, 0xc4, 0xe7, 0x6d, 0xaf, 0x6d, 0x00, 0xca, 0xe7, 0x07, 0xf4, 0x09, 0xad, 0x3b, + 0x33, 0x83, 0x07, 0xd6, 0x07, 0x4b, 0x3e, 0xcc, 0xdb, 0xf3, 0x95, 0x0e, 0x86, 0xf5, 0x50, 0xff, + 0x4f, 0x71, 0xde, 0xa5, 0xb3, 0xb1, 0x4b, 0xe9, 0x70, 0xbc, 0xa9, 0xf3, 0x47, 0x54, 0x36, 0xea, + 0x38, 0xbc, 0x16, 0x68, 0xba, 0x88, 0x11, 0x58, 0x03, 0xe4, 0xd7, 0x8f, 0x8b, 0x6f, 0xd4, 0x1f, + 0xcf, 0xef, 0x77, 0x6f, 0x5b, 0x55, 0xc9, 0xf4, 0x36, 0x1e, 0xbd, 0x50, 0x0a, 0x66, 0x4b, 0x59, + 0x26, 0x6b, 0x1a, 0x79, 0xbf, 0xd6, 0xad, 0xb7, 0xf9, 0x1f, 0x42, 0x99, 0x6d, 0xaa, 0xb8, 0xfd, + 0x5a, 0xb8, 0x2e, 0xc6, 0x0d, 0x62, 0x5d, 0x65, 0xd2, 0x4a, 0xae, 0x09, 0x22, 0xee, 0xbe, 0xe1, + 0xc3, 0xbd, 0x15, 0xca, 0xfe, 0x3c, 0xce, 0x10, 0xcf, 0xba, 0x17, 0x67, 0x2a, 0x84, 0x56, 0xd7, + 0x92, 0x20, 0xfa, 0x78, 0xf5, 0xa3, 0xc9, 0x96, 0x4c, 0x73, 0x1b, 0x2d, 0x5b, 0xa1, 0x21, 0x81, + 0x86, 0x00, 0x64, 0x08, 0xb2, 0xe1, 0x70, 0xfd, 0xcd, 0xd5, 0x2b, 0x66, 0x54, 0xf2, 0xc1, 0x0b, + 0xcb, 0x31, 0x57, 0xbc, 0xe7, 0xa7, 0x1a, 0x8b, 0x36, 0xd7, 0x67, 0x12, 0x09, 0x2e, 0x4a, 0x56, + 0x58, 0x4e, 0xf8, 0x93, 0x35, 0xcf, 0xb6, 0x87, 0x3f, 0x0d, 0x86, 0xe6, 0x77, 0x9f, 0x07, 0xb0, + 0xb0, 0xf2, 0x7c, 0x52, 0xfe, 0x0c, 0xc4, 0xfb, 0xd5, 0x0f, 0x42, 0x8f, 0xb8, 0xfe, 0xa2, 0xe6, + 0xfb, 0x37, 0x05, 0x37, 0xfb, 0x5b, 0xcd, 0xa3, 0xf2, 0x7e, 0xcb, 0xf9, 0xc6, 0x4e, 0xef, 0x5f, + 0xc0, 0xfd, 0xca, 0x14, 0x2b, 0x76, 0x33, 0x06, 0x95, 0xb9, 0xf6, 0xf7, 0x10, 0x4a, 0xbd, 0xed, + 0x9c, 0xf9, 0x63, 0x14, 0xd3, 0xbc, 0x55, 0xf1, 0xbe, 0x79, 0x39, 0xda, 0xa4, 0x6b, 0x6b, 0x92, + 0x3a, 0xc9, 0x1f, 0xe5, 0xc3, 0x3f, 0x4a, 0x6d, 0x1b, 0xbb, 0xb9, 0x6d, 0xaf, 0x45, 0xfc, 0x1d, + 0xff, 0x88, 0xe3, 0x13, 0xe1, 0xa7, 0x1f, 0x92, 0xff, 0x0b, 0x15, 0x71, 0x7f, 0xc8, 0x5e, 0x1e, + 0x00, 0x00 }; // Autogenerated from wled00/data/settings_sync.htm, do not edit!! -const uint16_t PAGE_settings_sync_length = 2840; +const uint16_t PAGE_settings_sync_length = 3153; const uint8_t PAGE_settings_sync[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x95, 0x5a, 0xdb, 0x77, 0xda, 0x38, - 0x13, 0x7f, 0xf7, 0x5f, 0xa1, 0xf5, 0xc3, 0x6e, 0xd8, 0x12, 0xae, 0x21, 0x4d, 0x09, 0x76, 0xbf, - 0x10, 0xd2, 0x24, 0x67, 0x9b, 0x86, 0x42, 0xba, 0x97, 0xa7, 0x3d, 0xc2, 0x16, 0xe0, 0x60, 0x4b, - 0x5e, 0x4b, 0xce, 0xe5, 0xec, 0xd9, 0xff, 0xfd, 0x9b, 0x91, 0x6c, 0x03, 0x06, 0x02, 0x79, 0x28, - 0xb1, 0xa5, 0x99, 0xd1, 0x68, 0x2e, 0xbf, 0x19, 0xc9, 0xed, 0xfd, 0x34, 0xb8, 0xbf, 0x7c, 0xf8, - 0x6b, 0x78, 0x45, 0xe6, 0x2a, 0x0a, 0xdd, 0x1e, 0xfe, 0x92, 0x90, 0xf2, 0x99, 0x63, 0x33, 0x6e, - 0xc3, 0x3b, 0xa3, 0xbe, 0xdb, 0x8b, 0x98, 0xa2, 0x84, 0xd3, 0x88, 0x39, 0xf6, 0x53, 0xc0, 0x9e, - 0x63, 0x91, 0x28, 0x9b, 0x78, 0x82, 0x2b, 0xc6, 0x95, 0x63, 0x3f, 0x07, 0xbe, 0x9a, 0x3b, 0x9d, - 0x46, 0xc3, 0x76, 0x2d, 0x43, 0x6a, 0x95, 0xe6, 0x7c, 0xf6, 0x14, 0x78, 0xec, 0x58, 0xbf, 0x54, - 0x03, 0x1e, 0xa8, 0x80, 0x86, 0xc7, 0xd2, 0xa3, 0x21, 0x73, 0x9a, 0xd5, 0x88, 0xbe, 0x04, 0x51, - 0x1a, 0x15, 0xef, 0xa9, 0x64, 0x89, 0x7e, 0xa1, 0x13, 0x78, 0xe7, 0xc2, 0x26, 0x56, 0x69, 0xe9, - 0x4c, 0x21, 0x6f, 0x4e, 0x13, 0xc9, 0x60, 0x91, 0x54, 0x4d, 0x8f, 0xcf, 0x60, 0x54, 0x05, 0x2a, - 0x64, 0xee, 0xf8, 0x95, 0x7b, 0x64, 0xcc, 0x94, 0x0a, 0xf8, 0x4c, 0xf6, 0xea, 0x66, 0xb0, 0x27, - 0xbd, 0x24, 0x88, 0x95, 0x6b, 0x3d, 0xd1, 0x84, 0xf8, 0x8e, 0x2f, 0xbc, 0x34, 0x02, 0x05, 0xcf, - 0xa7, 0x29, 0xf7, 0x54, 0x20, 0x38, 0x99, 0xdd, 0xfa, 0x47, 0xac, 0xf2, 0x6f, 0xc2, 0x54, 0x9a, - 0x70, 0xe2, 0xd7, 0x66, 0x4c, 0x5d, 0x85, 0x0c, 0x69, 0xfa, 0xaf, 0x7a, 0xea, 0xbf, 0x82, 0xf4, - 0xe6, 0xa8, 0xf2, 0xef, 0x73, 0xc0, 0x7d, 0xf1, 0x5c, 0x13, 0x31, 0xe3, 0x47, 0xf6, 0x5c, 0xa9, - 0x58, 0x76, 0xeb, 0xf5, 0x05, 0x17, 0xb5, 0xe7, 0x90, 0x21, 0x73, 0x3d, 0x00, 0x03, 0x24, 0x53, - 0xea, 0x31, 0x59, 0x4f, 0xfd, 0xf8, 0x98, 0x0b, 0x15, 0x4c, 0x03, 0x96, 0xd4, 0xed, 0x15, 0x41, - 0xfd, 0xb2, 0xa0, 0xba, 0xcc, 0xd4, 0xb6, 0xab, 0xf6, 0xdf, 0x92, 0x85, 0xd3, 0x55, 0x6a, 0xea, - 0x3f, 0x02, 0xfd, 0xe9, 0x49, 0xe7, 0xc4, 0x71, 0xfc, 0xda, 0x78, 0x5a, 0x1b, 0xdc, 0xd6, 0x9e, - 0x68, 0x98, 0xb2, 0xcf, 0x47, 0xcd, 0x7c, 0xe4, 0xc2, 0x8c, 0xfc, 0xfc, 0xf3, 0xd1, 0xda, 0xbb, - 0xd3, 0xa8, 0x54, 0x73, 0x9a, 0xab, 0x1f, 0xeb, 0x34, 0xf9, 0x3b, 0xd0, 0x54, 0xba, 0x9d, 0xce, - 0xe9, 0x59, 0x49, 0x3a, 0xd0, 0x35, 0xf6, 0x89, 0x6f, 0x56, 0xaa, 0x8d, 0x7d, 0xe2, 0x9b, 0x95, - 0x95, 0xbd, 0x7c, 0xb9, 0x84, 0xad, 0x4c, 0x45, 0x72, 0xf4, 0xe8, 0x34, 0xce, 0x1f, 0x7b, 0x67, - 0xe7, 0x8f, 0x1f, 0x3e, 0x54, 0xd0, 0x05, 0xf6, 0xb5, 0xfd, 0xe1, 0xe8, 0xf1, 0x03, 0x10, 0xd7, - 0xbc, 0x39, 0xf3, 0x16, 0xcc, 0x77, 0xcc, 0xf0, 0xd8, 0xae, 0x18, 0x41, 0xae, 0xfb, 0xf8, 0x73, - 0xb3, 0xaa, 0x07, 0x47, 0x3b, 0x68, 0x47, 0x6b, 0xb4, 0xcb, 0x55, 0xaf, 0x71, 0x55, 0x0c, 0x00, - 0xd8, 0x6c, 0xd5, 0x87, 0x7f, 0xd4, 0x69, 0x9e, 0x97, 0xb5, 0x60, 0x1f, 0x9c, 0xed, 0x8a, 0xfc, - 0x4a, 0xab, 0x7e, 0x36, 0x37, 0xda, 0x32, 0x47, 0x7f, 0x75, 0x5a, 0xe7, 0x25, 0x5d, 0x1d, 0x56, - 0x2d, 0x69, 0xe4, 0xf8, 0x4b, 0x75, 0xc6, 0xc3, 0x42, 0x9d, 0x35, 0x8b, 0x1b, 0x29, 0x2f, 0x31, - 0xf0, 0x48, 0xf5, 0x1a, 0xb2, 0x9a, 0x1f, 0xc8, 0x38, 0xa4, 0xaf, 0x0e, 0x73, 0x1b, 0x9f, 0x6d, - 0x2e, 0x38, 0xb3, 0xbb, 0xf6, 0x24, 0x14, 0xde, 0xc2, 0xae, 0xc2, 0x50, 0x61, 0xe9, 0x61, 0xbe, - 0xe8, 0x8a, 0xa1, 0x21, 0x0f, 0x7e, 0xa7, 0x21, 0xac, 0x23, 0x9f, 0x03, 0xe5, 0xcd, 0x8f, 0x62, - 0x4c, 0x99, 0x5b, 0xae, 0xd6, 0x59, 0x2a, 0x95, 0x7f, 0x3d, 0x2a, 0x19, 0x41, 0xf7, 0x77, 0xd7, - 0x74, 0x71, 0x70, 0xe8, 0x7c, 0x92, 0x30, 0xba, 0x38, 0xd7, 0x24, 0x18, 0x7f, 0x25, 0x12, 0x1c, - 0x5a, 0x25, 0x39, 0x69, 0x9c, 0x94, 0xa5, 0xe0, 0xd0, 0x7f, 0xb8, 0xdf, 0x2a, 0x7a, 0x7e, 0x45, - 0x3d, 0xd0, 0xec, 0x1a, 0x54, 0x84, 0x89, 0x5c, 0xd3, 0xff, 0xac, 0x5e, 0x3d, 0x4b, 0xd6, 0x2c, - 0x69, 0x89, 0x4c, 0x3c, 0x67, 0x99, 0x1b, 0x75, 0x59, 0x7b, 0x94, 0x9f, 0x63, 0xe7, 0x04, 0x32, - 0x7e, 0x49, 0x89, 0x86, 0x72, 0xad, 0xff, 0x05, 0x11, 0x22, 0x04, 0x49, 0x93, 0xf0, 0xc8, 0x36, - 0xc6, 0xf3, 0xa4, 0xb4, 0x2b, 0xe7, 0x40, 0xa9, 0x29, 0x7a, 0x75, 0x83, 0x68, 0x13, 0xe1, 0xbf, - 0x12, 0xc1, 0x43, 0x41, 0x7d, 0xc7, 0x06, 0x2d, 0x40, 0x16, 0x04, 0x42, 0x44, 0x02, 0x78, 0xc5, - 0x87, 0xbf, 0x65, 0x01, 0x3b, 0xe3, 0xa9, 0x4d, 0x00, 0x6f, 0xe6, 0x02, 0xa6, 0x62, 0x21, 0x01, - 0xf9, 0x04, 0x97, 0xe9, 0x24, 0x0a, 0x00, 0x79, 0x30, 0xa2, 0x80, 0xd5, 0x0f, 0x9e, 0x88, 0x17, - 0x52, 0x29, 0x1d, 0x5b, 0x89, 0x38, 0x11, 0xcf, 0xeb, 0x63, 0x73, 0x16, 0xc6, 0x7d, 0x04, 0xc7, - 0x49, 0xaa, 0x14, 0xec, 0x5a, 0xbd, 0xc6, 0x20, 0xd7, 0xbc, 0xa0, 0x34, 0x2f, 0x0c, 0xbc, 0x85, - 0x63, 0xdf, 0xa0, 0xac, 0xcf, 0xbd, 0xba, 0x99, 0x00, 0x55, 0x41, 0x84, 0xbb, 0x9d, 0xc7, 0x2a, - 0x98, 0xfa, 0xc8, 0xd4, 0xa7, 0xde, 0x62, 0xc9, 0xb7, 0xc6, 0x61, 0x34, 0xb5, 0xdd, 0x31, 0x7d, - 0x62, 0x4b, 0x92, 0x79, 0x92, 0x8b, 0x9f, 0xb7, 0x5c, 0x4b, 0x23, 0x26, 0x98, 0x37, 0x8d, 0xc1, - 0x3c, 0x2d, 0x18, 0x6b, 0xbb, 0x7f, 0x7c, 0xbd, 0x1a, 0x90, 0x7e, 0x02, 0xe6, 0x01, 0x97, 0x2a, - 0x18, 0x6e, 0xbb, 0x3f, 0x06, 0x43, 0x32, 0x04, 0xe3, 0x76, 0x49, 0x2f, 0xe0, 0x71, 0xaa, 0xb2, - 0x82, 0xf0, 0x63, 0x68, 0x67, 0x4b, 0xf1, 0x34, 0x9a, 0xb0, 0x04, 0x94, 0x8b, 0x02, 0xee, 0xd8, - 0x4d, 0xb0, 0x1a, 0x7d, 0x71, 0xec, 0xd3, 0x4e, 0xa7, 0xdd, 0xb1, 0x73, 0x53, 0xf8, 0xf0, 0x98, - 0xb0, 0x7f, 0xd2, 0x20, 0x61, 0xe8, 0x85, 0xc4, 0x6d, 0x71, 0x7f, 0xab, 0xd4, 0x16, 0xc8, 0x59, - 0x17, 0xfb, 0x1e, 0xa9, 0xfa, 0xdf, 0xaa, 0x3c, 0xc8, 0x49, 0x62, 0xa1, 0x73, 0xf1, 0x61, 0x5d, - 0xae, 0x0e, 0x0c, 0x90, 0x61, 0x92, 0xac, 0xab, 0xf3, 0xcb, 0x5d, 0xd7, 0x06, 0xf2, 0x57, 0x47, - 0x06, 0xfe, 0xb5, 0x0e, 0xe0, 0xee, 0x29, 0xac, 0x5d, 0xf9, 0x5c, 0x44, 0x93, 0x59, 0xc0, 0xbb, - 0x0d, 0x42, 0x53, 0x25, 0x70, 0x12, 0x74, 0x53, 0x3e, 0x16, 0xc9, 0x50, 0xc6, 0x14, 0x36, 0xf5, - 0xa9, 0x10, 0xa3, 0xd8, 0x8b, 0x3a, 0xa6, 0x61, 0x30, 0xe3, 0x5d, 0x8f, 0x61, 0x05, 0xb1, 0x4d, - 0x39, 0x9b, 0x25, 0x22, 0x8d, 0xb1, 0x98, 0xc1, 0xf6, 0xea, 0x9a, 0x5f, 0xcb, 0x70, 0xcd, 0x08, - 0xfc, 0x6b, 0x5a, 0xc5, 0x63, 0xab, 0x78, 0x6a, 0x17, 0x4f, 0x27, 0xc5, 0x53, 0xa7, 0x78, 0x3a, - 0x2d, 0x9e, 0x3e, 0x16, 0x4f, 0x67, 0xcb, 0x25, 0xac, 0x7c, 0x8d, 0x31, 0xe3, 0x7e, 0xb7, 0xa0, - 0xc8, 0xec, 0x62, 0x8c, 0xa0, 0xd1, 0x6f, 0x22, 0x5e, 0x32, 0xeb, 0x80, 0x73, 0x32, 0x7b, 0x35, - 0x6d, 0xb7, 0xcc, 0x61, 0x6d, 0x65, 0x69, 0x15, 0x2c, 0xad, 0x4d, 0x96, 0xad, 0x1c, 0xed, 0x22, - 0x31, 0xe1, 0xf1, 0x30, 0x96, 0x93, 0x62, 0x91, 0x93, 0x43, 0xf5, 0xea, 0x14, 0x2c, 0x9d, 0x03, - 0x17, 0x39, 0x5d, 0xea, 0x75, 0x7a, 0x20, 0xcb, 0xc7, 0x62, 0x91, 0x8f, 0x87, 0xea, 0x75, 0x56, - 0xb0, 0x9c, 0xe5, 0x2c, 0xab, 0xf1, 0x30, 0x62, 0x1e, 0x0b, 0x9e, 0x58, 0xf7, 0x20, 0x61, 0xa3, - 0xc2, 0x5f, 0xa3, 0xe6, 0x61, 0x1a, 0x8f, 0x5a, 0xc5, 0x26, 0x47, 0x07, 0xfa, 0x6b, 0xd4, 0x2e, - 0x16, 0x69, 0x1f, 0xb8, 0xc9, 0x51, 0xe1, 0xaf, 0xd1, 0xc9, 0x81, 0x8b, 0x74, 0x96, 0x7a, 0x1d, - 0xe8, 0xaf, 0xd1, 0x69, 0xb1, 0xc8, 0xe9, 0xa1, 0x7a, 0x15, 0xfe, 0x1a, 0x7d, 0x3c, 0x70, 0x91, - 0xb3, 0xa5, 0x5e, 0xeb, 0xfe, 0xaa, 0x6b, 0x84, 0xd0, 0x38, 0x55, 0xf8, 0x8c, 0x8b, 0xe7, 0x84, - 0xc6, 0xbb, 0xe4, 0xe5, 0x72, 0xa0, 0x90, 0xf4, 0x93, 0x60, 0x36, 0x57, 0x9c, 0x49, 0x59, 0xed, - 0xd5, 0x73, 0xae, 0xb7, 0xb9, 0x33, 0xe6, 0x4b, 0xdb, 0xbd, 0x14, 0xa1, 0x48, 0xaa, 0xd6, 0x06, - 0x23, 0x05, 0x20, 0x7e, 0x9b, 0xf9, 0x4f, 0xdb, 0xbd, 0x9a, 0x4e, 0x99, 0xa7, 0xe4, 0x92, 0xb9, - 0xc0, 0x59, 0x6b, 0x07, 0xd7, 0xf8, 0x1e, 0xc0, 0x74, 0xcc, 0x66, 0xd8, 0x49, 0x13, 0x11, 0x63, - 0xd5, 0x97, 0xd5, 0xb7, 0x17, 0x1a, 0x5f, 0x43, 0xad, 0x24, 0x13, 0x91, 0x72, 0x5f, 0xe2, 0x02, - 0x08, 0x40, 0xc4, 0x34, 0xd0, 0x1e, 0xd5, 0x02, 0xa0, 0x66, 0x12, 0x1f, 0xc0, 0xde, 0x53, 0x78, - 0x08, 0xe0, 0x33, 0xd6, 0x25, 0x6f, 0x5b, 0x6d, 0x3c, 0xb0, 0xdd, 0xdd, 0xa2, 0xb2, 0x82, 0x19, - 0x27, 0x60, 0x51, 0x22, 0x12, 0x72, 0x3b, 0xda, 0x2b, 0xaf, 0xbf, 0x22, 0xef, 0x22, 0x64, 0x2f, - 0x74, 0x5d, 0x6a, 0x77, 0xcf, 0x0e, 0x2f, 0x0c, 0xbb, 0xa5, 0xf9, 0x87, 0xf3, 0x20, 0x0c, 0x62, - 0x49, 0x6e, 0x52, 0x96, 0x6d, 0xe7, 0x7d, 0xc2, 0x6e, 0x56, 0x85, 0xdd, 0x51, 0x2f, 0x11, 0xef, - 0xe3, 0xbf, 0x5b, 0xe5, 0x5f, 0x37, 0x8e, 0x7a, 0x86, 0x73, 0xdb, 0x3e, 0xfe, 0x96, 0x9d, 0xc5, - 0x81, 0x6b, 0x8d, 0xd8, 0x44, 0x08, 0x55, 0xd4, 0x62, 0xa2, 0x04, 0xa1, 0x71, 0x1c, 0xbe, 0x66, - 0xfb, 0x92, 0xb5, 0x5e, 0x3d, 0xd0, 0xfd, 0xc5, 0x2d, 0x97, 0x8a, 0x72, 0x8f, 0x91, 0xaf, 0x41, - 0xd6, 0x5e, 0x58, 0x57, 0x5c, 0x17, 0xcd, 0x20, 0x9f, 0x09, 0x61, 0x66, 0xcf, 0xd2, 0xdf, 0xbe, - 0x66, 0xaa, 0xdf, 0xd1, 0x05, 0x23, 0x6a, 0x1e, 0xc8, 0x25, 0x3b, 0x54, 0x64, 0x4f, 0x3c, 0xb1, - 0x04, 0x85, 0xee, 0x13, 0x83, 0xde, 0x04, 0x15, 0x46, 0x8c, 0x86, 0x2a, 0x88, 0x98, 0xa5, 0x15, - 0xca, 0xf2, 0x92, 0x60, 0xdf, 0x93, 0x64, 0x33, 0x7b, 0x04, 0x8d, 0xb2, 0x30, 0xb3, 0x7e, 0x40, - 0x1b, 0x1c, 0xd1, 0x80, 0x43, 0x57, 0x95, 0x45, 0x3e, 0x0f, 0x5f, 0xf7, 0x30, 0xdf, 0xdd, 0xdb, - 0x2b, 0xbd, 0x8b, 0x6b, 0x7d, 0x63, 0xea, 0x59, 0x24, 0x0b, 0x32, 0xb8, 0xfb, 0x93, 0x68, 0x3e, - 0x6d, 0x3b, 0x98, 0x7c, 0x00, 0x76, 0x90, 0x05, 0xe7, 0x43, 0x4c, 0x00, 0xc3, 0x3c, 0xb8, 0xd5, - 0x8d, 0xa4, 0xb6, 0x32, 0xb8, 0x04, 0x3b, 0x6d, 0x7d, 0x5e, 0x04, 0x91, 0x26, 0xe9, 0x88, 0x65, - 0x3a, 0x71, 0x1b, 0x1b, 0x7a, 0x48, 0xe4, 0x66, 0xad, 0xdd, 0x24, 0x47, 0xf2, 0xe2, 0xf2, 0x5b, - 0xa5, 0x57, 0x37, 0x24, 0x05, 0x69, 0x46, 0x89, 0x7d, 0xbd, 0xed, 0x5e, 0x24, 0xea, 0x18, 0x54, - 0xd9, 0x20, 0xca, 0xe5, 0x35, 0xa0, 0x79, 0xd1, 0x9a, 0xc0, 0xf1, 0xcb, 0xce, 0x9f, 0x00, 0x66, - 0x52, 0xa9, 0x44, 0x44, 0xb0, 0x1b, 0x5f, 0xb2, 0xd6, 0xcd, 0xbc, 0xd9, 0x22, 0x36, 0xc8, 0x08, - 0x92, 0x70, 0xd0, 0x71, 0xad, 0x2d, 0x2d, 0xe0, 0xd5, 0x46, 0x63, 0xb9, 0xad, 0x03, 0x5c, 0xdd, - 0x15, 0xb4, 0x54, 0xbb, 0xfa, 0x41, 0xdd, 0xec, 0xde, 0xa5, 0xe0, 0x44, 0xec, 0x67, 0xf7, 0x78, - 0xe2, 0xaa, 0xc8, 0x08, 0x45, 0xf1, 0x30, 0xc1, 0x21, 0x0c, 0xe0, 0xd8, 0x54, 0xd6, 0xef, 0xc7, - 0x56, 0xfd, 0x1a, 0xb9, 0x7e, 0xed, 0x4f, 0x9f, 0x3e, 0x95, 0xd4, 0xb0, 0xc0, 0xaf, 0xa5, 0x14, - 0xd1, 0x19, 0x41, 0x2e, 0x51, 0x03, 0x22, 0x40, 0x76, 0x8f, 0x92, 0x79, 0xc2, 0xa6, 0x4e, 0x71, - 0xa9, 0x30, 0x0b, 0xd4, 0x3c, 0x9d, 0xd4, 0x3c, 0x11, 0xd5, 0xbf, 0x32, 0xff, 0xcb, 0x8b, 0xf9, - 0xc5, 0x3e, 0x14, 0xda, 0x4a, 0xbc, 0xfd, 0xf8, 0x7b, 0x12, 0x52, 0xbe, 0xb0, 0x5d, 0x3d, 0xde, - 0xab, 0x53, 0xf7, 0x27, 0x8d, 0x4c, 0x8b, 0x20, 0x46, 0x81, 0xc7, 0x62, 0x7a, 0x2c, 0x61, 0x2d, - 0x86, 0x39, 0x11, 0xc3, 0x39, 0x81, 0xa9, 0x25, 0x20, 0x58, 0x3b, 0xf6, 0x3f, 0x36, 0xfb, 0xc7, - 0xc8, 0x93, 0xda, 0x04, 0xd4, 0xf7, 0x11, 0x1c, 0x4b, 0x16, 0x18, 0x5c, 0x6c, 0x6f, 0xfd, 0x73, - 0x13, 0x74, 0x9a, 0x8d, 0x92, 0x01, 0x50, 0x62, 0x24, 0xfc, 0xcd, 0xf0, 0xbd, 0xb3, 0xcb, 0xd1, - 0x87, 0xb7, 0x49, 0x83, 0x40, 0x62, 0xfa, 0xfa, 0xbb, 0x22, 0x14, 0xda, 0x96, 0x31, 0x1c, 0x09, - 0x01, 0x35, 0x46, 0xd7, 0xfd, 0x5d, 0x44, 0x00, 0x4f, 0x56, 0x46, 0x35, 0x78, 0x83, 0xac, 0x9d, - 0x57, 0xb7, 0x5d, 0x04, 0x90, 0x0b, 0x3a, 0x80, 0x70, 0x2d, 0x6b, 0x17, 0x11, 0x74, 0x1f, 0x83, - 0x20, 0x8a, 0x58, 0x42, 0x3e, 0x90, 0x82, 0x7a, 0x67, 0x82, 0x81, 0x66, 0x05, 0xd1, 0x1f, 0x3b, - 0xd2, 0x84, 0x12, 0x6b, 0x3d, 0x20, 0x76, 0xdc, 0x32, 0x31, 0xcc, 0xe8, 0x63, 0x3f, 0x7a, 0xa9, - 0x83, 0x53, 0x4a, 0xa1, 0x61, 0xb2, 0x3d, 0xe0, 0x53, 0x81, 0xf1, 0x61, 0x69, 0x10, 0x01, 0x34, - 0x83, 0xf0, 0x28, 0xc7, 0xf4, 0xc3, 0x9e, 0x9c, 0x6b, 0x34, 0x56, 0x5d, 0x4a, 0x22, 0x5d, 0xa0, - 0xad, 0x2f, 0x22, 0xf1, 0x10, 0xf0, 0x5e, 0xc8, 0xa4, 0x68, 0x4d, 0xf6, 0xe4, 0xd8, 0x97, 0xac, - 0x82, 0xe6, 0x3e, 0x2e, 0x20, 0x96, 0xcc, 0x68, 0x14, 0x51, 0xe2, 0x89, 0x04, 0xeb, 0x3b, 0xd8, - 0x63, 0x1f, 0xe6, 0x5e, 0x67, 0x82, 0x72, 0xf4, 0x26, 0x78, 0x74, 0x15, 0xd3, 0x29, 0x1c, 0x68, - 0x4b, 0xbb, 0xfb, 0xe3, 0x7e, 0xeb, 0xee, 0x8e, 0x5b, 0x9d, 0x4e, 0xb6, 0x41, 0xfd, 0x64, 0x2d, - 0x43, 0x16, 0xca, 0x80, 0xa9, 0xee, 0xbf, 0x0b, 0x28, 0x84, 0xe4, 0x42, 0xca, 0x00, 0xcb, 0x8b, - 0xa9, 0x58, 0x57, 0x51, 0x1a, 0x52, 0xc5, 0xb2, 0xfa, 0x6f, 0xee, 0x38, 0xf7, 0xa5, 0xd6, 0x45, - 0x56, 0xb1, 0x0c, 0x4f, 0xc0, 0x9f, 0x84, 0x29, 0xb5, 0x7a, 0xba, 0xb4, 0x53, 0x3c, 0x0c, 0x16, - 0x1d, 0xc7, 0xc5, 0xad, 0x56, 0x31, 0x64, 0x7c, 0xa6, 0xe6, 0x10, 0xad, 0x2d, 0x53, 0xb2, 0xfa, - 0xe1, 0x2b, 0x5f, 0x68, 0x6d, 0x7a, 0x13, 0xd7, 0xd2, 0x6f, 0x55, 0x72, 0xf7, 0xfd, 0xe1, 0x81, - 0x60, 0x3f, 0x87, 0x1d, 0x85, 0xc4, 0xf3, 0x23, 0x0d, 0x43, 0xbc, 0xaf, 0xe5, 0x98, 0x71, 0x50, - 0x93, 0x41, 0x30, 0x4b, 0x38, 0x0d, 0xc9, 0x5c, 0x48, 0x25, 0x35, 0x5e, 0x58, 0x0f, 0x58, 0x3d, - 0x23, 0xfa, 0x4a, 0x82, 0x08, 0x60, 0x02, 0xc8, 0xe6, 0xe8, 0x13, 0x19, 0x43, 0x1b, 0x00, 0xf0, - 0xc7, 0x75, 0x6b, 0x34, 0xd5, 0xa3, 0x57, 0xe3, 0xe1, 0x59, 0xeb, 0xf4, 0x14, 0x90, 0x6b, 0xe2, - 0xe6, 0xee, 0x27, 0x13, 0x26, 0x11, 0xd4, 0x24, 0x84, 0x33, 0xf4, 0x77, 0x58, 0xee, 0x48, 0x0a, - 0x45, 0x10, 0x8e, 0xc3, 0x19, 0x1b, 0xbc, 0x48, 0x96, 0xa0, 0x8d, 0x24, 0xa1, 0x80, 0x28, 0x04, - 0x7d, 0x55, 0xd3, 0xfc, 0x47, 0xe0, 0x38, 0xd4, 0x47, 0xc1, 0x42, 0xe1, 0x6b, 0xb5, 0xd0, 0x94, - 0x02, 0x07, 0x3c, 0xfb, 0xb8, 0x22, 0xaa, 0x0d, 0x52, 0x22, 0xbd, 0x2f, 0x94, 0x8c, 0x9a, 0x60, - 0x69, 0xc6, 0xfd, 0x55, 0xf2, 0xba, 0x79, 0x23, 0x10, 0xdc, 0xad, 0x2d, 0x66, 0x34, 0x56, 0xec, - 0xdf, 0x6c, 0x58, 0x71, 0xdb, 0xed, 0x43, 0x7f, 0x78, 0xd0, 0xed, 0x43, 0x96, 0xc6, 0x67, 0x8d, - 0xd5, 0x8b, 0x08, 0x83, 0x73, 0x3a, 0x18, 0xc8, 0x45, 0xaa, 0xe6, 0xa0, 0xf8, 0x82, 0xf1, 0xa5, - 0x52, 0xd9, 0x0a, 0xbf, 0xad, 0x2b, 0xd2, 0x2e, 0x7a, 0xa8, 0xcb, 0x90, 0xd1, 0x44, 0xef, 0x4e, - 0x33, 0x92, 0x69, 0xc0, 0x42, 0xdd, 0x48, 0xf9, 0x26, 0x51, 0x6a, 0x44, 0xf7, 0x01, 0x87, 0xc2, - 0xc2, 0x04, 0x43, 0x62, 0x0b, 0x24, 0x8c, 0xf1, 0xba, 0xa7, 0x80, 0x04, 0x0c, 0x25, 0x0b, 0xc3, - 0xc6, 0x04, 0xb6, 0xe9, 0xc4, 0xf0, 0x7d, 0x5f, 0xcf, 0xf2, 0xdd, 0xe8, 0xdd, 0x4f, 0x40, 0xd7, - 0xa4, 0x1c, 0xfc, 0xab, 0x96, 0xbf, 0x1b, 0x1f, 0x64, 0xf9, 0xbb, 0xef, 0xc3, 0xfb, 0xd1, 0xc3, - 0x3b, 0x6f, 0x94, 0xb2, 0xb6, 0x09, 0x63, 0xd8, 0x68, 0x4d, 0x3c, 0xc8, 0x5e, 0x68, 0xbb, 0x02, - 0x1a, 0x42, 0xb0, 0x25, 0x18, 0x79, 0xd8, 0x83, 0x41, 0x15, 0x87, 0xf0, 0x81, 0x7a, 0x0e, 0x61, - 0x95, 0x62, 0x7b, 0x9a, 0x05, 0x1a, 0xe4, 0x9f, 0x09, 0xc4, 0x6f, 0x0c, 0x49, 0xf2, 0xe8, 0xd2, - 0x92, 0x62, 0x58, 0x04, 0xda, 0x30, 0x9f, 0x4c, 0x05, 0x32, 0x0b, 0x98, 0x48, 0xf2, 0x40, 0xfe, - 0x29, 0xcf, 0x00, 0x68, 0xf7, 0x92, 0xb5, 0x04, 0xde, 0x66, 0x80, 0xef, 0x3f, 0xc6, 0x57, 0xa3, - 0x35, 0x23, 0x9c, 0x34, 0x8c, 0xea, 0xc3, 0x6c, 0x8d, 0x92, 0xb1, 0xf3, 0xa5, 0x0b, 0x0c, 0x00, - 0xe3, 0x5c, 0x8c, 0xd7, 0xed, 0x78, 0x7a, 0x62, 0x44, 0x5c, 0x86, 0x01, 0x6e, 0xf1, 0x76, 0xb0, - 0x15, 0x43, 0x72, 0xf6, 0xcb, 0xdb, 0x01, 0x1a, 0x73, 0x53, 0x83, 0x2c, 0x5e, 0x1f, 0x44, 0x1c, - 0x78, 0x6f, 0x49, 0x18, 0x6c, 0x38, 0x51, 0x17, 0x93, 0x6b, 0xbc, 0x9e, 0xda, 0xcf, 0x7d, 0xbd, - 0x09, 0x61, 0x68, 0xf5, 0x61, 0x3a, 0x81, 0x5e, 0x7f, 0x5e, 0x3e, 0x89, 0xed, 0x09, 0xbd, 0xfe, - 0xdd, 0x3b, 0x8e, 0x1d, 0xef, 0xcb, 0x99, 0xe8, 0x1f, 0xa5, 0xb6, 0xa4, 0x8c, 0x8e, 0x87, 0xb5, - 0x8c, 0x59, 0x39, 0xb9, 0x19, 0x0c, 0x06, 0x5d, 0xfe, 0x12, 0x29, 0xf1, 0x28, 0xe6, 0x2d, 0x00, - 0x15, 0x86, 0x11, 0x94, 0x44, 0x1f, 0x8e, 0x74, 0xb7, 0x43, 0x0d, 0x5d, 0x38, 0x12, 0x62, 0x8d, - 0x24, 0x26, 0xb8, 0x41, 0xa0, 0x1e, 0xfb, 0xe5, 0x02, 0x0e, 0xbc, 0xea, 0x17, 0x44, 0x3c, 0x5d, - 0x0f, 0x32, 0xac, 0x9d, 0x03, 0x82, 0xc3, 0x56, 0x6a, 0x56, 0xde, 0xfc, 0x0f, 0x05, 0x40, 0x39, - 0xe2, 0xba, 0x11, 0xb2, 0x96, 0x3c, 0x37, 0x5f, 0xdf, 0xac, 0xde, 0xd0, 0x8e, 0xba, 0x04, 0x23, - 0xfc, 0xb5, 0x04, 0x46, 0x37, 0xb7, 0xdb, 0xf9, 0x1a, 0x8d, 0xb5, 0xba, 0x8f, 0xe5, 0x7e, 0x5f, - 0x7d, 0xbb, 0x19, 0x1a, 0xaf, 0x40, 0x26, 0xf2, 0x2a, 0x38, 0xc4, 0x1c, 0xa1, 0xde, 0x74, 0xe4, - 0xcd, 0x3d, 0x1e, 0xf7, 0xef, 0x79, 0xfd, 0x7e, 0x3a, 0xdd, 0x73, 0x33, 0x70, 0x03, 0x4d, 0x03, - 0x59, 0xb9, 0xfd, 0x20, 0x2b, 0x97, 0x16, 0xbb, 0x14, 0xba, 0x04, 0x16, 0x7d, 0xe7, 0xa1, 0xeb, - 0x03, 0x18, 0xae, 0x9f, 0xfb, 0xa3, 0xbb, 0x71, 0x4b, 0x7c, 0xd3, 0xd8, 0xc0, 0xfd, 0x0c, 0x65, - 0x64, 0xa9, 0xbb, 0xc7, 0x46, 0xc1, 0x25, 0xb5, 0x92, 0xfd, 0x9b, 0x1b, 0xc0, 0xf5, 0x2e, 0xf6, - 0x56, 0x99, 0x7d, 0x93, 0xdb, 0x7a, 0x83, 0xbd, 0xbd, 0x9f, 0x7d, 0xc9, 0x9d, 0x43, 0xe6, 0x50, - 0x5f, 0x7a, 0x60, 0xa8, 0xc5, 0xa9, 0x9c, 0x87, 0x01, 0x5f, 0xe4, 0x49, 0x28, 0xf8, 0x4a, 0xf8, - 0x82, 0xa9, 0xa7, 0x90, 0x1f, 0x30, 0x02, 0xb5, 0x5b, 0xd2, 0xa7, 0xec, 0xb4, 0x1d, 0xd3, 0xd9, - 0x12, 0x05, 0xad, 0xa3, 0xe7, 0xb9, 0x2e, 0x58, 0x09, 0xb4, 0x02, 0x39, 0xb4, 0xf2, 0x59, 0x25, - 0x37, 0x3c, 0x74, 0x4e, 0x2a, 0xc5, 0x08, 0xc2, 0x5b, 0xef, 0x42, 0xb9, 0x20, 0xc6, 0x96, 0xd9, - 0xf4, 0xf9, 0x26, 0x19, 0x40, 0xee, 0x24, 0x0d, 0x42, 0x1f, 0x3f, 0x04, 0x01, 0xa5, 0x4e, 0xb5, - 0x31, 0x4b, 0x00, 0xcc, 0x75, 0x92, 0xf5, 0x69, 0xea, 0x93, 0x04, 0x1a, 0xaf, 0xf2, 0x21, 0xa2, - 0x3f, 0xd8, 0x38, 0x44, 0x34, 0x9b, 0x1d, 0x40, 0x19, 0xfc, 0x6d, 0x34, 0x76, 0xf6, 0xec, 0xad, - 0x76, 0x03, 0x50, 0x14, 0x7f, 0x1b, 0x8d, 0x9d, 0xcd, 0xff, 0x69, 0x03, 0x4e, 0xcd, 0xf8, 0xfb, - 0x86, 0x20, 0x93, 0x25, 0xf8, 0xbb, 0x5b, 0x50, 0xe7, 0xe3, 0x29, 0xd2, 0xc0, 0xef, 0x1b, 0x82, - 0x3e, 0xb5, 0x9a, 0x70, 0x36, 0xc0, 0xdf, 0xdd, 0x82, 0x9a, 0x0d, 0xbd, 0x9a, 0xfe, 0xf3, 0x86, - 0xa8, 0xa6, 0x51, 0xaa, 0x59, 0xd6, 0x6a, 0xed, 0x8c, 0x01, 0xb0, 0xf5, 0x1b, 0x63, 0x31, 0xf6, - 0x65, 0xc6, 0x56, 0x88, 0xa0, 0x58, 0x06, 0x6f, 0xa3, 0x38, 0x11, 0x4f, 0x35, 0x32, 0x16, 0xd0, - 0x57, 0x4f, 0x04, 0x4d, 0x7c, 0xd3, 0x23, 0x42, 0x1d, 0x24, 0x32, 0x8d, 0xf5, 0xb7, 0xb6, 0x39, - 0xa4, 0xa3, 0xf6, 0x47, 0x7e, 0xbb, 0x93, 0xec, 0xfd, 0xd2, 0xf5, 0x9e, 0x8f, 0x56, 0xd6, 0xca, - 0x07, 0x31, 0xfc, 0x32, 0x07, 0x7f, 0xf0, 0xe3, 0x1d, 0x7e, 0xc9, 0xc3, 0xff, 0xb1, 0xf0, 0x7f, - 0x61, 0xea, 0x54, 0x85, 0xc1, 0x20, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x9d, 0x5a, 0x6d, 0x77, 0xda, 0xb8, + 0x12, 0xfe, 0xee, 0x5f, 0xa1, 0xf8, 0xc3, 0x2e, 0x6c, 0x08, 0x18, 0x12, 0xd2, 0x94, 0x62, 0xf7, + 0x86, 0x90, 0x26, 0xec, 0x36, 0x0d, 0x85, 0x64, 0x5f, 0xce, 0xb9, 0xe7, 0xec, 0x11, 0xb6, 0x00, + 0x25, 0xb6, 0xe5, 0xb5, 0xe5, 0xbc, 0x9c, 0x6e, 0xff, 0xfb, 0x9d, 0x91, 0x6c, 0x03, 0x06, 0x02, + 0xbd, 0x1f, 0x4a, 0x6c, 0x69, 0x66, 0x34, 0x9a, 0x97, 0x67, 0x46, 0x72, 0xbb, 0x07, 0xfd, 0xdb, + 0x8b, 0xbb, 0xbf, 0x86, 0x97, 0x64, 0x2e, 0x03, 0xdf, 0xe9, 0xe2, 0x2f, 0xf1, 0x69, 0x38, 0xb3, + 0x4d, 0x16, 0x9a, 0xf0, 0xce, 0xa8, 0xe7, 0x74, 0x03, 0x26, 0x29, 0x09, 0x69, 0xc0, 0x6c, 0xf3, + 0x89, 0xb3, 0xe7, 0x48, 0xc4, 0xd2, 0x24, 0xae, 0x08, 0x25, 0x0b, 0xa5, 0x6d, 0x3e, 0x73, 0x4f, + 0xce, 0xed, 0xb6, 0x65, 0x99, 0x8e, 0xa1, 0x49, 0x8d, 0xd2, 0x9c, 0xc7, 0x9e, 0xb8, 0xcb, 0x8e, + 0xd4, 0x4b, 0x8d, 0x87, 0x5c, 0x72, 0xea, 0x1f, 0x25, 0x2e, 0xf5, 0x99, 0xdd, 0xac, 0x05, 0xf4, + 0x85, 0x07, 0x69, 0x50, 0xbc, 0xa7, 0x09, 0x8b, 0xd5, 0x0b, 0x9d, 0xc0, 0x7b, 0x28, 0x4c, 0x62, + 0x94, 0x96, 0xce, 0x14, 0x72, 0xe7, 0x34, 0x4e, 0x18, 0x2c, 0x92, 0xca, 0xe9, 0xd1, 0x19, 0x8c, + 0x4a, 0x2e, 0x7d, 0xe6, 0x8c, 0x5f, 0x43, 0x97, 0x8c, 0x99, 0x94, 0x3c, 0x9c, 0x25, 0xdd, 0x86, + 0x1e, 0xec, 0x26, 0x6e, 0xcc, 0x23, 0xe9, 0x18, 0x4f, 0x34, 0x26, 0xbe, 0x70, 0x79, 0x54, 0xf3, + 0x6c, 0x4f, 0xb8, 0x69, 0x00, 0x6a, 0xd6, 0x60, 0xc0, 0x3e, 0x68, 0x7e, 0x98, 0xa6, 0xa1, 0x2b, + 0xb9, 0x08, 0xc9, 0x6c, 0xe0, 0x55, 0x58, 0xf5, 0x5b, 0xcc, 0x64, 0x1a, 0x87, 0xc4, 0xab, 0xcf, + 0x98, 0xbc, 0xf4, 0x19, 0x92, 0xf6, 0x5e, 0xd5, 0xd4, 0xf7, 0x82, 0xf4, 0xba, 0x52, 0xfd, 0xf6, + 0xcc, 0x43, 0x4f, 0x3c, 0xd7, 0x45, 0xc4, 0xc2, 0x8a, 0x39, 0x97, 0x32, 0x4a, 0x3a, 0x8d, 0xc6, + 0x63, 0x28, 0xea, 0xcf, 0x3e, 0x43, 0xe6, 0x06, 0x07, 0x6b, 0xc4, 0x53, 0xea, 0xb2, 0xa4, 0x91, + 0x7a, 0xd1, 0x51, 0x28, 0x24, 0x9f, 0x72, 0x16, 0x37, 0xcc, 0x25, 0x41, 0xbd, 0xb2, 0xa0, 0x46, + 0x92, 0xed, 0xc1, 0xac, 0x99, 0x7f, 0x27, 0xcc, 0x9f, 0x2e, 0x53, 0x53, 0xef, 0x01, 0xe8, 0x4f, + 0x4f, 0xda, 0x27, 0xb6, 0xed, 0xd5, 0xc7, 0xd3, 0x7a, 0x7f, 0x50, 0x7f, 0xa2, 0x7e, 0xca, 0x3e, + 0x56, 0x9a, 0xf9, 0xc8, 0xb9, 0x1e, 0xf9, 0xe9, 0xa7, 0xca, 0xca, 0xbb, 0x6d, 0x55, 0x6b, 0x39, + 0xcd, 0xe5, 0xfd, 0x2a, 0x4d, 0xfe, 0x0e, 0x34, 0xd5, 0x4e, 0xbb, 0x7d, 0x7a, 0x56, 0x92, 0x0e, + 0x74, 0xd6, 0x2e, 0xf1, 0xcd, 0x6a, 0xcd, 0xda, 0x25, 0xbe, 0x59, 0x5d, 0xda, 0x8b, 0x2f, 0xa8, + 0xf7, 0xeb, 0xb8, 0xc2, 0x6a, 0xd2, 0x3e, 0xb0, 0xaa, 0xdf, 0x7c, 0x26, 0x89, 0x0f, 0xfc, 0x6e, + 0xcc, 0xa8, 0x64, 0x99, 0xdd, 0x2b, 0xa6, 0x76, 0xa0, 0x59, 0xfd, 0xe0, 0xd7, 0xc1, 0x30, 0xe7, + 0x52, 0xc6, 0x7c, 0x92, 0x4a, 0x06, 0x13, 0xb1, 0x6b, 0xd6, 0x58, 0xb5, 0x56, 0x1e, 0x97, 0xaf, + 0x11, 0x03, 0xd3, 0x49, 0xf6, 0x22, 0x1b, 0x0f, 0xf4, 0x89, 0xe6, 0x02, 0xd6, 0x08, 0x69, 0x02, + 0x11, 0x63, 0xd6, 0x64, 0xb5, 0xe6, 0xd5, 0x27, 0xc2, 0x7b, 0xad, 0xd3, 0x08, 0x1c, 0xe0, 0x5d, + 0xcc, 0xb9, 0xef, 0x55, 0x7c, 0xa4, 0xa7, 0x9e, 0x77, 0xf9, 0x04, 0x5a, 0x7c, 0xe6, 0x09, 0x84, + 0x35, 0x8b, 0x2b, 0x26, 0xea, 0x6c, 0xd6, 0x2a, 0x55, 0xdb, 0xf9, 0x76, 0xc5, 0xe4, 0xef, 0x95, + 0x6a, 0x0d, 0x22, 0xee, 0x77, 0xea, 0x57, 0xaa, 0xdf, 0x37, 0x33, 0xb0, 0x38, 0x16, 0x31, 0xe8, + 0x09, 0x0c, 0x90, 0x1c, 0x89, 0xf0, 0x59, 0xdd, 0x17, 0xb3, 0x8a, 0x79, 0x89, 0xe3, 0x24, 0xb3, + 0x02, 0x78, 0x9b, 0x4c, 0xb9, 0xcf, 0xd4, 0x7e, 0x20, 0x1b, 0x62, 0xd8, 0xf7, 0xe7, 0x6c, 0x5c, + 0x4c, 0x31, 0xe3, 0xa6, 0x7c, 0x96, 0xc6, 0x54, 0x99, 0x4d, 0xef, 0x87, 0x4c, 0x29, 0xc7, 0x28, + 0xfb, 0x6f, 0x38, 0x08, 0x5d, 0x11, 0x44, 0x60, 0x3d, 0x46, 0x22, 0x3a, 0x63, 0xc4, 0xa3, 0x92, + 0x1e, 0x40, 0xcc, 0x2c, 0x59, 0xfa, 0xd3, 0x05, 0x04, 0xcd, 0x54, 0xc4, 0x95, 0x07, 0xdb, 0xfa, + 0xf0, 0xd0, 0x3d, 0xfb, 0xf0, 0x70, 0x78, 0x58, 0xc5, 0x60, 0x37, 0xaf, 0xcc, 0xc3, 0xca, 0xc3, + 0x21, 0xb8, 0xa5, 0xee, 0xce, 0x99, 0xfb, 0xc8, 0x3c, 0x5b, 0x0f, 0x8f, 0xcd, 0xaa, 0x76, 0x99, + 0xe3, 0x3c, 0xfc, 0xd4, 0xac, 0xa9, 0xc1, 0xd1, 0x16, 0xda, 0xd1, 0x0a, 0xed, 0x62, 0xd5, 0x2b, + 0x5c, 0x15, 0xf3, 0x0e, 0xc2, 0x0a, 0x7c, 0x6c, 0xd5, 0x7c, 0x1b, 0x72, 0xad, 0xa4, 0x05, 0x3b, + 0xb4, 0x37, 0x2b, 0xf2, 0x8b, 0x5f, 0x93, 0xd9, 0xdc, 0x68, 0xc3, 0x9c, 0xff, 0x8b, 0xdd, 0xfa, + 0x50, 0xd2, 0xd5, 0x66, 0xb5, 0x92, 0x46, 0xb6, 0x5c, 0xa8, 0x33, 0x1e, 0x16, 0xea, 0xac, 0xc4, + 0xb6, 0x96, 0xf2, 0x12, 0x01, 0x4f, 0x22, 0x5f, 0xc1, 0x3f, 0x1e, 0x4f, 0x22, 0x9f, 0xbe, 0xda, + 0xcc, 0xb1, 0x3e, 0x9a, 0xa1, 0x08, 0x99, 0xd9, 0x31, 0x27, 0x00, 0x15, 0x8f, 0xe0, 0x1e, 0xc7, + 0x2a, 0x62, 0x7a, 0x98, 0x2f, 0xba, 0x64, 0xe8, 0x3c, 0x18, 0xbe, 0x25, 0xcf, 0x5c, 0xba, 0xf3, + 0x4a, 0x84, 0x48, 0x35, 0x80, 0x30, 0x5e, 0x61, 0xa9, 0x56, 0xbf, 0xb9, 0x34, 0x61, 0x04, 0x13, + 0xad, 0xb3, 0xa2, 0x8b, 0x8d, 0x43, 0x1f, 0x26, 0x90, 0x01, 0x8f, 0x1f, 0x14, 0x09, 0x66, 0x7a, + 0x89, 0x04, 0x87, 0x96, 0x49, 0x4e, 0xac, 0x93, 0xb2, 0x14, 0x1c, 0xfa, 0x8e, 0xfb, 0xad, 0xa1, + 0xe7, 0x97, 0xd4, 0x03, 0xcd, 0x4c, 0x0c, 0xb4, 0x8e, 0x69, 0xdb, 0x19, 0xe8, 0xc0, 0xc6, 0x54, + 0x5c, 0xd5, 0xa3, 0x58, 0x48, 0xe1, 0x0a, 0x1f, 0x36, 0xa8, 0x70, 0xd1, 0xaa, 0x55, 0x14, 0x60, + 0xda, 0x48, 0xe1, 0x8f, 0xa5, 0x88, 0x21, 0xba, 0x10, 0x12, 0x07, 0x92, 0x05, 0x98, 0x09, 0xee, + 0x00, 0x6c, 0x56, 0xfd, 0xf7, 0xdf, 0x8c, 0x0c, 0xf8, 0x83, 0x08, 0x02, 0xf7, 0x13, 0xc8, 0x27, + 0x37, 0xc2, 0x63, 0x75, 0x32, 0xf4, 0x19, 0x6a, 0xc8, 0x10, 0x06, 0xc9, 0x1f, 0x9f, 0x2f, 0xfb, + 0x64, 0x30, 0x3c, 0xc0, 0x4c, 0x5c, 0x96, 0x98, 0xac, 0x4a, 0xac, 0x29, 0x69, 0xd5, 0x2a, 0x52, + 0x29, 0x7c, 0x40, 0xf1, 0x1f, 0x15, 0xbc, 0x02, 0xba, 0x9a, 0x87, 0x6a, 0xba, 0x63, 0x9a, 0xd5, + 0xc3, 0x05, 0x52, 0x36, 0x92, 0xfa, 0x43, 0xf2, 0x31, 0xb2, 0x4f, 0xcc, 0xda, 0x41, 0xb3, 0xfa, + 0xdd, 0xe8, 0x36, 0x32, 0xd8, 0xef, 0x2a, 0x8f, 0x3a, 0xff, 0xe1, 0x01, 0x16, 0x10, 0x92, 0xc6, + 0x3e, 0xe0, 0x86, 0x72, 0xb2, 0x9b, 0x24, 0x80, 0x29, 0x40, 0xa8, 0x08, 0xba, 0x0d, 0x5d, 0xf0, + 0x10, 0x06, 0x20, 0x29, 0x71, 0x65, 0xdb, 0x04, 0x6b, 0x41, 0x71, 0x81, 0x80, 0x0d, 0x0c, 0xc2, + 0xe1, 0x1d, 0x9f, 0xfe, 0x4e, 0xcc, 0xac, 0x20, 0x8e, 0xa7, 0x26, 0x81, 0x72, 0x34, 0x17, 0x30, + 0x13, 0x89, 0x04, 0x0a, 0x23, 0xa4, 0x77, 0x3a, 0x09, 0x38, 0x14, 0x26, 0x8c, 0x7c, 0x60, 0xf5, + 0xf8, 0x13, 0x71, 0x7d, 0x9a, 0x24, 0xb6, 0x29, 0x05, 0x98, 0xe7, 0x39, 0x1b, 0x33, 0xb2, 0xc1, + 0x39, 0xf3, 0xa3, 0x1e, 0x8c, 0x01, 0x1c, 0x49, 0xf0, 0x0e, 0x02, 0x97, 0x6d, 0xea, 0x17, 0x94, + 0xe6, 0xfa, 0xdc, 0x7d, 0xb4, 0xcd, 0x6b, 0x94, 0xf5, 0xb1, 0xdb, 0xd0, 0x13, 0xa0, 0x2a, 0x88, + 0x28, 0x78, 0x8c, 0x2d, 0x4c, 0x3d, 0x64, 0xea, 0x51, 0xf7, 0x71, 0xc1, 0xb7, 0xb2, 0x8a, 0xd6, + 0xd4, 0x74, 0xc6, 0xf4, 0x89, 0x2d, 0x48, 0xe6, 0x31, 0x54, 0x72, 0x2d, 0x7f, 0xde, 0xd2, 0x05, + 0x15, 0x4c, 0x9c, 0x46, 0x60, 0x9e, 0x16, 0x0c, 0x1d, 0x3b, 0xca, 0x87, 0xbd, 0x18, 0xcc, 0x03, + 0xa1, 0x27, 0x61, 0xf8, 0xd8, 0xb9, 0xef, 0x0f, 0xc9, 0x10, 0x8c, 0xdb, 0x21, 0x5d, 0x1e, 0x46, + 0xa9, 0xcc, 0xcc, 0x73, 0x3f, 0x34, 0x73, 0xe5, 0xc2, 0x34, 0x98, 0xb0, 0x18, 0xac, 0xc5, 0x43, + 0xdb, 0x6c, 0xc2, 0x5f, 0xfa, 0x62, 0x9b, 0xa7, 0xed, 0xf6, 0x71, 0xdb, 0xcc, 0xcd, 0xe3, 0xc1, + 0x63, 0xcc, 0xfe, 0x49, 0x79, 0xcc, 0xd0, 0x0b, 0xb1, 0xd3, 0x0a, 0xbd, 0x55, 0xa9, 0x59, 0x2f, + 0x70, 0xdf, 0x32, 0xc9, 0xff, 0x2f, 0x55, 0xfd, 0x5b, 0x91, 0x07, 0xe0, 0xa1, 0x7c, 0x8b, 0x7f, + 0x57, 0xe5, 0xaa, 0xc0, 0x00, 0x19, 0x1a, 0x0c, 0x3a, 0x0a, 0x07, 0x9c, 0xd5, 0x3d, 0x02, 0xce, + 0x68, 0xe6, 0xd1, 0xda, 0x5e, 0x37, 0x72, 0x77, 0x25, 0xb6, 0x36, 0xf9, 0x5c, 0x40, 0xe3, 0x19, + 0x0f, 0x3b, 0x16, 0xa1, 0xa9, 0x14, 0x38, 0x09, 0xba, 0x49, 0x0f, 0x7b, 0x28, 0x3f, 0x89, 0x28, + 0x6c, 0xea, 0x7d, 0x21, 0x06, 0x6b, 0xd9, 0x11, 0xf5, 0xf9, 0x2c, 0xec, 0xb8, 0x2a, 0x99, 0x4c, + 0xed, 0x9c, 0x59, 0x2c, 0xd2, 0x08, 0x7b, 0x1d, 0xd8, 0x5e, 0x43, 0xf1, 0x2b, 0x19, 0x8e, 0x1e, + 0x81, 0x7f, 0x4d, 0xa3, 0x78, 0x6c, 0x15, 0x4f, 0xc7, 0xc5, 0xd3, 0x49, 0xf1, 0xd4, 0x2e, 0x9e, + 0x4e, 0x8b, 0xa7, 0x77, 0xc5, 0xd3, 0xd9, 0x62, 0x09, 0x23, 0x5f, 0x63, 0x0c, 0xa5, 0xb2, 0x53, + 0x50, 0x64, 0x76, 0xd1, 0x46, 0x50, 0x28, 0x3d, 0x11, 0x2f, 0x99, 0x75, 0x9a, 0x79, 0xca, 0xc0, + 0x93, 0x53, 0xe6, 0x30, 0x36, 0xb2, 0xb4, 0x0a, 0x96, 0xd6, 0x3a, 0xcb, 0x46, 0x8e, 0xe3, 0xa2, + 0x5d, 0x84, 0xc7, 0xfd, 0x58, 0x4e, 0x8a, 0x45, 0x4e, 0xf6, 0xd5, 0xab, 0x5d, 0xb0, 0xb4, 0xf7, + 0x5c, 0xe4, 0x74, 0xa1, 0xd7, 0xe9, 0x9e, 0x2c, 0xef, 0x8a, 0x45, 0xde, 0xed, 0xab, 0xd7, 0x59, + 0xc1, 0x72, 0x96, 0xb3, 0x2c, 0xc7, 0xc3, 0x88, 0xb9, 0x8c, 0x3f, 0xb1, 0xce, 0x5e, 0xc2, 0x46, + 0x85, 0xbf, 0x46, 0xcd, 0xfd, 0x34, 0x1e, 0xb5, 0x8a, 0x4d, 0x8e, 0xf6, 0xf4, 0xd7, 0xe8, 0xb8, + 0x58, 0xe4, 0x78, 0xcf, 0x4d, 0x8e, 0x0a, 0x7f, 0x8d, 0x4e, 0xf6, 0x5c, 0xa4, 0xbd, 0xd0, 0x6b, + 0x4f, 0x7f, 0x8d, 0x4e, 0x8b, 0x45, 0x4e, 0xf7, 0xd5, 0xab, 0xf0, 0xd7, 0xe8, 0xdd, 0x9e, 0x8b, + 0x9c, 0x2d, 0xf4, 0x5a, 0xf5, 0x57, 0x43, 0x21, 0x84, 0xc2, 0xa9, 0xc2, 0x67, 0xa1, 0x78, 0x8e, + 0x69, 0xb4, 0x4d, 0x5e, 0x2e, 0x07, 0xea, 0x48, 0x2f, 0xe6, 0xb3, 0xb9, 0x0c, 0x59, 0x92, 0xd4, + 0xba, 0x8d, 0x9c, 0xeb, 0x6d, 0xee, 0x8c, 0xf9, 0xc2, 0x74, 0x2e, 0x84, 0x2f, 0xe2, 0x9a, 0xb1, + 0xc6, 0x48, 0x01, 0x88, 0xdf, 0x66, 0xfe, 0xd3, 0x74, 0x2e, 0xa7, 0x53, 0xe6, 0xca, 0x64, 0xc1, + 0x5c, 0xe0, 0xac, 0xb1, 0x85, 0x6b, 0x7c, 0x0b, 0x60, 0x3a, 0x66, 0x33, 0xec, 0xf1, 0x89, 0x88, + 0xb0, 0x01, 0x49, 0x6a, 0x6f, 0x2f, 0x34, 0xbe, 0x82, 0x73, 0x26, 0x99, 0x88, 0x34, 0xf4, 0x12, + 0x5c, 0x00, 0x01, 0x88, 0xe8, 0x23, 0x95, 0xee, 0x60, 0x12, 0x6c, 0xa7, 0x3d, 0x00, 0x7b, 0x57, + 0xe2, 0x19, 0x31, 0x9c, 0xb1, 0x0e, 0x79, 0xdb, 0x6a, 0xe3, 0xbe, 0xe9, 0x6c, 0x17, 0x95, 0x15, + 0xcc, 0x28, 0x06, 0x8b, 0x12, 0x68, 0xd6, 0x07, 0xa3, 0x9d, 0xf2, 0x7a, 0x4b, 0xf2, 0xce, 0x7d, + 0xf6, 0x42, 0x57, 0xa5, 0x76, 0x76, 0xec, 0xf0, 0x5c, 0xb3, 0x1b, 0x8a, 0x7f, 0x08, 0xe7, 0x10, + 0x1e, 0x25, 0xe4, 0x3a, 0x65, 0xd9, 0x76, 0x7e, 0x4c, 0xd8, 0xf5, 0xb2, 0xb0, 0x1b, 0xea, 0xc6, + 0xe2, 0xc7, 0xf8, 0x6f, 0x96, 0xf9, 0x57, 0x8d, 0x23, 0x9f, 0xe1, 0x58, 0xbf, 0x8b, 0xbf, 0x65, + 0x66, 0x71, 0xe0, 0x18, 0x23, 0x36, 0x11, 0x42, 0x16, 0xb5, 0x98, 0x48, 0x41, 0xe0, 0xac, 0xe5, + 0xbf, 0x66, 0xfb, 0x4a, 0xea, 0xdd, 0x06, 0x57, 0xfd, 0xc5, 0x20, 0x4c, 0x24, 0x0d, 0x5d, 0x46, + 0xf0, 0x00, 0xa5, 0xda, 0x0b, 0xe3, 0x32, 0x54, 0x45, 0x93, 0xe7, 0x33, 0x3e, 0xcc, 0xec, 0x58, + 0xfa, 0xcb, 0xe7, 0x4c, 0xf5, 0x1b, 0xfa, 0xc8, 0x88, 0x9c, 0xf3, 0x64, 0xc1, 0x0e, 0x15, 0xd9, + 0x15, 0x4f, 0x2c, 0x46, 0xa1, 0xbb, 0xc4, 0xa0, 0x37, 0x41, 0x85, 0x11, 0xa3, 0xbe, 0xe4, 0x01, + 0x33, 0x94, 0x42, 0x59, 0x5e, 0x12, 0xec, 0x7b, 0xe2, 0x6c, 0x66, 0x87, 0xa0, 0x51, 0x16, 0x66, + 0xc6, 0x3d, 0x34, 0xc3, 0x01, 0xe5, 0x70, 0x86, 0xcb, 0x23, 0x3f, 0xf4, 0x5f, 0x77, 0x30, 0xdf, + 0xdc, 0x9a, 0x4b, 0xbd, 0x8b, 0x63, 0x7c, 0x61, 0xf2, 0x59, 0xc4, 0x8f, 0xa4, 0x7f, 0xf3, 0x27, + 0x51, 0x7c, 0xca, 0x76, 0x30, 0x79, 0x07, 0xec, 0x20, 0x2b, 0x61, 0x3e, 0x26, 0x80, 0x66, 0xee, + 0x0f, 0x54, 0x4f, 0xa8, 0xac, 0x0c, 0x2e, 0xc1, 0x13, 0x81, 0xba, 0x41, 0x00, 0x91, 0x3a, 0xe9, + 0x88, 0xa1, 0x4f, 0x0c, 0x26, 0x1e, 0x3c, 0x20, 0x91, 0x9b, 0xf5, 0xe3, 0x26, 0xa9, 0x24, 0xe7, + 0x17, 0x5f, 0xaa, 0xdd, 0x86, 0x26, 0x29, 0x48, 0x33, 0x4a, 0x3c, 0x7f, 0x98, 0xce, 0x79, 0x2c, + 0x8f, 0x40, 0x95, 0x35, 0xa2, 0x5c, 0x9e, 0x05, 0xcd, 0x8b, 0xd2, 0x04, 0x8e, 0x89, 0x66, 0xfe, + 0x04, 0x30, 0x93, 0x26, 0x52, 0x04, 0x04, 0xbb, 0xf1, 0x05, 0x6b, 0x43, 0xcf, 0xeb, 0x2d, 0x62, + 0x83, 0x8c, 0x20, 0x09, 0x07, 0x32, 0xc7, 0xd8, 0xd0, 0x58, 0x5e, 0x0e, 0xf7, 0xe9, 0x00, 0x97, + 0x77, 0x55, 0xf4, 0xdb, 0xeb, 0xfd, 0xa0, 0xea, 0x75, 0x6f, 0x52, 0x70, 0x22, 0xf6, 0xb3, 0x3b, + 0x3c, 0x71, 0x59, 0x64, 0x84, 0xa4, 0x78, 0x98, 0x08, 0x21, 0x0c, 0xe0, 0x78, 0x57, 0xd6, 0xef, + 0x7e, 0xa3, 0x7e, 0x56, 0xae, 0xdf, 0xf1, 0xfb, 0xf7, 0xef, 0x4b, 0x6a, 0x18, 0xe0, 0xd7, 0x52, + 0x8a, 0xa8, 0x8c, 0x20, 0x17, 0xa8, 0x01, 0x11, 0x20, 0xbb, 0x4b, 0xc9, 0x3c, 0x66, 0x53, 0xbb, + 0xb8, 0x66, 0x9a, 0x71, 0x39, 0x4f, 0x27, 0x75, 0x38, 0xfa, 0x37, 0x3e, 0x33, 0xef, 0xd3, 0x8b, + 0xfe, 0xc5, 0x3e, 0x14, 0xda, 0x4a, 0xbc, 0x1c, 0xfb, 0x7b, 0xe2, 0xd3, 0xf0, 0xd1, 0x74, 0xd4, + 0x78, 0xb7, 0x41, 0x9d, 0x03, 0x85, 0x4c, 0x8f, 0x3c, 0x42, 0x81, 0x47, 0x62, 0x7a, 0x94, 0xc0, + 0x5a, 0x0c, 0x73, 0x22, 0x82, 0x73, 0x02, 0x93, 0x0b, 0x40, 0x30, 0xb6, 0xec, 0x7f, 0xac, 0xf7, + 0x8f, 0x91, 0x97, 0x28, 0x13, 0x50, 0xcf, 0x43, 0x70, 0x2c, 0x59, 0xa0, 0x7f, 0x5e, 0xb6, 0x80, + 0xb1, 0x62, 0x82, 0x76, 0xd3, 0x2a, 0x19, 0x00, 0x25, 0x06, 0x70, 0x62, 0x5c, 0x0b, 0xdf, 0x1b, + 0xb3, 0x1c, 0x7d, 0x78, 0xd9, 0xd8, 0xe7, 0x09, 0xa6, 0xaf, 0xb7, 0x2d, 0x42, 0xa1, 0x6d, 0x19, + 0xc3, 0xb1, 0x10, 0x50, 0x63, 0x74, 0xd5, 0xdb, 0x46, 0x04, 0xf0, 0x64, 0x64, 0x54, 0xfd, 0x37, + 0xc8, 0x8e, 0xf3, 0xea, 0xb6, 0x8d, 0x00, 0x72, 0x41, 0x05, 0x10, 0xae, 0x65, 0x6c, 0x23, 0x82, + 0xee, 0xa3, 0xcf, 0x83, 0x00, 0x4e, 0xc1, 0x87, 0xa4, 0xa0, 0xde, 0x9a, 0x60, 0xa0, 0x59, 0x41, + 0xf4, 0xc7, 0x96, 0x34, 0xa1, 0xc4, 0x58, 0x0d, 0x88, 0x2d, 0xf7, 0x8e, 0x0c, 0x33, 0xfa, 0xc8, + 0x0b, 0x5e, 0x1a, 0xe0, 0x94, 0x52, 0x68, 0xe8, 0x6c, 0xe7, 0xe1, 0x54, 0x60, 0x7c, 0x18, 0x0a, + 0x44, 0x00, 0xcd, 0x20, 0x3c, 0xca, 0x31, 0x7d, 0xb7, 0x23, 0xe7, 0x2c, 0x6b, 0xd9, 0xa5, 0x24, + 0x50, 0x05, 0xda, 0xf8, 0x24, 0x62, 0x17, 0x01, 0xef, 0x85, 0x4c, 0x8a, 0xd6, 0x64, 0x47, 0x8e, + 0x7d, 0xca, 0x2a, 0x68, 0xee, 0xe3, 0x02, 0x62, 0xc9, 0x8c, 0x06, 0x01, 0x25, 0xae, 0x88, 0xb1, + 0xbe, 0x83, 0x3d, 0x76, 0x61, 0xee, 0x55, 0x26, 0x28, 0x47, 0x6f, 0x82, 0x47, 0x57, 0x31, 0x9d, + 0xc2, 0x81, 0xb6, 0xb4, 0xbb, 0x3f, 0x6e, 0x37, 0xee, 0xee, 0xa8, 0xd5, 0x6e, 0x67, 0x1b, 0x54, + 0x4f, 0xc6, 0x22, 0x64, 0xa1, 0x0c, 0xe8, 0xea, 0xfe, 0xbb, 0x80, 0x42, 0x48, 0xce, 0x93, 0x84, + 0x63, 0x79, 0xd1, 0x15, 0xeb, 0x32, 0x48, 0x7d, 0x2a, 0x59, 0x56, 0xff, 0xf5, 0x15, 0xf8, 0xae, + 0xd4, 0x3a, 0xcf, 0x2a, 0x96, 0xe6, 0xe1, 0xe1, 0x53, 0x76, 0x29, 0xa3, 0xa6, 0x4b, 0x3b, 0xc5, + 0xc3, 0x60, 0xd1, 0x71, 0x9c, 0x0f, 0x94, 0x8a, 0x3e, 0x0b, 0x67, 0x72, 0x0e, 0xd1, 0xda, 0xd2, + 0x25, 0xab, 0xe7, 0xbf, 0x86, 0x8f, 0x4a, 0x9b, 0xee, 0xc4, 0x31, 0xd4, 0x5b, 0x8d, 0xdc, 0x7c, + 0xbd, 0xbb, 0x23, 0xd8, 0xcf, 0x61, 0x47, 0x81, 0x77, 0x9f, 0x84, 0xfa, 0x3e, 0x5e, 0x2e, 0x86, + 0x98, 0x71, 0x50, 0x93, 0x41, 0x30, 0x8b, 0x43, 0xea, 0x93, 0xb9, 0x48, 0x64, 0xa2, 0xf0, 0xc2, + 0xb8, 0xc3, 0xea, 0x19, 0xd0, 0x57, 0xc2, 0x03, 0x80, 0x09, 0x20, 0x9b, 0xa3, 0x4f, 0x92, 0x08, + 0xda, 0x00, 0x80, 0xbf, 0x50, 0xb5, 0x46, 0x53, 0x35, 0x7a, 0x39, 0x1e, 0x9e, 0xb5, 0x4e, 0x4f, + 0x01, 0xb9, 0x26, 0x4e, 0xee, 0x7e, 0x32, 0x61, 0x09, 0x82, 0x5a, 0x02, 0xe1, 0x0c, 0xfd, 0x1d, + 0x96, 0x3b, 0x92, 0x42, 0x11, 0x84, 0xe3, 0x70, 0xc6, 0x06, 0x2f, 0x09, 0x8b, 0xd1, 0x46, 0x09, + 0xa1, 0x80, 0x28, 0x04, 0x7d, 0x55, 0x57, 0xfc, 0x15, 0x70, 0x1c, 0xea, 0x23, 0x61, 0x21, 0xff, + 0xb5, 0x56, 0x68, 0x4a, 0x81, 0x03, 0x9e, 0x3d, 0x5c, 0x11, 0xd5, 0x06, 0x29, 0x81, 0xda, 0x17, + 0x4a, 0x46, 0x4d, 0xb0, 0x34, 0xe3, 0xfe, 0xaa, 0x79, 0xdd, 0xbc, 0x16, 0x08, 0xee, 0xc6, 0x06, + 0x33, 0x6a, 0x2b, 0xf6, 0xae, 0xd7, 0xac, 0xb8, 0xe9, 0x4e, 0xa3, 0xb7, 0xdf, 0x9d, 0x46, 0x96, + 0xc6, 0x67, 0xd6, 0xf2, 0x45, 0x84, 0xc6, 0x39, 0x15, 0x0c, 0xe4, 0x3c, 0x95, 0x73, 0x50, 0xfc, + 0x91, 0x85, 0x0b, 0xa5, 0xb2, 0x15, 0x7e, 0x5b, 0x55, 0xe4, 0xb8, 0xe8, 0xa1, 0x2e, 0x7c, 0x46, + 0x63, 0xb5, 0x3b, 0xc5, 0x48, 0xa6, 0x9c, 0xf9, 0xaa, 0x91, 0xf2, 0x74, 0xa2, 0xd4, 0x89, 0xea, + 0x03, 0xf6, 0x85, 0x85, 0x09, 0x86, 0xc4, 0x06, 0x48, 0x18, 0xe3, 0x75, 0x4f, 0x01, 0x09, 0x18, + 0x4a, 0x06, 0x86, 0x8d, 0x0e, 0x6c, 0xdd, 0x89, 0xe1, 0xfb, 0xae, 0x9e, 0xe5, 0xab, 0xd6, 0xbb, + 0x17, 0x83, 0xae, 0x71, 0x39, 0xf8, 0x97, 0x2d, 0x7f, 0x33, 0xde, 0xcb, 0xf2, 0x37, 0x5f, 0x87, + 0xb7, 0xa3, 0xbb, 0xcd, 0x65, 0x65, 0xeb, 0xdd, 0x4f, 0xd6, 0x36, 0x61, 0x0c, 0x6b, 0xad, 0x89, + 0x0b, 0xd9, 0x0b, 0x6d, 0x17, 0xa7, 0x3e, 0x04, 0x5b, 0x8c, 0x91, 0x87, 0x3d, 0x18, 0x54, 0x71, + 0x08, 0x1f, 0xa8, 0xe7, 0x10, 0x56, 0x29, 0xb6, 0xa7, 0x59, 0xa0, 0xe1, 0xa5, 0xa8, 0x0a, 0xc4, + 0x2f, 0x0c, 0x49, 0xf2, 0xe8, 0x52, 0x92, 0x22, 0x58, 0x04, 0xda, 0x30, 0x8f, 0x4c, 0x05, 0x32, + 0x0b, 0x98, 0x88, 0xf3, 0x40, 0x3e, 0xc8, 0x33, 0x00, 0xda, 0xbd, 0x78, 0x25, 0x81, 0x37, 0x19, + 0xe0, 0xeb, 0xfd, 0xf8, 0x72, 0xb4, 0x62, 0x84, 0x13, 0x4b, 0xab, 0x3e, 0xcc, 0xd6, 0x28, 0x19, + 0x3b, 0x5f, 0xba, 0xc0, 0x00, 0x30, 0xce, 0xf9, 0x78, 0xd5, 0x8e, 0xa7, 0x27, 0x5a, 0xc4, 0x85, + 0xcf, 0x71, 0x8b, 0x83, 0xfe, 0x46, 0x0c, 0xc9, 0xd9, 0x2f, 0x06, 0x7d, 0x34, 0xe6, 0xba, 0x06, + 0x59, 0xbc, 0xde, 0x89, 0x88, 0xbb, 0x6f, 0x49, 0xe8, 0xaf, 0x39, 0x51, 0x15, 0x93, 0x2b, 0xbc, + 0x9e, 0xda, 0xcd, 0x7d, 0xb5, 0x0e, 0x61, 0x68, 0xf5, 0x61, 0x3a, 0x81, 0x5e, 0x7f, 0x5e, 0x3e, + 0x89, 0xed, 0x08, 0xbd, 0xde, 0xcd, 0x0f, 0x1c, 0x3b, 0x7e, 0x2c, 0x67, 0x82, 0x7f, 0xa4, 0xdc, + 0x90, 0x32, 0x2a, 0x1e, 0x56, 0x32, 0x66, 0xe9, 0xe4, 0xa6, 0x31, 0x18, 0x74, 0xf9, 0x4b, 0xa4, + 0xc4, 0xa5, 0x98, 0xb7, 0x00, 0x54, 0x18, 0x46, 0x50, 0x12, 0x3d, 0x38, 0xd2, 0x0d, 0x86, 0x0a, + 0xba, 0x70, 0xc4, 0xc7, 0x1a, 0x49, 0x74, 0x70, 0x83, 0x40, 0x35, 0xf6, 0xf3, 0x39, 0x1c, 0x78, + 0xe5, 0xcf, 0x88, 0x78, 0xaa, 0x1e, 0x64, 0x58, 0x3b, 0x07, 0x04, 0x87, 0xad, 0xd4, 0x8d, 0xbc, + 0xf9, 0x1f, 0x0a, 0x80, 0x72, 0xc4, 0x75, 0x2d, 0x64, 0x25, 0x79, 0xae, 0x3f, 0xbf, 0x59, 0xbd, + 0xa1, 0x1d, 0x75, 0x08, 0x46, 0xf8, 0x6b, 0x09, 0x8c, 0xae, 0x07, 0x9b, 0xf9, 0x2c, 0x6b, 0xa5, + 0xee, 0x63, 0xb9, 0xdf, 0x55, 0xdf, 0xae, 0x87, 0xda, 0x2b, 0x90, 0x89, 0x61, 0x0d, 0x1c, 0xa2, + 0x8f, 0x50, 0x6f, 0x3a, 0xf2, 0xfa, 0x16, 0x8f, 0xfb, 0xb7, 0x61, 0xe3, 0x76, 0x3a, 0xdd, 0x71, + 0x33, 0x70, 0x0d, 0x4d, 0x03, 0x59, 0xba, 0xfd, 0x20, 0x4b, 0x97, 0x16, 0xdb, 0x14, 0xba, 0x00, + 0x16, 0x75, 0xe7, 0xa1, 0xea, 0x03, 0x18, 0xae, 0x97, 0xfb, 0xa3, 0xb3, 0x74, 0x4b, 0x9c, 0x11, + 0x5b, 0x6b, 0xb8, 0x9f, 0xa1, 0x4c, 0x52, 0xea, 0xee, 0xb1, 0x51, 0x70, 0x48, 0xbd, 0x64, 0xff, + 0xe6, 0x1a, 0x70, 0xfd, 0x10, 0xfb, 0xda, 0x95, 0xf7, 0x3a, 0xb7, 0xf1, 0x06, 0xfb, 0xf1, 0x6e, + 0xf6, 0x05, 0x77, 0x0e, 0x99, 0x43, 0x75, 0xe9, 0x81, 0xa1, 0x16, 0xa5, 0xc9, 0xdc, 0xe7, 0xe1, + 0x63, 0x9e, 0x84, 0x22, 0x5c, 0x0a, 0x5f, 0x30, 0xf5, 0x14, 0xbf, 0xed, 0xc8, 0x39, 0xd4, 0xee, + 0x84, 0x3e, 0x65, 0xa7, 0x6d, 0xfc, 0x0e, 0x59, 0xa0, 0xa0, 0x51, 0x79, 0x9e, 0xab, 0x82, 0x15, + 0x43, 0x2b, 0x90, 0x43, 0x6b, 0x38, 0xab, 0xe6, 0x86, 0x87, 0xce, 0x49, 0xa6, 0x18, 0x41, 0x78, + 0xeb, 0x5d, 0x28, 0xc7, 0x23, 0x6c, 0x99, 0x75, 0x9f, 0xaf, 0x93, 0x01, 0xe4, 0x4e, 0x52, 0xee, + 0x7b, 0xf8, 0x75, 0x07, 0x28, 0x55, 0xaa, 0x8d, 0x59, 0x0c, 0x60, 0xae, 0x92, 0xac, 0x47, 0x53, + 0x8f, 0xc4, 0xd0, 0x78, 0x95, 0x0f, 0x11, 0xbd, 0xfe, 0xda, 0x21, 0xa2, 0xd9, 0x6c, 0x03, 0xca, + 0xe0, 0xaf, 0x65, 0x6d, 0xed, 0xd9, 0x5b, 0xc7, 0x16, 0xa0, 0x28, 0xfe, 0x5a, 0xd6, 0xd6, 0xe6, + 0xff, 0xd4, 0x82, 0x53, 0x33, 0xfe, 0xbe, 0x21, 0x48, 0x67, 0x09, 0xfe, 0x6e, 0x17, 0xd4, 0x7e, + 0x77, 0x8a, 0x34, 0xf0, 0xfb, 0x86, 0xa0, 0xf7, 0xad, 0x26, 0x9c, 0x0d, 0xf0, 0x77, 0xbb, 0xa0, + 0xa6, 0xa5, 0x56, 0x53, 0x7f, 0xde, 0x10, 0xd5, 0xd4, 0x4a, 0x35, 0xcb, 0x5a, 0xad, 0x9c, 0x31, + 0x00, 0xb6, 0x7e, 0x63, 0x2c, 0xc2, 0xbe, 0x4c, 0xdb, 0x0a, 0x11, 0x14, 0xcb, 0xe0, 0x20, 0x88, + 0x62, 0xf1, 0x54, 0x27, 0x63, 0x01, 0x7d, 0xf5, 0x44, 0xd0, 0xd8, 0xd3, 0x3d, 0x22, 0xd4, 0x41, + 0x92, 0xa4, 0x91, 0xfa, 0xd6, 0x36, 0x87, 0x74, 0x54, 0xfe, 0xc8, 0x6f, 0x77, 0xf0, 0x9c, 0xfb, + 0xf6, 0x97, 0xae, 0x1f, 0xf9, 0x68, 0x65, 0x2c, 0x7d, 0x10, 0xc3, 0x0f, 0x73, 0xf0, 0x07, 0x3f, + 0xde, 0xe1, 0x97, 0x3c, 0xfc, 0x0f, 0x2d, 0xff, 0x03, 0xeb, 0x0a, 0x98, 0x3d, 0xe0, 0x22, 0x00, + 0x00 }; // Autogenerated from wled00/data/settings_time.htm, do not edit!! -const uint16_t PAGE_settings_time_length = 3030; +const uint16_t PAGE_settings_time_length = 3302; const uint8_t PAGE_settings_time[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x77, 0xda, 0xb8, - 0xf2, 0xbb, 0x7f, 0x85, 0xe2, 0xf6, 0x64, 0x61, 0x63, 0x9e, 0x09, 0x2d, 0x01, 0xec, 0x2e, 0x21, - 0xb4, 0x69, 0x1b, 0x48, 0xce, 0x42, 0x37, 0x77, 0xfb, 0x38, 0x5b, 0x61, 0x0b, 0x70, 0x62, 0x24, - 0xae, 0x25, 0x87, 0xe4, 0xa6, 0xf9, 0xef, 0x77, 0x24, 0x19, 0x83, 0x09, 0x90, 0xa4, 0xbb, 0xf7, - 0xc3, 0x3d, 0x3d, 0x75, 0x6c, 0x69, 0x34, 0x33, 0x1a, 0xcd, 0x5b, 0x34, 0x76, 0x8e, 0xcf, 0x5a, - 0xfd, 0x3f, 0xcf, 0xdb, 0x68, 0x2c, 0x26, 0x81, 0xd3, 0x90, 0x4f, 0x14, 0x60, 0x3a, 0xb2, 0x4d, - 0x42, 0x4d, 0xf8, 0x26, 0xd8, 0x73, 0x1a, 0x13, 0x22, 0x30, 0xa2, 0x78, 0x42, 0x6c, 0xf3, 0xda, - 0x27, 0xb3, 0x29, 0x0b, 0x85, 0x89, 0x5c, 0x46, 0x05, 0xa1, 0xc2, 0x36, 0x67, 0xbe, 0x27, 0xc6, - 0x76, 0xa5, 0x58, 0x34, 0x1d, 0x43, 0x83, 0x1a, 0x2b, 0x73, 0x1e, 0xb9, 0xf6, 0x5d, 0x92, 0x53, - 0x1f, 0x96, 0x4f, 0x7d, 0xe1, 0xe3, 0x20, 0xc7, 0x5d, 0x1c, 0x10, 0xbb, 0x64, 0x4d, 0xf0, 0x8d, - 0x3f, 0x89, 0x26, 0xc9, 0x77, 0xc4, 0x49, 0xa8, 0x3e, 0xf0, 0x00, 0xbe, 0x29, 0x33, 0x91, 0xb1, - 0x42, 0x3a, 0x66, 0xc8, 0x1d, 0xe3, 0x90, 0x13, 0x20, 0x12, 0x89, 0x61, 0xae, 0x0a, 0xa3, 0xc2, - 0x17, 0x01, 0x71, 0xfa, 0xfe, 0x84, 0xa0, 0x1e, 0x11, 0xc2, 0xa7, 0x23, 0xde, 0x28, 0xe8, 0xc1, - 0x06, 0x77, 0x43, 0x7f, 0x2a, 0x1c, 0xe3, 0x1a, 0x87, 0xc8, 0xb3, 0x3d, 0xe6, 0x46, 0x13, 0x60, - 0xd0, 0x22, 0x81, 0xbd, 0x03, 0x2c, 0x70, 0xfb, 0x8b, 0xf9, 0x01, 0x53, 0xd3, 0x32, 0xdf, 0x92, - 0x01, 0x3c, 0x3b, 0x38, 0x84, 0x67, 0x73, 0x1a, 0xaa, 0xf7, 0x5b, 0x78, 0x7e, 0x88, 0xa8, 0x7a, - 0x06, 0x72, 0x3c, 0x1a, 0xc1, 0xb3, 0x47, 0xa6, 0xf0, 0x3c, 0x73, 0x05, 0x3c, 0xbb, 0xec, 0x1a, - 0x9e, 0xc7, 0xc4, 0x35, 0xbf, 0xd5, 0x87, 0x11, 0x75, 0x85, 0xcf, 0x28, 0x3a, 0xc9, 0x64, 0xef, - 0x66, 0x3e, 0xf5, 0xd8, 0x2c, 0xcf, 0xa6, 0x84, 0x66, 0xcc, 0xb1, 0x10, 0x53, 0x5e, 0x2b, 0x14, - 0xae, 0x28, 0xcb, 0xcf, 0x02, 0xe2, 0xe5, 0x47, 0xa4, 0x30, 0x24, 0x58, 0x44, 0x21, 0xe1, 0x05, - 0x1e, 0x73, 0x5c, 0x78, 0x21, 0x60, 0x03, 0xb9, 0xf9, 0xa7, 0x99, 0xbd, 0x4f, 0x10, 0x1e, 0xad, - 0x22, 0x4c, 0x16, 0x01, 0xf1, 0xbf, 0x38, 0x09, 0x86, 0xcb, 0xd0, 0x3d, 0x80, 0x3e, 0xea, 0xe3, - 0x4c, 0xd6, 0x7a, 0x47, 0xc4, 0x1f, 0xf0, 0x27, 0x9a, 0x7a, 0xa7, 0xcc, 0x85, 0x97, 0x16, 0x87, - 0xc7, 0xdb, 0x56, 0x66, 0x09, 0x78, 0xf4, 0xde, 0xcb, 0x88, 0xec, 0x5d, 0x48, 0x80, 0x19, 0x8a, - 0x24, 0x67, 0xa2, 0x1d, 0x10, 0x29, 0xa2, 0xa3, 0x5b, 0x35, 0xb5, 0x04, 0xda, 0xdd, 0x00, 0xc9, - 0x8f, 0x6e, 0xbb, 0x70, 0x50, 0x30, 0xfb, 0xa5, 0xf8, 0x6d, 0x01, 0x4f, 0x6e, 0xa6, 0x98, 0x02, - 0x0a, 0x8b, 0x64, 0xef, 0xa4, 0xf4, 0xa9, 0x2d, 0x89, 0x99, 0x17, 0xc7, 0xe6, 0x1e, 0xc9, 0xd6, - 0x69, 0x9e, 0x8b, 0xdb, 0x80, 0xe4, 0x3d, 0x9f, 0x4f, 0x03, 0x7c, 0x6b, 0x9b, 0x94, 0x51, 0x62, - 0xee, 0xd8, 0xf6, 0xca, 0xc4, 0x1b, 0x3d, 0x51, 0x33, 0x4d, 0x4b, 0xe4, 0x7d, 0x4a, 0x49, 0x78, - 0xd2, 0xef, 0x9c, 0xc6, 0xe0, 0xf6, 0x1a, 0xf0, 0xdd, 0x17, 0xa5, 0x72, 0xb5, 0x74, 0xf8, 0xba, - 0x0e, 0x6b, 0x76, 0x5f, 0xdc, 0x94, 0x5f, 0x97, 0x2a, 0x75, 0x73, 0xc1, 0x95, 0x94, 0xc1, 0x9d, - 0x62, 0xc4, 0xc5, 0xae, 0x99, 0x5d, 0xe1, 0x02, 0xf6, 0x68, 0x9e, 0x9d, 0xc2, 0xb0, 0x3b, 0x26, - 0xee, 0x15, 0xf1, 0xde, 0x98, 0x83, 0x80, 0xb9, 0x57, 0x80, 0x4a, 0xd1, 0x5b, 0x3a, 0x12, 0x29, - 0x60, 0xb5, 0x2d, 0xd0, 0xc3, 0x86, 0xd0, 0xe6, 0x22, 0x42, 0xf8, 0x3f, 0x76, 0xda, 0x34, 0x0f, - 0xea, 0x37, 0x56, 0xef, 0x27, 0x2c, 0x0a, 0x93, 0x8f, 0x8e, 0x4f, 0x23, 0x41, 0x92, 0xcf, 0x73, - 0x38, 0x7e, 0x22, 0x92, 0x4f, 0xfd, 0x52, 0x90, 0x48, 0x0a, 0x1a, 0xa1, 0x59, 0x1f, 0xb2, 0x30, - 0xe3, 0xdb, 0xc5, 0xba, 0xdf, 0xa8, 0xd6, 0xfd, 0xbd, 0xbd, 0xec, 0x9d, 0x1c, 0x10, 0x7b, 0xf6, - 0x77, 0x4d, 0x0b, 0x68, 0xfa, 0x74, 0x1a, 0x89, 0xd8, 0x46, 0x2f, 0x5e, 0xde, 0xf9, 0xf7, 0x26, - 0xf2, 0xbd, 0xe4, 0x55, 0xdc, 0x4e, 0x61, 0x7c, 0xec, 0x7b, 0x9e, 0xb2, 0x6a, 0x0d, 0x9c, 0xcc, - 0x17, 0xe7, 0x00, 0x6a, 0xb7, 0x03, 0x76, 0x63, 0x4a, 0xd2, 0x9e, 0xf3, 0x95, 0x3e, 0x40, 0x7d, - 0xa2, 0xf1, 0xb9, 0x01, 0xe6, 0xdc, 0x36, 0x6f, 0xf8, 0x7c, 0x25, 0x8d, 0x26, 0x03, 0x12, 0x9a, - 0x68, 0xe2, 0x53, 0xdb, 0x04, 0x7c, 0x60, 0xd4, 0xb6, 0x59, 0x3e, 0xd8, 0x8c, 0xa8, 0xfb, 0x1c, - 0x44, 0x95, 0xc3, 0xcd, 0x88, 0xfa, 0x29, 0x44, 0x8f, 0x30, 0x54, 0x29, 0xa6, 0x11, 0x79, 0xfe, - 0xb5, 0x12, 0x43, 0xeb, 0x48, 0x63, 0x61, 0xd4, 0x0d, 0x7c, 0xf7, 0x0a, 0x9c, 0x5f, 0xac, 0xb4, - 0x63, 0x9f, 0x5b, 0x72, 0x2a, 0x9b, 0x50, 0x00, 0xc7, 0x64, 0x3a, 0x89, 0x72, 0x35, 0x0a, 0x80, - 0x42, 0xa3, 0x54, 0x47, 0xf6, 0xdd, 0x5a, 0x3a, 0x15, 0x70, 0x91, 0x01, 0x07, 0x3c, 0x76, 0x65, - 0x41, 0xe9, 0xe2, 0x58, 0x53, 0x52, 0xfa, 0x66, 0x9b, 0xb1, 0xc2, 0xd5, 0xa4, 0x5a, 0xd5, 0x07, - 0xd8, 0xbd, 0x1a, 0x85, 0x2c, 0xa2, 0x5e, 0x0e, 0x56, 0xb2, 0xb0, 0xf6, 0xe2, 0xe0, 0xe0, 0xa0, - 0x2e, 0xbd, 0x70, 0xe8, 0xfc, 0x1e, 0x51, 0xe0, 0x0e, 0xcd, 0x08, 0xb9, 0xf2, 0xf0, 0x2d, 0x57, - 0x74, 0x40, 0xe1, 0xa4, 0x8f, 0x4c, 0x14, 0xae, 0x93, 0xe8, 0x50, 0x3f, 0x79, 0xbb, 0x58, 0x33, - 0xf6, 0x36, 0x79, 0xeb, 0xad, 0xbe, 0x29, 0xb5, 0x83, 0xff, 0xa6, 0x75, 0x69, 0x97, 0xea, 0x97, - 0xa0, 0x6e, 0x97, 0xa0, 0x6e, 0x7a, 0x4f, 0xde, 0x03, 0xc5, 0x79, 0x79, 0x77, 0x79, 0xbf, 0x41, - 0x77, 0xbe, 0xd7, 0x13, 0x15, 0x8d, 0x55, 0x59, 0xb1, 0x3a, 0x0c, 0xd9, 0x04, 0x35, 0xc0, 0x55, - 0x11, 0x77, 0x7e, 0x80, 0x1d, 0x25, 0x10, 0x90, 0xdc, 0x25, 0x28, 0xf8, 0x65, 0xa3, 0x54, 0x5e, - 0x90, 0x64, 0x53, 0x65, 0x64, 0xd7, 0x38, 0x88, 0x00, 0x10, 0xa8, 0xed, 0x95, 0x00, 0xf2, 0xe5, - 0xdd, 0x84, 0x7f, 0xb9, 0xfc, 0x76, 0xdf, 0x28, 0xe8, 0xf9, 0x14, 0x2d, 0x8d, 0x3a, 0xad, 0x22, - 0xc7, 0x4f, 0xd1, 0xb5, 0x52, 0xac, 0x23, 0xfb, 0x25, 0xb9, 0x03, 0xb5, 0xdc, 0x41, 0x82, 0xad, - 0x30, 0x7b, 0xfe, 0x0f, 0x30, 0xbb, 0x99, 0xd1, 0xf6, 0xcf, 0x32, 0xfa, 0x95, 0x7e, 0x15, 0x5f, - 0x85, 0xd4, 0x93, 0x07, 0x0a, 0x79, 0x1f, 0xcb, 0xe6, 0x97, 0xf5, 0xae, 0xa2, 0x1a, 0xfb, 0x89, - 0xea, 0x36, 0x27, 0x51, 0xdd, 0xee, 0x21, 0x7a, 0x11, 0x0d, 0x7d, 0x4e, 0xd2, 0x8e, 0x02, 0x10, - 0xc6, 0xa2, 0x28, 0x57, 0x2a, 0x0f, 0x90, 0x6f, 0xf2, 0x0a, 0xd5, 0xc7, 0x76, 0x9f, 0x03, 0x5f, - 0xf0, 0x04, 0xa7, 0x50, 0xfd, 0xfb, 0x1e, 0xa1, 0xba, 0xc1, 0x1d, 0x54, 0x9f, 0xea, 0x0b, 0x1e, - 0x7a, 0x81, 0x5f, 0x2c, 0x75, 0x10, 0x0b, 0x5f, 0x50, 0x7d, 0xbe, 0x23, 0xf8, 0xdf, 0xd9, 0xfc, - 0x2f, 0x8f, 0xda, 0x7c, 0xf5, 0x29, 0x06, 0x6f, 0xa6, 0x0c, 0x7e, 0x9d, 0x4e, 0x9a, 0xd6, 0x66, - 0x7d, 0x3c, 0x8c, 0xf5, 0xf1, 0x70, 0x9b, 0x3e, 0x1e, 0x3e, 0xaa, 0x8f, 0x32, 0xa0, 0xa6, 0xd4, - 0xf1, 0xf0, 0xa7, 0xd4, 0xf1, 0xf0, 0x1f, 0x52, 0xc7, 0xc3, 0xbf, 0xaf, 0x8e, 0x87, 0x1b, 0xd4, - 0xf1, 0xf0, 0x1f, 0x54, 0xc7, 0xc3, 0xff, 0x2f, 0x75, 0x3c, 0xdc, 0xaa, 0x8e, 0x4f, 0x54, 0x45, - 0x95, 0x03, 0xf6, 0x3b, 0x7d, 0x48, 0xf6, 0x16, 0x69, 0xa5, 0x58, 0x64, 0x78, 0x32, 0x4f, 0xbe, - 0x5b, 0xe4, 0x5f, 0xa5, 0xa2, 0x4e, 0xc0, 0x02, 0x22, 0x20, 0xe5, 0xd3, 0x99, 0xac, 0xb9, 0xe7, - 0x67, 0xf3, 0x4a, 0xbb, 0x94, 0x0d, 0xe8, 0xd0, 0xa0, 0xd9, 0x4e, 0x00, 0xf6, 0x2e, 0x93, 0x64, - 0xd2, 0x16, 0x8e, 0x73, 0xb9, 0x5b, 0xaa, 0x67, 0xca, 0x95, 0x83, 0x1d, 0x5b, 0x3e, 0x77, 0x45, - 0xf6, 0xc7, 0x0f, 0xc8, 0xed, 0x76, 0x77, 0x33, 0xa5, 0x1d, 0x95, 0x7c, 0x76, 0x16, 0x38, 0x7f, - 0xfc, 0x88, 0xc7, 0x8e, 0x53, 0x63, 0x65, 0x3d, 0x78, 0xbe, 0x3c, 0xb8, 0x1f, 0x43, 0xb6, 0x17, - 0x83, 0xd9, 0xec, 0xee, 0x6e, 0xac, 0x2e, 0x8a, 0x97, 0xd6, 0x91, 0x9c, 0xb3, 0xfc, 0xec, 0xfd, - 0x62, 0x8b, 0x17, 0x5e, 0xbc, 0x45, 0x6c, 0x7f, 0x29, 0x5a, 0x0f, 0xfe, 0x7d, 0xb3, 0xd2, 0x5b, - 0x97, 0x90, 0x13, 0x28, 0xd4, 0x96, 0xf7, 0x89, 0xbf, 0xf8, 0xdf, 0xf6, 0xec, 0x75, 0xbb, 0xfd, - 0x75, 0x62, 0x4d, 0x7e, 0xb5, 0xcb, 0xf5, 0x55, 0x51, 0xd9, 0x72, 0xc9, 0xbd, 0xd9, 0x93, 0xc9, - 0xbb, 0x97, 0xef, 0x0d, 0xf3, 0xa7, 0xfd, 0xdf, 0xf5, 0x0c, 0x48, 0x21, 0x1e, 0x88, 0x21, 0x73, - 0xa5, 0x5f, 0xa7, 0xb2, 0xd4, 0x7b, 0x1b, 0x30, 0x2c, 0xd2, 0x73, 0xd9, 0xac, 0x05, 0x48, 0x13, - 0x14, 0xdd, 0x55, 0x14, 0xdd, 0x2d, 0x28, 0xba, 0x73, 0x14, 0x0b, 0x49, 0x60, 0xcf, 0xfb, 0x9d, - 0xcd, 0x64, 0xad, 0x62, 0x51, 0x90, 0xd1, 0x9d, 0xae, 0x16, 0x15, 0xeb, 0x13, 0xec, 0x86, 0x0c, - 0xca, 0x31, 0x0b, 0x03, 0xad, 0x90, 0xcd, 0x78, 0x3e, 0x20, 0x74, 0x04, 0xf5, 0x6c, 0x00, 0xdf, - 0x3e, 0x38, 0x9c, 0x50, 0xc8, 0xa5, 0x38, 0x6b, 0x85, 0x76, 0x4f, 0x84, 0x50, 0x95, 0xe5, 0x65, - 0xb2, 0xd3, 0x82, 0x22, 0xb5, 0xc5, 0x3c, 0x92, 0xc9, 0x08, 0x10, 0xe0, 0x9b, 0x83, 0x6a, 0xad, - 0x52, 0xc9, 0xee, 0x89, 0x6c, 0x7d, 0x5e, 0x82, 0xe6, 0xdd, 0x10, 0x4a, 0x40, 0x12, 0xd7, 0x50, - 0x19, 0x53, 0x78, 0x66, 0xb6, 0x1e, 0xc4, 0x18, 0x5b, 0x24, 0x08, 0x32, 0xc5, 0x65, 0xcd, 0xfc, - 0x7e, 0x14, 0x09, 0x01, 0x9c, 0xbe, 0xbc, 0x13, 0xf7, 0xb5, 0xef, 0x56, 0x0a, 0xb0, 0x94, 0x02, - 0x4c, 0x79, 0xa0, 0x0e, 0x24, 0x2e, 0xe1, 0xfd, 0xaa, 0xef, 0x59, 0xf8, 0xa4, 0x07, 0x5e, 0x68, - 0x91, 0xc7, 0x10, 0x58, 0x16, 0x92, 0x7f, 0x47, 0x7e, 0x48, 0xc0, 0xac, 0xd2, 0x14, 0xcb, 0x5b, - 0x28, 0x9e, 0xfe, 0x34, 0x45, 0xba, 0x85, 0xe2, 0xfe, 0x16, 0x8a, 0xc7, 0x3f, 0x4d, 0xd1, 0x4f, - 0x51, 0x5c, 0xaa, 0x75, 0x89, 0x50, 0x25, 0xf3, 0x1d, 0x09, 0x7e, 0xfc, 0xc8, 0xc4, 0xb5, 0x37, - 0x28, 0x49, 0xfb, 0x1a, 0xce, 0xea, 0xd4, 0xe7, 0x82, 0x00, 0x2b, 0xa0, 0x1b, 0x84, 0x73, 0x3c, - 0x22, 0x10, 0xd7, 0x6c, 0xe7, 0x2e, 0x29, 0xf3, 0xa1, 0x62, 0x84, 0x83, 0xd5, 0x95, 0xfe, 0x44, - 0x15, 0xa9, 0x22, 0xcf, 0x42, 0x7f, 0xe4, 0xd3, 0xdd, 0x5d, 0x91, 0xf7, 0xb0, 0xc0, 0x08, 0x36, - 0x26, 0x30, 0x75, 0x09, 0x1b, 0xa2, 0xb3, 0xc1, 0x25, 0xe4, 0x83, 0x0f, 0x74, 0x5f, 0x03, 0xe6, - 0x03, 0x2c, 0xac, 0xb4, 0x46, 0xcf, 0x27, 0x18, 0x4d, 0x0a, 0xfb, 0xec, 0xbd, 0xb5, 0x53, 0xca, - 0xaa, 0x9e, 0x46, 0x31, 0x6b, 0xad, 0x6d, 0x3d, 0xac, 0xf0, 0x64, 0x99, 0x7f, 0x0d, 0x02, 0x4c, - 0xaf, 0x96, 0xfb, 0x06, 0x31, 0x36, 0xa8, 0xf1, 0x37, 0x1a, 0x5d, 0xa3, 0xf8, 0x26, 0x93, 0xb6, - 0x59, 0x1b, 0x0c, 0xd9, 0x7a, 0x86, 0xd5, 0xd6, 0x56, 0x97, 0x77, 0x4d, 0x6b, 0xa3, 0x81, 0x2e, - 0xc8, 0x75, 0x13, 0xf8, 0x0b, 0xd3, 0x7a, 0x86, 0x85, 0xd7, 0x56, 0x97, 0xb7, 0xcd, 0x7b, 0x03, - 0x72, 0x70, 0xdd, 0x14, 0x8a, 0x9b, 0x43, 0x88, 0x87, 0xae, 0xbd, 0xe8, 0xa9, 0x14, 0x78, 0xfe, - 0x92, 0xbf, 0x99, 0xda, 0x15, 0x19, 0x51, 0x12, 0x48, 0x19, 0x1e, 0x1d, 0xe3, 0x37, 0x7f, 0x22, - 0x3b, 0x51, 0x28, 0x0a, 0x83, 0x8c, 0xa9, 0x5b, 0x07, 0x2e, 0x07, 0xe7, 0x00, 0x41, 0x57, 0x43, - 0x34, 0x0a, 0xba, 0x15, 0x30, 0x60, 0xde, 0x2d, 0xc4, 0x6d, 0xe0, 0x09, 0x02, 0x56, 0x2f, 0x93, - 0x05, 0x5c, 0xe0, 0x3e, 0x27, 0x2a, 0x7e, 0xc9, 0x97, 0xbf, 0x78, 0xd2, 0xde, 0xea, 0x0d, 0x41, - 0x35, 0x89, 0x18, 0x33, 0x98, 0x9a, 0x32, 0x2e, 0x64, 0xbc, 0xe7, 0xd1, 0x60, 0xe2, 0x0b, 0xd8, - 0xad, 0xa7, 0x96, 0xca, 0x48, 0x1d, 0xeb, 0xb3, 0x60, 0x53, 0x70, 0x42, 0xe9, 0xb1, 0x31, 0x09, - 0xa6, 0x47, 0xb2, 0x09, 0x37, 0xd0, 0x3e, 0x42, 0x1b, 0x82, 0xfe, 0x58, 0xca, 0x1e, 0x4e, 0x24, - 0xae, 0x37, 0x8d, 0x82, 0x9e, 0x98, 0x87, 0xc4, 0xb5, 0x6b, 0x8c, 0x64, 0xd1, 0x91, 0x5c, 0x74, - 0x04, 0x89, 0xc0, 0x62, 0x5d, 0x6a, 0x85, 0xe6, 0xd4, 0x74, 0x7a, 0xf8, 0x9a, 0x2c, 0x40, 0x16, - 0x11, 0x77, 0x5c, 0x76, 0x0c, 0xd5, 0x99, 0x03, 0xf1, 0x46, 0x53, 0x10, 0x4f, 0xd9, 0x79, 0x27, - 0x43, 0xa8, 0x1c, 0x52, 0x45, 0x61, 0xb7, 0x7f, 0x0e, 0x73, 0xe1, 0x35, 0x09, 0x6b, 0x28, 0x36, - 0xeb, 0x95, 0xc0, 0x3e, 0x4f, 0xca, 0xfa, 0xb0, 0xeb, 0x41, 0x08, 0xdb, 0x5c, 0x86, 0x12, 0xe4, - 0x46, 0x24, 0x10, 0x3d, 0x65, 0xe4, 0xda, 0x3f, 0x43, 0xa1, 0x54, 0xd6, 0x0b, 0x3e, 0x71, 0x82, - 0xca, 0x07, 0x63, 0x24, 0xe5, 0x8e, 0x45, 0x42, 0xc5, 0x58, 0x4f, 0xa6, 0xf5, 0x56, 0xaf, 0x52, - 0x4c, 0xff, 0x07, 0xd2, 0xa0, 0xda, 0x4a, 0x29, 0xd8, 0xff, 0x0c, 0x00, 0xe9, 0xa2, 0x0f, 0x5c, - 0x8a, 0xa1, 0x61, 0x20, 0xca, 0x9b, 0xf3, 0x37, 0xd3, 0x79, 0xd7, 0xe9, 0x67, 0x3e, 0xf5, 0x5b, - 0xd9, 0xa4, 0x08, 0x5c, 0x59, 0x57, 0x52, 0x20, 0x85, 0xa3, 0x5e, 0xff, 0x01, 0x84, 0x31, 0xcf, - 0x5a, 0x4d, 0xa7, 0xd5, 0xee, 0x17, 0x5a, 0xed, 0x35, 0x30, 0x31, 0xc8, 0xbe, 0xe9, 0xb4, 0x01, - 0xa4, 0xbd, 0x05, 0xe4, 0x00, 0xb4, 0xe3, 0x53, 0x2f, 0x07, 0x10, 0x85, 0xf6, 0xf1, 0x46, 0x28, - 0xd0, 0x78, 0x00, 0x6a, 0x01, 0x50, 0x6b, 0x33, 0xd0, 0x2b, 0x8d, 0xaa, 0x03, 0x50, 0x9d, 0xcd, - 0x50, 0xaf, 0x15, 0xaa, 0xe6, 0xe7, 0x4d, 0xf3, 0x55, 0x35, 0x7f, 0x0e, 0x48, 0xce, 0x8f, 0xfb, - 0xc6, 0x26, 0x28, 0x48, 0xad, 0x81, 0x9b, 0x4c, 0xf3, 0xa2, 0xd7, 0xdf, 0x2c, 0x43, 0xc8, 0x9c, - 0x3f, 0x00, 0xd0, 0x47, 0x80, 0xd9, 0x88, 0xa8, 0x04, 0x92, 0x6e, 0xca, 0xdd, 0x37, 0xb7, 0x6c, - 0xbf, 0x04, 0xb2, 0xee, 0x7e, 0x06, 0xa0, 0xee, 0xe7, 0x2d, 0x3c, 0x95, 0x40, 0xdc, 0x5d, 0xf0, - 0x01, 0x63, 0xf4, 0x91, 0x41, 0x04, 0xdf, 0x08, 0x06, 0x22, 0x7f, 0xdf, 0xeb, 0xa3, 0xcc, 0x7b, - 0xea, 0xf9, 0x78, 0x0b, 0x67, 0x20, 0xf4, 0x56, 0x33, 0xd7, 0xc3, 0xfc, 0x0a, 0x0b, 0xd0, 0xc5, - 0x19, 0xa6, 0x1b, 0x41, 0x41, 0xf4, 0x4d, 0x90, 0xc7, 0x66, 0x5c, 0xaf, 0x35, 0x40, 0xa1, 0xb9, - 0xe5, 0xfc, 0x4a, 0x20, 0xfa, 0x13, 0xc9, 0xd8, 0x09, 0x9e, 0x61, 0xdf, 0xdf, 0xc2, 0x19, 0x48, - 0xbf, 0x7b, 0xf6, 0x07, 0x40, 0x76, 0xd9, 0x35, 0xe3, 0xfe, 0xc0, 0x0f, 0xf9, 0xd5, 0xc6, 0x63, - 0x28, 0xcb, 0x5b, 0x80, 0xe6, 0x47, 0x49, 0xfc, 0xe3, 0x31, 0xac, 0x69, 0x52, 0x77, 0xcc, 0x42, - 0x08, 0x8e, 0x9b, 0x57, 0xc0, 0x99, 0x74, 0xfe, 0xf5, 0x50, 0xdd, 0xe6, 0x1d, 0x12, 0x43, 0xd9, - 0x6e, 0xbf, 0x85, 0xd8, 0x70, 0x08, 0xce, 0x23, 0xb1, 0x5b, 0x6d, 0x85, 0x9f, 0xce, 0xd6, 0xd7, - 0x65, 0xaf, 0x2a, 0xf2, 0x42, 0x42, 0xc7, 0xfa, 0xf8, 0xdd, 0x48, 0x22, 0x3c, 0x38, 0x1a, 0x97, - 0x51, 0x8f, 0xa3, 0x0c, 0xcc, 0xe7, 0x51, 0xa9, 0x8a, 0xc6, 0x2c, 0x0a, 0x79, 0x56, 0x52, 0x6a, - 0x45, 0x61, 0x08, 0xc1, 0x1d, 0xc9, 0x48, 0x19, 0x68, 0xff, 0xe4, 0x73, 0x30, 0x7d, 0x48, 0xa1, - 0x13, 0xdf, 0x0b, 0x83, 0x1c, 0xb6, 0x19, 0xd1, 0x2b, 0xca, 0x66, 0x70, 0x4e, 0x72, 0xd2, 0xc9, - 0xcb, 0xd5, 0xa7, 0x58, 0xf8, 0x22, 0xf2, 0x1e, 0x38, 0x0b, 0x88, 0x74, 0x0f, 0xbc, 0x45, 0x17, - 0xe4, 0x9a, 0x6c, 0xd7, 0x58, 0x99, 0xec, 0x99, 0xb2, 0x1e, 0x5a, 0x95, 0x45, 0x6a, 0xeb, 0xa7, - 0xfd, 0x0d, 0xb9, 0xce, 0x4d, 0x00, 0x9b, 0x4d, 0x65, 0x3b, 0xaf, 0x5e, 0xe5, 0x5f, 0xc9, 0xda, - 0x8e, 0x4c, 0x61, 0x2c, 0x5f, 0x2c, 0x69, 0xd7, 0x76, 0xca, 0xe8, 0x68, 0x3d, 0xb7, 0xdd, 0x25, - 0x6e, 0x8d, 0x24, 0x64, 0x3a, 0xed, 0x4d, 0x67, 0x78, 0x61, 0xca, 0x2a, 0x6f, 0x3b, 0xb7, 0x5d, - 0x73, 0xee, 0x6a, 0xd7, 0xb0, 0x9b, 0xe2, 0xb6, 0x24, 0xfb, 0x4d, 0xab, 0xcc, 0xce, 0xc3, 0x8d, - 0x91, 0x8e, 0x50, 0x32, 0x90, 0xc2, 0x51, 0x0d, 0xc4, 0x72, 0x84, 0x9b, 0xa7, 0x6d, 0xa6, 0x8a, - 0x31, 0x2a, 0xe7, 0x01, 0xc6, 0x16, 0x61, 0x49, 0x45, 0x24, 0xdf, 0x31, 0x32, 0x32, 0x39, 0xe2, - 0x88, 0x92, 0x19, 0x82, 0x12, 0xd1, 0x92, 0x81, 0xfa, 0x16, 0xcd, 0x58, 0x78, 0xc5, 0x21, 0x33, - 0x43, 0x03, 0x99, 0xe5, 0x93, 0x10, 0x14, 0xd7, 0x9f, 0x47, 0xb1, 0x79, 0xa9, 0xcc, 0x23, 0x6a, - 0xae, 0x6a, 0xc3, 0x3c, 0xd0, 0xed, 0x3b, 0x2d, 0x79, 0x57, 0x00, 0x21, 0x6e, 0xdf, 0x69, 0x52, - 0x1c, 0xb0, 0x11, 0x52, 0x03, 0x88, 0x41, 0x6c, 0x93, 0x35, 0xf5, 0xf6, 0xf0, 0x76, 0x76, 0xaa, - 0xc3, 0xee, 0x18, 0xd3, 0x91, 0x0c, 0x43, 0x5c, 0x45, 0x7e, 0x29, 0x80, 0x39, 0x71, 0x79, 0x61, - 0xe1, 0xbc, 0x05, 0x2b, 0x14, 0xe8, 0xb4, 0x7d, 0xbc, 0x62, 0x0f, 0x67, 0xa5, 0x55, 0xa5, 0x30, - 0x56, 0xf2, 0xde, 0xca, 0x52, 0xaa, 0x8b, 0x4e, 0xf1, 0x7a, 0x2c, 0xe5, 0x4d, 0x6d, 0x0a, 0x63, - 0x0d, 0x16, 0xc9, 0x5d, 0xa9, 0x3c, 0x5e, 0x87, 0xa7, 0xf3, 0x5c, 0x3c, 0xbd, 0x31, 0x9b, 0xa1, - 0x0a, 0x40, 0x01, 0xbb, 0x70, 0x0e, 0x8f, 0x09, 0xab, 0x12, 0xe7, 0x02, 0xbd, 0xb9, 0x41, 0x63, - 0x8e, 0x44, 0x88, 0xfd, 0x20, 0xfb, 0xd8, 0xca, 0x5e, 0x2c, 0x55, 0x75, 0x6a, 0x2d, 0x16, 0x51, - 0x01, 0xd9, 0x32, 0x45, 0x1d, 0x26, 0xcd, 0xc1, 0xd8, 0xba, 0xb6, 0xd5, 0xd6, 0x6b, 0x17, 0xab, - 0xde, 0x31, 0x1c, 0xd4, 0xe4, 0xd0, 0x31, 0x64, 0xd7, 0xb5, 0x5d, 0x3a, 0xe0, 0xd3, 0x7a, 0x03, - 0x7c, 0x43, 0x88, 0xa7, 0x4e, 0xb9, 0x68, 0xa4, 0x64, 0xd2, 0xfa, 0xf3, 0xa9, 0xd7, 0x1e, 0x87, - 0x87, 0x4b, 0xc2, 0xc9, 0xcd, 0xd3, 0x95, 0x18, 0xcb, 0xfb, 0xa7, 0xf6, 0x89, 0x21, 0x9c, 0x3d, - 0xc4, 0x12, 0x23, 0x39, 0x86, 0x83, 0x78, 0x72, 0xb7, 0x79, 0xe9, 0xa0, 0x0a, 0xf1, 0xde, 0xe6, - 0x09, 0x52, 0xbc, 0x65, 0x63, 0xbe, 0xe7, 0x34, 0x95, 0x93, 0x27, 0x5f, 0x18, 0xed, 0x2f, 0x11, - 0xa9, 0xad, 0x88, 0xad, 0xf3, 0x8c, 0xdb, 0xa2, 0x25, 0x2c, 0x2b, 0x62, 0xeb, 0xfd, 0x14, 0x96, - 0xd4, 0x86, 0xa5, 0x89, 0x1b, 0x1d, 0xd9, 0x0e, 0x40, 0x53, 0x75, 0x75, 0xc7, 0x95, 0xad, 0x37, - 0x06, 0x8e, 0x1a, 0xe4, 0x68, 0x0c, 0x39, 0x30, 0x9a, 0x80, 0xb9, 0x7b, 0x3b, 0xe0, 0x73, 0xf4, - 0x1a, 0xf0, 0x36, 0xfa, 0x9e, 0x0f, 0xdc, 0x0d, 0x68, 0x38, 0x0e, 0x38, 0x43, 0x2e, 0x84, 0x94, - 0x01, 0x41, 0x11, 0x27, 0x1e, 0x02, 0xbd, 0xd5, 0x1d, 0x06, 0x79, 0xe7, 0xc0, 0x25, 0x82, 0x01, - 0x83, 0xdc, 0xe2, 0x43, 0xef, 0xac, 0x8b, 0x30, 0xf5, 0xd0, 0x49, 0x1f, 0xf2, 0xe3, 0xe6, 0xf9, - 0x7b, 0xe4, 0xb2, 0xc9, 0x04, 0x06, 0x78, 0x5e, 0xc5, 0xc5, 0x0f, 0x11, 0xd8, 0x2f, 0x84, 0x2b, - 0x12, 0x22, 0x31, 0x26, 0x31, 0x3f, 0xe8, 0xfd, 0x31, 0xe0, 0x0d, 0xd8, 0x6c, 0x47, 0xba, 0x2e, - 0x24, 0x69, 0xcb, 0xdc, 0xb7, 0x28, 0x33, 0x5f, 0x05, 0xe6, 0x91, 0x21, 0x8e, 0x02, 0x81, 0xb0, - 0xae, 0xf8, 0x64, 0x15, 0x0a, 0xd5, 0x0a, 0x04, 0x58, 0x84, 0x63, 0x14, 0xca, 0xe7, 0x01, 0xfe, - 0x66, 0x40, 0x6e, 0x30, 0x3a, 0xa3, 0x85, 0xb3, 0xe1, 0x10, 0xe9, 0x0d, 0x2c, 0xac, 0x43, 0x8b, - 0xb4, 0x59, 0x4c, 0x44, 0x3a, 0x79, 0xb4, 0xb9, 0xb9, 0xe4, 0x7a, 0xd2, 0x07, 0xd3, 0x2c, 0xfd, - 0x14, 0x16, 0x65, 0xfc, 0x89, 0x1d, 0xe6, 0xce, 0xc0, 0xc5, 0x26, 0x6c, 0xa6, 0x9b, 0x03, 0xad, - 0xc7, 0xf1, 0x1b, 0x1b, 0x08, 0x48, 0x0d, 0xf7, 0x72, 0xa7, 0xfe, 0x68, 0x2c, 0x96, 0x29, 0xf0, - 0x55, 0x12, 0xdd, 0x65, 0x12, 0xc6, 0xb3, 0xf6, 0x20, 0x75, 0x2a, 0xee, 0xec, 0xe8, 0x43, 0x89, - 0x75, 0x4a, 0x75, 0x2e, 0xa1, 0xa8, 0xd0, 0x5d, 0x59, 0x70, 0x89, 0x23, 0x9f, 0xd6, 0x8a, 0x08, - 0x47, 0x82, 0xe9, 0xd8, 0x17, 0xb7, 0xa5, 0x9c, 0xd4, 0xdd, 0xb3, 0xe7, 0x4c, 0x23, 0x3e, 0x96, - 0x78, 0xf9, 0xcc, 0x87, 0x6c, 0x52, 0xf7, 0x3b, 0xe1, 0x3f, 0x87, 0x5c, 0x4c, 0x28, 0xc5, 0x61, - 0x34, 0xb7, 0x3b, 0x12, 0x75, 0xc8, 0xa9, 0x92, 0xc9, 0x00, 0xd2, 0x01, 0x35, 0x35, 0x1c, 0xea, - 0x39, 0x9a, 0x4c, 0x79, 0x2c, 0x02, 0x3e, 0xe4, 0x64, 0xb7, 0xd0, 0x5c, 0x74, 0x4f, 0x8d, 0xf9, - 0x0d, 0x75, 0x43, 0xc8, 0x42, 0x57, 0x0e, 0xce, 0xff, 0xea, 0x8e, 0x2b, 0x46, 0xc6, 0x38, 0x24, - 0x43, 0x7b, 0xfb, 0x4f, 0x1f, 0xf4, 0x1e, 0x0a, 0x2f, 0xb0, 0x8a, 0x96, 0xb9, 0x79, 0x68, 0x17, - 0xb0, 0x5b, 0xf9, 0xf3, 0x8e, 0xb8, 0x45, 0x01, 0x69, 0xa5, 0x8e, 0xa6, 0xb1, 0x9c, 0xe2, 0x42, - 0x12, 0x2b, 0xd9, 0xc9, 0x23, 0xca, 0xc9, 0x5f, 0x9d, 0x84, 0x2c, 0x00, 0xf4, 0x69, 0xc3, 0x94, - 0x81, 0xd3, 0x58, 0x69, 0x6c, 0xfb, 0x34, 0xf0, 0x29, 0xc9, 0xe9, 0x6b, 0xfd, 0xb9, 0x9c, 0xa5, - 0x40, 0x65, 0x2b, 0x78, 0xde, 0x05, 0x87, 0x43, 0xd3, 0x3f, 0x5a, 0xa9, 0xed, 0xef, 0x17, 0xa7, - 0xba, 0xb5, 0xac, 0x36, 0x96, 0x04, 0xfb, 0xd0, 0x79, 0xa4, 0xd8, 0xde, 0x5c, 0x37, 0x1b, 0xdb, - 0x0a, 0xe7, 0x82, 0x2c, 0x52, 0xe1, 0x4f, 0x2c, 0x4e, 0xf5, 0xe3, 0x9c, 0xff, 0x02, 0x46, 0xd1, - 0xb8, 0xad, 0xac, 0x23, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xd5, 0x1a, 0x6b, 0x57, 0xdb, 0x3a, + 0xf2, 0x7b, 0x7e, 0x85, 0x50, 0x7b, 0xb8, 0xf1, 0xc5, 0x79, 0x42, 0x5a, 0x48, 0x62, 0x77, 0x43, + 0x48, 0x0b, 0x2d, 0x09, 0x9c, 0x26, 0xbd, 0xec, 0xf6, 0x71, 0x6e, 0x15, 0x5b, 0x49, 0x0c, 0x8e, + 0xe4, 0xb5, 0x65, 0x02, 0x4b, 0xf9, 0xef, 0x3b, 0x92, 0x1c, 0xe7, 0x85, 0x81, 0xf6, 0xde, 0xfd, + 0xb0, 0xa7, 0xa7, 0xc6, 0x96, 0x46, 0xa3, 0x99, 0xd1, 0xbc, 0x95, 0xe6, 0xd6, 0xd1, 0x59, 0x7b, + 0xf0, 0xaf, 0xf3, 0x0e, 0x9a, 0x88, 0xa9, 0x6f, 0x37, 0xe5, 0x13, 0xf9, 0x84, 0x8d, 0x2d, 0x4c, + 0x19, 0x86, 0x6f, 0x4a, 0x5c, 0xbb, 0x39, 0xa5, 0x82, 0x20, 0x46, 0xa6, 0xd4, 0xc2, 0xd7, 0x1e, + 0x9d, 0x05, 0x3c, 0x14, 0x18, 0x39, 0x9c, 0x09, 0xca, 0x84, 0x85, 0x67, 0x9e, 0x2b, 0x26, 0x56, + 0xad, 0x5c, 0xc6, 0x76, 0x4e, 0x83, 0xe6, 0xd6, 0xe6, 0x5c, 0x7a, 0xed, 0x39, 0xb4, 0xa0, 0x3e, + 0x4c, 0x8f, 0x79, 0xc2, 0x23, 0x7e, 0x21, 0x72, 0x88, 0x4f, 0xad, 0x8a, 0x39, 0x25, 0x37, 0xde, + 0x34, 0x9e, 0xa6, 0xdf, 0x71, 0x44, 0x43, 0xf5, 0x41, 0x86, 0xf0, 0xcd, 0x38, 0x46, 0xb9, 0xb5, + 0xad, 0x13, 0x82, 0x9c, 0x09, 0x09, 0x23, 0x0a, 0x9b, 0xc4, 0x62, 0x54, 0xd8, 0x87, 0x51, 0xe1, + 0x09, 0x9f, 0xda, 0x03, 0x6f, 0x4a, 0x51, 0x9f, 0x0a, 0xe1, 0xb1, 0x71, 0xd4, 0x2c, 0xe9, 0xc1, + 0x66, 0xe4, 0x84, 0x5e, 0x20, 0xec, 0xdc, 0x35, 0x09, 0x91, 0xcf, 0x1d, 0x2f, 0x30, 0x5d, 0xcb, + 0xe5, 0x4e, 0x3c, 0x05, 0x32, 0x4d, 0x18, 0xb0, 0xb6, 0x2a, 0x26, 0xf5, 0xe5, 0x73, 0x1a, 0x59, + 0x5f, 0xf0, 0x7b, 0xc2, 0xb0, 0x89, 0xdf, 0xd2, 0x21, 0x3c, 0xbb, 0x24, 0x84, 0x67, 0x2b, 0x08, + 0xd5, 0xfb, 0x2d, 0x3c, 0xdf, 0xc7, 0x4c, 0x3d, 0x7d, 0x39, 0x1e, 0x8f, 0xe1, 0xd9, 0xa7, 0x01, + 0x3c, 0xcf, 0x1c, 0x01, 0xcf, 0x1e, 0xbf, 0x86, 0xe7, 0x11, 0x75, 0xf0, 0xb7, 0xc6, 0x28, 0x66, + 0x8e, 0xf0, 0x38, 0x43, 0xc7, 0x79, 0xe3, 0x6e, 0xe6, 0x31, 0x97, 0xcf, 0x8a, 0x3c, 0xa0, 0x2c, + 0x8f, 0x27, 0x42, 0x04, 0x51, 0xbd, 0x54, 0xba, 0x62, 0xbc, 0x38, 0xf3, 0xa9, 0x5b, 0x1c, 0xd3, + 0xd2, 0x88, 0x12, 0x11, 0x87, 0x34, 0x2a, 0x45, 0x09, 0xf9, 0xa5, 0x17, 0x02, 0xb8, 0x29, 0xcc, + 0x3f, 0xb1, 0x71, 0x9f, 0x22, 0x3c, 0x5c, 0x47, 0x98, 0x2e, 0x82, 0xcd, 0xff, 0x8c, 0xa8, 0x3f, + 0x5a, 0x86, 0x1e, 0x9f, 0xb8, 0x79, 0x61, 0xdc, 0x85, 0x14, 0xf0, 0x33, 0x24, 0x37, 0x13, 0x1d, + 0x9f, 0x4a, 0xe6, 0x0f, 0x6f, 0xd5, 0xd4, 0x12, 0x68, 0x2f, 0x03, 0x32, 0x3a, 0xbc, 0xed, 0xc1, + 0x41, 0xc0, 0xec, 0x97, 0xf2, 0xb7, 0x05, 0xbc, 0xcf, 0x89, 0xfb, 0xbe, 0x9f, 0x17, 0x26, 0xb5, + 0xb6, 0xca, 0xc6, 0x9d, 0x4f, 0x05, 0x62, 0x96, 0x5b, 0x74, 0x42, 0x60, 0x86, 0x26, 0x4b, 0xf3, + 0x58, 0xcb, 0x1f, 0x1b, 0x0d, 0x56, 0x04, 0x3a, 0x5b, 0x42, 0x84, 0xde, 0x30, 0x16, 0x14, 0x26, + 0x42, 0x07, 0x9b, 0xc2, 0x30, 0xd7, 0xc7, 0xc5, 0x6d, 0x40, 0x81, 0x13, 0x41, 0x6f, 0x44, 0xe9, + 0x92, 0x5c, 0x93, 0x39, 0x82, 0x0d, 0x40, 0x12, 0xdd, 0x32, 0x40, 0x41, 0x0d, 0xd3, 0x2d, 0x0e, + 0xb9, 0x7b, 0x5b, 0x24, 0x01, 0xc8, 0xc3, 0x6d, 0x4f, 0x3c, 0xdf, 0xcd, 0x33, 0x09, 0x4f, 0x5c, + 0xb7, 0x73, 0x0d, 0x54, 0x9c, 0x7a, 0x11, 0x68, 0x25, 0x0d, 0xf3, 0x58, 0xd2, 0x8c, 0xcd, 0xbc, + 0x61, 0xd9, 0x77, 0x87, 0x03, 0x92, 0x37, 0xcc, 0x77, 0x54, 0xfc, 0x01, 0x7f, 0xe2, 0xc0, 0x3d, + 0xe5, 0x0e, 0xbc, 0xb4, 0x23, 0x78, 0xbc, 0x6d, 0xe7, 0x8d, 0xfb, 0x87, 0x11, 0xd0, 0x30, 0xe4, + 0xa0, 0x0f, 0x02, 0x10, 0x80, 0xae, 0x47, 0xdc, 0xa7, 0x45, 0x9f, 0x8f, 0xf3, 0xb8, 0x23, 0xc7, + 0x51, 0x22, 0x15, 0x38, 0x0c, 0x34, 0xf2, 0x7c, 0xaa, 0xf8, 0x03, 0xe5, 0x0e, 0x41, 0x0e, 0xa7, + 0xc9, 0x38, 0x1f, 0x49, 0x03, 0x1a, 0x79, 0xe3, 0x38, 0x24, 0x4a, 0x8c, 0x9a, 0x3f, 0x34, 0x22, + 0x9e, 0x54, 0x86, 0xaf, 0xec, 0x84, 0x39, 0x7c, 0x1a, 0x80, 0x34, 0x29, 0x0a, 0xc8, 0x98, 0x22, + 0x97, 0x08, 0xb2, 0x05, 0x47, 0xba, 0x74, 0x52, 0x7d, 0x50, 0x01, 0x2c, 0x37, 0xa8, 0x63, 0xcb, + 0x4a, 0x74, 0x01, 0x54, 0x59, 0xe1, 0x2b, 0x06, 0x21, 0x17, 0xdc, 0xe1, 0xfe, 0xf6, 0x76, 0x5e, + 0xa9, 0x77, 0xd9, 0xcc, 0x2b, 0xbd, 0xb7, 0x24, 0x84, 0xdf, 0x17, 0x3c, 0x04, 0xac, 0xf2, 0x74, + 0x4f, 0x04, 0x9d, 0x4a, 0x89, 0x38, 0x27, 0x01, 0x36, 0x8c, 0x1f, 0x3f, 0x12, 0x30, 0x58, 0x3f, + 0x0d, 0x80, 0xe0, 0xb7, 0x80, 0x1f, 0x75, 0xb9, 0x4b, 0x8b, 0xe8, 0xdc, 0xa7, 0x24, 0xa2, 0x08, + 0x04, 0x41, 0x43, 0x74, 0x71, 0xda, 0x39, 0x42, 0x27, 0xe7, 0x40, 0x92, 0xb9, 0x82, 0x31, 0x5a, + 0xc5, 0x68, 0x2a, 0x6c, 0x86, 0x21, 0xa1, 0x94, 0x9e, 0x48, 0xf4, 0x6f, 0x94, 0xf6, 0x83, 0xf2, + 0xe3, 0x1d, 0x35, 0x5d, 0xc7, 0xd8, 0xd8, 0x59, 0x28, 0x70, 0x29, 0x2a, 0x5e, 0x46, 0x6f, 0x02, + 0xab, 0x86, 0xcd, 0xad, 0xca, 0x12, 0xbf, 0xf4, 0x26, 0x20, 0xcc, 0x95, 0x9a, 0x66, 0xdc, 0x49, + 0x3b, 0x66, 0x96, 0x54, 0x6b, 0x7c, 0x71, 0x84, 0x77, 0xa8, 0x52, 0x2c, 0x71, 0x0b, 0xe7, 0xe0, + 0x7a, 0x51, 0xe0, 0x93, 0x5b, 0x0b, 0x33, 0xce, 0x28, 0xde, 0xb2, 0xac, 0xb5, 0x89, 0x37, 0x7a, + 0x02, 0xf6, 0x34, 0x45, 0xd1, 0x63, 0x70, 0x9c, 0xc7, 0x83, 0xee, 0x69, 0x02, 0x6e, 0x3d, 0x00, + 0xbe, 0xfd, 0xa2, 0x52, 0xdd, 0xaf, 0x1c, 0xbc, 0x6e, 0xc0, 0x9a, 0xed, 0x17, 0x37, 0xd5, 0xd7, + 0x95, 0x5a, 0x03, 0x2f, 0xa8, 0x92, 0xaa, 0x72, 0xa7, 0x08, 0x71, 0x88, 0x83, 0x8d, 0x35, 0x2a, + 0xc0, 0x9a, 0xf0, 0xd9, 0x29, 0x0c, 0x3b, 0x13, 0xea, 0x5c, 0x51, 0xf7, 0x0d, 0x1e, 0x02, 0xcb, + 0x57, 0x80, 0x4a, 0xed, 0xb7, 0x64, 0xcf, 0x52, 0x0f, 0x15, 0x5b, 0xe0, 0xd1, 0x9a, 0x42, 0x3b, + 0x5e, 0x11, 0xc2, 0xff, 0x89, 0xdd, 0x61, 0x45, 0x70, 0x64, 0x13, 0xf5, 0x7e, 0xcc, 0xe3, 0x30, + 0xfd, 0xe8, 0x7a, 0x0c, 0x6c, 0x20, 0xfd, 0x3c, 0x07, 0xdf, 0x41, 0x45, 0xfa, 0xa9, 0x5f, 0x4a, + 0x12, 0x49, 0x49, 0x23, 0xc4, 0x8d, 0x11, 0x0f, 0xf3, 0x9e, 0x55, 0x6e, 0x78, 0xcd, 0xfd, 0x86, + 0xb7, 0xb3, 0x63, 0xdc, 0xc9, 0x01, 0xb1, 0x63, 0x7d, 0xd7, 0x7b, 0xc1, 0x9e, 0x1e, 0x0b, 0x62, + 0x91, 0x78, 0xfb, 0x8b, 0x97, 0x77, 0xde, 0x3d, 0x46, 0x9e, 0x9b, 0xbe, 0x4a, 0xb3, 0xb4, 0xf0, + 0xc4, 0x73, 0x5d, 0x15, 0x1f, 0x34, 0x70, 0x3a, 0x5f, 0x9e, 0x03, 0x28, 0x6e, 0x87, 0xfc, 0x06, + 0xcb, 0xad, 0x5d, 0xfb, 0x2b, 0xdb, 0x40, 0x7d, 0xac, 0xf1, 0x39, 0x3e, 0x89, 0x22, 0x0b, 0xdf, + 0x44, 0xf3, 0x95, 0x2c, 0x9e, 0x0e, 0x69, 0x88, 0xd1, 0xd4, 0x63, 0x16, 0x06, 0x7c, 0x10, 0x1e, + 0x2c, 0x5c, 0xdd, 0xcb, 0x46, 0xd4, 0xfb, 0x19, 0x44, 0xb5, 0x83, 0x6c, 0x44, 0x83, 0x15, 0x44, + 0x4f, 0x10, 0x54, 0x2b, 0xaf, 0x22, 0x72, 0xbd, 0x6b, 0x25, 0x86, 0xf6, 0xa1, 0xc6, 0xc2, 0x99, + 0xe3, 0x7b, 0xce, 0x15, 0x84, 0xd1, 0x44, 0x69, 0x27, 0x5e, 0x64, 0xca, 0x29, 0x23, 0xdd, 0x01, + 0x8c, 0x06, 0xdb, 0xa9, 0x72, 0x35, 0x4b, 0x80, 0x42, 0xa3, 0x54, 0x47, 0xf6, 0xdd, 0x5c, 0x3a, + 0x15, 0xf0, 0x15, 0x7e, 0x04, 0x78, 0xac, 0xda, 0x62, 0xa7, 0x8b, 0x23, 0xbd, 0x93, 0xd2, 0x37, + 0x0b, 0x27, 0x0a, 0x57, 0x97, 0x6a, 0xd5, 0x18, 0x12, 0xe7, 0x6a, 0x1c, 0xf2, 0x98, 0xb9, 0x05, + 0x58, 0xc9, 0xc3, 0xfa, 0x8b, 0xbd, 0xbd, 0xbd, 0x86, 0x8c, 0xe7, 0xa1, 0xfd, 0x31, 0x66, 0xd2, + 0x41, 0xcd, 0x28, 0xbd, 0x72, 0xc9, 0x6d, 0xa4, 0xf6, 0x01, 0x85, 0x93, 0xd1, 0x36, 0x55, 0xb8, + 0x6e, 0xaa, 0x43, 0x83, 0xf4, 0xed, 0xe2, 0x81, 0xb1, 0xb7, 0xe9, 0x5b, 0x7f, 0xfd, 0x4d, 0xa9, + 0x1d, 0xfc, 0xc7, 0xe6, 0xa5, 0x55, 0x69, 0x5c, 0x82, 0xba, 0x5d, 0x82, 0xba, 0x69, 0x9e, 0xdc, + 0x0d, 0xc5, 0x79, 0x79, 0x77, 0x79, 0x9f, 0xa1, 0x3b, 0xdf, 0x1b, 0xa9, 0x8a, 0x26, 0xaa, 0xac, + 0x48, 0x1d, 0x81, 0x7f, 0x42, 0x4d, 0x88, 0x73, 0xd4, 0x99, 0x1f, 0x60, 0x57, 0x09, 0x04, 0x24, + 0x77, 0x09, 0x0a, 0x7e, 0xd9, 0xac, 0x54, 0x17, 0x5b, 0xf2, 0x40, 0x19, 0xd9, 0x35, 0xf1, 0x63, + 0x00, 0x84, 0xdd, 0x76, 0x2a, 0x00, 0xf9, 0xf2, 0x6e, 0x1a, 0x7d, 0xb9, 0xfc, 0x76, 0xdf, 0x2c, + 0xe9, 0xf9, 0x95, 0xbd, 0x34, 0xea, 0x55, 0x15, 0x39, 0x7a, 0x8e, 0xae, 0x55, 0x12, 0x1d, 0xd9, + 0xad, 0x48, 0x0e, 0xd4, 0x72, 0x1b, 0x09, 0xbe, 0x46, 0xec, 0xf9, 0xdf, 0x40, 0x6c, 0x36, 0xa1, + 0x9d, 0x5f, 0x25, 0xf4, 0x2b, 0xfb, 0x2a, 0xbe, 0x0a, 0xa9, 0x27, 0x1b, 0x0a, 0x79, 0x9f, 0xc8, + 0xe6, 0xb7, 0x87, 0x5d, 0xc5, 0x7e, 0xe2, 0x27, 0xf6, 0x1f, 0x73, 0x12, 0xfb, 0x8f, 0x7b, 0x88, + 0x7e, 0xcc, 0x42, 0x2f, 0xa2, 0xab, 0x8e, 0x02, 0x10, 0x26, 0xa2, 0xa8, 0xd6, 0x6a, 0x1b, 0xc8, + 0xb3, 0xbc, 0xc2, 0xfe, 0x53, 0xdc, 0x17, 0xc0, 0x17, 0x3c, 0xc3, 0x29, 0xec, 0xff, 0x75, 0x8f, + 0xb0, 0x9f, 0xe1, 0x0e, 0xf6, 0x9f, 0xeb, 0x0b, 0x36, 0xbd, 0xc0, 0x6f, 0xa6, 0x3a, 0x88, 0x85, + 0x2f, 0xd8, 0xff, 0x79, 0x47, 0xf0, 0xbf, 0xb3, 0xf9, 0xdf, 0x9e, 0xb4, 0xf9, 0xfd, 0xe7, 0x18, + 0x3c, 0x5e, 0x31, 0xf8, 0x87, 0x74, 0x12, 0x9b, 0xd9, 0xfa, 0x78, 0x90, 0xe8, 0xe3, 0xc1, 0x63, + 0xfa, 0x78, 0xf0, 0xa4, 0x3e, 0xca, 0x80, 0xba, 0xa2, 0x8e, 0x07, 0xbf, 0xa4, 0x8e, 0x07, 0x7f, + 0x93, 0x3a, 0x1e, 0xfc, 0x75, 0x75, 0x3c, 0xc8, 0x50, 0xc7, 0x83, 0xbf, 0x51, 0x1d, 0x0f, 0xfe, + 0xbf, 0xd4, 0xf1, 0xe0, 0x51, 0x75, 0x7c, 0xa6, 0x2a, 0xaa, 0x1c, 0x70, 0xd0, 0x1d, 0x40, 0xb2, + 0xb7, 0x48, 0x2b, 0xc5, 0x22, 0xc3, 0x93, 0xe5, 0xc4, 0xdd, 0x22, 0xff, 0xaa, 0x94, 0x75, 0x02, + 0x26, 0x0b, 0x26, 0x91, 0x64, 0xb2, 0x78, 0xc7, 0x33, 0x8a, 0x4a, 0xbb, 0x94, 0x0d, 0xe8, 0xd0, + 0xa0, 0xc9, 0x4e, 0x01, 0x76, 0x2e, 0xd3, 0x64, 0xd2, 0x12, 0xb6, 0x7d, 0xb9, 0x5d, 0x69, 0xe4, + 0xab, 0xb5, 0xbd, 0x2d, 0x4b, 0x3e, 0xb7, 0x05, 0x64, 0xf0, 0x90, 0xdb, 0x41, 0xd6, 0x5f, 0xd9, + 0x52, 0xc9, 0x67, 0x77, 0x81, 0xf3, 0xc7, 0x8f, 0x64, 0xec, 0x68, 0x65, 0xac, 0xaa, 0x07, 0xcf, + 0x97, 0x07, 0x77, 0x13, 0xc8, 0xce, 0x62, 0xd0, 0x30, 0xb6, 0xb7, 0x13, 0x75, 0x51, 0xb4, 0xb4, + 0x0f, 0xe5, 0x9c, 0xe9, 0x19, 0xf7, 0x0b, 0x16, 0x2f, 0xdc, 0x84, 0x45, 0x62, 0x7d, 0x29, 0x9b, + 0x1b, 0xff, 0xbe, 0x99, 0xab, 0xac, 0x4b, 0xc8, 0x29, 0x94, 0xfc, 0xcb, 0x7c, 0x92, 0x2f, 0xde, + 0xb7, 0x1d, 0xeb, 0x21, 0x6e, 0x7f, 0x9f, 0x9a, 0xd3, 0xdf, 0xad, 0x6a, 0x63, 0x5d, 0x54, 0x96, + 0x5c, 0x72, 0x8f, 0xfb, 0x32, 0x79, 0x77, 0x8b, 0xfd, 0x51, 0xf1, 0x74, 0xf0, 0x51, 0xcf, 0x80, + 0x14, 0x92, 0x81, 0x04, 0xb2, 0x50, 0xf9, 0x3d, 0x90, 0x4d, 0x83, 0xb7, 0x50, 0x8c, 0x88, 0xd5, + 0x39, 0xa8, 0x50, 0x00, 0x69, 0x8a, 0xa2, 0xb7, 0x8e, 0xa2, 0xf7, 0x08, 0x8a, 0xde, 0x1c, 0xc5, + 0x42, 0x12, 0x50, 0x32, 0x7e, 0xe4, 0x33, 0x59, 0xab, 0x98, 0x0c, 0x64, 0xa4, 0x12, 0x7b, 0xa2, + 0xd9, 0x9a, 0x12, 0x27, 0xe4, 0x50, 0xcb, 0x9b, 0xae, 0x45, 0x8a, 0x21, 0x9f, 0x45, 0x45, 0x9f, + 0xb2, 0xb1, 0x98, 0x98, 0x3e, 0x7c, 0x7b, 0xe0, 0x70, 0x42, 0x21, 0x97, 0xba, 0x86, 0xc9, 0xad, + 0x3e, 0x94, 0xb9, 0x6c, 0x5c, 0x94, 0xc9, 0x4e, 0x7b, 0x42, 0xc2, 0x36, 0xd4, 0x61, 0xf9, 0xbc, + 0x00, 0x01, 0xbe, 0xd9, 0xdb, 0xaf, 0xd7, 0x6a, 0xc6, 0x8e, 0x30, 0x1a, 0xf3, 0x36, 0xc6, 0x7a, + 0xc9, 0x2d, 0x5c, 0x28, 0xb7, 0xfd, 0x04, 0x63, 0x9b, 0xfa, 0x7e, 0xbe, 0xbc, 0xac, 0x99, 0xdf, + 0x0f, 0x63, 0x21, 0x80, 0xd2, 0x97, 0x77, 0xe2, 0xbe, 0xfe, 0xdd, 0x5c, 0x01, 0xac, 0xac, 0x00, + 0xae, 0x78, 0xa0, 0x2e, 0x24, 0x2e, 0xfc, 0x7e, 0xdd, 0xf7, 0x2c, 0x7c, 0xd2, 0x86, 0x17, 0x5a, + 0xe4, 0x31, 0x14, 0x96, 0x85, 0xf4, 0xdf, 0xb1, 0x17, 0x52, 0x30, 0xab, 0xd5, 0x1d, 0xab, 0x8f, + 0xec, 0x78, 0xfa, 0xcb, 0x3b, 0xb2, 0x47, 0x76, 0xdc, 0x7d, 0x64, 0xc7, 0xa3, 0x5f, 0xde, 0xd1, + 0x5b, 0xd9, 0x71, 0xa9, 0xab, 0x42, 0x85, 0xea, 0x2c, 0xdc, 0x51, 0x1f, 0x4a, 0xec, 0xa4, 0x58, + 0xdf, 0xec, 0x2b, 0x4c, 0x69, 0x14, 0x41, 0x15, 0xad, 0x3b, 0x0b, 0x69, 0x8f, 0x48, 0x15, 0xf5, + 0x54, 0xb7, 0x89, 0xa6, 0xaa, 0x48, 0x15, 0x45, 0x1e, 0x7a, 0x63, 0x8f, 0x6d, 0x6f, 0x8b, 0xa2, + 0xec, 0x0c, 0x20, 0x60, 0x4c, 0x10, 0xe6, 0x50, 0x3e, 0x42, 0x67, 0xc3, 0x4b, 0xc8, 0x07, 0x37, + 0x74, 0x5f, 0x03, 0x16, 0x7d, 0x22, 0xcc, 0x55, 0x8d, 0x9e, 0x4f, 0x70, 0x96, 0xf6, 0x3f, 0x8c, + 0x7b, 0x59, 0x79, 0xab, 0x86, 0x58, 0xd9, 0x30, 0x1f, 0xec, 0x5b, 0xad, 0xd1, 0x64, 0xe2, 0x3f, + 0x87, 0x3e, 0x61, 0x57, 0xcb, 0x4d, 0xa7, 0x04, 0x9b, 0x30, 0xee, 0x32, 0x8d, 0xae, 0x59, 0x7e, + 0x93, 0x5f, 0xb5, 0x59, 0x0b, 0x0c, 0xd9, 0xfc, 0x09, 0xab, 0xad, 0xaf, 0x2f, 0xef, 0x61, 0x33, + 0xd3, 0x40, 0x17, 0xdb, 0xf5, 0x52, 0xf8, 0x0b, 0x6c, 0xfe, 0x84, 0x85, 0xd7, 0xd7, 0x97, 0x77, + 0xf0, 0x7d, 0x0e, 0x72, 0x70, 0xdd, 0x5e, 0x6c, 0xaa, 0xa0, 0x67, 0xff, 0xc3, 0x9b, 0xca, 0x46, + 0x25, 0x8a, 0x43, 0x3f, 0x8f, 0x75, 0x3f, 0xc0, 0x89, 0xc0, 0xe2, 0x21, 0x92, 0x6a, 0x80, 0x66, + 0x49, 0xd7, 0xf7, 0xb2, 0x5f, 0x05, 0xc1, 0x58, 0xb6, 0x46, 0x80, 0xef, 0xbc, 0x01, 0x21, 0x07, + 0x7c, 0xe2, 0x34, 0xa7, 0xa2, 0x92, 0x7c, 0xfb, 0x13, 0xb4, 0x4d, 0xeb, 0x64, 0x7f, 0x04, 0xfa, + 0x46, 0xc5, 0x84, 0xc3, 0x4c, 0xc0, 0x23, 0x21, 0x83, 0x78, 0x14, 0x0f, 0xa7, 0x9e, 0x00, 0x16, + 0x5c, 0xb5, 0x54, 0x86, 0xdf, 0x44, 0x49, 0x05, 0x0f, 0xc0, 0xb3, 0x24, 0x63, 0xb9, 0x64, 0x70, + 0x42, 0xfd, 0xe0, 0x10, 0xc6, 0x86, 0xda, 0xf0, 0xb5, 0x76, 0xeb, 0x8f, 0xa5, 0x94, 0xe0, 0x58, + 0xe2, 0x7a, 0xd3, 0x2c, 0xe9, 0x89, 0x79, 0x9c, 0x4b, 0xd6, 0xe4, 0x32, 0x16, 0x1d, 0xca, 0x45, + 0x87, 0x10, 0xdd, 0x17, 0xeb, 0x56, 0x76, 0xd1, 0x94, 0x62, 0xbb, 0x4f, 0xae, 0xe9, 0x02, 0x04, + 0xc2, 0x68, 0x2e, 0xc1, 0x3f, 0xa9, 0xea, 0xc6, 0x2d, 0xa4, 0x5b, 0x71, 0x00, 0xe2, 0xa9, 0xda, + 0xef, 0x64, 0x5c, 0x94, 0x43, 0xaa, 0xd2, 0xeb, 0x0d, 0xce, 0x61, 0x2e, 0xbc, 0xa6, 0x61, 0x1d, + 0x25, 0xb6, 0xba, 0x16, 0xad, 0xe7, 0x6d, 0xe2, 0xde, 0x40, 0xb2, 0x18, 0xda, 0x2b, 0x50, 0xb2, + 0x8d, 0x38, 0x97, 0x64, 0xaf, 0xaf, 0x2c, 0x57, 0x3b, 0x5d, 0xa8, 0x7e, 0xaa, 0x1a, 0xfe, 0x53, + 0x44, 0x51, 0x75, 0x6f, 0x82, 0xa4, 0xd8, 0x89, 0xa8, 0xa3, 0x5c, 0xc6, 0x36, 0x1a, 0x49, 0xfb, + 0xad, 0x5e, 0xa5, 0x88, 0xfe, 0x0f, 0xe4, 0x36, 0xf5, 0xb5, 0xfa, 0x6e, 0xf0, 0x19, 0x00, 0x92, + 0x4a, 0x2e, 0x97, 0xe8, 0x0a, 0x38, 0x0a, 0x0d, 0x03, 0xa1, 0x1b, 0xcf, 0xdf, 0xb0, 0xfd, 0xae, + 0x3b, 0xc8, 0x7f, 0x1a, 0xb4, 0x8d, 0xb4, 0xb2, 0x5b, 0xab, 0x00, 0x2b, 0x0a, 0xa4, 0x74, 0xd8, + 0x1f, 0xe4, 0xb2, 0x40, 0x80, 0x87, 0x76, 0x67, 0x50, 0x6a, 0x77, 0xfa, 0x83, 0x2c, 0x90, 0x5d, + 0x6c, 0x77, 0x00, 0xa4, 0xb3, 0x0c, 0x92, 0x5b, 0x83, 0xd9, 0xc3, 0xf6, 0xa7, 0x7e, 0x01, 0x20, + 0x4a, 0x9d, 0xa3, 0x4c, 0x44, 0x35, 0x05, 0xd4, 0x06, 0xa0, 0xf6, 0x51, 0x36, 0xaa, 0x57, 0x0a, + 0xaa, 0x0b, 0x50, 0xdd, 0x6c, 0x54, 0xaf, 0x15, 0x50, 0xeb, 0xf3, 0xc6, 0xfc, 0x5c, 0x62, 0xfb, + 0x0a, 0xe0, 0x1c, 0xb0, 0x9c, 0x67, 0x63, 0x81, 0x7c, 0x19, 0xa8, 0xc9, 0xb7, 0x2e, 0xfa, 0x03, + 0x23, 0x13, 0x53, 0x05, 0xf2, 0xe1, 0xf7, 0x00, 0xf5, 0xe1, 0x21, 0xa0, 0x39, 0x0c, 0x48, 0xba, + 0x25, 0xb9, 0x6f, 0x3d, 0xc4, 0x7e, 0x8a, 0x09, 0x84, 0xdd, 0xfb, 0x0c, 0x50, 0xbd, 0xcf, 0xd9, + 0x34, 0x55, 0x40, 0xdc, 0x3d, 0xf0, 0x01, 0x13, 0xf4, 0x81, 0x43, 0x58, 0xce, 0x46, 0x06, 0x22, + 0x3f, 0xe9, 0x0f, 0x50, 0xfe, 0x84, 0xb9, 0x1e, 0xc9, 0xa6, 0x0c, 0x84, 0xde, 0x6e, 0x15, 0xfa, + 0x24, 0xba, 0x22, 0x02, 0x74, 0x71, 0x46, 0x58, 0xa6, 0xe4, 0x2b, 0x20, 0xfa, 0x56, 0x3b, 0x5b, + 0x11, 0x2a, 0xaf, 0xf5, 0x7c, 0xa9, 0xd5, 0x7e, 0x8c, 0x4b, 0x10, 0xfd, 0xb1, 0x24, 0xec, 0x98, + 0xcc, 0x88, 0xe7, 0x65, 0x53, 0x06, 0xd2, 0xef, 0x9d, 0xfd, 0x01, 0x80, 0x3d, 0x7e, 0xcd, 0x23, + 0x6f, 0xe8, 0x85, 0xd1, 0x95, 0x91, 0x49, 0x5c, 0x15, 0x8e, 0xa1, 0xf5, 0x41, 0x6e, 0xfe, 0xe1, + 0x08, 0xd6, 0xb4, 0x98, 0x33, 0x51, 0x7d, 0xe3, 0x4c, 0xfc, 0x55, 0x38, 0x93, 0xee, 0x3f, 0xe7, + 0xea, 0xb6, 0x64, 0x00, 0x69, 0xdf, 0x43, 0xda, 0xee, 0xa0, 0x8d, 0xf8, 0x68, 0x04, 0xce, 0x23, + 0xf5, 0x0e, 0xda, 0x0a, 0x3f, 0x9d, 0x3d, 0x5c, 0x6c, 0xbd, 0xaa, 0xc9, 0xfb, 0x2a, 0x94, 0x53, + 0x11, 0x3c, 0xf9, 0x48, 0xc3, 0x36, 0x18, 0xa9, 0xc3, 0x99, 0x1b, 0xa1, 0x3c, 0x4c, 0x17, 0x51, + 0x65, 0x1f, 0x4d, 0x78, 0x1c, 0x46, 0x86, 0xdc, 0xa9, 0x1d, 0x87, 0x21, 0x44, 0x6c, 0xa4, 0x7a, + 0xde, 0xda, 0x3f, 0x79, 0x11, 0x98, 0x3e, 0xe4, 0xc5, 0xa9, 0x9f, 0x95, 0xa3, 0x11, 0xb6, 0x63, + 0x76, 0xc5, 0xf8, 0x0c, 0xce, 0x49, 0x4e, 0xda, 0x45, 0xb9, 0xfa, 0x94, 0x08, 0x4f, 0xc4, 0xee, + 0x86, 0xb3, 0x80, 0xf0, 0x85, 0xd7, 0x19, 0xef, 0x61, 0x3b, 0xd7, 0xcb, 0x92, 0x4a, 0x1f, 0xcb, + 0x22, 0x67, 0x43, 0x14, 0xcb, 0xac, 0x9f, 0x0e, 0xd6, 0x59, 0x9f, 0xd3, 0x77, 0xe3, 0xaf, 0xa5, + 0x30, 0xaf, 0x5e, 0x15, 0x5f, 0xc9, 0x82, 0x8d, 0x06, 0x30, 0x56, 0x2c, 0x57, 0xb4, 0x6b, 0x3b, + 0xe5, 0x6c, 0xfc, 0x30, 0xb5, 0xbd, 0x8f, 0x78, 0xe3, 0x60, 0x3b, 0xe0, 0x5e, 0xb2, 0xa8, 0xbd, + 0xc0, 0xb2, 0x74, 0xcb, 0xa0, 0x36, 0x37, 0x47, 0x9a, 0x91, 0x6f, 0x6d, 0x50, 0x5b, 0x91, 0x4d, + 0xa4, 0x75, 0x62, 0x33, 0x02, 0x94, 0x8c, 0xa3, 0x70, 0x54, 0x43, 0xb1, 0x1c, 0xac, 0xe6, 0xb9, + 0x18, 0x56, 0x31, 0x66, 0x7e, 0x63, 0xb2, 0x08, 0x4b, 0x2a, 0x20, 0x79, 0x76, 0x2e, 0x2f, 0x33, + 0x9e, 0x08, 0x31, 0x3a, 0x43, 0x50, 0xf7, 0x99, 0x32, 0x50, 0xdf, 0xa2, 0x19, 0x0f, 0xaf, 0x22, + 0x48, 0xb7, 0xd0, 0x50, 0xa6, 0xee, 0x34, 0x04, 0xc5, 0xf5, 0xe6, 0x41, 0x72, 0x5e, 0xff, 0x46, + 0x31, 0x4b, 0xc9, 0x4f, 0x94, 0x21, 0x8d, 0x73, 0xbb, 0x76, 0x5b, 0x5e, 0x00, 0x40, 0x88, 0xdb, + 0xb5, 0x5b, 0x8c, 0xf8, 0x7c, 0x8c, 0xd4, 0x00, 0xe2, 0x10, 0xdb, 0x64, 0xa1, 0x8c, 0x1e, 0x8d, + 0x3b, 0x67, 0xa7, 0x70, 0x8e, 0xc0, 0xc9, 0x84, 0xb0, 0xb1, 0x0c, 0x43, 0x91, 0x8a, 0xfc, 0x52, + 0x00, 0xf3, 0xcd, 0xe5, 0x2d, 0x84, 0xfd, 0x16, 0xac, 0x50, 0xa0, 0xd3, 0xce, 0xd1, 0x9a, 0x3d, + 0x9c, 0x55, 0x36, 0x94, 0x62, 0x2d, 0x99, 0xad, 0x2d, 0x1b, 0xc2, 0x29, 0x79, 0x18, 0x4b, 0x35, + 0xab, 0xf7, 0x90, 0x7b, 0x00, 0x8b, 0xa4, 0xae, 0x52, 0x9d, 0x3c, 0x84, 0xa7, 0xfb, 0xb3, 0x78, + 0xfa, 0x13, 0x3e, 0x43, 0x35, 0x80, 0x02, 0x72, 0xe1, 0x1c, 0x9e, 0x12, 0x56, 0x4d, 0xcb, 0x26, + 0xd7, 0x9f, 0x1b, 0x34, 0x89, 0x90, 0x08, 0x89, 0xe7, 0x1b, 0x4f, 0xad, 0xec, 0x27, 0x52, 0x55, + 0xa7, 0xd6, 0xe6, 0x31, 0x13, 0x90, 0x02, 0x33, 0x75, 0x11, 0xf6, 0x64, 0x6a, 0xd0, 0xd1, 0x6b, + 0x17, 0xab, 0xde, 0x71, 0xe2, 0xd7, 0xe5, 0xd0, 0x11, 0xa4, 0xcc, 0xf5, 0x6d, 0x36, 0x8c, 0x82, + 0x46, 0x13, 0x7c, 0x43, 0x48, 0x02, 0xbb, 0x5a, 0xce, 0xad, 0xc8, 0xa4, 0xfd, 0xaf, 0xe7, 0xde, + 0x65, 0x1c, 0x1c, 0x2c, 0x09, 0xa7, 0xb0, 0x6a, 0x4d, 0xed, 0x93, 0xe7, 0x36, 0x7f, 0x21, 0x9a, + 0x6d, 0x62, 0x49, 0x90, 0x1c, 0x2d, 0xf9, 0x8c, 0x27, 0x5b, 0xc8, 0x4b, 0x07, 0x55, 0x4a, 0x78, + 0x9b, 0x27, 0x48, 0x09, 0xcb, 0xb9, 0x39, 0xcf, 0xab, 0xbb, 0x1c, 0x3f, 0xfb, 0x16, 0x68, 0x77, + 0x69, 0x93, 0xfa, 0x9a, 0xd8, 0xba, 0x3f, 0x71, 0x05, 0xb4, 0x84, 0x65, 0x4d, 0x6c, 0xfd, 0x5f, + 0xc2, 0xb2, 0xc2, 0xb0, 0x34, 0xf1, 0x5c, 0x57, 0xd6, 0xf8, 0x28, 0x50, 0xf7, 0x71, 0x91, 0xb2, + 0xf5, 0xe6, 0xd0, 0x56, 0x83, 0x11, 0x9a, 0x40, 0x0e, 0x8c, 0xa6, 0x60, 0xee, 0xee, 0x16, 0xf8, + 0x9c, 0x24, 0x57, 0xb5, 0x73, 0xfa, 0xf2, 0x0e, 0xdc, 0x0d, 0x68, 0x38, 0xf1, 0x23, 0x8e, 0x1c, + 0x08, 0x29, 0x43, 0x8a, 0xe2, 0x88, 0xba, 0x08, 0xf4, 0x56, 0xb7, 0x0d, 0xe4, 0x45, 0x42, 0x24, + 0x11, 0x0c, 0x39, 0xe4, 0x16, 0xef, 0xfb, 0x67, 0x3d, 0x44, 0x98, 0x8b, 0x8e, 0x07, 0x90, 0x1f, + 0xb7, 0xce, 0x4f, 0x90, 0xc3, 0xa7, 0x53, 0x18, 0x88, 0x8a, 0x39, 0x89, 0xf7, 0x7d, 0x0c, 0xf6, + 0xab, 0xef, 0x6b, 0xc5, 0x84, 0x26, 0xf4, 0xa0, 0x93, 0x23, 0xc0, 0xeb, 0xf3, 0xd9, 0x96, 0x74, + 0x5d, 0x48, 0xee, 0x2d, 0x73, 0xdf, 0xb2, 0xcc, 0x7c, 0x15, 0x98, 0x4b, 0x47, 0x24, 0xf6, 0x05, + 0x22, 0xba, 0x8c, 0x93, 0xa5, 0x25, 0x54, 0x2b, 0xf2, 0xca, 0x9a, 0x24, 0x28, 0x94, 0xcf, 0x03, + 0xfc, 0x2d, 0x9f, 0xde, 0x10, 0x74, 0xc6, 0x4a, 0x67, 0xa3, 0x11, 0xd2, 0x0c, 0x2c, 0xac, 0x43, + 0x8b, 0xb4, 0x55, 0x4e, 0x45, 0x3a, 0x7d, 0xb2, 0x63, 0xb9, 0xe4, 0x7a, 0x56, 0x0f, 0xa6, 0x55, + 0xf9, 0x25, 0x2c, 0xca, 0xf8, 0x53, 0x3b, 0x2c, 0x9c, 0x81, 0x8b, 0x4d, 0xc9, 0x5c, 0xad, 0xf8, + 0xdb, 0x4f, 0xe3, 0xcf, 0x65, 0x6c, 0x20, 0x35, 0xdc, 0x2d, 0x9c, 0x7a, 0xe3, 0x89, 0x58, 0xde, + 0x21, 0x5a, 0xdf, 0xa2, 0xb7, 0xbc, 0x45, 0xee, 0xa7, 0x78, 0x90, 0x3a, 0x95, 0xb4, 0x6b, 0xf4, + 0xa1, 0x24, 0x3a, 0xa5, 0xda, 0x91, 0x28, 0x97, 0xb4, 0x5a, 0xc1, 0x25, 0x8e, 0x3d, 0x56, 0x2f, + 0x23, 0x12, 0x0b, 0xae, 0x63, 0x5f, 0xd2, 0x6b, 0xb2, 0x57, 0x2e, 0x94, 0x5d, 0x3b, 0x88, 0xa3, + 0x89, 0xc4, 0x1b, 0xcd, 0x3c, 0xc8, 0x26, 0x75, 0x13, 0x13, 0xfe, 0x47, 0x90, 0x8b, 0x09, 0xa5, + 0x38, 0x9c, 0x15, 0xb6, 0xc7, 0xa2, 0x01, 0x39, 0x55, 0x3a, 0xe9, 0x43, 0x3a, 0xa0, 0xa6, 0x46, + 0x23, 0x3d, 0xc7, 0xd2, 0x29, 0x97, 0xc7, 0x40, 0x87, 0x9c, 0xec, 0x95, 0x5a, 0x8b, 0x96, 0x68, + 0x6e, 0x7e, 0xed, 0xdc, 0x14, 0xb2, 0xd0, 0x95, 0x83, 0xf3, 0xbf, 0xba, 0x8d, 0x4a, 0x50, 0x6e, + 0x12, 0xd2, 0x91, 0xf5, 0xf8, 0x8f, 0x61, 0x34, 0x0f, 0xa5, 0x17, 0x44, 0x45, 0xcb, 0xc2, 0x3c, + 0xb4, 0x0b, 0xe0, 0x56, 0xfe, 0xfa, 0x27, 0xe9, 0x3b, 0xd8, 0xb9, 0x24, 0x9a, 0x26, 0x72, 0x4a, + 0x0a, 0x49, 0xa2, 0x64, 0x27, 0x8f, 0xa8, 0x20, 0x7f, 0x94, 0x14, 0x72, 0x1f, 0xd0, 0xaf, 0x1a, + 0xa6, 0x2a, 0x91, 0xd7, 0xba, 0xd5, 0x1e, 0xf3, 0x3d, 0x46, 0x0b, 0xfa, 0xae, 0x7e, 0x2e, 0x67, + 0x29, 0x50, 0xd9, 0xdf, 0x9d, 0xb7, 0xb6, 0xe1, 0xd0, 0xf4, 0x6f, 0x9a, 0xea, 0xbb, 0xbb, 0xe5, + 0x40, 0xf7, 0x8b, 0x15, 0x63, 0x69, 0xb0, 0x0f, 0x9f, 0x2a, 0xb6, 0xb3, 0xeb, 0xe6, 0xdc, 0x63, + 0x85, 0x73, 0x49, 0x16, 0xa9, 0xf0, 0x27, 0x11, 0xa7, 0xfa, 0xed, 0xd6, 0x7f, 0x01, 0x73, 0x2d, + 0x5b, 0xb4, 0xcb, 0x25, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_sec.htm, do not edit!! -const uint16_t PAGE_settings_sec_length = 2096; +const uint16_t PAGE_settings_sec_length = 2355; const uint8_t PAGE_settings_sec[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6b, 0x6f, 0xdb, 0x38, - 0x16, 0xfd, 0xee, 0x5f, 0xc1, 0xa8, 0x40, 0xc7, 0x5e, 0xc8, 0x92, 0xe3, 0x76, 0x07, 0x7d, 0xd8, - 0xee, 0x26, 0x8d, 0x3b, 0x0d, 0x90, 0x17, 0x62, 0x67, 0x3a, 0x8b, 0xa2, 0x28, 0x68, 0x89, 0xb6, - 0x58, 0xcb, 0xa4, 0x86, 0xa4, 0xe2, 0x7a, 0x3b, 0xfd, 0xef, 0x7b, 0x2e, 0x25, 0xd9, 0x4e, 0xda, - 0x4e, 0x50, 0xcc, 0x87, 0x24, 0xe2, 0xeb, 0x3e, 0xce, 0xbd, 0xf7, 0x5c, 0x32, 0x83, 0x83, 0x93, - 0xcb, 0xd7, 0xd3, 0xff, 0x5e, 0x8d, 0x59, 0xe6, 0x56, 0xf9, 0x68, 0x40, 0xbf, 0x59, 0xce, 0xd5, - 0x62, 0x18, 0x08, 0x15, 0x60, 0x2c, 0x78, 0x3a, 0x1a, 0xac, 0x84, 0xe3, 0x4c, 0xf1, 0x95, 0x18, - 0x06, 0xb7, 0x52, 0xac, 0x0b, 0x6d, 0x5c, 0xc0, 0x12, 0xad, 0x9c, 0x50, 0x6e, 0x18, 0xac, 0x65, - 0xea, 0xb2, 0xe1, 0xbf, 0x7b, 0xbd, 0x60, 0xd4, 0xaa, 0xb6, 0xb6, 0xee, 0xad, 0xa5, 0xe2, 0x56, - 0x26, 0xa2, 0xeb, 0x07, 0xa1, 0x54, 0xd2, 0x49, 0x9e, 0x77, 0x6d, 0xc2, 0x73, 0x31, 0x3c, 0x0c, - 0x57, 0xfc, 0xb3, 0x5c, 0x95, 0xab, 0xed, 0xb8, 0xb4, 0xc2, 0xf8, 0x01, 0x9f, 0x61, 0xac, 0x74, - 0xc0, 0x5a, 0xf7, 0x54, 0xd7, 0x06, 0x25, 0x19, 0x37, 0x56, 0x40, 0x49, 0xe9, 0xe6, 0xdd, 0x67, - 0x98, 0x75, 0xd2, 0xe5, 0x62, 0x74, 0x2e, 0x6d, 0xc2, 0x26, 0xc2, 0x39, 0xa9, 0x16, 0x76, 0x10, - 0x57, 0x93, 0x03, 0x9b, 0x18, 0x59, 0xb8, 0x51, 0xeb, 0x96, 0x1b, 0xe6, 0xe4, 0x4a, 0xe8, 0xd2, - 0x85, 0xe9, 0x30, 0xd5, 0x49, 0xb9, 0x82, 0xa1, 0x2f, 0xe7, 0xa5, 0x4a, 0x9c, 0xd4, 0x8a, 0xbd, - 0x6d, 0x77, 0xbe, 0xac, 0xa5, 0x4a, 0xf5, 0x3a, 0xd2, 0x85, 0x50, 0xed, 0x20, 0x73, 0xae, 0xb0, - 0x2f, 0xe2, 0x78, 0xa9, 0x74, 0xb4, 0xce, 0x45, 0x1a, 0x2d, 0x44, 0x3c, 0x17, 0xdc, 0x95, 0x46, - 0xd8, 0xd8, 0xd6, 0x6a, 0xe2, 0x47, 0x56, 0x24, 0xa5, 0x91, 0x6e, 0xd3, 0x6d, 0xa6, 0x82, 0xce, - 0xd7, 0xad, 0xd0, 0xe3, 0xfb, 0x42, 0xb7, 0x07, 0x83, 0x30, 0xf8, 0x68, 0x45, 0x3e, 0xdf, 0xdf, - 0x7d, 0xf3, 0xcd, 0xee, 0xb2, 0x48, 0xb9, 0x13, 0xdf, 0xdb, 0xbb, 0x38, 0x4d, 0xdb, 0xa2, 0xf3, - 0xc5, 0x08, 0xd8, 0xa3, 0x18, 0x19, 0xe7, 0xc6, 0xb9, 0x20, 0x97, 0x8e, 0x37, 0x7e, 0x69, 0xb7, - 0x55, 0xda, 0xcb, 0xd9, 0xa7, 0xbd, 0xcd, 0xe2, 0xf1, 0xe3, 0x40, 0xcf, 0x3e, 0x89, 0xc4, 0x05, - 0xc3, 0xa1, 0xdb, 0x14, 0x42, 0xcf, 0x69, 0xee, 0xe0, 0xc8, 0x18, 0xbe, 0x89, 0xa4, 0xf5, 0x7f, - 0xef, 0x48, 0xb0, 0x99, 0x5e, 0x4f, 0x35, 0xb7, 0xae, 0x2d, 0x42, 0x37, 0x3c, 0x38, 0xec, 0x7c, - 0x21, 0x34, 0xd5, 0x90, 0x8c, 0x08, 0x1c, 0x2d, 0x04, 0x9d, 0x97, 0x2a, 0x92, 0x4a, 0x09, 0xf3, - 0x76, 0x7a, 0x7e, 0x36, 0x14, 0xa1, 0x8a, 0x92, 0x9c, 0x5b, 0x7b, 0x26, 0xad, 0x8b, 0x78, 0x9a, - 0xb6, 0xdd, 0xab, 0x40, 0x18, 0xa3, 0x4d, 0xf0, 0x22, 0x20, 0x69, 0x41, 0x27, 0x4c, 0x72, 0xc1, - 0xcd, 0xb4, 0x8a, 0x48, 0xbb, 0x8e, 0x4c, 0x07, 0xe7, 0xac, 0xdb, 0xe4, 0x22, 0xe2, 0x4a, 0xae, - 0x38, 0x29, 0x1f, 0x06, 0x4a, 0x2b, 0x40, 0x50, 0xef, 0x18, 0x02, 0xc0, 0xe6, 0x50, 0xbb, 0x31, - 0x10, 0xb8, 0xed, 0xeb, 0x33, 0x62, 0xa5, 0x6f, 0x45, 0xbb, 0x56, 0xf4, 0xb5, 0x13, 0xf6, 0x9f, - 0xf7, 0x7a, 0x7b, 0xee, 0x94, 0x45, 0xae, 0x79, 0xfa, 0x46, 0xe6, 0x82, 0xfc, 0x69, 0x9c, 0x51, - 0x62, 0xcd, 0xfe, 0x38, 0x3f, 0x7b, 0x8b, 0xb0, 0x5f, 0x8b, 0x3f, 0x4b, 0x61, 0x1d, 0x5c, 0x82, - 0xe9, 0xe3, 0x5b, 0x80, 0x4a, 0x72, 0x05, 0xbc, 0x6b, 0x07, 0x74, 0x34, 0x08, 0xf7, 0x55, 0xef, - 0xd0, 0x71, 0x99, 0xb4, 0xd0, 0x6e, 0x0b, 0xad, 0xac, 0x98, 0x8a, 0xcf, 0x2e, 0xf4, 0x33, 0xd6, - 0x21, 0x6b, 0xec, 0x68, 0xf8, 0x94, 0xac, 0xe8, 0x90, 0x8f, 0xdf, 0x8a, 0xad, 0xc0, 0xd9, 0x93, - 0x2b, 0xf6, 0x05, 0x0b, 0x92, 0x91, 0x2c, 0xc3, 0x83, 0x46, 0x40, 0x95, 0x1f, 0x57, 0x97, 0x93, - 0x29, 0x92, 0x23, 0xae, 0x1c, 0x42, 0x0c, 0xc8, 0x13, 0xed, 0x3d, 0x79, 0xa3, 0xcd, 0xea, 0x84, - 0x3b, 0xfe, 0xb2, 0x0e, 0xba, 0x8e, 0x78, 0x81, 0x33, 0x88, 0x17, 0x32, 0x8a, 0x07, 0xa1, 0x88, - 0xe6, 0xf0, 0xdf, 0xbe, 0xef, 0x7d, 0x08, 0x2b, 0xd4, 0x69, 0x4d, 0x77, 0x30, 0x7f, 0xcb, 0xf3, - 0x12, 0x45, 0x17, 0x84, 0x07, 0x87, 0x3b, 0xc8, 0x92, 0x4c, 0x24, 0xcb, 0x8b, 0x72, 0xb5, 0x4b, - 0xa3, 0x83, 0xf6, 0x81, 0x20, 0x17, 0xa2, 0xa5, 0xd8, 0x44, 0x08, 0x55, 0x92, 0xb5, 0xe3, 0xf7, - 0xbd, 0xee, 0xf3, 0x0f, 0x71, 0x07, 0xb9, 0xf4, 0x3e, 0x38, 0x86, 0xbd, 0xb6, 0xe0, 0x09, 0x65, - 0xef, 0x94, 0xcf, 0xf0, 0x7b, 0x0c, 0x6a, 0x80, 0x8b, 0xc1, 0x24, 0x93, 0x73, 0x87, 0xbf, 0xaf, - 0xc1, 0x15, 0x46, 0xe7, 0xf8, 0x3a, 0xca, 0x69, 0x7c, 0xc5, 0xc1, 0x00, 0x34, 0xcf, 0x0b, 0x7b, - 0xa6, 0x93, 0x25, 0x1d, 0x01, 0x1d, 0x14, 0x34, 0x37, 0xa9, 0x25, 0x5d, 0xf1, 0x85, 0xb8, 0x29, - 0xea, 0x8f, 0x13, 0xbd, 0x56, 0x5e, 0x2e, 0x02, 0x12, 0xbc, 0xd5, 0x2b, 0xda, 0x80, 0xe4, 0xd5, - 0xeb, 0x33, 0xe1, 0x15, 0xf8, 0x6f, 0xbf, 0xdb, 0x7f, 0x5d, 0xcb, 0x45, 0xb6, 0x9d, 0xae, 0xcf, - 0x9e, 0x22, 0x50, 0x86, 0x26, 0x4f, 0x44, 0x2e, 0x50, 0x69, 0x1f, 0x90, 0xc4, 0x49, 0x5e, 0xa6, - 0xc2, 0xb6, 0xb7, 0xde, 0x75, 0x3a, 0x7f, 0xfd, 0x55, 0x8f, 0x0a, 0xe3, 0xff, 0x9e, 0x88, 0x39, - 0x2f, 0x73, 0xd7, 0xee, 0x00, 0xa3, 0xce, 0xd7, 0xd6, 0x20, 0xae, 0x49, 0xa6, 0x26, 0x1b, 0x66, - 0x4d, 0x32, 0xdc, 0x95, 0x7a, 0x6c, 0xa3, 0x4f, 0xf6, 0x55, 0x31, 0xfc, 0x15, 0x4c, 0xb5, 0xdb, - 0x49, 0x59, 0x3e, 0x6a, 0xfd, 0x47, 0xae, 0x88, 0xd9, 0x58, 0x69, 0x72, 0xe4, 0xab, 0xcf, 0xfc, - 0xc4, 0x82, 0x42, 0x5e, 0x62, 0xa7, 0xdf, 0x31, 0x88, 0x2b, 0x26, 0x9e, 0xe9, 0x74, 0xc3, 0xb4, - 0xa2, 0x38, 0x0f, 0x83, 0xdf, 0x84, 0xfb, 0xbd, 0xdd, 0x81, 0xb8, 0x39, 0xa2, 0xcc, 0x24, 0x66, - 0xe8, 0xe3, 0xa3, 0xdd, 0x32, 0xe6, 0x64, 0x1e, 0x30, 0x50, 0x65, 0xa6, 0xb1, 0x54, 0x68, 0x4b, - 0xcc, 0x99, 0xca, 0x5b, 0xe6, 0x4b, 0x64, 0x88, 0x8a, 0x2d, 0x80, 0xc0, 0xdd, 0xb9, 0x4c, 0xe4, - 0xc5, 0x31, 0xa6, 0x66, 0xa5, 0x73, 0x88, 0x77, 0x8b, 0x78, 0x61, 0x18, 0x54, 0xa3, 0x00, 0x8a, - 0x93, 0x5c, 0x26, 0xcb, 0x61, 0xf0, 0x96, 0xd4, 0xbe, 0x1a, 0xc4, 0xd5, 0x02, 0xac, 0x83, 0x88, - 0xed, 0xa1, 0x1f, 0x9c, 0x39, 0xa6, 0x33, 0x2d, 0xca, 0x87, 0xdd, 0xb9, 0x3b, 0x27, 0x6c, 0x39, - 0x5b, 0x49, 0xd8, 0x38, 0xe1, 0xb7, 0x62, 0xb7, 0x25, 0x33, 0x8d, 0xf8, 0xac, 0x3f, 0x6a, 0x4d, - 0x6a, 0x9a, 0x65, 0x8f, 0xd9, 0x8d, 0x27, 0x45, 0x06, 0x78, 0xcb, 0x02, 0xf0, 0xf4, 0x47, 0x0d, - 0xe7, 0xb3, 0xab, 0xd3, 0x8b, 0x17, 0x6c, 0x20, 0x55, 0x51, 0xba, 0x5a, 0x74, 0x01, 0xe7, 0xd6, - 0xda, 0xa4, 0x81, 0x47, 0x09, 0xeb, 0x5b, 0x88, 0xfc, 0xb7, 0x95, 0xff, 0xc3, 0xe7, 0x53, 0x80, - 0xc5, 0x3f, 0xe7, 0x42, 0x2d, 0xd0, 0xb2, 0xfc, 0x48, 0xaa, 0xbd, 0x91, 0x56, 0x48, 0x02, 0x90, - 0x32, 0xa8, 0x68, 0x5b, 0x06, 0x54, 0xd7, 0x1d, 0xc8, 0x2a, 0xb8, 0x43, 0x52, 0x63, 0xc5, 0xa7, - 0xfe, 0xbf, 0xa0, 0x86, 0x94, 0xaf, 0x74, 0x0a, 0xb1, 0x0a, 0x1d, 0xc6, 0xc8, 0x24, 0x60, 0xbe, - 0x13, 0x41, 0x23, 0x08, 0xcf, 0x0a, 0x26, 0xa8, 0x0c, 0x18, 0x67, 0x4f, 0x59, 0x2a, 0x17, 0xd2, - 0x31, 0x6c, 0x9b, 0xa1, 0x2e, 0x80, 0x89, 0x41, 0x1b, 0xa5, 0x90, 0xf8, 0xc8, 0x43, 0x99, 0xce, - 0xb5, 0x79, 0xf1, 0x68, 0xce, 0xa9, 0xbf, 0x3e, 0x7e, 0xf4, 0xfc, 0xd9, 0xb3, 0x67, 0x2f, 0xd9, - 0x8d, 0x12, 0x2a, 0x31, 0x9b, 0xc2, 0x89, 0x94, 0x39, 0xc3, 0x95, 0x5d, 0x49, 0x6b, 0x51, 0xa1, - 0x11, 0x3b, 0x16, 0xac, 0x30, 0xc8, 0x5c, 0xe5, 0xd8, 0x3a, 0x13, 0x20, 0x6d, 0x64, 0x74, 0x42, - 0xb8, 0x10, 0x2c, 0x21, 0x4b, 0x35, 0xbb, 0xb8, 0x9c, 0x32, 0x94, 0x18, 0xdb, 0xe8, 0xd2, 0xb0, - 0x19, 0x57, 0x4b, 0x2c, 0xd2, 0x82, 0x36, 0x21, 0x9b, 0x9c, 0x9e, 0x87, 0x4c, 0xb8, 0x24, 0x62, - 0x85, 0x54, 0x07, 0xad, 0x26, 0xb0, 0xc6, 0xff, 0x50, 0x35, 0xb2, 0xb5, 0x34, 0x90, 0x68, 0x2d, - 0x6b, 0x5f, 0x4e, 0x8f, 0x3a, 0xcc, 0xea, 0xb9, 0x5b, 0x73, 0x23, 0x58, 0xd5, 0xa3, 0xee, 0xe1, - 0xee, 0x81, 0x9a, 0xe9, 0xcf, 0x5b, 0xb8, 0x2f, 0x2e, 0x2b, 0x0f, 0xaf, 0x10, 0x90, 0x22, 0x33, - 0x00, 0xe2, 0x87, 0x91, 0xaa, 0x0e, 0x5c, 0x5e, 0xdd, 0x89, 0xca, 0x93, 0x7e, 0x8d, 0xd0, 0x54, - 0x03, 0x41, 0xba, 0x21, 0x30, 0x98, 0x11, 0x32, 0x24, 0x3e, 0x6b, 0x5a, 0x30, 0x33, 0x00, 0x18, - 0xd4, 0x4b, 0x0e, 0x32, 0x25, 0x08, 0x21, 0xcd, 0x78, 0x6e, 0x75, 0x8d, 0xb9, 0xcb, 0x04, 0x2e, - 0x2f, 0xc6, 0x00, 0x16, 0xd6, 0xa8, 0x83, 0xab, 0x90, 0x3a, 0xc5, 0x4a, 0x33, 0x43, 0xdd, 0xae, - 0xcc, 0x53, 0x36, 0x13, 0x74, 0xd1, 0x50, 0x0b, 0x88, 0xf1, 0x78, 0x42, 0x1d, 0x5a, 0x69, 0xad, - 0x3c, 0x8d, 0x2a, 0x6c, 0x46, 0xad, 0x13, 0x69, 0x1b, 0x6b, 0xaa, 0x7d, 0x4a, 0x3b, 0x64, 0x01, - 0x01, 0x1d, 0x32, 0x0d, 0x95, 0x66, 0x2d, 0x81, 0x39, 0x57, 0x0c, 0xa9, 0x82, 0x1a, 0x80, 0x1d, - 0x09, 0x06, 0x46, 0xcc, 0x51, 0x78, 0x19, 0xab, 0x6e, 0x48, 0x5b, 0x34, 0x09, 0xf9, 0x59, 0x85, - 0xbb, 0xdc, 0xe5, 0x35, 0x55, 0x0a, 0x12, 0x0e, 0x26, 0x2e, 0x20, 0x09, 0x98, 0x83, 0x08, 0x36, - 0x95, 0x75, 0x5e, 0xb7, 0x9c, 0x7b, 0xf5, 0x39, 0x85, 0x09, 0xdb, 0xd2, 0xca, 0xa4, 0xf4, 0x60, - 0x10, 0xcb, 0x91, 0xf7, 0xef, 0x44, 0xa8, 0x0d, 0xe3, 0x49, 0x42, 0xe1, 0x03, 0x26, 0xef, 0xe4, - 0x1b, 0xc9, 0x1a, 0x7a, 0xa2, 0xd3, 0x74, 0x52, 0xa4, 0x3f, 0x8c, 0x61, 0x1d, 0x91, 0x77, 0x41, - 0x25, 0x8d, 0x7e, 0xde, 0xf0, 0xc4, 0x69, 0x43, 0x90, 0x43, 0xce, 0x03, 0x07, 0xaf, 0x27, 0x75, - 0xec, 0x8e, 0xf2, 0x7c, 0xa7, 0x96, 0xab, 0x14, 0x09, 0x4b, 0xc7, 0x2d, 0x72, 0x0b, 0x2b, 0x00, - 0x5c, 0x50, 0x62, 0x34, 0xd8, 0x9a, 0xd1, 0x3f, 0xa8, 0x86, 0xa3, 0x3d, 0xbc, 0x3d, 0x7c, 0xc0, - 0x18, 0xc6, 0x20, 0x2d, 0x1c, 0x82, 0xbc, 0xf4, 0x31, 0x90, 0x94, 0x15, 0x89, 0x00, 0x61, 0x7b, - 0x1e, 0xa5, 0xc6, 0xb8, 0xcd, 0x7c, 0x62, 0x9f, 0xec, 0xc9, 0x68, 0xd2, 0x64, 0x79, 0x45, 0x3a, - 0xa0, 0x9b, 0x27, 0x0f, 0xd1, 0xdd, 0x8d, 0xa7, 0xbb, 0x73, 0xae, 0x4a, 0x9e, 0xfb, 0xb0, 0x34, - 0x47, 0xb7, 0xdc, 0x67, 0x46, 0xe3, 0x2a, 0x83, 0x8f, 0x4c, 0x5a, 0x4a, 0xa5, 0xb1, 0xe9, 0xa1, - 0xf2, 0x39, 0xa2, 0xf2, 0xa9, 0x6d, 0x22, 0x26, 0x2d, 0x0b, 0x10, 0xe1, 0x35, 0xee, 0x28, 0xda, - 0xd4, 0x46, 0xf1, 0x86, 0xc9, 0x67, 0x4e, 0xb1, 0x5c, 0x2d, 0x71, 0x34, 0x43, 0x92, 0xa1, 0x0f, - 0xd5, 0x20, 0xa3, 0x09, 0x69, 0xf5, 0x8a, 0x78, 0xcc, 0x5f, 0x16, 0x98, 0xe3, 0x66, 0x41, 0x97, - 0xe8, 0x66, 0xa6, 0x3b, 0x37, 0x50, 0x15, 0x34, 0xe2, 0xeb, 0x53, 0x83, 0x98, 0xef, 0x98, 0x69, - 0x54, 0x6b, 0xdc, 0x2e, 0xfa, 0x3c, 0xdd, 0xb3, 0x9b, 0xee, 0x14, 0x4d, 0xd4, 0xfd, 0x3d, 0xc3, - 0x27, 0x5d, 0x01, 0x2d, 0x5e, 0x7b, 0x30, 0x62, 0x0f, 0x34, 0x98, 0x5f, 0xf6, 0xee, 0x66, 0x69, - 0x34, 0x99, 0x47, 0x24, 0x25, 0xbc, 0xeb, 0x43, 0xd0, 0xf9, 0x65, 0x74, 0xe3, 0xb7, 0x6d, 0x31, - 0xad, 0xd2, 0x72, 0xc7, 0x59, 0xdf, 0x82, 0x51, 0x63, 0x91, 0xcc, 0x17, 0xf7, 0x71, 0x68, 0x3d, - 0x00, 0x04, 0x9e, 0x34, 0x73, 0xb9, 0x28, 0x8d, 0xbf, 0x8d, 0x36, 0x70, 0xdc, 0x41, 0xe3, 0xce, - 0x8e, 0xd6, 0x83, 0xa0, 0xf4, 0x7f, 0x8c, 0xca, 0x5d, 0x50, 0x5a, 0x7f, 0x8b, 0x4a, 0x3f, 0xdc, - 0xb9, 0xf3, 0x1d, 0x48, 0xf6, 0x10, 0xa1, 0x2a, 0x6a, 0xfd, 0x5d, 0x19, 0x55, 0x8e, 0x50, 0xab, - 0xa8, 0x71, 0x8e, 0xef, 0xb8, 0x54, 0x95, 0xe7, 0xe5, 0xef, 0xe3, 0xeb, 0x77, 0xd7, 0xa7, 0xd3, - 0x71, 0xd5, 0x3f, 0x40, 0xb9, 0x86, 0x7a, 0xcd, 0x77, 0x4f, 0x44, 0x1e, 0x85, 0xd6, 0xa9, 0x6a, - 0xe8, 0xf6, 0xae, 0xbc, 0x15, 0x27, 0xe2, 0xf8, 0xb3, 0x44, 0x47, 0x41, 0x23, 0x9c, 0xef, 0x53, - 0x09, 0x03, 0x9f, 0x1b, 0xd1, 0xf5, 0xe4, 0x48, 0x06, 0xe1, 0x6d, 0xe2, 0xd5, 0x8d, 0x27, 0x57, - 0x51, 0x5d, 0x9b, 0x6f, 0xbe, 0x43, 0xf9, 0xe1, 0x96, 0xbe, 0xad, 0x27, 0x48, 0x22, 0xe1, 0x19, - 0x55, 0x7f, 0x8a, 0xfe, 0x14, 0x35, 0x95, 0x73, 0x34, 0xc3, 0xb3, 0xa1, 0x29, 0x97, 0xba, 0x3c, - 0x9a, 0x67, 0x1e, 0x5a, 0x71, 0x56, 0xce, 0xa2, 0x44, 0xaf, 0xe2, 0x23, 0x69, 0x12, 0xad, 0xf5, - 0x52, 0x8a, 0xf8, 0xdd, 0xd9, 0xf8, 0x24, 0xde, 0xd5, 0xca, 0xc7, 0x19, 0x9e, 0xc8, 0xcb, 0x60, - 0x44, 0xd3, 0x94, 0x0a, 0x2d, 0x76, 0x2b, 0x0c, 0x11, 0x0e, 0xeb, 0x45, 0x87, 0x4f, 0xa3, 0x5e, - 0x77, 0x96, 0xf7, 0xb6, 0xe4, 0xf5, 0x33, 0x2a, 0xd6, 0x72, 0x29, 0x63, 0x7f, 0x21, 0x96, 0x88, - 0x9f, 0x36, 0xb6, 0x0b, 0x7a, 0xec, 0x26, 0x46, 0xa4, 0xd2, 0xd9, 0xbd, 0x1c, 0x6d, 0x0c, 0xd8, - 0xdf, 0x8a, 0x16, 0x2e, 0xe8, 0x6a, 0x0f, 0x2a, 0x94, 0xa2, 0xe2, 0x55, 0x5b, 0x88, 0x04, 0x4f, - 0x6d, 0xd0, 0x1e, 0x76, 0xef, 0x6a, 0xf8, 0x88, 0x65, 0x25, 0x3a, 0x88, 0x9f, 0xf5, 0x4d, 0x12, - 0xbd, 0x00, 0x17, 0x5a, 0xb3, 0xc1, 0x0b, 0x0b, 0xcd, 0x4b, 0x33, 0xba, 0x05, 0x02, 0x32, 0xf0, - 0x24, 0x54, 0xd3, 0x25, 0x8b, 0x8c, 0x3b, 0x68, 0x3c, 0x6a, 0xb5, 0x93, 0x0e, 0xeb, 0xf7, 0x0e, - 0x7f, 0xed, 0xf6, 0x7b, 0xfd, 0x3e, 0x7b, 0x9d, 0x19, 0x3c, 0x5f, 0x24, 0x88, 0x74, 0x92, 0x64, - 0x6b, 0x7a, 0xfc, 0xd5, 0x7d, 0xeb, 0x0c, 0x1d, 0x0d, 0xf7, 0x6a, 0x40, 0x0f, 0xa3, 0xaa, 0xb6, - 0xfb, 0x53, 0x60, 0xcc, 0x72, 0x3d, 0x8b, 0x57, 0x78, 0xf7, 0x08, 0x13, 0x9f, 0x9d, 0xbe, 0x1e, - 0x5f, 0x4c, 0xc6, 0xdf, 0x86, 0xa0, 0x75, 0x7e, 0x3a, 0x65, 0x79, 0xa5, 0xc9, 0x3b, 0x88, 0x5e, - 0xd7, 0x18, 0x3a, 0x11, 0x06, 0x5e, 0xc1, 0x0d, 0x6b, 0xd1, 0x31, 0xc1, 0xad, 0x78, 0x88, 0xa8, - 0x86, 0x12, 0xac, 0x2c, 0x02, 0x2a, 0x5d, 0xff, 0x48, 0x63, 0xfe, 0xdd, 0x45, 0xac, 0x4f, 0x5b, - 0x2a, 0x8a, 0xa5, 0x72, 0xa1, 0xdb, 0x62, 0xf5, 0xb0, 0xfd, 0x89, 0x3b, 0x2e, 0x11, 0x46, 0xeb, - 0xa7, 0xee, 0xb8, 0x31, 0x35, 0x1e, 0x40, 0xe6, 0x19, 0xa7, 0xe1, 0xfa, 0x7b, 0x3c, 0xd4, 0x34, - 0x40, 0x74, 0xf5, 0x22, 0xe7, 0x9b, 0x17, 0xfe, 0x39, 0x4c, 0xee, 0xfa, 0x65, 0x7c, 0xd0, 0xd3, - 0x80, 0xde, 0x09, 0xf4, 0x7f, 0x9c, 0xff, 0x03, 0x7a, 0x9a, 0xfb, 0x01, 0xd7, 0x11, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48, + 0x12, 0xfe, 0xee, 0x5f, 0x31, 0x4c, 0xaa, 0x58, 0xfb, 0x56, 0x58, 0x86, 0xe4, 0xb6, 0x12, 0xb0, + 0x9c, 0x83, 0xe0, 0x6c, 0xb8, 0x82, 0x40, 0x61, 0xb3, 0xb9, 0xab, 0x5c, 0x6a, 0x6b, 0x2c, 0x8d, + 0xad, 0x89, 0x65, 0x8d, 0x76, 0x66, 0x84, 0xe3, 0xcb, 0xee, 0x7f, 0xbf, 0xa7, 0x47, 0x92, 0x5f, + 0x08, 0x49, 0x2a, 0x75, 0x1f, 0x00, 0xcd, 0x5b, 0xf7, 0xf4, 0xd3, 0xdd, 0x4f, 0xf7, 0xd0, 0xdf, + 0x3b, 0xbf, 0x7e, 0x35, 0xfe, 0xf7, 0xcd, 0x90, 0xa5, 0x6e, 0x91, 0x0d, 0xfa, 0xf4, 0x9b, 0x65, + 0x22, 0x9f, 0x45, 0x5c, 0xe6, 0x1c, 0x63, 0x29, 0x92, 0x41, 0x7f, 0x21, 0x9d, 0x60, 0xb9, 0x58, + 0xc8, 0x88, 0xdf, 0x2b, 0xb9, 0x2c, 0xb4, 0x71, 0x9c, 0xc5, 0x3a, 0x77, 0x32, 0x77, 0x11, 0x5f, + 0xaa, 0xc4, 0xa5, 0xd1, 0xdf, 0x7b, 0x3d, 0x3e, 0x68, 0x55, 0x5b, 0x5b, 0x0f, 0xd6, 0x12, 0x79, + 0xaf, 0x62, 0x79, 0xe0, 0x07, 0x81, 0xca, 0x95, 0x53, 0x22, 0x3b, 0xb0, 0xb1, 0xc8, 0x64, 0x74, + 0x18, 0x2c, 0xc4, 0x27, 0xb5, 0x28, 0x17, 0xeb, 0x71, 0x69, 0xa5, 0xf1, 0x03, 0x31, 0xc1, 0x38, + 0xd7, 0x9c, 0xb5, 0x1e, 0xa8, 0xae, 0x2f, 0x14, 0xa7, 0xc2, 0x58, 0x09, 0x25, 0xa5, 0x9b, 0x1e, + 0x3c, 0xc7, 0xac, 0x53, 0x2e, 0x93, 0x83, 0x2b, 0x65, 0x63, 0x36, 0x92, 0xce, 0xa9, 0x7c, 0x66, + 0xfb, 0x61, 0x35, 0xd9, 0xb7, 0xb1, 0x51, 0x85, 0x1b, 0xb4, 0xee, 0x85, 0x61, 0x99, 0x8e, 0x55, + 0x11, 0x38, 0xb5, 0x90, 0xba, 0x74, 0x41, 0x12, 0x25, 0x3a, 0x2e, 0x17, 0xb8, 0x6e, 0x80, 0x85, + 0x68, 0xef, 0xf0, 0x64, 0x5a, 0xe6, 0xb1, 0x53, 0x3a, 0x67, 0x6f, 0xda, 0x9d, 0xcf, 0x4b, 0x95, + 0x27, 0x7a, 0xd9, 0xd5, 0x85, 0xcc, 0xdb, 0x3c, 0x75, 0xae, 0xb0, 0xc7, 0x61, 0x38, 0xcf, 0x75, + 0x77, 0x99, 0xc9, 0xa4, 0x3b, 0x93, 0xe1, 0x54, 0x0a, 0x57, 0x1a, 0x69, 0x43, 0x5b, 0xeb, 0x0c, + 0x9f, 0x58, 0x19, 0x97, 0x46, 0xb9, 0xd5, 0x41, 0x33, 0xc5, 0x3b, 0x7f, 0xad, 0x85, 0x9e, 0x3d, + 0x14, 0xba, 0x3e, 0xc8, 0x03, 0xfe, 0xbb, 0x95, 0xd9, 0x74, 0x7b, 0xf7, 0xdd, 0x17, 0xbb, 0xcb, + 0x22, 0x11, 0x4e, 0x3e, 0xb6, 0x77, 0x76, 0x91, 0xb4, 0x65, 0xe7, 0xb3, 0x91, 0xb8, 0x4f, 0xce, + 0xe8, 0x72, 0x6e, 0x98, 0x49, 0xb2, 0xec, 0x6c, 0xe5, 0x97, 0x36, 0x5b, 0x95, 0xbd, 0x9e, 0x7c, + 0xdc, 0xda, 0x2c, 0xf7, 0xf7, 0xb9, 0x9e, 0x7c, 0x94, 0xb1, 0xe3, 0x51, 0xe4, 0x56, 0x85, 0xd4, + 0x53, 0x9a, 0xdb, 0x3b, 0x35, 0x46, 0xac, 0xba, 0xca, 0xfa, 0xbf, 0x3b, 0x12, 0x32, 0x2d, 0x92, + 0x7f, 0x8e, 0xda, 0x32, 0x70, 0xd1, 0x5e, 0xaf, 0xf3, 0x39, 0x93, 0x8e, 0xe9, 0x28, 0xe9, 0xc6, + 0x06, 0x70, 0xc8, 0x5a, 0x6d, 0x9b, 0x57, 0xb0, 0xf3, 0xce, 0x89, 0xee, 0xc2, 0xca, 0x53, 0xe7, + 0x8c, 0x9a, 0x94, 0x4e, 0x62, 0xc1, 0xc4, 0x3c, 0x90, 0x9d, 0xe0, 0xe1, 0x3c, 0xe9, 0x86, 0x6d, + 0x4e, 0x7e, 0x72, 0xe1, 0x47, 0x71, 0x2f, 0x1a, 0x01, 0x5f, 0x6c, 0x14, 0x76, 0x95, 0x43, 0x84, + 0xeb, 0x04, 0x49, 0x77, 0xa2, 0x93, 0x55, 0x57, 0x14, 0xc0, 0x27, 0x79, 0x95, 0xaa, 0x2c, 0x69, + 0x6b, 0xda, 0x2f, 0x92, 0x64, 0x78, 0x8f, 0x5b, 0x5c, 0x2a, 0x8b, 0x60, 0x94, 0xa6, 0xcd, 0xe9, + 0xce, 0x3c, 0x68, 0x77, 0xa2, 0xc1, 0xe7, 0x5f, 0xa5, 0xfb, 0xad, 0xdd, 0xf9, 0xeb, 0xf1, 0x7d, + 0xd2, 0x18, 0x6d, 0x70, 0x3d, 0xec, 0x43, 0x24, 0x5b, 0x9d, 0xc9, 0x6e, 0xa6, 0x67, 0x6d, 0x3e, + 0xa4, 0x79, 0x56, 0x1b, 0x0f, 0x8f, 0xb1, 0xa9, 0xca, 0xa4, 0x37, 0x03, 0xa1, 0x6b, 0x60, 0xee, + 0x65, 0x3d, 0x0f, 0xf4, 0x70, 0x70, 0xaa, 0x66, 0xa5, 0x11, 0x1e, 0xad, 0xca, 0x0c, 0x36, 0x15, + 0x8a, 0xa2, 0xe6, 0x3f, 0xf9, 0x45, 0x1e, 0xeb, 0x45, 0x01, 0xd0, 0x24, 0x2b, 0xc4, 0x4c, 0x32, + 0xb8, 0x54, 0xec, 0xc1, 0x97, 0x5b, 0x00, 0xdb, 0x54, 0x2f, 0xc7, 0x5a, 0x58, 0x57, 0x61, 0x7c, + 0xd8, 0xf9, 0x4c, 0xb1, 0xab, 0x23, 0xf2, 0x32, 0x77, 0xb4, 0xe0, 0x61, 0x55, 0x39, 0xae, 0xfc, + 0x66, 0x7c, 0x75, 0x19, 0x49, 0xd8, 0x12, 0x67, 0xc2, 0x5a, 0x32, 0x84, 0xac, 0x6a, 0xbb, 0x97, + 0xb5, 0x29, 0xc7, 0x9c, 0xa4, 0x01, 0xc5, 0x38, 0x93, 0xc2, 0x8c, 0xab, 0xc8, 0x6f, 0xd7, 0x19, + 0xe0, 0xb1, 0x75, 0x2b, 0x18, 0x29, 0x72, 0xb5, 0xf0, 0xf7, 0x8d, 0x78, 0xae, 0x73, 0x58, 0x56, + 0xef, 0x88, 0x00, 0x7d, 0x73, 0xa8, 0xdd, 0x5c, 0x10, 0x81, 0xb9, 0xad, 0xcf, 0xc8, 0x85, 0xbe, + 0x27, 0xc7, 0x7a, 0x45, 0x00, 0xf6, 0xe8, 0x45, 0xaf, 0xb7, 0x65, 0x4e, 0x59, 0x10, 0x68, 0xaf, + 0x61, 0x3f, 0xd9, 0xd3, 0x18, 0x93, 0xcb, 0x25, 0xfb, 0xd7, 0xd5, 0xe5, 0x1b, 0xe4, 0xd5, 0xad, + 0xfc, 0xa3, 0x94, 0xd6, 0x9d, 0x7c, 0xc3, 0x71, 0x5b, 0xaa, 0x37, 0xe8, 0xb8, 0x54, 0x59, 0x68, + 0xb7, 0x05, 0x3c, 0x25, 0xc7, 0x88, 0x9b, 0xc0, 0xcf, 0x58, 0x87, 0xb4, 0xb4, 0x83, 0xe8, 0x19, + 0xdd, 0xa2, 0xf3, 0x4d, 0x3f, 0x6f, 0xe4, 0xca, 0x6d, 0xc1, 0x92, 0x64, 0xc4, 0xf3, 0x60, 0xaf, + 0x11, 0x50, 0x25, 0xe0, 0xcd, 0xf5, 0x68, 0x8c, 0x08, 0x0d, 0x2b, 0x83, 0xe0, 0x03, 0xb2, 0x24, + 0xf7, 0x96, 0xbc, 0xd6, 0x66, 0x71, 0x0e, 0x4f, 0x9e, 0xd4, 0x59, 0x95, 0xd7, 0x41, 0xd9, 0xe6, + 0xe4, 0x5f, 0x04, 0x4a, 0x97, 0x02, 0xc6, 0xbe, 0xef, 0x7d, 0x08, 0x2a, 0xd4, 0x69, 0x2d, 0xef, + 0x60, 0xfe, 0x5e, 0x64, 0x25, 0x28, 0x8e, 0x07, 0x7b, 0x87, 0x1b, 0xc8, 0xe2, 0x54, 0xc6, 0xf3, + 0xb7, 0xe5, 0x62, 0x93, 0xa7, 0x7b, 0xed, 0x3d, 0x49, 0x26, 0x74, 0xe7, 0x72, 0xd5, 0x85, 0xab, + 0xe2, 0xb4, 0x1d, 0xbe, 0xef, 0x1d, 0xbc, 0xf8, 0x10, 0x76, 0x90, 0xac, 0xef, 0xf9, 0x19, 0xee, + 0x6b, 0x0b, 0x11, 0x53, 0x0a, 0x8d, 0xc5, 0x04, 0xbf, 0x87, 0x20, 0x62, 0x98, 0xc8, 0x47, 0xa9, + 0x9a, 0x3a, 0xfc, 0x7d, 0x05, 0x66, 0x36, 0x3a, 0xc3, 0xd7, 0x69, 0x46, 0xe3, 0x1b, 0x01, 0xbe, + 0xa5, 0x79, 0x51, 0xd8, 0x4b, 0x1d, 0xcf, 0xe9, 0x08, 0xc8, 0xd7, 0x27, 0xe1, 0xa8, 0x96, 0x74, + 0x83, 0x08, 0xbd, 0x2b, 0xea, 0x8f, 0x73, 0xbd, 0xcc, 0xbd, 0x5c, 0x38, 0x84, 0xbf, 0xd1, 0x0b, + 0xda, 0x00, 0x76, 0xd0, 0xcb, 0x4b, 0xe9, 0x15, 0xf8, 0x6f, 0xbf, 0xdb, 0x7f, 0xdd, 0xaa, 0x59, + 0xba, 0x9e, 0xae, 0xcf, 0x5e, 0xc0, 0x51, 0x86, 0x26, 0xcf, 0x25, 0x65, 0x00, 0xff, 0x80, 0x20, + 0x8e, 0xb3, 0x32, 0x91, 0xb6, 0xbd, 0xb6, 0xae, 0xd3, 0xf9, 0xf3, 0xcf, 0x7a, 0x54, 0x18, 0xff, + 0xf7, 0x5c, 0x4e, 0x45, 0x99, 0xb9, 0x76, 0x07, 0x18, 0x6d, 0xc5, 0xd5, 0x08, 0xc1, 0xc0, 0x09, + 0xd6, 0x63, 0x30, 0x57, 0xcd, 0x94, 0xe0, 0x71, 0x1f, 0xc6, 0x38, 0xaa, 0x9d, 0x8e, 0x75, 0xb6, + 0xbf, 0xdf, 0xf6, 0xdc, 0xde, 0x0b, 0xda, 0x9e, 0xfc, 0x23, 0xda, 0x91, 0x8d, 0x9c, 0x36, 0xb0, + 0x88, 0x78, 0xf2, 0xc2, 0xc9, 0x05, 0x85, 0x59, 0x7c, 0x51, 0x70, 0xaf, 0xba, 0xda, 0x86, 0xf3, + 0x8b, 0x02, 0x79, 0x4d, 0x61, 0xcb, 0xae, 0x74, 0x22, 0xbb, 0xec, 0x06, 0x19, 0x64, 0x25, 0x93, + 0x84, 0x2b, 0x7b, 0x77, 0x39, 0x3c, 0x67, 0x17, 0x37, 0xc8, 0xdc, 0x60, 0x47, 0xa2, 0xdd, 0x95, + 0x18, 0x78, 0x69, 0x9d, 0x0e, 0xed, 0xf2, 0xac, 0x49, 0xe2, 0x5f, 0xfa, 0x6a, 0x82, 0x62, 0xc2, + 0x7f, 0xf6, 0xcb, 0xc7, 0x9c, 0x77, 0x7e, 0xde, 0x14, 0x83, 0xd0, 0x76, 0x3f, 0xda, 0x97, 0x45, + 0xf4, 0x0b, 0xf7, 0xf6, 0xb6, 0xfa, 0x61, 0x5d, 0xc2, 0xfa, 0x3e, 0x57, 0x07, 0xff, 0x50, 0x0b, + 0x2a, 0x86, 0xac, 0x34, 0x19, 0x92, 0xce, 0xa7, 0x6f, 0x6c, 0x51, 0x68, 0x4e, 0xb0, 0xd1, 0x6f, + 0xe8, 0x87, 0x55, 0xf1, 0x26, 0x72, 0x04, 0x67, 0x91, 0xe6, 0x88, 0x03, 0x2d, 0x14, 0xca, 0x29, + 0xe2, 0xb4, 0xc5, 0x14, 0xc6, 0xf4, 0xf5, 0xbb, 0xe5, 0x75, 0x71, 0x1f, 0x4d, 0x39, 0x43, 0x69, + 0x4d, 0x35, 0x56, 0x0a, 0x6d, 0xa9, 0xd2, 0x26, 0xea, 0x9e, 0xf9, 0x24, 0x8f, 0xc0, 0x39, 0x80, + 0x63, 0xb9, 0x3b, 0x97, 0xca, 0xac, 0x38, 0xa3, 0xba, 0x0f, 0x52, 0x76, 0xf0, 0x06, 0xd1, 0x77, + 0xc4, 0xab, 0x01, 0x87, 0xd6, 0x38, 0x53, 0xf1, 0x3c, 0xe2, 0x6f, 0x48, 0xed, 0xcb, 0x7e, 0x58, + 0x2d, 0xe0, 0x6a, 0x10, 0x31, 0x78, 0xfc, 0x4c, 0x6b, 0x7d, 0xe8, 0x8c, 0x0e, 0x51, 0x44, 0x6f, + 0xce, 0xed, 0x9c, 0xb0, 0xe5, 0x64, 0xa1, 0x70, 0xc7, 0x91, 0xb8, 0x97, 0x9b, 0x2d, 0xa9, 0x69, + 0xc4, 0xa7, 0x47, 0x83, 0xd6, 0xa8, 0xae, 0xc4, 0x6c, 0x9f, 0xdd, 0xf9, 0xba, 0xc9, 0x80, 0x6f, + 0x59, 0x00, 0x9b, 0xa3, 0x41, 0xd3, 0x23, 0xb0, 0x9b, 0x8b, 0xb7, 0xc7, 0xac, 0xaf, 0xf2, 0xa2, + 0x74, 0xb5, 0xe8, 0x02, 0xc6, 0x2d, 0xb5, 0x49, 0xb8, 0x07, 0x09, 0xeb, 0xeb, 0x26, 0xc4, 0x7f, + 0x5b, 0xf5, 0x5f, 0x7c, 0x3e, 0x03, 0x58, 0xe2, 0x53, 0x26, 0xf3, 0x19, 0x5a, 0x1c, 0x3f, 0x52, + 0xf9, 0xd6, 0x48, 0xe7, 0x08, 0x63, 0x44, 0x23, 0xc8, 0x74, 0x9d, 0xc8, 0xc4, 0x4c, 0x1d, 0xc8, + 0x2a, 0x84, 0x43, 0xf8, 0x60, 0xc5, 0x27, 0xef, 0xdf, 0xa0, 0x86, 0x94, 0x2f, 0x10, 0x60, 0x60, + 0x5e, 0xf4, 0x22, 0x46, 0xc5, 0x9c, 0xf9, 0xce, 0x05, 0x1a, 0xb7, 0x03, 0x4e, 0xb0, 0x67, 0x2c, + 0x51, 0x33, 0xe5, 0x18, 0xb6, 0x4d, 0x90, 0xd9, 0xc0, 0xc4, 0x00, 0x7e, 0x72, 0x89, 0x77, 0x3b, + 0x94, 0xe9, 0x4c, 0x9b, 0xe3, 0x27, 0x53, 0x41, 0xfd, 0xd8, 0xfe, 0x93, 0x17, 0xcf, 0x9f, 0x3f, + 0x3f, 0x61, 0x77, 0xb9, 0xcc, 0x63, 0xb3, 0x2a, 0x9c, 0x4c, 0x98, 0x33, 0x22, 0xb7, 0x0b, 0x65, + 0x2d, 0x65, 0x08, 0x3b, 0x43, 0x05, 0x32, 0xc8, 0xbd, 0xdc, 0xb1, 0x65, 0x2a, 0x51, 0x76, 0x90, + 0x93, 0x31, 0xe1, 0x42, 0xb0, 0x04, 0x2c, 0xd1, 0xec, 0xed, 0xf5, 0x98, 0x81, 0x24, 0xd8, 0x4a, + 0x97, 0x86, 0x4d, 0x44, 0x3e, 0xc7, 0x22, 0x2d, 0x68, 0x13, 0xb0, 0xd1, 0xc5, 0x55, 0xc0, 0xa4, + 0x8b, 0xbb, 0xac, 0x50, 0xf9, 0x5e, 0xab, 0x71, 0xac, 0xf1, 0x3f, 0xc4, 0x27, 0x6c, 0xa9, 0x0c, + 0x24, 0x5a, 0xcb, 0xda, 0xd7, 0xe3, 0xd3, 0x0e, 0xb3, 0x7a, 0xea, 0x96, 0xc2, 0x48, 0x56, 0xb5, + 0x31, 0x0f, 0x70, 0xf7, 0x40, 0x4d, 0xf4, 0xa7, 0x35, 0xdc, 0x6f, 0xaf, 0x2b, 0x0b, 0x6f, 0xe0, + 0x90, 0x22, 0x35, 0x00, 0xe2, 0xab, 0x9e, 0xaa, 0x0e, 0x5c, 0xdf, 0xec, 0x78, 0xe5, 0xe9, 0x51, + 0x8d, 0xd0, 0x58, 0x03, 0x41, 0xea, 0x28, 0x19, 0xae, 0x11, 0x30, 0xc4, 0x3d, 0x6b, 0xba, 0x34, + 0x86, 0x96, 0xc5, 0xa2, 0x78, 0x90, 0x81, 0x2c, 0x97, 0x84, 0x90, 0x66, 0x22, 0xb3, 0xba, 0xc6, + 0xdc, 0xa5, 0x12, 0xd5, 0xdc, 0x18, 0xc0, 0xc2, 0x1a, 0x75, 0x30, 0x15, 0x52, 0xc7, 0xa9, 0x5c, + 0xcf, 0x50, 0xbd, 0x2e, 0xb3, 0x84, 0x4d, 0x24, 0x35, 0xa6, 0xf9, 0x0c, 0x62, 0x3c, 0x9e, 0x50, + 0x87, 0x6e, 0xab, 0x56, 0x9e, 0x74, 0x2b, 0x6c, 0x06, 0xad, 0x73, 0x65, 0x9b, 0xdb, 0x54, 0xfb, + 0x72, 0xed, 0x10, 0x05, 0x04, 0x74, 0xc0, 0x34, 0x54, 0x9a, 0xa5, 0x02, 0xe6, 0x22, 0x67, 0x08, + 0x15, 0xe4, 0x00, 0xee, 0x11, 0x63, 0x60, 0xe4, 0x14, 0x89, 0x97, 0xb2, 0xaa, 0xa3, 0x5e, 0xa3, + 0x49, 0xc8, 0x4f, 0x2a, 0xdc, 0xd5, 0x26, 0xae, 0x29, 0x53, 0x10, 0x70, 0x55, 0x87, 0x41, 0x98, + 0x83, 0x05, 0x56, 0xd5, 0xed, 0xbc, 0x6e, 0x35, 0xf5, 0xea, 0x33, 0x72, 0x13, 0xb6, 0x25, 0xd5, + 0x95, 0x92, 0xbd, 0x7e, 0xa8, 0x06, 0xde, 0xbe, 0x73, 0x99, 0xaf, 0x98, 0x88, 0x63, 0x72, 0x1f, + 0x30, 0x79, 0xa7, 0x5e, 0x2b, 0xd6, 0xf0, 0x13, 0x9d, 0xa6, 0x93, 0x32, 0xf9, 0xaa, 0x0f, 0x6b, + 0x8f, 0xbc, 0xe3, 0x95, 0x34, 0xfa, 0x79, 0x2d, 0x62, 0x50, 0x24, 0x41, 0x0e, 0x39, 0xdf, 0x39, + 0x78, 0x3b, 0xaa, 0x7d, 0x77, 0x9a, 0x65, 0x1b, 0xb5, 0x22, 0x4f, 0x10, 0xb0, 0x74, 0xdc, 0x22, + 0xb6, 0xb0, 0x02, 0xc0, 0x25, 0x05, 0x46, 0x83, 0xad, 0x19, 0xfc, 0x1f, 0xd9, 0x70, 0xba, 0x85, + 0xb7, 0x87, 0x0f, 0x18, 0xe3, 0x32, 0x08, 0x0b, 0x07, 0x27, 0xcf, 0xbd, 0x0f, 0x14, 0x45, 0x45, + 0x2c, 0xa9, 0x9d, 0x03, 0x7b, 0x56, 0xad, 0x5b, 0x13, 0xf9, 0xc4, 0x3e, 0xe9, 0xd3, 0xc1, 0xa8, + 0x89, 0xf2, 0x8a, 0x74, 0x40, 0x37, 0x4f, 0x07, 0xdf, 0xa1, 0xc8, 0x3b, 0x62, 0xbb, 0xd6, 0x95, + 0xc8, 0x4b, 0x91, 0x79, 0xb7, 0x34, 0x47, 0xd7, 0xdc, 0x67, 0x06, 0xc3, 0x2a, 0x82, 0x4f, 0x4d, + 0x52, 0xaa, 0x5c, 0x63, 0xd3, 0xf7, 0xd2, 0xe7, 0x94, 0xd2, 0xa7, 0xbe, 0x13, 0x31, 0x69, 0x59, + 0x80, 0x08, 0x6f, 0xd1, 0x65, 0x69, 0x53, 0x5f, 0x4a, 0x34, 0x4c, 0x3e, 0x71, 0x68, 0x6b, 0xf3, + 0x39, 0x8e, 0xa6, 0x08, 0xb2, 0x88, 0x87, 0x35, 0xc8, 0xa8, 0x42, 0x3a, 0x7f, 0x49, 0x3c, 0xe6, + 0xdb, 0x1d, 0xe6, 0x84, 0x99, 0xd1, 0xa3, 0xab, 0x99, 0x39, 0x98, 0x1a, 0xa8, 0xe2, 0x8d, 0xf8, + 0xfa, 0x54, 0x3f, 0x14, 0x1b, 0x66, 0x1a, 0xd4, 0x1a, 0xd7, 0x8b, 0x3e, 0x4e, 0xb7, 0xee, 0xed, + 0xdb, 0xe8, 0xda, 0xeb, 0xbe, 0x53, 0xf2, 0x41, 0x57, 0x40, 0x8b, 0xd7, 0xce, 0x07, 0xac, 0x01, + 0xaf, 0xf5, 0x38, 0x7a, 0x3f, 0x6d, 0x75, 0x97, 0x49, 0x77, 0x34, 0xed, 0x92, 0x94, 0x60, 0xd7, + 0x06, 0xde, 0xf9, 0x69, 0x70, 0xe7, 0xb7, 0xad, 0x31, 0xad, 0xc2, 0x72, 0xc3, 0x59, 0x5f, 0x82, + 0x51, 0x63, 0x11, 0x4f, 0x67, 0x0f, 0x71, 0x68, 0x7d, 0x07, 0x88, 0x9d, 0xfe, 0xbf, 0x81, 0x63, + 0x07, 0x8d, 0x9d, 0x1d, 0xad, 0xef, 0x82, 0x72, 0xf4, 0x75, 0x54, 0xbe, 0x52, 0x41, 0x1f, 0x45, + 0xe5, 0x28, 0xd8, 0x98, 0xf3, 0x08, 0x24, 0x5b, 0x88, 0x50, 0x16, 0xb5, 0xbe, 0x95, 0x46, 0x95, + 0x21, 0x54, 0x2a, 0x6a, 0x9c, 0xc3, 0xdd, 0x47, 0x8f, 0x4f, 0xcf, 0xeb, 0xdf, 0x86, 0xb7, 0xef, + 0x6e, 0x2f, 0xc6, 0xc3, 0xaa, 0x7e, 0x80, 0x72, 0x0d, 0xd5, 0x9a, 0x47, 0x4f, 0x74, 0x3d, 0x0a, + 0x2d, 0x7a, 0x1c, 0x55, 0x74, 0xbb, 0x2b, 0x6f, 0x21, 0x88, 0x38, 0xfe, 0x28, 0x51, 0x51, 0x50, + 0x08, 0xa7, 0xdb, 0x54, 0xc2, 0xc0, 0xe7, 0x46, 0x1e, 0x78, 0x72, 0xac, 0x1f, 0x60, 0x5e, 0xdd, + 0x70, 0x74, 0xd3, 0xad, 0x73, 0xf3, 0xf5, 0x23, 0x94, 0x1f, 0xac, 0xe9, 0xdb, 0x7a, 0x82, 0x24, + 0x12, 0x9e, 0x50, 0xf6, 0x27, 0xa8, 0x4f, 0xdd, 0x26, 0x73, 0x4e, 0x27, 0x78, 0xf8, 0x34, 0xe9, + 0x52, 0xa7, 0x47, 0xf3, 0x9f, 0x00, 0x94, 0xe2, 0xb4, 0x9c, 0x74, 0xf1, 0x9a, 0x0b, 0x4f, 0x95, + 0x89, 0xb5, 0xd6, 0x73, 0x25, 0x43, 0xea, 0x0b, 0xc3, 0x4d, 0xae, 0xfc, 0x3e, 0xc9, 0x50, 0x36, + 0xf9, 0x80, 0xa6, 0x29, 0x14, 0x5a, 0xec, 0x5e, 0x1a, 0x22, 0x1c, 0xd6, 0xeb, 0x1e, 0x3e, 0xeb, + 0xf6, 0x0e, 0x26, 0x59, 0x6f, 0x4d, 0x5e, 0x3f, 0xa2, 0x62, 0xa9, 0xe6, 0x2a, 0xf4, 0x2d, 0x3d, + 0xbd, 0x8a, 0xb5, 0xb1, 0x07, 0xa0, 0xc7, 0x03, 0xbc, 0xc1, 0x13, 0xe5, 0xec, 0x56, 0x8c, 0x36, + 0x17, 0xd8, 0xde, 0x8a, 0x12, 0x2e, 0xe9, 0x71, 0x02, 0x2a, 0x54, 0xb2, 0xe2, 0x55, 0x5b, 0xc8, + 0x58, 0x81, 0x7e, 0x1c, 0x4a, 0xc4, 0x7c, 0x93, 0xc3, 0xa7, 0x2c, 0x2d, 0x51, 0x41, 0xfc, 0xac, + 0x2f, 0x92, 0xa8, 0x05, 0x68, 0xc9, 0xcd, 0x0a, 0x6f, 0x44, 0x14, 0x2f, 0xcd, 0xa8, 0x0b, 0x04, + 0x64, 0xe0, 0xc9, 0xea, 0xf9, 0xef, 0xfb, 0xe2, 0xbd, 0xc6, 0xa2, 0x56, 0x3b, 0xee, 0xb0, 0xa3, + 0xde, 0xe1, 0x2f, 0x07, 0x47, 0xbd, 0xa3, 0x23, 0xf6, 0x2a, 0x35, 0x78, 0x80, 0x29, 0x10, 0xe9, + 0x28, 0x4e, 0x97, 0xf4, 0x7c, 0xad, 0xeb, 0xd6, 0x25, 0x2a, 0x1a, 0x5e, 0x06, 0x80, 0x1e, 0x97, + 0xaa, 0xca, 0xee, 0x0f, 0x81, 0x31, 0xc9, 0xf4, 0x24, 0x5c, 0xe0, 0xe5, 0x26, 0x4d, 0x78, 0x79, + 0xf1, 0x6a, 0xf8, 0x76, 0x34, 0xfc, 0xd2, 0x05, 0xad, 0xab, 0x8b, 0x31, 0xcb, 0x2a, 0x4d, 0xde, + 0x40, 0xd4, 0xba, 0xe6, 0xa2, 0x23, 0x69, 0x60, 0x15, 0xcc, 0xb0, 0x16, 0x15, 0x13, 0xdc, 0x8a, + 0xa7, 0x54, 0xde, 0x50, 0x82, 0x55, 0x05, 0xa7, 0xd4, 0xf5, 0xcf, 0x4c, 0xe6, 0x5f, 0x8e, 0xc4, + 0xfa, 0xb4, 0xa5, 0xa2, 0x58, 0x4a, 0x17, 0xea, 0x16, 0xab, 0xa7, 0xf9, 0x37, 0x7b, 0xdc, 0x2f, + 0x5b, 0xdc, 0xd6, 0x0f, 0xf5, 0xb8, 0x21, 0x15, 0x1e, 0x40, 0xe6, 0x19, 0xa7, 0xe1, 0xfa, 0x07, + 0x3c, 0xd4, 0x14, 0x40, 0x54, 0xf5, 0x22, 0x13, 0xab, 0x63, 0xff, 0xa0, 0x27, 0x73, 0xfd, 0x32, + 0x3e, 0xe8, 0x5d, 0x40, 0x8f, 0x04, 0xfa, 0xbf, 0xdf, 0xff, 0x00, 0x76, 0x9c, 0x87, 0xd9, 0x07, + 0x14, 0x00, 0x00 }; // Autogenerated from wled00/data/settings_um.htm, do not edit!! -const uint16_t PAGE_settings_um_length = 2213; +const uint16_t PAGE_settings_um_length = 2230; const uint8_t PAGE_settings_um[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6b, 0x53, 0xe3, 0x3a, - 0x12, 0xfd, 0xce, 0xaf, 0x30, 0x1a, 0x0a, 0xec, 0x8a, 0x71, 0xc2, 0xb0, 0x77, 0x97, 0x49, 0xa2, - 0xb0, 0xc3, 0x3c, 0x76, 0xd8, 0x9a, 0x19, 0xa8, 0x62, 0xee, 0xdd, 0xda, 0x62, 0xa9, 0x8b, 0xb1, - 0x95, 0x44, 0x83, 0x23, 0xb9, 0x24, 0x99, 0xc7, 0x86, 0xfc, 0xf7, 0x3d, 0x2d, 0xdb, 0x21, 0x61, - 0x60, 0xee, 0x6e, 0xed, 0x17, 0xc0, 0x72, 0xab, 0xdd, 0x3a, 0xdd, 0x7d, 0xfa, 0x88, 0xe1, 0xe6, - 0xfb, 0x93, 0x77, 0xdf, 0xfe, 0x79, 0xfa, 0x21, 0x98, 0xba, 0x59, 0x31, 0x1a, 0x36, 0x3f, 0x45, - 0x9a, 0x07, 0x45, 0xaa, 0x26, 0x9c, 0x09, 0xc5, 0x46, 0xc3, 0x99, 0x70, 0x69, 0x90, 0x4d, 0x53, - 0x63, 0x85, 0xe3, 0xac, 0x72, 0xe3, 0xdd, 0x83, 0x76, 0x75, 0x43, 0xa5, 0x33, 0xc1, 0xd9, 0x8d, - 0x14, 0xb7, 0xa5, 0x36, 0x8e, 0x05, 0x99, 0x56, 0x4e, 0x28, 0x98, 0xdd, 0xca, 0xdc, 0x4d, 0xf9, - 0x2f, 0xbd, 0xde, 0xd2, 0xf4, 0xc9, 0xab, 0x5c, 0xdc, 0xc8, 0x4c, 0xec, 0xfa, 0x87, 0x58, 0x2a, - 0xe9, 0x64, 0x5a, 0xec, 0xda, 0x2c, 0x2d, 0x04, 0xdf, 0x8b, 0x67, 0xe9, 0x9d, 0x9c, 0x55, 0xb3, - 0xe5, 0x73, 0x65, 0x85, 0xf1, 0x0f, 0xe9, 0x15, 0x9e, 0x95, 0x66, 0x3f, 0x7c, 0x79, 0x34, 0x74, - 0xd2, 0x15, 0x62, 0xf4, 0x2b, 0x2c, 0x67, 0x3a, 0x0f, 0xce, 0x84, 0x73, 0x52, 0x4d, 0xec, 0xb0, - 0x5b, 0xaf, 0x0f, 0x6d, 0x66, 0x64, 0xe9, 0x46, 0x1b, 0x37, 0xa9, 0x09, 0xf4, 0xad, 0x12, 0x26, - 0x2e, 0x74, 0x26, 0xcb, 0xb8, 0x32, 0xfa, 0xd6, 0xc6, 0x39, 0xcf, 0x75, 0x56, 0xcd, 0x10, 0x5f, - 0x5c, 0xcd, 0xde, 0x8d, 0x27, 0x7c, 0xbe, 0x88, 0x4b, 0xa9, 0x2c, 0x3f, 0xff, 0x73, 0xfc, 0x97, - 0xf8, 0x20, 0x7e, 0x13, 0xef, 0xf5, 0xe2, 0xbd, 0xbd, 0x0b, 0x5a, 0x3c, 0xe1, 0xe7, 0xcc, 0xd8, - 0x9b, 0x9c, 0xc5, 0x7f, 0xfc, 0xeb, 0x82, 0xbe, 0xc2, 0x37, 0xf7, 0x62, 0x55, 0xcd, 0xbe, 0xf0, - 0xde, 0x60, 0x5c, 0xa9, 0xcc, 0x49, 0xad, 0x82, 0xc9, 0x71, 0x1e, 0x8a, 0x68, 0x6e, 0x84, 0xab, - 0x8c, 0x0a, 0xf2, 0x64, 0x22, 0xdc, 0x87, 0x42, 0x50, 0x00, 0x47, 0xf7, 0xfe, 0xd5, 0x62, 0x69, - 0x2a, 0xed, 0xc9, 0x8a, 0xa9, 0xd8, 0xde, 0x66, 0xfa, 0xea, 0xbb, 0xc8, 0x1c, 0xe3, 0xdc, 0xdd, - 0x97, 0x42, 0x8f, 0x69, 0x6d, 0xf3, 0xad, 0x31, 0xe9, 0x7d, 0x22, 0xad, 0xff, 0xbd, 0xb6, 0xff, - 0x53, 0x18, 0xcd, 0x6f, 0xa5, 0xca, 0xf5, 0x6d, 0xa2, 0x4b, 0xa1, 0x42, 0x36, 0x75, 0xae, 0xb4, - 0xfd, 0x6e, 0x77, 0x22, 0xdd, 0xb4, 0xba, 0x4a, 0x32, 0x3d, 0xeb, 0xbe, 0x95, 0x26, 0xd3, 0x5a, - 0x5f, 0x4b, 0xd1, 0xfd, 0xc7, 0xe7, 0x0f, 0xef, 0xbb, 0xb7, 0xf2, 0x5a, 0x76, 0x5b, 0x0c, 0x5f, - 0x55, 0x35, 0xa8, 0xbb, 0xb6, 0x59, 0x60, 0x2b, 0xde, 0x8f, 0x9e, 0x7a, 0xef, 0x2e, 0xad, 0x62, - 0xf6, 0xbb, 0x15, 0xc5, 0x78, 0xd5, 0xba, 0xd0, 0x69, 0xfe, 0xf7, 0xb3, 0x50, 0xc4, 0x8e, 0x6f, - 0xf6, 0xa2, 0x79, 0x21, 0x5c, 0xa0, 0x78, 0x9e, 0x64, 0x46, 0xa4, 0x4e, 0x34, 0x00, 0x84, 0xac, - 0xce, 0x15, 0x8b, 0x06, 0x2a, 0x81, 0xb3, 0xb7, 0xce, 0x19, 0x79, 0x55, 0x39, 0x81, 0x17, 0x26, - 0x63, 0xb1, 0x88, 0xe2, 0xa7, 0xeb, 0x84, 0x03, 0x3e, 0xe7, 0xc4, 0x9d, 0xeb, 0x7e, 0x4f, 0x6f, - 0xd2, 0xd6, 0xc1, 0x0f, 0x86, 0xa9, 0xbd, 0x57, 0x70, 0xe1, 0xa2, 0x38, 0x4f, 0xae, 0x74, 0x7e, - 0x9f, 0xa4, 0x25, 0x82, 0xce, 0xdf, 0x4d, 0x65, 0x91, 0x87, 0x8a, 0xec, 0xd3, 0x3c, 0xff, 0x70, - 0x83, 0x28, 0x3e, 0x4b, 0x8b, 0x72, 0x15, 0x26, 0x64, 0x14, 0x33, 0x8b, 0xc3, 0x88, 0x8f, 0xe6, - 0x7f, 0x13, 0xee, 0xb7, 0x30, 0x5a, 0x3c, 0x6f, 0x27, 0x8c, 0xd1, 0x06, 0xe1, 0xc1, 0x0e, 0xb5, - 0x6e, 0x75, 0x21, 0x92, 0x42, 0x4f, 0x42, 0xf6, 0x81, 0xd6, 0x83, 0xe6, 0xf0, 0x00, 0x26, 0x18, - 0xcb, 0x42, 0xf8, 0x63, 0xa0, 0xb8, 0x0d, 0x8e, 0xfb, 0xb9, 0x59, 0x47, 0x26, 0xb1, 0x71, 0x2c, - 0x27, 0x95, 0x49, 0x3d, 0x5a, 0xf5, 0x31, 0x82, 0x71, 0x8a, 0x0d, 0x79, 0xf2, 0x2f, 0x75, 0xac, - 0x90, 0xab, 0x12, 0xa0, 0x89, 0xa0, 0x4c, 0x27, 0x22, 0xc8, 0x53, 0x97, 0x6e, 0x02, 0xde, 0x15, - 0x80, 0xcf, 0x90, 0x0e, 0x46, 0x1f, 0xe8, 0xa3, 0x3c, 0x9a, 0xbc, 0xa0, 0x04, 0xbd, 0xbf, 0xa4, - 0x34, 0xda, 0xe9, 0x4c, 0x17, 0xdb, 0xdb, 0xa1, 0x2f, 0xcb, 0x5e, 0x1c, 0xfa, 0x26, 0xe0, 0x64, - 0x51, 0x9c, 0x39, 0x6d, 0xe0, 0x95, 0x4a, 0xf1, 0xd8, 0x89, 0x19, 0x1d, 0x3c, 0x3b, 0x2e, 0x59, - 0x14, 0x3d, 0x3c, 0x34, 0x66, 0xd8, 0x3f, 0x2b, 0x11, 0xf0, 0x47, 0xf8, 0x0f, 0xbe, 0xe8, 0x5c, - 0x24, 0xc1, 0x69, 0x21, 0x52, 0x2b, 0x02, 0x00, 0x21, 0x4c, 0x40, 0xa5, 0x13, 0x1c, 0x9f, 0x22, - 0xa4, 0x78, 0xcd, 0xa3, 0x5d, 0xf7, 0x58, 0x77, 0x5e, 0x14, 0xc1, 0x2a, 0x47, 0xbc, 0xbe, 0x37, - 0xf0, 0x0d, 0x6a, 0x09, 0x56, 0xcd, 0x58, 0x94, 0x48, 0x05, 0x40, 0x3f, 0x7d, 0xfb, 0xf2, 0x99, - 0xb3, 0xaf, 0x3a, 0x68, 0x5a, 0xda, 0x06, 0xe8, 0x47, 0x97, 0x16, 0x04, 0x05, 0x5b, 0x6b, 0x8f, - 0x8f, 0xab, 0xed, 0xc1, 0x39, 0xef, 0xa0, 0x1f, 0xc4, 0x26, 0xe7, 0x61, 0xef, 0x61, 0xbd, 0x8f, - 0x8e, 0x9f, 0x33, 0xe4, 0x3f, 0x18, 0x66, 0x53, 0x91, 0x5d, 0x53, 0x8d, 0x46, 0x73, 0x62, 0x0b, - 0xc5, 0x45, 0x42, 0x6c, 0x93, 0x18, 0x51, 0x16, 0x69, 0x86, 0x2a, 0x3a, 0xbf, 0x40, 0xb1, 0x21, - 0x4e, 0x5b, 0x5d, 0x59, 0x67, 0xc2, 0xdd, 0xfd, 0x68, 0x20, 0xc7, 0x21, 0xc3, 0x39, 0xae, 0x84, - 0x01, 0xee, 0x22, 0xa1, 0x82, 0x44, 0xa3, 0x82, 0x2d, 0xf0, 0xa8, 0x5a, 0xc3, 0x5e, 0xbc, 0x1f, - 0x45, 0x63, 0x6d, 0x42, 0x72, 0x2b, 0x41, 0x07, 0x72, 0x48, 0x24, 0x93, 0x14, 0x42, 0x4d, 0xdc, - 0x74, 0x20, 0x3b, 0x9d, 0x08, 0x7e, 0xdc, 0x26, 0x27, 0x96, 0x39, 0x97, 0x17, 0xd1, 0x1c, 0x8f, - 0x22, 0xb9, 0x49, 0x8b, 0x0a, 0x61, 0x92, 0x29, 0x16, 0x1f, 0x1e, 0x9a, 0x95, 0xe1, 0xee, 0xde, - 0xf2, 0xef, 0xd1, 0xfe, 0x9b, 0x68, 0x0e, 0xa0, 0xdd, 0x3d, 0xaa, 0x0e, 0x19, 0xd6, 0x86, 0x33, - 0x23, 0x72, 0x36, 0xb8, 0x42, 0x67, 0x5d, 0x2f, 0xd6, 0xdf, 0x2c, 0xf7, 0xec, 0x1f, 0x32, 0x24, - 0x48, 0x4d, 0x04, 0xeb, 0xb3, 0x57, 0xe3, 0xf1, 0x98, 0x2d, 0x1e, 0x41, 0x40, 0x15, 0x9c, 0xe2, - 0x83, 0x84, 0x18, 0x82, 0xa8, 0x39, 0xc8, 0xc7, 0x4e, 0xb5, 0xed, 0xce, 0x55, 0x2c, 0x2f, 0x50, - 0xaf, 0x27, 0x9e, 0x89, 0x12, 0xa4, 0xdf, 0x48, 0x41, 0xc6, 0x51, 0x63, 0x2c, 0xa3, 0xc8, 0xb3, - 0x2c, 0x57, 0x71, 0xeb, 0x49, 0x46, 0x03, 0x51, 0xa0, 0x56, 0x08, 0xaa, 0x16, 0x98, 0x9f, 0x40, - 0x4a, 0x9e, 0xd6, 0x49, 0x4d, 0x3e, 0x82, 0xe7, 0x00, 0x9e, 0x1b, 0xca, 0x16, 0x39, 0x47, 0xc8, - 0x9d, 0xbb, 0x8b, 0x11, 0xef, 0xa1, 0xb6, 0x3d, 0xa6, 0x65, 0x65, 0xa7, 0x21, 0xad, 0x45, 0x9e, - 0xb3, 0xeb, 0x67, 0x1f, 0x52, 0xd4, 0xc6, 0xf1, 0x83, 0xf5, 0xcb, 0xa6, 0x2f, 0x84, 0xf2, 0x4c, - 0x18, 0xcb, 0xd3, 0xd2, 0xa7, 0x1f, 0xe1, 0x04, 0x5d, 0x7c, 0x94, 0x02, 0x24, 0x83, 0xb2, 0x8a, - 0x01, 0x1e, 0x66, 0xc2, 0x12, 0x58, 0xb5, 0x0a, 0xac, 0x8c, 0xcd, 0x33, 0xc0, 0xc2, 0x84, 0x55, - 0xea, 0x5a, 0x21, 0x2a, 0xe0, 0xc6, 0x1d, 0x25, 0x5e, 0xaa, 0xac, 0xa8, 0x72, 0xbc, 0x44, 0xf6, - 0xa2, 0xc3, 0x95, 0x0f, 0xc0, 0x45, 0xd4, 0x7f, 0x7c, 0xee, 0xe0, 0x7d, 0xc7, 0xf9, 0xd5, 0x17, - 0x4e, 0xa3, 0x1e, 0x81, 0x35, 0x38, 0x91, 0x19, 0xaa, 0xf6, 0x44, 0x06, 0x27, 0x5a, 0x0f, 0xfd, - 0xdc, 0x5c, 0xc4, 0xa0, 0x6e, 0xef, 0xc9, 0xb7, 0x87, 0x8d, 0x75, 0x3b, 0x87, 0xd4, 0xc0, 0xde, - 0x4a, 0x97, 0x01, 0xbc, 0x68, 0x9e, 0x81, 0x16, 0xd8, 0x95, 0x06, 0x0b, 0xa6, 0x8a, 0xf5, 0x35, - 0x67, 0xbe, 0xab, 0xae, 0xf4, 0x1d, 0x8b, 0x2d, 0xdf, 0xa9, 0x4b, 0x9a, 0x39, 0x53, 0x09, 0xb6, - 0xd3, 0x09, 0xd5, 0x21, 0xab, 0xbb, 0x0e, 0x25, 0xdb, 0x47, 0x19, 0xd4, 0x65, 0x3b, 0xf0, 0x3e, - 0x9a, 0xae, 0xea, 0x5b, 0x7e, 0xd9, 0xec, 0xda, 0x9a, 0xab, 0x05, 0xbb, 0x8c, 0x9b, 0x22, 0xe2, - 0x6e, 0xa5, 0x68, 0x0e, 0x43, 0xdb, 0xe1, 0x3b, 0x01, 0xf4, 0x03, 0x67, 0xfb, 0x6f, 0x58, 0x30, - 0x93, 0x8a, 0xb3, 0xdd, 0x3d, 0x78, 0x2f, 0x52, 0x6b, 0x39, 0xb3, 0x6c, 0x07, 0xe1, 0x32, 0xa9, - 0x30, 0x1c, 0xfa, 0xde, 0x14, 0xec, 0x5d, 0x72, 0x96, 0xaa, 0xfb, 0xa5, 0xcd, 0xdd, 0x5d, 0xc1, - 0x76, 0x9a, 0x08, 0x72, 0x31, 0x4e, 0xab, 0xc2, 0x51, 0xfc, 0x34, 0x5c, 0x28, 0xf6, 0xb5, 0x28, - 0x02, 0xdf, 0x57, 0x8d, 0xa6, 0xe9, 0xbf, 0xfe, 0xa5, 0x57, 0xde, 0x0d, 0xd8, 0xe5, 0xe2, 0x49, - 0x72, 0x50, 0x65, 0x5e, 0x66, 0x74, 0xd0, 0x7a, 0x4d, 0xac, 0x64, 0x91, 0x8b, 0xbb, 0x93, 0xb1, - 0x37, 0xe8, 0xec, 0x81, 0x0c, 0x1b, 0x93, 0xcb, 0x60, 0x6b, 0xee, 0x16, 0xfd, 0x00, 0x07, 0x5c, - 0x42, 0xc6, 0xb9, 0x3e, 0x6c, 0x5f, 0x0f, 0xa5, 0x2a, 0x2b, 0x17, 0x10, 0xe4, 0x9c, 0x4d, 0x65, - 0x9e, 0x43, 0xa4, 0x05, 0xb5, 0x1a, 0xda, 0x9a, 0x8b, 0x45, 0x9f, 0x76, 0x6f, 0xcd, 0xe5, 0x21, - 0xb5, 0x14, 0xb0, 0x44, 0x8c, 0x4d, 0xc0, 0xe3, 0x14, 0x29, 0x63, 0xa3, 0xcb, 0xbe, 0x04, 0xd9, - 0xfe, 0xdf, 0xde, 0xb6, 0xe6, 0x7a, 0x01, 0x67, 0x8f, 0x61, 0xaf, 0x79, 0xda, 0x9a, 0x7b, 0x8c, - 0x39, 0x05, 0xbe, 0xcc, 0x20, 0x36, 0xfc, 0xdc, 0xf5, 0xd6, 0xdc, 0x2e, 0x30, 0x28, 0xbd, 0xa3, - 0xa6, 0x60, 0x42, 0x37, 0x95, 0x36, 0xde, 0xd9, 0x9a, 0xbf, 0x8c, 0xdc, 0x62, 0x27, 0x82, 0xfc, - 0xbb, 0x32, 0xa3, 0xcb, 0xc5, 0x5a, 0xbf, 0xbd, 0x37, 0xba, 0xc4, 0xf8, 0x53, 0x35, 0x93, 0xbf, - 0x24, 0x35, 0x44, 0x41, 0x52, 0x2a, 0x42, 0x47, 0xae, 0x8a, 0x30, 0x7b, 0x74, 0xff, 0x15, 0x91, - 0xb6, 0xcd, 0x13, 0x9d, 0xef, 0x5d, 0x10, 0xc5, 0x4b, 0x70, 0xfa, 0xf1, 0xd7, 0xd3, 0x5f, 0xbf, - 0xd1, 0xc9, 0x64, 0xe2, 0xd2, 0x09, 0x59, 0x21, 0xbd, 0x75, 0x75, 0xd4, 0x8b, 0x00, 0xe0, 0xe1, - 0xe1, 0x71, 0x18, 0x34, 0x4b, 0x51, 0x1d, 0x82, 0xc0, 0xa3, 0x47, 0x70, 0x20, 0xfd, 0x50, 0x19, - 0xac, 0x37, 0x9e, 0x4c, 0xd2, 0x56, 0xac, 0x2c, 0xc7, 0x42, 0xa7, 0x63, 0xea, 0x41, 0x64, 0xf9, - 0xea, 0x6b, 0x34, 0xe2, 0xa0, 0x16, 0x3e, 0x9b, 0xdc, 0x7a, 0x5f, 0x08, 0xce, 0xbb, 0x5e, 0x5d, - 0xf0, 0x35, 0xbd, 0xba, 0xe0, 0x0b, 0x76, 0x65, 0xe1, 0x89, 0x42, 0xaa, 0x97, 0x63, 0x5b, 0x07, - 0x19, 0x2d, 0x9a, 0x69, 0xf9, 0x54, 0x47, 0x91, 0xf2, 0xd8, 0x85, 0x89, 0x97, 0x31, 0x32, 0x29, - 0x53, 0x03, 0xd0, 0x1a, 0xec, 0x5a, 0x52, 0x6f, 0x44, 0x55, 0x0c, 0x5a, 0x55, 0x4b, 0x3f, 0x55, - 0x51, 0xac, 0x25, 0xe9, 0xa4, 0xa4, 0xbf, 0x6a, 0x6a, 0xf1, 0x84, 0x48, 0x16, 0x00, 0x4d, 0x44, - 0xf5, 0x8e, 0x01, 0x81, 0x26, 0x7f, 0xcc, 0x9b, 0xf6, 0xfb, 0xc0, 0x14, 0x0d, 0x9c, 0x98, 0x33, - 0xc0, 0x19, 0x49, 0xe0, 0x2e, 0x16, 0x6b, 0xaa, 0x0e, 0x63, 0x87, 0x30, 0x26, 0x3f, 0x35, 0x5d, - 0x63, 0x0c, 0xd2, 0x8b, 0xaf, 0xd0, 0x2f, 0x76, 0x95, 0xb9, 0xe7, 0xab, 0x2f, 0xc0, 0xde, 0xed, - 0xdc, 0x15, 0x09, 0x9d, 0x16, 0xe7, 0xa7, 0x05, 0xe4, 0x9a, 0xf4, 0x0c, 0x15, 0x8d, 0xc8, 0x8f, - 0xa9, 0x10, 0xb9, 0x8b, 0xd6, 0xeb, 0xee, 0x58, 0x8d, 0x75, 0x7b, 0xa0, 0x36, 0xfa, 0x67, 0x2a, - 0x0b, 0xa1, 0xe3, 0x23, 0xdb, 0xdb, 0xf4, 0x13, 0x25, 0x0d, 0x91, 0xe3, 0xde, 0xe6, 0xdf, 0x81, - 0x9b, 0x72, 0x24, 0x7d, 0xa0, 0x55, 0xc7, 0xd0, 0x54, 0x38, 0x06, 0x06, 0xe3, 0xb6, 0xba, 0xb2, - 0xe5, 0x80, 0x75, 0xd4, 0xaa, 0x94, 0x26, 0xed, 0x34, 0x1f, 0x0b, 0xe2, 0x5b, 0xd2, 0x67, 0x87, - 0x5e, 0xd7, 0x43, 0xd6, 0xb3, 0x8e, 0xd7, 0x57, 0xc4, 0xa3, 0x1d, 0xd6, 0xcd, 0xc6, 0x93, 0xe4, - 0xbb, 0x05, 0x54, 0xf1, 0x1c, 0xf7, 0xb0, 0xa9, 0xce, 0xfb, 0x0c, 0xc1, 0xb0, 0x45, 0x94, 0xb8, - 0x29, 0xe4, 0x3a, 0xd4, 0x2a, 0x0e, 0xa4, 0xaf, 0x5b, 0xfd, 0x05, 0x8a, 0x30, 0x86, 0xe6, 0xb0, - 0xd7, 0x0b, 0xb9, 0xb4, 0x48, 0xe5, 0x3d, 0x11, 0x66, 0x21, 0x95, 0x40, 0x9b, 0x08, 0xef, 0x2c, - 0x84, 0x78, 0x5b, 0xee, 0xa7, 0xac, 0xd5, 0x97, 0x26, 0x91, 0x54, 0xb3, 0xf8, 0x51, 0x38, 0xd4, - 0xd4, 0xc0, 0x19, 0x8b, 0x69, 0xca, 0x79, 0x93, 0xd5, 0x49, 0x07, 0x88, 0x9e, 0x99, 0x74, 0x8d, - 0xd9, 0x92, 0x55, 0xa6, 0x06, 0x37, 0xd2, 0xfd, 0x11, 0x31, 0xc6, 0xb0, 0x8b, 0x3f, 0x2e, 0xe3, - 0x95, 0x79, 0xb4, 0x9c, 0x89, 0xe8, 0xf0, 0x01, 0xa3, 0x66, 0xf3, 0xfb, 0x5a, 0xbe, 0xe5, 0x6c, - 0xa9, 0x1d, 0xd7, 0x85, 0xb5, 0xd2, 0x50, 0xd5, 0xba, 0x52, 0x79, 0x42, 0xbc, 0x71, 0x6a, 0x84, - 0xb5, 0xc1, 0x50, 0x8e, 0xce, 0xd2, 0x1b, 0x31, 0xec, 0xca, 0x51, 0xe0, 0x74, 0xd0, 0x5c, 0x49, - 0xe5, 0xbf, 0x21, 0xb3, 0xeb, 0x21, 0x60, 0x21, 0x3b, 0xe3, 0xe7, 0x44, 0x6a, 0x7d, 0x85, 0x6c, - 0xae, 0x36, 0x3f, 0x49, 0x45, 0x7b, 0x31, 0xea, 0x5a, 0x80, 0x78, 0x58, 0xf2, 0x03, 0x16, 0x43, - 0x05, 0x20, 0x13, 0x90, 0xe7, 0x48, 0x22, 0x41, 0xf9, 0x5f, 0xe4, 0x20, 0x5e, 0xbd, 0x5c, 0x88, - 0x35, 0xf1, 0x6f, 0x6f, 0xce, 0x48, 0xaf, 0x09, 0x08, 0x7d, 0x41, 0x77, 0x93, 0xf7, 0x75, 0xe0, - 0x21, 0xdd, 0x76, 0xce, 0xc6, 0x89, 0x27, 0xd4, 0xdf, 0x70, 0xa6, 0x5c, 0xba, 0xfb, 0x10, 0x53, - 0xc9, 0xaf, 0x82, 0x56, 0x67, 0x12, 0x36, 0x8b, 0x8d, 0x61, 0xb7, 0xb9, 0x24, 0x0f, 0xfd, 0x97, - 0x47, 0x7f, 0x95, 0x33, 0xba, 0x5b, 0x07, 0x95, 0x29, 0x42, 0xd6, 0x08, 0x48, 0x90, 0x49, 0x34, - 0x80, 0xa1, 0x37, 0x40, 0x42, 0x44, 0x9a, 0x83, 0x7b, 0x71, 0x93, 0x02, 0x6f, 0x13, 0x02, 0x9c, - 0xa1, 0x2a, 0x41, 0xc7, 0x48, 0xf3, 0x6c, 0x23, 0x90, 0x78, 0xa6, 0xbf, 0x7e, 0xb7, 0x2d, 0xf3, - 0x9f, 0x8d, 0x31, 0x94, 0x7d, 0x1d, 0x72, 0x56, 0x6a, 0xeb, 0x18, 0xf6, 0xd5, 0x11, 0x60, 0x38, - 0x53, 0xf8, 0x14, 0x37, 0x39, 0xc8, 0xe5, 0x4d, 0x3b, 0x90, 0x9d, 0xc6, 0xc5, 0xe3, 0x96, 0x8d, - 0x36, 0x56, 0x17, 0xa7, 0xa2, 0x28, 0x8f, 0x88, 0xf7, 0x2b, 0xe7, 0x70, 0xf4, 0x7a, 0xec, 0xd4, - 0x0f, 0xe4, 0x33, 0x2b, 0x64, 0x76, 0xcd, 0xd9, 0x27, 0x0a, 0xe6, 0x70, 0xd8, 0xad, 0x5f, 0x20, - 0x60, 0x78, 0x58, 0xee, 0xd9, 0x78, 0x61, 0xd3, 0x11, 0x6d, 0x3a, 0x4a, 0xb3, 0xeb, 0xc7, 0x7d, - 0x6b, 0x5f, 0xa9, 0xe3, 0x65, 0x4d, 0xb9, 0x2c, 0x4d, 0x0c, 0x02, 0xb4, 0x65, 0xaa, 0xfc, 0xa9, - 0x0b, 0x6b, 0xab, 0x6c, 0x29, 0x0f, 0xbc, 0xee, 0xee, 0x4f, 0x8c, 0x10, 0x6a, 0xd0, 0xe4, 0xb3, - 0xaf, 0x34, 0x92, 0x39, 0xda, 0x7e, 0xb5, 0xd7, 0xeb, 0xf5, 0xfe, 0x34, 0x08, 0xde, 0xad, 0xdf, - 0xfc, 0xe0, 0x3a, 0xdf, 0xa4, 0x8c, 0xc0, 0xe1, 0x28, 0x58, 0xf5, 0x4b, 0xb5, 0xb1, 0xee, 0x17, - 0x42, 0xff, 0x89, 0xd7, 0x8d, 0xed, 0x57, 0x6f, 0x0e, 0x0e, 0x0e, 0xc8, 0x6b, 0x55, 0xe4, 0xbe, - 0xdc, 0x29, 0x39, 0xeb, 0x5d, 0x90, 0x34, 0xde, 0x7d, 0x8b, 0xd5, 0xc0, 0x4c, 0x5f, 0xaf, 0xfe, - 0x03, 0xa5, 0x2a, 0x91, 0xe0, 0xd7, 0x3e, 0x15, 0x75, 0x2a, 0x51, 0xf7, 0xa3, 0xf6, 0xb2, 0xda, - 0x16, 0x73, 0x92, 0x24, 0xed, 0x66, 0xf3, 0x47, 0xd9, 0x58, 0x02, 0xbb, 0xf1, 0x3f, 0x21, 0xdb, - 0xa5, 0x12, 0xc2, 0x2f, 0x2a, 0x33, 0xaa, 0x39, 0xfa, 0x2f, 0xd5, 0x7f, 0x00, 0x30, 0xbd, 0x63, - 0x27, 0xbb, 0x12, 0x00, 0x00 + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xa5, 0x58, 0x6d, 0x53, 0xdb, 0x48, + 0x12, 0xfe, 0xce, 0xaf, 0x10, 0x13, 0x0a, 0xa4, 0xb2, 0x90, 0x4d, 0xb8, 0xdd, 0x4b, 0x6c, 0x8f, + 0xd9, 0x90, 0x97, 0x0b, 0x57, 0x49, 0xa0, 0x8a, 0xec, 0x5e, 0x5d, 0x71, 0xd4, 0x22, 0x4b, 0x63, + 0x7b, 0x82, 0x3c, 0xa3, 0x9a, 0x19, 0xf1, 0x72, 0xc6, 0xff, 0xfd, 0x9e, 0x1e, 0x49, 0xc6, 0x26, + 0x64, 0xf7, 0xae, 0xee, 0x0b, 0xa0, 0x51, 0x4f, 0xab, 0xe7, 0xe9, 0xa7, 0x9f, 0xee, 0x61, 0xb8, + 0xfd, 0xee, 0xf4, 0xed, 0xd7, 0x7f, 0x9e, 0xbd, 0x0f, 0x66, 0x6e, 0x5e, 0x8c, 0x86, 0xcd, 0x4f, + 0x91, 0xe6, 0x41, 0x91, 0xaa, 0x29, 0x67, 0x42, 0xb1, 0xd1, 0x70, 0x2e, 0x5c, 0x1a, 0x64, 0xb3, + 0xd4, 0x58, 0xe1, 0x38, 0xab, 0xdc, 0x64, 0xff, 0x55, 0xbb, 0xba, 0xa5, 0xd2, 0xb9, 0xe0, 0xec, + 0x46, 0x8a, 0xdb, 0x52, 0x1b, 0xc7, 0x82, 0x4c, 0x2b, 0x27, 0x14, 0xcc, 0x6e, 0x65, 0xee, 0x66, + 0xfc, 0xa7, 0x5e, 0x6f, 0x65, 0xfa, 0xe4, 0x55, 0x2e, 0x6e, 0x64, 0x26, 0xf6, 0xfd, 0x43, 0x2c, + 0x95, 0x74, 0x32, 0x2d, 0xf6, 0x6d, 0x96, 0x16, 0x82, 0x1f, 0xc4, 0xf3, 0xf4, 0x4e, 0xce, 0xab, + 0xf9, 0xea, 0xb9, 0xb2, 0xc2, 0xf8, 0x87, 0x74, 0x8c, 0x67, 0xa5, 0xd9, 0x77, 0x5f, 0x1e, 0x0d, + 0x9d, 0x74, 0x85, 0x18, 0xfd, 0x0a, 0xcb, 0xb9, 0xce, 0x83, 0x73, 0xe1, 0x9c, 0x54, 0x53, 0x3b, + 0xec, 0xd6, 0xeb, 0x43, 0x9b, 0x19, 0x59, 0xba, 0xd1, 0xd6, 0x4d, 0x6a, 0x02, 0x7d, 0xab, 0x84, + 0x89, 0x0b, 0x9d, 0xc9, 0x32, 0xae, 0x8c, 0xbe, 0xb5, 0x71, 0xce, 0x73, 0x9d, 0x55, 0x73, 0xc4, + 0x17, 0x57, 0xf3, 0xb7, 0x93, 0x29, 0x5f, 0x2c, 0xe3, 0x52, 0x2a, 0xcb, 0x2f, 0x7e, 0x8e, 0xff, + 0x1a, 0xbf, 0x8a, 0x5f, 0xc7, 0x07, 0xbd, 0xf8, 0xe0, 0xe0, 0x92, 0x16, 0x4f, 0xf9, 0x05, 0x33, + 0xf6, 0x26, 0x67, 0xf1, 0x9f, 0xff, 0xba, 0xa4, 0xaf, 0xf0, 0xed, 0x83, 0x58, 0x55, 0xf3, 0xcf, + 0xbc, 0x37, 0x98, 0x54, 0x2a, 0x73, 0x52, 0xab, 0x60, 0x7a, 0x92, 0x87, 0x22, 0x5a, 0x18, 0xe1, + 0x2a, 0xa3, 0x82, 0x3c, 0x99, 0x0a, 0xf7, 0xbe, 0x10, 0x14, 0xc0, 0xf1, 0xbd, 0x7f, 0xb5, 0x5c, + 0x99, 0x4a, 0x7b, 0xba, 0x66, 0x2a, 0x76, 0x77, 0x99, 0x1e, 0x7f, 0x13, 0x99, 0x63, 0x9c, 0xbb, + 0xfb, 0x52, 0xe8, 0x09, 0xad, 0x6d, 0xbf, 0x31, 0x26, 0xbd, 0x4f, 0xa4, 0xf5, 0xbf, 0x37, 0xf6, + 0x7f, 0x0c, 0xa3, 0xc5, 0xad, 0x54, 0xb9, 0xbe, 0x4d, 0x74, 0x29, 0x54, 0xc8, 0x66, 0xce, 0x95, + 0xb6, 0xdf, 0xed, 0x4e, 0xa5, 0x9b, 0x55, 0xe3, 0x24, 0xd3, 0xf3, 0xee, 0x1b, 0x69, 0x32, 0xad, + 0xf5, 0xb5, 0x14, 0xdd, 0x7f, 0x7c, 0x7a, 0xff, 0xae, 0x7b, 0x2b, 0xaf, 0x65, 0xb7, 0xc5, 0xf0, + 0x45, 0x55, 0x83, 0xba, 0x6f, 0x9b, 0x05, 0xb6, 0xe6, 0xfd, 0xf8, 0xa9, 0xf7, 0xee, 0xca, 0x2a, + 0x66, 0xbf, 0x5b, 0x51, 0x4c, 0xd6, 0xad, 0x0b, 0x9d, 0xe6, 0x7f, 0x3f, 0x0f, 0x45, 0xec, 0xf8, + 0x76, 0x2f, 0x5a, 0x14, 0xc2, 0x05, 0x8a, 0xe7, 0x49, 0x66, 0x44, 0xea, 0x44, 0x03, 0x40, 0xc8, + 0xea, 0x5c, 0xb1, 0x68, 0xa0, 0x12, 0x38, 0x7b, 0xe3, 0x9c, 0x91, 0xe3, 0xca, 0x09, 0xbc, 0x30, + 0x19, 0x8b, 0x45, 0x14, 0x3f, 0x5d, 0x27, 0x1c, 0xf0, 0x39, 0x27, 0xee, 0x5c, 0xf7, 0x5b, 0x7a, + 0x93, 0xb6, 0x0e, 0xbe, 0x33, 0x4c, 0xed, 0xbd, 0x82, 0x0b, 0x17, 0xc5, 0x79, 0x32, 0xd6, 0xf9, + 0x7d, 0x92, 0x96, 0x08, 0x3a, 0x7f, 0x3b, 0x93, 0x45, 0x1e, 0x2a, 0xb2, 0x4f, 0xf3, 0xfc, 0xfd, + 0x0d, 0xa2, 0xf8, 0x24, 0x2d, 0xe8, 0x2a, 0x4c, 0xc8, 0x28, 0x66, 0x16, 0x87, 0x11, 0x1f, 0x2d, + 0xfe, 0x26, 0xdc, 0x6f, 0x61, 0xb4, 0x7c, 0xde, 0x4e, 0x18, 0xa3, 0x0d, 0xc2, 0x83, 0x1d, 0xb8, + 0x6e, 0x75, 0x21, 0x92, 0x42, 0x4f, 0x43, 0xf6, 0x9e, 0xd6, 0x83, 0xe6, 0xf0, 0x00, 0x26, 0x98, + 0xc8, 0x42, 0xf8, 0x63, 0x80, 0xdc, 0x06, 0xc7, 0xfd, 0xd4, 0xac, 0x23, 0x93, 0xd8, 0x38, 0x91, + 0xd3, 0xca, 0xa4, 0x1e, 0xad, 0xfa, 0x18, 0xc1, 0x24, 0xc5, 0x86, 0x3c, 0xf9, 0x97, 0x3a, 0x51, + 0xc8, 0x55, 0x09, 0xd0, 0x44, 0x50, 0xa6, 0x53, 0x11, 0xe4, 0xa9, 0x4b, 0xb7, 0x01, 0xef, 0x1a, + 0xc0, 0xe7, 0x48, 0x07, 0xa3, 0x0f, 0xf4, 0x41, 0x8f, 0x26, 0x2f, 0xa0, 0xa0, 0xf7, 0x97, 0x94, + 0x46, 0x3b, 0x9d, 0xe9, 0x62, 0x77, 0x37, 0xf4, 0xb4, 0xec, 0xc5, 0xa1, 0x2f, 0x02, 0x4e, 0x16, + 0xc5, 0xb9, 0xd3, 0x06, 0x5e, 0x89, 0x8a, 0x27, 0x4e, 0xcc, 0xe9, 0xe0, 0xd9, 0x49, 0xc9, 0xa2, + 0xe8, 0xe1, 0xa1, 0x31, 0xc3, 0xfe, 0x79, 0x89, 0x80, 0x3f, 0xc0, 0x7f, 0xf0, 0x59, 0xe7, 0x22, + 0x09, 0xce, 0x0a, 0x91, 0x5a, 0x11, 0x00, 0x08, 0x61, 0x02, 0xa2, 0x4e, 0x70, 0x72, 0x86, 0x90, + 0xe2, 0x0d, 0x8f, 0x76, 0xd3, 0x63, 0x5d, 0x79, 0x51, 0x04, 0xab, 0x1c, 0xf1, 0xfa, 0xda, 0xc0, + 0x37, 0xa8, 0x24, 0x58, 0x35, 0x67, 0x51, 0x22, 0x15, 0x00, 0xfd, 0xf8, 0xf5, 0xf3, 0x27, 0xce, + 0xbe, 0xe8, 0xa0, 0x29, 0x69, 0x1b, 0xa0, 0x1e, 0x5d, 0x5a, 0x10, 0x14, 0x6c, 0xa3, 0x3c, 0x3e, + 0xac, 0x97, 0x07, 0xe7, 0xbc, 0x83, 0x7a, 0x10, 0xdb, 0x9c, 0x87, 0xbd, 0x87, 0xcd, 0x3a, 0x3a, + 0x79, 0xce, 0x90, 0x7f, 0x67, 0x98, 0xcd, 0x44, 0x76, 0x4d, 0x1c, 0x8d, 0x16, 0xa4, 0x16, 0x8a, + 0x8b, 0x84, 0xd4, 0x26, 0x31, 0xa2, 0x2c, 0xd2, 0x0c, 0x2c, 0xba, 0xb8, 0x04, 0xd9, 0x10, 0xa7, + 0xad, 0xc6, 0xd6, 0x99, 0x70, 0xff, 0x30, 0x1a, 0xc8, 0x49, 0xc8, 0x70, 0x8e, 0xb1, 0x30, 0xc0, + 0x5d, 0x24, 0x44, 0x48, 0x14, 0x2a, 0xd4, 0x02, 0x8f, 0xaa, 0x35, 0xec, 0xc5, 0x87, 0x51, 0x34, + 0xd1, 0x26, 0x24, 0xb7, 0x12, 0x72, 0x20, 0x87, 0x24, 0x32, 0x49, 0x21, 0xd4, 0xd4, 0xcd, 0x06, + 0xb2, 0xd3, 0x89, 0xe0, 0xc7, 0x6d, 0x73, 0x52, 0x99, 0x0b, 0x79, 0x19, 0x2d, 0xf0, 0x28, 0x92, + 0x9b, 0xb4, 0xa8, 0x10, 0x26, 0x99, 0x62, 0xf1, 0xe1, 0xa1, 0x59, 0x19, 0xee, 0x1f, 0xac, 0xfe, + 0x1e, 0x1d, 0xbe, 0x8e, 0x16, 0x00, 0xda, 0xdd, 0x83, 0x75, 0xc8, 0xb0, 0x36, 0x9c, 0x19, 0x91, + 0xb3, 0xc1, 0x18, 0x95, 0x75, 0xbd, 0xdc, 0x7c, 0xb3, 0xda, 0x73, 0x78, 0xc4, 0x90, 0x20, 0x35, + 0x15, 0xac, 0xcf, 0x5e, 0x4c, 0x26, 0x13, 0xb6, 0x7c, 0x04, 0x01, 0x2c, 0x38, 0xc3, 0x07, 0x09, + 0x31, 0x04, 0x51, 0x6b, 0x90, 0x8f, 0x9d, 0xb8, 0xed, 0x2e, 0x54, 0x2c, 0x2f, 0xc1, 0xd7, 0x53, + 0xaf, 0x44, 0x09, 0xd2, 0x6f, 0xa4, 0x20, 0xe3, 0xa8, 0x31, 0x96, 0x51, 0xe4, 0x55, 0x96, 0xab, + 0xb8, 0xf5, 0x24, 0xa3, 0x81, 0x28, 0xc0, 0x15, 0x82, 0xaa, 0x05, 0xe6, 0x0f, 0x20, 0x25, 0x4f, + 0x9b, 0xa2, 0x26, 0x1f, 0xc1, 0x73, 0x00, 0xcf, 0x0d, 0x65, 0x8b, 0x9c, 0x23, 0xe4, 0x2e, 0xdc, + 0xe5, 0x88, 0xf7, 0xc0, 0x6d, 0x8f, 0x69, 0x59, 0xd9, 0x59, 0x48, 0x6b, 0x91, 0xd7, 0xec, 0xfa, + 0xd9, 0x87, 0x14, 0xb5, 0x71, 0x7c, 0x67, 0xfd, 0x63, 0xd3, 0x1f, 0x84, 0xf2, 0x4c, 0x18, 0xab, + 0xd3, 0xd2, 0xa7, 0x1f, 0xe1, 0x84, 0x5c, 0x7c, 0x90, 0x02, 0x22, 0x03, 0x5a, 0xc5, 0x00, 0x0f, + 0x3d, 0x61, 0x05, 0xac, 0x8a, 0xa2, 0x85, 0x6f, 0x43, 0x1d, 0xbe, 0x37, 0x9c, 0x99, 0xc0, 0xe7, + 0xaa, 0xe9, 0x93, 0xfd, 0x97, 0x3f, 0xf7, 0xca, 0x3b, 0x36, 0xda, 0x1b, 0x3c, 0x62, 0x2f, 0x63, + 0xf3, 0x0c, 0xf6, 0xf0, 0xc2, 0x2a, 0x75, 0xad, 0x10, 0x38, 0xa0, 0xe5, 0x8e, 0xb8, 0x21, 0x55, + 0x56, 0x54, 0x39, 0x5e, 0x22, 0xc1, 0xd1, 0xd1, 0x5a, 0x0c, 0x70, 0x11, 0xf5, 0x1f, 0x9f, 0x3b, + 0x78, 0xdf, 0x71, 0x7e, 0x75, 0xf9, 0xfc, 0x81, 0xd5, 0x23, 0xf6, 0x06, 0x87, 0x36, 0x43, 0xd5, + 0x1e, 0xda, 0xe0, 0xd0, 0x9b, 0xa7, 0xbb, 0x30, 0x97, 0x31, 0xd4, 0xdd, 0x43, 0xe7, 0x2b, 0xc8, + 0xc6, 0xba, 0x6d, 0x55, 0x6a, 0x60, 0x6f, 0xa5, 0xcb, 0x80, 0x6f, 0xb4, 0xc8, 0xa0, 0x1c, 0x6c, + 0xac, 0x21, 0x94, 0xa9, 0x62, 0x7d, 0xcd, 0x99, 0x2f, 0xbc, 0xb1, 0xbe, 0x63, 0xb1, 0xe5, 0x7b, + 0x35, 0xeb, 0x99, 0x33, 0x95, 0x60, 0x7b, 0x9d, 0x50, 0x1d, 0xb1, 0xba, 0x30, 0xc1, 0xea, 0x3e, + 0x98, 0x52, 0x33, 0x7b, 0xe0, 0x7d, 0x34, 0x85, 0xd7, 0xb7, 0xfc, 0xaa, 0xd9, 0xb5, 0xb3, 0x50, + 0x4b, 0x76, 0x15, 0x37, 0x3c, 0xe3, 0x6e, 0x8d, 0x57, 0x47, 0x21, 0xe1, 0x1c, 0x60, 0xc4, 0xe0, + 0xec, 0xf0, 0x35, 0x0b, 0xe6, 0x52, 0x71, 0xb6, 0x7f, 0x00, 0xef, 0x45, 0x6a, 0x2d, 0x67, 0x96, + 0xed, 0x21, 0x5c, 0x26, 0x15, 0xfa, 0x47, 0xdf, 0x9b, 0x42, 0xe0, 0x4b, 0xce, 0x52, 0x75, 0xbf, + 0xb2, 0xb9, 0xbb, 0x2b, 0xd8, 0x5e, 0x13, 0x41, 0x2e, 0x26, 0x69, 0x55, 0x38, 0x8a, 0x9f, 0xfa, + 0x0f, 0xc5, 0xbe, 0x11, 0xc5, 0x93, 0x74, 0xfe, 0x84, 0x74, 0x0e, 0xd8, 0xd5, 0xf2, 0x49, 0x72, + 0x40, 0xc4, 0x86, 0x02, 0xa2, 0x8d, 0x95, 0x2c, 0x72, 0x71, 0x77, 0x3a, 0xf1, 0x06, 0x9d, 0x03, + 0xe8, 0x65, 0x63, 0x72, 0x15, 0xec, 0x2c, 0xdc, 0xb2, 0x1f, 0xe0, 0x80, 0x2b, 0xc8, 0x38, 0xd7, + 0x47, 0xed, 0xeb, 0xa1, 0x54, 0x65, 0xe5, 0x02, 0x82, 0x9c, 0xb3, 0x99, 0xcc, 0x73, 0xcc, 0x71, + 0x41, 0x3d, 0x30, 0xed, 0x2c, 0xc4, 0xb2, 0x4f, 0xbb, 0x77, 0x16, 0xf2, 0x88, 0xaa, 0x0e, 0x58, + 0x22, 0xc6, 0x26, 0xe0, 0x49, 0x8a, 0x94, 0xb1, 0xd1, 0x55, 0x5f, 0x42, 0x8f, 0xff, 0x6f, 0x6f, + 0x3b, 0x0b, 0xbd, 0x84, 0xb3, 0xc7, 0xb0, 0x37, 0x3c, 0xed, 0x2c, 0x3c, 0xc6, 0x9c, 0x02, 0x5f, + 0x65, 0x10, 0x1b, 0xfe, 0xd8, 0xf5, 0xce, 0xc2, 0x2e, 0xd1, 0x4b, 0xbd, 0xa3, 0x86, 0x30, 0xa1, + 0x9b, 0x49, 0x1b, 0xef, 0xed, 0x2c, 0x7e, 0x8c, 0xdc, 0x72, 0x2f, 0xc2, 0x84, 0x38, 0x36, 0xa3, + 0xab, 0xe5, 0x46, 0x49, 0xbe, 0x33, 0xba, 0x44, 0x87, 0x54, 0xb5, 0xd8, 0xff, 0x68, 0x1a, 0x11, + 0x05, 0x4d, 0x5b, 0x11, 0x8a, 0x76, 0x7d, 0x4e, 0xb3, 0xc7, 0xf7, 0x5f, 0x10, 0x69, 0x5b, 0x3c, + 0xd1, 0xc5, 0xc1, 0x25, 0x75, 0x01, 0x09, 0xd9, 0x3f, 0xf9, 0x72, 0xf6, 0xeb, 0x57, 0x3a, 0x99, + 0x4c, 0x5c, 0x3a, 0x25, 0x2b, 0xa4, 0xb7, 0x66, 0x47, 0xbd, 0x08, 0x00, 0x1e, 0x1e, 0x1e, 0xfb, + 0x45, 0xb3, 0x14, 0xd5, 0x21, 0x08, 0x3c, 0x7a, 0x04, 0x07, 0xd2, 0xf7, 0x9d, 0xc1, 0x66, 0xe1, + 0xc9, 0x24, 0x6d, 0xe7, 0x99, 0x55, 0xe7, 0xe8, 0x74, 0x4c, 0xdd, 0xab, 0x2c, 0x5f, 0x7f, 0x8d, + 0x42, 0x1c, 0xd4, 0xb3, 0xd1, 0x36, 0xb7, 0xde, 0x17, 0x82, 0xf3, 0xae, 0xd7, 0x17, 0x3c, 0xa7, + 0xd7, 0x17, 0x3c, 0x61, 0xd7, 0x16, 0x9e, 0x0c, 0x51, 0xf5, 0x72, 0x6c, 0xeb, 0x20, 0xa3, 0x65, + 0xd3, 0x50, 0x9f, 0x8e, 0x5a, 0x34, 0x9c, 0xec, 0xc3, 0xc4, 0x4f, 0x3a, 0x32, 0x29, 0x53, 0x03, + 0xd0, 0x1a, 0xec, 0x5a, 0xdd, 0x6f, 0xe6, 0xae, 0x18, 0xca, 0xab, 0x56, 0x7e, 0xaa, 0xa2, 0xd8, + 0x48, 0xd2, 0x69, 0x49, 0x7f, 0xd5, 0xd2, 0xe2, 0x35, 0x93, 0x2c, 0x00, 0x9a, 0x88, 0xea, 0x1d, + 0x03, 0x02, 0x4d, 0x7e, 0x9f, 0x37, 0xed, 0xf7, 0x41, 0x29, 0x1a, 0x38, 0xd1, 0x8a, 0x80, 0x33, + 0x92, 0xc0, 0x5d, 0x2c, 0x36, 0x06, 0x3f, 0x74, 0x26, 0xc2, 0x98, 0xfc, 0xd4, 0x8a, 0x8e, 0x4e, + 0x49, 0x2f, 0xbe, 0x60, 0xc4, 0xb1, 0xeb, 0xe2, 0xbe, 0x58, 0x7f, 0x01, 0x81, 0x6f, 0x5b, 0xb3, + 0x48, 0xe8, 0xb4, 0x38, 0x3f, 0x2d, 0x20, 0xd7, 0x34, 0xf2, 0x10, 0x69, 0x44, 0x7e, 0x42, 0x44, + 0xe4, 0x2e, 0xda, 0xe4, 0xdd, 0x89, 0x9a, 0xe8, 0xf6, 0x40, 0x6d, 0xf4, 0xcf, 0x30, 0x0b, 0xa1, + 0xe3, 0x23, 0xbb, 0xbb, 0xf4, 0x13, 0x94, 0xc6, 0x1c, 0xe4, 0xde, 0xe4, 0xdf, 0x80, 0x9b, 0x72, + 0x34, 0x1d, 0x61, 0x9c, 0x9d, 0x60, 0xec, 0xc2, 0x31, 0xd0, 0x3b, 0x77, 0xd5, 0xd8, 0x96, 0x03, + 0xd6, 0x51, 0xeb, 0xd3, 0x36, 0x8d, 0x57, 0x8b, 0x89, 0x20, 0xbd, 0xa5, 0x11, 0xee, 0xc8, 0x8f, + 0xfe, 0x98, 0xfc, 0x59, 0xc7, 0x8f, 0x60, 0xa4, 0xa3, 0x1d, 0xd6, 0xcd, 0x26, 0xd3, 0xe4, 0x9b, + 0x05, 0x54, 0xf1, 0x02, 0x57, 0xb5, 0x99, 0xce, 0xfb, 0x0c, 0xc1, 0xb0, 0x65, 0x94, 0xb8, 0x19, + 0x26, 0x7a, 0x0c, 0xb4, 0x38, 0x90, 0xbe, 0x6e, 0x47, 0x34, 0x48, 0x84, 0x31, 0xd4, 0xaa, 0xfd, + 0x48, 0x91, 0x4b, 0x8b, 0x54, 0xde, 0x93, 0x60, 0x16, 0x52, 0x09, 0x94, 0x89, 0xf0, 0xce, 0x42, + 0xcc, 0x77, 0xab, 0xfd, 0x94, 0xb5, 0xfa, 0x5e, 0x25, 0x92, 0x6a, 0x1e, 0x3f, 0xce, 0x16, 0xb5, + 0x34, 0x70, 0xc6, 0x62, 0x6a, 0x84, 0xde, 0x64, 0x7d, 0xca, 0x00, 0x44, 0xcf, 0x74, 0xba, 0xc6, + 0x6c, 0xa5, 0x2a, 0x33, 0x83, 0x4b, 0xeb, 0xe1, 0x88, 0x14, 0x63, 0xd8, 0xc5, 0x1f, 0x57, 0xf1, + 0x5a, 0x3f, 0x5a, 0xf5, 0x44, 0x54, 0xf8, 0x80, 0x51, 0xb1, 0xf9, 0x7d, 0xad, 0xde, 0x72, 0xb6, + 0x1a, 0x2f, 0x37, 0x67, 0x6f, 0xa5, 0x31, 0x78, 0xeb, 0x4a, 0xe5, 0x09, 0xe9, 0xc6, 0x99, 0x11, + 0xd6, 0x06, 0x43, 0x39, 0x3a, 0x4f, 0x6f, 0xc4, 0xb0, 0x2b, 0x47, 0x81, 0xd3, 0x41, 0x73, 0x6b, + 0x95, 0xff, 0xc6, 0x24, 0x5e, 0x37, 0x01, 0x8b, 0xc9, 0x34, 0x7e, 0x6e, 0x8e, 0xad, 0x6f, 0x99, + 0xcd, 0xed, 0xe7, 0x0f, 0x52, 0xd1, 0xde, 0x9d, 0xba, 0x16, 0x20, 0x1e, 0x95, 0xfc, 0x15, 0x8b, + 0x31, 0x28, 0x20, 0x13, 0x98, 0xe0, 0x91, 0x44, 0x82, 0xf2, 0xbf, 0xc8, 0x41, 0xbc, 0x7e, 0xff, + 0x10, 0x1b, 0xf7, 0x03, 0x7b, 0x73, 0x4e, 0x23, 0x9d, 0xc0, 0x5d, 0x40, 0xd0, 0xf5, 0xe5, 0x5d, + 0x1d, 0x78, 0x48, 0x17, 0xa2, 0xf3, 0x49, 0xe2, 0x05, 0xf5, 0x37, 0x9c, 0x29, 0x97, 0xee, 0x3e, + 0x44, 0x57, 0xf2, 0xab, 0x90, 0xd5, 0xb9, 0x84, 0xcd, 0x72, 0x6b, 0xd8, 0x6d, 0xee, 0xd1, 0x43, + 0xff, 0xe5, 0xd1, 0x2f, 0x72, 0x4e, 0xd7, 0xef, 0xa0, 0x32, 0x45, 0xc8, 0x9a, 0x19, 0x13, 0x62, + 0x12, 0x0d, 0x60, 0xe8, 0x0d, 0x90, 0x10, 0x91, 0xe6, 0xd0, 0x5e, 0x5c, 0xb6, 0xa0, 0xdb, 0x84, + 0x00, 0x67, 0x60, 0x25, 0xe4, 0x18, 0x69, 0x9e, 0x6f, 0x05, 0x12, 0xcf, 0xf4, 0xd7, 0xef, 0xb6, + 0x55, 0xfe, 0xf3, 0x09, 0x9a, 0xb2, 0xe7, 0x21, 0x67, 0xa5, 0xb6, 0x8e, 0x61, 0x5f, 0x1d, 0x01, + 0x9a, 0x33, 0x85, 0x4f, 0x71, 0x93, 0x83, 0x5c, 0xde, 0xb4, 0x0d, 0xd9, 0x69, 0xdc, 0x4d, 0x6e, + 0xd9, 0x68, 0x6b, 0x7d, 0x71, 0x26, 0x8a, 0xf2, 0x98, 0x74, 0xbf, 0x72, 0x0e, 0x47, 0xaf, 0xdb, + 0x4e, 0xfd, 0x40, 0x3e, 0xb3, 0x42, 0x66, 0xd7, 0x9c, 0x7d, 0xa4, 0x60, 0x8e, 0x86, 0xdd, 0xfa, + 0x05, 0x02, 0x86, 0x87, 0xd5, 0x9e, 0xad, 0x1f, 0x6c, 0x3a, 0xa6, 0x4d, 0xc7, 0x69, 0x76, 0xfd, + 0xb8, 0x6f, 0xe3, 0x2b, 0x75, 0xbc, 0xac, 0xa1, 0xcb, 0xca, 0xc4, 0x20, 0x40, 0x5b, 0xa6, 0xca, + 0x9f, 0xba, 0xb0, 0xb6, 0xca, 0x56, 0xe3, 0x81, 0x1f, 0xcd, 0xfb, 0x53, 0x23, 0x84, 0x1a, 0x34, + 0xf9, 0xec, 0x2b, 0x8d, 0x64, 0x8e, 0x76, 0x5f, 0x1c, 0xf4, 0x7a, 0xbd, 0xbf, 0x0c, 0x82, 0xb7, + 0x9b, 0x97, 0x43, 0xb8, 0xce, 0xb7, 0x29, 0x23, 0x70, 0x38, 0x0a, 0xd6, 0xfd, 0x12, 0x37, 0x36, + 0xfd, 0xe2, 0x2e, 0xf0, 0xc4, 0xeb, 0xd6, 0xee, 0x8b, 0xd7, 0xaf, 0x5e, 0xbd, 0x22, 0xaf, 0x55, + 0x91, 0x7b, 0xba, 0x53, 0x72, 0x36, 0xab, 0x20, 0x69, 0xbc, 0xfb, 0x12, 0xab, 0x81, 0x99, 0xbd, + 0x5c, 0xff, 0x1f, 0x4b, 0x55, 0x22, 0xc1, 0x2f, 0x7d, 0x2a, 0xea, 0x54, 0x82, 0xf7, 0xa3, 0xf6, + 0x3e, 0xdb, 0x92, 0x39, 0x49, 0x92, 0x76, 0xb3, 0xf9, 0xb3, 0x6c, 0xac, 0x80, 0xdd, 0xfa, 0x9f, + 0x90, 0xed, 0x12, 0x85, 0xf0, 0x8b, 0x68, 0x46, 0x9c, 0xa3, 0x7f, 0x64, 0xfd, 0x07, 0xe9, 0x71, + 0x3b, 0x45, 0xde, 0x12, 0x00, 0x00 }; diff --git a/wled00/html_ui.h b/wled00/html_ui.h index 0baad9ae3..059bc6796 100644 --- a/wled00/html_ui.h +++ b/wled00/html_ui.h @@ -7,1781 +7,1828 @@ */ // Autogenerated from wled00/data/index.htm, do not edit!! -const uint16_t PAGE_index_L = 28388; +const uint16_t PAGE_index_L = 29142; const uint8_t PAGE_index[] PROGMEM = { - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdc, 0xbd, 0xf9, 0x7e, 0xe3, 0x38, - 0xaf, 0x20, 0xfa, 0x7f, 0x9e, 0x42, 0xa5, 0xea, 0xae, 0xb2, 0xda, 0x8a, 0x2d, 0xaf, 0x71, 0x9c, - 0x72, 0x72, 0x9c, 0x7d, 0xdf, 0x9c, 0xbd, 0xa6, 0x7e, 0xa7, 0x64, 0x5b, 0xb6, 0x95, 0xc8, 0x92, - 0x22, 0xc9, 0x5b, 0x5c, 0x9e, 0xf7, 0x98, 0x67, 0xb8, 0x6f, 0x75, 0x9f, 0xe4, 0x02, 0x24, 0x25, - 0x51, 0xb2, 0xec, 0xa4, 0xba, 0xfb, 0xcc, 0x99, 0xb9, 0xfd, 0x7d, 0x15, 0x4b, 0x14, 0x17, 0x10, - 0x04, 0x41, 0x00, 0x04, 0xc1, 0x6f, 0x9f, 0x76, 0x2f, 0x76, 0x6e, 0x1e, 0x2f, 0xf7, 0x84, 0x9e, - 0xd7, 0x37, 0x36, 0x85, 0x6f, 0xf8, 0x23, 0x18, 0xaa, 0xd9, 0xad, 0x89, 0x9a, 0x29, 0x62, 0x82, - 0xa6, 0xb6, 0xe1, 0xa7, 0xaf, 0x79, 0xaa, 0x60, 0xaa, 0x7d, 0xad, 0x26, 0x0e, 0x75, 0x6d, 0x64, - 0x5b, 0x8e, 0x27, 0x0a, 0x2b, 0x2d, 0xcb, 0xf4, 0x34, 0xd3, 0xab, 0x89, 0x23, 0xbd, 0xed, 0xf5, - 0x6a, 0x6d, 0x6d, 0xa8, 0xb7, 0xb4, 0x55, 0xf2, 0x22, 0xeb, 0xa6, 0xee, 0xe9, 0xaa, 0xb1, 0xea, - 0xb6, 0x54, 0x43, 0xab, 0xe5, 0xe4, 0x3e, 0x24, 0xf4, 0x07, 0x7d, 0xff, 0x5d, 0xf4, 0x2b, 0x5d, - 0x69, 0xf5, 0x54, 0xc7, 0xd5, 0xa0, 0x92, 0x81, 0xd7, 0x59, 0xad, 0x88, 0xd1, 0xc6, 0xbc, 0x9e, - 0xd6, 0xd7, 0x56, 0x5b, 0x96, 0x61, 0x39, 0xa2, 0x10, 0x34, 0xf7, 0x39, 0x4f, 0xfe, 0xe3, 0xea, - 0xf0, 0xbf, 0x4c, 0x34, 0x57, 0x64, 0x45, 0x55, 0xdb, 0x36, 0xb4, 0xd5, 0xbe, 0xd5, 0xd4, 0xe1, - 0x67, 0xa4, 0x35, 0x57, 0x21, 0x61, 0xb5, 0xa5, 0xda, 0x6a, 0xd3, 0xd0, 0xb0, 0xa4, 0xa1, 0x9b, - 0x2f, 0x82, 0xa3, 0x19, 0x35, 0xd1, 0xed, 0x41, 0x77, 0x5a, 0x03, 0x4f, 0xd0, 0xa1, 0x1e, 0xe8, - 0x56, 0xcf, 0xd1, 0x3a, 0x35, 0xb1, 0xad, 0x7a, 0x6a, 0x55, 0xef, 0xab, 0x5d, 0x2d, 0x3b, 0x5e, - 0xc5, 0x2f, 0x1b, 0x4d, 0xd5, 0xd5, 0xca, 0x45, 0xb9, 0x5e, 0xaf, 0x6f, 0xd7, 0xeb, 0x7b, 0xf5, - 0x3d, 0xf8, 0x8b, 0xbf, 0x07, 0xf5, 0x9d, 0x03, 0x7c, 0xda, 0xef, 0xc2, 0x9f, 0x23, 0xe3, 0xea, - 0xe6, 0xa5, 0x75, 0xbe, 0xd3, 0xb3, 0x4e, 0x30, 0x6d, 0xf7, 0xd6, 0x38, 0xba, 0xde, 0x3f, 0xc2, - 0xc7, 0x2b, 0x9a, 0xbb, 0x4b, 0xf2, 0x1e, 0x66, 0x2f, 0xb3, 0x8f, 0x98, 0xb2, 0x97, 0x3b, 0xbe, - 0xde, 0xdb, 0xbf, 0xbd, 0x38, 0xca, 0x3d, 0x43, 0x52, 0xf6, 0x72, 0x74, 0x31, 0xee, 0x9e, 0x1f, - 0x68, 0xf5, 0xdb, 0xb3, 0xf1, 0xde, 0xfa, 0x41, 0xb9, 0x75, 0xb5, 0x73, 0xb2, 0x7b, 0x5f, 0xef, - 0xd9, 0xf5, 0xdd, 0xa7, 0x7c, 0xa7, 0x72, 0x79, 0xf6, 0xbc, 0xdd, 0x28, 0x5c, 0xdd, 0x2b, 0x95, - 0xab, 0x93, 0xbc, 0x72, 0xa2, 0x3e, 0xed, 0xe4, 0xbb, 0x9d, 0x9d, 0xf5, 0xde, 0x8e, 0xf9, 0x6a, - 0x0d, 0xac, 0xf3, 0x6e, 0xfd, 0xba, 0xfb, 0xb8, 0xf6, 0x76, 0x36, 0xae, 0x4f, 0xce, 0x8d, 0xdb, - 0xf6, 0xd5, 0xa1, 0xf1, 0xa0, 0xd7, 0x8d, 0x8b, 0xfc, 0xd9, 0x6e, 0x7d, 0xb7, 0x5c, 0xd8, 0xbb, - 0x7b, 0x3d, 0x3f, 0xac, 0x6b, 0x4a, 0x9d, 0x00, 0x62, 0xec, 0xdf, 0xbc, 0x34, 0x06, 0x57, 0xfd, - 0x9d, 0x1d, 0x71, 0x73, 0x45, 0xf8, 0xe6, 0xe9, 0x9e, 0xa1, 0x6d, 0xde, 0x9f, 0xee, 0xed, 0x7e, - 0xcb, 0xd2, 0x67, 0xe1, 0x9b, 0xdb, 0x72, 0x74, 0xdb, 0xdb, 0x5c, 0xe9, 0x0c, 0xcc, 0x96, 0xa7, - 0x5b, 0xa6, 0xd0, 0xd1, 0xb4, 0x76, 0x53, 0x6d, 0xbd, 0xa4, 0xa4, 0xe9, 0x6c, 0xa8, 0x3a, 0x02, - 0x0c, 0xb9, 0xd5, 0x1a, 0xf4, 0x01, 0xf3, 0x99, 0xae, 0xe6, 0xed, 0x19, 0x1a, 0x3e, 0xba, 0xdb, - 0x93, 0x1b, 0xb5, 0x7b, 0x0e, 0x63, 0x90, 0x12, 0x91, 0x7a, 0x44, 0xe9, 0xbb, 0xf2, 0x43, 0x36, - 0xc2, 0xac, 0x2d, 0x47, 0x53, 0x3d, 0x8d, 0xe5, 0x4e, 0x89, 0xb4, 0x15, 0x51, 0xda, 0x30, 0x32, - 0xde, 0xc4, 0x66, 0x03, 0xa7, 0xb7, 0x54, 0x6c, 0x31, 0xfb, 0xac, 0x0e, 0x55, 0x96, 0x41, 0x36, - 0x32, 0xae, 0xd3, 0xaa, 0x89, 0xba, 0x63, 0x65, 0x9e, 0x5d, 0x7c, 0x55, 0xdb, 0xed, 0xbd, 0x21, - 0xd4, 0x71, 0xaa, 0xbb, 0x30, 0xfa, 0x9a, 0x93, 0x12, 0x0d, 0x0b, 0xda, 0x93, 0xb5, 0xda, 0xe6, - 0xb4, 0x65, 0xeb, 0xad, 0x97, 0x9a, 0xa9, 0x8d, 0x04, 0xcc, 0xbf, 0x83, 0x04, 0x74, 0x09, 0x29, - 0x98, 0xe9, 0xb3, 0x4d, 0x1e, 0x44, 0x79, 0x4a, 0x28, 0xb5, 0x9a, 0x2f, 0x2b, 0xf2, 0xa8, 0xa7, - 0x69, 0xc6, 0xa9, 0xde, 0xed, 0x79, 0xa6, 0xe6, 0xba, 0xd5, 0x4f, 0x39, 0x9a, 0x52, 0x37, 0xbb, - 0x86, 0x56, 0xcd, 0xaf, 0xb1, 0x0c, 0xbb, 0xba, 0xa3, 0x11, 0x4c, 0x54, 0xc5, 0x96, 0x61, 0xb5, - 0x5e, 0x46, 0xba, 0xab, 0x01, 0x20, 0xea, 0xc4, 0x1a, 0x78, 0xd5, 0xef, 0xd3, 0x96, 0xd5, 0xb7, - 0x2d, 0x13, 0x00, 0xaa, 0x62, 0x9b, 0x03, 0x3d, 0x73, 0x8f, 0x85, 0x64, 0xcb, 0xc6, 0x22, 0x6e, - 0x75, 0x3a, 0x9b, 0xfd, 0x98, 0x49, 0x32, 0x81, 0x2c, 0x63, 0x99, 0x29, 0x51, 0x37, 0x6d, 0x28, - 0xa7, 0x99, 0x00, 0x72, 0x4a, 0x02, 0x98, 0x61, 0x16, 0x10, 0x40, 0x53, 0x39, 0x29, 0x92, 0x8f, - 0x90, 0x7f, 0x15, 0xe6, 0x89, 0xd9, 0xd5, 0x58, 0xd6, 0x81, 0x0d, 0xe4, 0xa9, 0x5d, 0x36, 0x0c, - 0xbd, 0xad, 0x39, 0x6e, 0x0a, 0xf2, 0x6f, 0xe0, 0x80, 0x78, 0xef, 0x63, 0xd9, 0x7b, 0x07, 0xcb, - 0x1e, 0xc5, 0xb2, 0x83, 0x8d, 0x79, 0xd6, 0xa0, 0xd5, 0x23, 0xc8, 0xf6, 0x96, 0x22, 0x9b, 0x64, - 0x76, 0x6b, 0xd7, 0xf8, 0x73, 0x43, 0xca, 0x40, 0x57, 0x06, 0x76, 0xea, 0x2b, 0xe9, 0xe1, 0x77, - 0xda, 0x20, 0xc9, 0x24, 0xfe, 0xf8, 0x2a, 0x4f, 0x01, 0x58, 0x43, 0xf3, 0x00, 0x58, 0xc8, 0x75, - 0x04, 0x13, 0xd7, 0x19, 0xaa, 0x46, 0x8a, 0x74, 0x4b, 0x44, 0x14, 0xc2, 0x37, 0x4d, 0xac, 0xd5, - 0xc2, 0xae, 0x40, 0x4f, 0xda, 0x93, 0x86, 0x07, 0xdd, 0xf9, 0xf2, 0x25, 0xd5, 0x32, 0x34, 0xd5, - 0x09, 0x4a, 0x79, 0x92, 0x6c, 0x99, 0xa7, 0x00, 0x48, 0x4a, 0x92, 0x66, 0x72, 0x4e, 0x51, 0x10, - 0x73, 0x50, 0xed, 0x8d, 0xde, 0xd7, 0x60, 0x50, 0x68, 0xad, 0xbd, 0x0c, 0x74, 0x16, 0xd0, 0xbc, - 0xd3, 0xd3, 0x8d, 0x36, 0x14, 0x99, 0xc9, 0xa5, 0x0f, 0xe4, 0x33, 0x68, 0xbe, 0x95, 0x6f, 0x59, - 0x36, 0x0f, 0x60, 0x42, 0x78, 0x13, 0x98, 0x18, 0x2b, 0xff, 0xd1, 0x01, 0x76, 0xb3, 0xda, 0x51, - 0x5b, 0xda, 0x94, 0x3d, 0xf5, 0x75, 0x63, 0x52, 0xbd, 0x3f, 0x02, 0x26, 0xe1, 0x6e, 0x00, 0xfa, - 0xaa, 0x03, 0xc7, 0x48, 0x11, 0xfe, 0x81, 0xdf, 0xb3, 0x23, 0xab, 0xd3, 0xc9, 0x6f, 0xf8, 0x7c, - 0x8e, 0xb0, 0x39, 0x9f, 0x97, 0xb4, 0x95, 0xf5, 0x83, 0xb3, 0x6e, 0x9d, 0x70, 0x92, 0x7a, 0xdd, - 0xbc, 0xad, 0xd7, 0x5d, 0x3a, 0x3d, 0x73, 0xf8, 0xb7, 0xbf, 0x5f, 0xaf, 0x1f, 0x3c, 0xf5, 0xbb, - 0xf5, 0x85, 0xff, 0x6d, 0xf7, 0xeb, 0xf5, 0xee, 0xc3, 0xe8, 0x7a, 0xa7, 0xfe, 0xda, 0x7a, 0x3c, - 0x7e, 0x3a, 0xaa, 0xdf, 0x3c, 0xee, 0x1c, 0xd7, 0xcf, 0x47, 0x3b, 0x6f, 0x56, 0x7d, 0x7b, 0x07, - 0x58, 0xd2, 0xe8, 0xf1, 0xf0, 0x68, 0xdb, 0x5d, 0xdb, 0xad, 0xe8, 0x17, 0xa3, 0xb7, 0x6e, 0xbf, - 0x70, 0xf6, 0x70, 0x66, 0xbe, 0x3d, 0xed, 0xbc, 0x78, 0xe6, 0x73, 0xab, 0x79, 0x9e, 0xbe, 0x32, - 0x8e, 0x4f, 0xd5, 0xe3, 0xc2, 0xc0, 0xb8, 0x3d, 0xb5, 0x0d, 0xfb, 0xbe, 0x7c, 0xfb, 0x7a, 0xaf, - 0x5b, 0x5a, 0x63, 0x3d, 0x77, 0x3c, 0xd1, 0x94, 0xe7, 0x5b, 0xe3, 0x78, 0xf4, 0xe4, 0x94, 0xcc, - 0x9b, 0xf6, 0x5e, 0xe1, 0xd4, 0xf4, 0xda, 0x97, 0xc3, 0x7a, 0x37, 0xdd, 0xf1, 0xb2, 0x9d, 0xa6, - 0x7b, 0xea, 0x1e, 0x18, 0xe7, 0xa7, 0x83, 0x9e, 0xd1, 0xbf, 0x7a, 0x3e, 0xd1, 0xd7, 0xce, 0x2f, - 0x77, 0xf7, 0x8e, 0xba, 0xa3, 0x9b, 0x3e, 0xf0, 0x30, 0xb5, 0xdc, 0x6f, 0x1b, 0xe9, 0xc6, 0xe1, - 0xed, 0x76, 0x6f, 0xef, 0xa8, 0x7d, 0xb8, 0x3f, 0x56, 0x5f, 0xd6, 0xdc, 0xe2, 0x5e, 0x76, 0xf2, - 0xd6, 0x3b, 0x6e, 0x3c, 0xef, 0xac, 0x6d, 0x5f, 0x5d, 0x9d, 0x76, 0x76, 0x47, 0x96, 0xbd, 0x9f, - 0xd5, 0xcb, 0xea, 0x6b, 0x63, 0xcf, 0xd8, 0xdb, 0xdf, 0x7d, 0x18, 0x57, 0x9e, 0xee, 0xee, 0x9f, - 0x27, 0x05, 0x67, 0xd2, 0x2f, 0x9e, 0x97, 0xf7, 0x8d, 0xa7, 0xab, 0x62, 0x6f, 0x90, 0x36, 0x1f, - 0xdc, 0x83, 0xa3, 0xdd, 0xb3, 0xab, 0xfd, 0x42, 0xb7, 0x3e, 0x56, 0x73, 0xc5, 0x7a, 0xb7, 0xee, - 0x78, 0x77, 0x67, 0xbd, 0xce, 0x4b, 0xf7, 0xb9, 0xb3, 0x57, 0x6f, 0xea, 0x3b, 0xbd, 0xd1, 0xa0, - 0x71, 0x34, 0xda, 0xbb, 0xdd, 0xe9, 0x0f, 0xda, 0x97, 0x3d, 0xfd, 0xaa, 0x7d, 0x53, 0x76, 0x86, - 0x47, 0xcf, 0xa7, 0x8d, 0xeb, 0xa7, 0xbd, 0xd1, 0x6e, 0x6f, 0x7f, 0x7d, 0xfb, 0xc8, 0xb5, 0xac, - 0xa3, 0x52, 0xe1, 0xe6, 0xe8, 0xfa, 0xc8, 0x3a, 0xba, 0xdd, 0xad, 0xbc, 0x4c, 0xce, 0x9f, 0x8e, - 0xd6, 0x6e, 0x9f, 0xeb, 0x93, 0x33, 0xe7, 0x3a, 0xab, 0x9e, 0x65, 0x77, 0x47, 0xea, 0x85, 0x6d, - 0xbd, 0xa9, 0xbd, 0xf5, 0xd3, 0x83, 0x1d, 0xf7, 0x31, 0xff, 0x76, 0x9e, 0x7f, 0xbc, 0x78, 0x73, - 0xf3, 0xa7, 0x85, 0xf1, 0xab, 0x76, 0x6e, 0x17, 0xdf, 0x1e, 0x9e, 0x5f, 0x2b, 0xcd, 0x87, 0x9b, - 0x6c, 0xef, 0x6c, 0xfb, 0xf4, 0x39, 0x5b, 0x2a, 0x3c, 0xee, 0xd6, 0x8f, 0x1a, 0xe9, 0xb5, 0x41, - 0xb9, 0x5c, 0x31, 0x0b, 0x87, 0xe9, 0xc3, 0xeb, 0xcb, 0xf6, 0x53, 0x3b, 0x37, 0x28, 0xdc, 0xbc, - 0xb5, 0xaf, 0x9f, 0xda, 0x77, 0x67, 0x37, 0x9d, 0x23, 0xa3, 0x74, 0xd8, 0x39, 0xe9, 0xb6, 0x73, - 0xcd, 0xb5, 0xc6, 0xf0, 0xb5, 0xbd, 0x7e, 0xbf, 0x3e, 0xb0, 0x9d, 0xf6, 0x65, 0xe5, 0xea, 0xe6, - 0xa2, 0xaf, 0xa9, 0x6f, 0xa5, 0x9b, 0xcb, 0x8b, 0xeb, 0x63, 0x63, 0x77, 0xf7, 0xf9, 0xf0, 0xee, - 0xf9, 0x40, 0xa9, 0x9f, 0x9f, 0x5d, 0x3d, 0xba, 0xfd, 0x6b, 0xe7, 0xc4, 0xe8, 0xdb, 0x93, 0xd7, - 0xbb, 0xb5, 0x97, 0x41, 0xf3, 0xe8, 0x6a, 0x27, 0x7f, 0xd0, 0x38, 0x7a, 0xd9, 0x6f, 0xa4, 0xcf, - 0x4c, 0x6d, 0xe7, 0xb8, 0x58, 0x39, 0x3e, 0xde, 0xbf, 0xdb, 0xe9, 0x5d, 0x75, 0x06, 0xa3, 0x93, - 0x33, 0x3b, 0x3f, 0xb9, 0x5d, 0xb7, 0xfb, 0xaf, 0xb9, 0xbb, 0x93, 0xdb, 0xeb, 0xb2, 0xa3, 0x79, - 0xca, 0x81, 0xad, 0x34, 0x9e, 0xef, 0x1e, 0xaf, 0xaf, 0xf7, 0xd3, 0x0f, 0xcf, 0x6b, 0xe9, 0x0b, - 0xfd, 0xb6, 0xf1, 0x92, 0x3d, 0x38, 0x7a, 0x1b, 0xe4, 0xfa, 0xfa, 0xe1, 0xd3, 0xfd, 0x38, 0xdd, - 0xad, 0x3c, 0xe6, 0xae, 0x6f, 0x5f, 0xbc, 0xcb, 0xfe, 0xeb, 0x91, 0xee, 0x5d, 0xdf, 0x3c, 0xdc, - 0x9d, 0xbf, 0xbd, 0xed, 0x78, 0x83, 0xfd, 0xcb, 0x93, 0xd6, 0xa1, 0xf2, 0x76, 0xbd, 0x7d, 0x90, - 0x7e, 0x5c, 0xcf, 0xee, 0x98, 0xbd, 0x6d, 0x35, 0xaf, 0x0c, 0x4b, 0xd6, 0x61, 0xc7, 0xdd, 0xbb, - 0x3d, 0xeb, 0x3e, 0x9c, 0x5d, 0xee, 0x75, 0x2e, 0x4a, 0x4f, 0xad, 0xe3, 0xb1, 0xb2, 0x7f, 0x74, - 0xa9, 0xdf, 0x4d, 0x46, 0xdd, 0xe7, 0x66, 0xf9, 0xec, 0x68, 0x70, 0x97, 0xb6, 0x9e, 0x8a, 0xc3, - 0xfc, 0xcb, 0x4b, 0x39, 0xfb, 0x66, 0x1e, 0x8d, 0x77, 0x4f, 0x9c, 0xee, 0xe0, 0x2c, 0x9f, 0x9f, - 0xa4, 0x9b, 0xf7, 0x95, 0xd1, 0xed, 0xc1, 0xab, 0xbe, 0xa6, 0x9e, 0x56, 0x3a, 0x57, 0xc7, 0x6f, - 0x23, 0x73, 0xe7, 0xb9, 0xe2, 0x1d, 0xd9, 0x76, 0xfb, 0x68, 0xbd, 0xf9, 0xb8, 0xdb, 0xb8, 0x3b, - 0xbe, 0xdb, 0xb9, 0x3a, 0x32, 0x75, 0xfb, 0x5e, 0x39, 0x6c, 0x7a, 0x2d, 0xa3, 0x75, 0xb3, 0x36, - 0xdc, 0x99, 0x9c, 0xf6, 0x1f, 0xd4, 0xc6, 0x9d, 0x73, 0xd5, 0x38, 0x3f, 0x9b, 0x34, 0xd5, 0xe3, - 0xe3, 0xed, 0x5e, 0xfe, 0x52, 0x7f, 0x70, 0x1e, 0x9a, 0xdd, 0x76, 0xb9, 0xde, 0x7c, 0xd5, 0x5a, - 0xed, 0xdd, 0x9b, 0x8b, 0xf5, 0xbd, 0xab, 0xbd, 0x23, 0xed, 0x5e, 0xb9, 0xbb, 0xbc, 0xbf, 0x6a, - 0xb5, 0xaf, 0x2a, 0x86, 0x77, 0x79, 0xb1, 0x37, 0x48, 0xaf, 0x95, 0x5f, 0xf3, 0x47, 0xe3, 0xdb, - 0x1b, 0xeb, 0x58, 0xbb, 0xb7, 0x3b, 0xcf, 0x57, 0xfa, 0xe1, 0xe1, 0x61, 0x09, 0xa6, 0xd2, 0xee, - 0xe9, 0x73, 0xae, 0x79, 0xd8, 0xbd, 0x1a, 0x3f, 0xb8, 0xb7, 0xd0, 0xa1, 0x93, 0xc7, 0x66, 0x37, - 0xbd, 0x33, 0x86, 0xff, 0x95, 0xd7, 0xb5, 0xc3, 0xd6, 0xc5, 0x10, 0x18, 0xf4, 0x71, 0xce, 0x28, - 0x37, 0x15, 0x73, 0x77, 0xed, 0xf9, 0x20, 0xdd, 0x6c, 0xd4, 0x73, 0xed, 0x9d, 0xa7, 0xbb, 0x71, - 0x7f, 0x54, 0x79, 0x3a, 0xce, 0x1e, 0x3d, 0x7a, 0xe3, 0x4b, 0xaf, 0x79, 0x3c, 0x36, 0xec, 0xab, - 0xec, 0xe9, 0xc1, 0x73, 0xe3, 0x55, 0x51, 0x6e, 0xfa, 0xed, 0xf3, 0xa3, 0xa7, 0xb1, 0x73, 0xa0, - 0x19, 0xe9, 0x49, 0xda, 0x79, 0x3a, 0x76, 0xac, 0xb4, 0x79, 0xdb, 0x2b, 0x5c, 0x3a, 0xe7, 0x47, - 0x07, 0xa3, 0x93, 0xf2, 0xbd, 0xf3, 0x70, 0x7e, 0x76, 0x97, 0x1f, 0xdf, 0x68, 0xd7, 0xf7, 0x87, - 0x8d, 0xe7, 0x46, 0xeb, 0xc5, 0x3b, 0x3d, 0xee, 0x68, 0x39, 0xa7, 0xb5, 0xe6, 0xda, 0x93, 0xe1, - 0x4b, 0xa1, 0x59, 0xbe, 0x2b, 0xbe, 0x14, 0x2b, 0x0d, 0xa7, 0x50, 0xef, 0xe7, 0x2e, 0x87, 0xd9, - 0x2b, 0xbd, 0xd3, 0x73, 0x8f, 0xf2, 0x83, 0xb3, 0x61, 0xab, 0x52, 0x2e, 0x5c, 0xe8, 0x57, 0x57, - 0xd7, 0xe7, 0x96, 0xd6, 0xb6, 0x2f, 0x3b, 0x87, 0x66, 0x63, 0xd4, 0x02, 0x5e, 0x98, 0x56, 0x77, - 0xf7, 0xf6, 0xca, 0x6b, 0xad, 0x93, 0xb7, 0x9b, 0xee, 0xb6, 0x71, 0xd5, 0x7d, 0xb6, 0x9f, 0xbb, - 0x37, 0xbb, 0xe6, 0xb1, 0x77, 0x60, 0x3e, 0xe4, 0x5f, 0x9b, 0xfd, 0x87, 0xe3, 0xf2, 0xfe, 0xc5, - 0xf6, 0xe9, 0xd3, 0xda, 0xc8, 0x75, 0xd2, 0xc7, 0x4f, 0x6f, 0x8f, 0x66, 0xf3, 0xb9, 0xdd, 0x7c, - 0xd9, 0x19, 0xec, 0x75, 0x6e, 0x95, 0xc3, 0xa1, 0x31, 0x7a, 0x6d, 0x7a, 0xb7, 0xdd, 0xe3, 0xb5, - 0xb7, 0xeb, 0x87, 0xfd, 0xf3, 0x63, 0x77, 0xd8, 0x18, 0x1b, 0xa3, 0xb7, 0xfc, 0xfd, 0xa3, 0xa7, - 0x16, 0xc7, 0xcf, 0x8e, 0x9e, 0xed, 0xb8, 0x03, 0xc3, 0x34, 0xf7, 0xef, 0x2e, 0x27, 0x96, 0x69, - 0x5f, 0x2a, 0xd7, 0xa7, 0x25, 0xeb, 0xee, 0xfc, 0xe4, 0xe5, 0xa5, 0xb3, 0x67, 0x1c, 0x14, 0x5b, - 0xee, 0xcd, 0xee, 0x79, 0xdd, 0xed, 0xbe, 0xed, 0x14, 0x2a, 0x07, 0x6b, 0xdd, 0xc6, 0xc9, 0x5d, - 0xb7, 0xf1, 0xb4, 0xd6, 0xcf, 0xb6, 0xf6, 0x86, 0x27, 0xf5, 0xd3, 0xfe, 0xf8, 0xe4, 0x2d, 0x9b, - 0x1d, 0xac, 0xf5, 0xca, 0x5a, 0xf7, 0x70, 0x7f, 0xed, 0xcc, 0x39, 0x2c, 0x3e, 0x1f, 0xdb, 0xd9, - 0xa7, 0x71, 0xf1, 0xb5, 0x90, 0x57, 0x2b, 0x37, 0x6b, 0xb9, 0xb1, 0x79, 0x78, 0x77, 0xbd, 0x73, - 0x60, 0x74, 0xf6, 0x9f, 0xce, 0x3d, 0xaf, 0x9d, 0xdf, 0x6f, 0xdd, 0xaa, 0xea, 0xa4, 0xac, 0xad, - 0x5f, 0xbe, 0xf4, 0x06, 0xad, 0xc9, 0xb5, 0x62, 0x5d, 0x0e, 0x72, 0x6f, 0xb9, 0xb7, 0xec, 0xee, - 0x76, 0xba, 0x32, 0xd2, 0xc7, 0xf5, 0xfd, 0xf6, 0xd9, 0x6d, 0xae, 0x6b, 0xf6, 0xb7, 0x8b, 0xe3, - 0xfa, 0xa8, 0x5c, 0xb1, 0x47, 0x87, 0xad, 0xfb, 0x67, 0x63, 0xdf, 0xd9, 0x36, 0x1f, 0xc6, 0xa7, - 0xcf, 0xcf, 0xe5, 0xc2, 0xed, 0x41, 0x77, 0x78, 0x7e, 0x70, 0x77, 0x50, 0x3f, 0xde, 0x7f, 0x1b, - 0xef, 0x8f, 0xd2, 0xf7, 0x56, 0xdf, 0x5c, 0x3b, 0xab, 0xeb, 0xcd, 0xbb, 0xe6, 0xa0, 0x6c, 0x68, - 0x87, 0xd7, 0xdb, 0x25, 0xb7, 0x95, 0x53, 0x3a, 0xa7, 0x5e, 0xd3, 0x69, 0x3b, 0xd9, 0xe3, 0xd7, - 0xbb, 0xf2, 0xa3, 0x93, 0xb6, 0x86, 0xa3, 0x7d, 0xef, 0xfa, 0x70, 0x6f, 0xed, 0xac, 0xf8, 0x76, - 0xb0, 0xae, 0xbc, 0x9e, 0x6f, 0x97, 0x1f, 0xaf, 0xf7, 0x2c, 0xab, 0x94, 0x7b, 0xd9, 0x3f, 0x56, - 0x9b, 0xaf, 0x85, 0x73, 0xed, 0xf0, 0xee, 0xa4, 0xad, 0x75, 0xb2, 0x3d, 0xf7, 0x6c, 0x7f, 0xbf, - 0x61, 0x7b, 0xa5, 0x7e, 0xe5, 0xa1, 0x7f, 0xfc, 0xba, 0xbb, 0x5b, 0x37, 0xaf, 0x95, 0x56, 0x31, - 0x57, 0xe9, 0x8f, 0xfb, 0x63, 0xe7, 0xea, 0xed, 0x6a, 0x30, 0xb9, 0x34, 0x5d, 0xfb, 0x7a, 0xd4, - 0xa9, 0x3f, 0xbe, 0xd8, 0x5e, 0xef, 0xcd, 0x01, 0xb4, 0xdc, 0xe4, 0xc6, 0xe7, 0x8d, 0x4e, 0xf1, - 0xde, 0xdb, 0x3e, 0x3b, 0x5b, 0xdf, 0xbd, 0xba, 0xc9, 0xad, 0x0f, 0x4e, 0xd3, 0xdd, 0x66, 0x71, - 0xad, 0xbb, 0x7f, 0x7a, 0x59, 0x68, 0xdd, 0x28, 0x95, 0xfd, 0xca, 0x51, 0xb1, 0xfd, 0x34, 0x3e, - 0x36, 0x8a, 0xb9, 0x03, 0x77, 0xbc, 0x7e, 0x7f, 0xf8, 0x76, 0xba, 0x7d, 0x71, 0xf8, 0x76, 0xff, - 0x7c, 0xdd, 0x58, 0x3f, 0x3f, 0xdd, 0xb9, 0xb8, 0xdd, 0xde, 0xd9, 0xbf, 0x4a, 0x0f, 0x0e, 0x7a, - 0xdb, 0xd9, 0xbb, 0xb5, 0xa7, 0xb7, 0xdb, 0xd1, 0xc9, 0x5e, 0xe3, 0xa6, 0xbf, 0xeb, 0xe8, 0xc7, - 0xe9, 0x5b, 0xa4, 0xfd, 0x6c, 0x73, 0xff, 0x61, 0xff, 0xec, 0xf4, 0xd4, 0x7d, 0xee, 0xea, 0x75, - 0xaf, 0x68, 0xdb, 0x6b, 0x03, 0xc3, 0x1e, 0x37, 0xf3, 0xde, 0xdb, 0x5e, 0xe5, 0xa8, 0x32, 0xee, - 0x4d, 0x0e, 0x2f, 0x76, 0xb7, 0x4f, 0x0a, 0x8d, 0x83, 0x6e, 0xf9, 0xea, 0x32, 0x97, 0xdf, 0xd6, - 0x2f, 0x0b, 0x8f, 0x67, 0xa3, 0xbc, 0xb3, 0xbb, 0xef, 0xdd, 0xdf, 0xee, 0x3e, 0x9c, 0xa6, 0x35, - 0xd7, 0x1c, 0x16, 0x0e, 0xd7, 0xaf, 0xc6, 0xaf, 0x9d, 0x7e, 0x73, 0xd7, 0x6c, 0x9e, 0x9d, 0x3e, - 0x1f, 0xdc, 0xee, 0xdb, 0xaf, 0xaf, 0x4f, 0x4d, 0xf3, 0xbe, 0xd1, 0x55, 0x8c, 0xde, 0xfd, 0x70, - 0x7d, 0x74, 0x5b, 0x28, 0xbd, 0xde, 0x1c, 0xbe, 0x5e, 0xae, 0xbf, 0xbd, 0xde, 0x3a, 0xa7, 0x6b, - 0x2f, 0xaf, 0x27, 0xcf, 0x95, 0xc7, 0xe7, 0xa7, 0xb7, 0xae, 0x92, 0xb3, 0x9b, 0xeb, 0xe9, 0xc9, - 0x55, 0xc5, 0x7d, 0x78, 0xb2, 0x1f, 0xc7, 0x27, 0x07, 0xfa, 0xfe, 0xf1, 0xcd, 0xb9, 0x7b, 0x34, - 0x1a, 0xd9, 0x93, 0xeb, 0x62, 0xb1, 0xbb, 0x77, 0x61, 0xde, 0x65, 0xd3, 0x1a, 0x10, 0x52, 0xfb, - 0x70, 0x37, 0x9b, 0x37, 0xae, 0x0a, 0x83, 0x46, 0x69, 0x92, 0x7b, 0x7d, 0x3b, 0x7a, 0xf3, 0x1e, - 0x6e, 0xcf, 0x2f, 0xf7, 0xca, 0x56, 0xfb, 0xf1, 0x58, 0xb9, 0x7c, 0xbd, 0xd5, 0xef, 0x8f, 0xbd, - 0xee, 0xc9, 0xc1, 0xc9, 0xd9, 0xd1, 0xe9, 0x63, 0x59, 0x69, 0x8f, 0xb5, 0xc7, 0x89, 0xd9, 0x6c, - 0xa6, 0xdd, 0xfd, 0x93, 0x93, 0xd7, 0x73, 0x53, 0xb9, 0x7f, 0xcb, 0x3b, 0xa7, 0xde, 0x59, 0x73, - 0xfb, 0xea, 0xfe, 0xd2, 0x7c, 0xf4, 0xfa, 0xc7, 0x6a, 0xf1, 0xfe, 0x75, 0xff, 0xda, 0x6a, 0x66, - 0xd7, 0xfb, 0xfd, 0xc1, 0xa4, 0x75, 0x75, 0x37, 0x5c, 0xd3, 0x3b, 0x3b, 0xe7, 0xc3, 0x07, 0xc7, - 0xe8, 0xbd, 0x75, 0x77, 0x4f, 0x77, 0x87, 0x20, 0x82, 0xa7, 0x2b, 0x87, 0xa5, 0xf1, 0xf3, 0xc9, - 0x7a, 0xb1, 0xd2, 0xda, 0xd5, 0xbc, 0xf4, 0xbe, 0xfa, 0xd0, 0x69, 0xa4, 0x4f, 0x5f, 0xac, 0xec, - 0xbd, 0x97, 0x1e, 0x36, 0x5a, 0xaf, 0xaa, 0xf3, 0x5a, 0x7e, 0x79, 0xba, 0x69, 0xbe, 0x14, 0xcf, - 0xd5, 0x93, 0x57, 0xfb, 0xa2, 0xf9, 0xb2, 0xb7, 0x67, 0xbb, 0x6a, 0x6b, 0xfd, 0x34, 0xe7, 0x5c, - 0x9f, 0x3f, 0x1c, 0x77, 0x2f, 0x9b, 0xce, 0xfd, 0x64, 0xb7, 0xfd, 0xf8, 0xac, 0x95, 0xbd, 0xed, - 0xab, 0xfa, 0x9b, 0xf7, 0xd2, 0x7c, 0xdc, 0x51, 0x46, 0xbb, 0x5a, 0xf1, 0xd6, 0x3c, 0xd7, 0xed, - 0xbe, 0xf9, 0x04, 0xb2, 0xca, 0x20, 0x3b, 0x78, 0xee, 0x94, 0x4f, 0x3a, 0x6b, 0x43, 0x2d, 0x97, - 0xcb, 0x1f, 0x0e, 0x3a, 0xeb, 0xf9, 0xbd, 0x61, 0x76, 0x4d, 0x33, 0xb7, 0xb3, 0x69, 0xf3, 0x72, - 0xcd, 0x6e, 0x82, 0x90, 0x79, 0x75, 0xfc, 0xd4, 0xd4, 0x95, 0xe7, 0x9d, 0x86, 0x6d, 0x9d, 0xaf, - 0x43, 0xc7, 0x6f, 0x5e, 0x9e, 0xd7, 0x8e, 0xcf, 0x46, 0x76, 0xf3, 0xbe, 0x6b, 0xd9, 0xf5, 0x66, - 0xcf, 0x6b, 0x5e, 0xdc, 0xbf, 0x4c, 0xbc, 0xfa, 0x7e, 0xe1, 0x24, 0x9d, 0x7d, 0xb5, 0x94, 0x46, - 0xbd, 0x71, 0x7e, 0x9f, 0x3f, 0xc8, 0x37, 0x4f, 0x3b, 0xa6, 0xdb, 0xb3, 0xb7, 0x8b, 0xea, 0x7a, - 0xbb, 0xff, 0xb6, 0x96, 0x3d, 0x1c, 0x67, 0xb3, 0xed, 0x56, 0xe1, 0xe2, 0xe1, 0xfc, 0xa9, 0x08, - 0xb4, 0x3a, 0x79, 0xb8, 0xbd, 0xcb, 0xb7, 0x1f, 0xaf, 0xdd, 0xdd, 0xf5, 0xb5, 0xd7, 0x93, 0xd3, - 0xb5, 0xf5, 0x57, 0xf5, 0x6d, 0x00, 0x5d, 0x3b, 0xca, 0x0d, 0x2f, 0x1f, 0x6e, 0xd6, 0x0a, 0x6b, - 0xa5, 0xe6, 0x7d, 0xe3, 0xc0, 0x6a, 0x6d, 0x5b, 0x9d, 0xdd, 0xbc, 0x76, 0x74, 0xfd, 0x76, 0xac, - 0xb4, 0xce, 0x76, 0x14, 0x90, 0xd5, 0x46, 0x57, 0x4a, 0xb7, 0x33, 0x1c, 0x34, 0xda, 0xc3, 0x76, - 0xae, 0xd8, 0xc9, 0x0d, 0x80, 0xea, 0x4f, 0x2f, 0xf7, 0x0a, 0xc7, 0xc7, 0x87, 0xa7, 0xe5, 0xc1, - 0x4e, 0x3b, 0x6b, 0x96, 0xcc, 0x4a, 0xbb, 0x50, 0xba, 0xbd, 0x38, 0xb9, 0x34, 0xcb, 0x66, 0xcf, - 0x81, 0x05, 0xd2, 0xb9, 0x2b, 0xa8, 0xed, 0x82, 0xf9, 0x96, 0xd7, 0x6f, 0xf4, 0xf3, 0xd3, 0x62, - 0xae, 0xb8, 0x67, 0x6a, 0x9d, 0xd3, 0xec, 0xf1, 0xc1, 0xa9, 0x71, 0xff, 0xe4, 0x3d, 0xdd, 0xab, - 0xaf, 0xd6, 0x5e, 0xaf, 0x38, 0x6e, 0x3c, 0x0f, 0xdd, 0x83, 0x66, 0xb6, 0xdc, 0x5f, 0x77, 0xd4, - 0x7d, 0xc3, 0x3d, 0xed, 0x17, 0x07, 0x87, 0x2f, 0x57, 0xf7, 0xc6, 0x70, 0xed, 0x26, 0x3b, 0xd2, - 0x9e, 0xde, 0x9e, 0x0f, 0x0f, 0xb5, 0xb5, 0xf1, 0x93, 0x7e, 0xfb, 0x66, 0x1f, 0x97, 0xee, 0xeb, - 0xf7, 0xdb, 0xa7, 0xbb, 0xe7, 0xa3, 0xeb, 0x93, 0xf1, 0xe8, 0xfa, 0xd1, 0xdc, 0xb7, 0x1e, 0x0e, - 0xc6, 0x2d, 0xf5, 0x64, 0x7c, 0x5e, 0xde, 0xbd, 0xae, 0x6c, 0x9f, 0x9b, 0x79, 0x6b, 0xfd, 0xfc, - 0x15, 0x46, 0xd8, 0x1b, 0x3a, 0x6a, 0xe9, 0xc6, 0x3c, 0x7a, 0x7e, 0x38, 0xdb, 0x36, 0xfa, 0x47, - 0xfb, 0x4f, 0x85, 0xc9, 0xe5, 0xe3, 0x43, 0xe1, 0xcc, 0x5b, 0x1f, 0x96, 0xfa, 0xfd, 0xc3, 0xc1, - 0xe8, 0x71, 0x38, 0x1c, 0x5f, 0x0e, 0x35, 0xe7, 0x74, 0x5d, 0x6b, 0x0c, 0xdd, 0xb7, 0x87, 0xf3, - 0xe7, 0xdb, 0x07, 0xe7, 0xa5, 0xf9, 0xda, 0x3a, 0xb8, 0xb8, 0xbb, 0xcf, 0x37, 0xf7, 0x9a, 0xbb, - 0x07, 0x27, 0x7a, 0xe1, 0xec, 0xf4, 0xee, 0xe6, 0xfe, 0xed, 0xed, 0xfe, 0x70, 0xbf, 0x54, 0xdc, - 0x1e, 0x64, 0xf3, 0x4e, 0x3d, 0xf7, 0xfa, 0x62, 0x95, 0x8d, 0xf5, 0xce, 0x7e, 0xf7, 0xae, 0xb9, - 0x3d, 0x70, 0x3a, 0x77, 0xdb, 0xf7, 0xfb, 0xfb, 0xc6, 0xdd, 0x7d, 0x6e, 0xd0, 0x1d, 0x5f, 0x8c, - 0x5a, 0x6e, 0xba, 0x72, 0x9f, 0xcd, 0x02, 0x7f, 0x7a, 0x3a, 0xd6, 0xb5, 0x53, 0x63, 0xfd, 0xfe, - 0xa1, 0x5e, 0xd1, 0x0e, 0x4e, 0x4b, 0x2d, 0x67, 0x7b, 0xad, 0xd3, 0xbb, 0x38, 0x9b, 0x8c, 0x8d, - 0x4a, 0xf3, 0xf9, 0xea, 0xfe, 0xe0, 0x79, 0x3b, 0xd7, 0xbc, 0xcf, 0x5a, 0x2f, 0xe5, 0xdb, 0xd6, - 0xab, 0x66, 0xba, 0xce, 0xda, 0x7e, 0xe5, 0x70, 0x6d, 0xe0, 0xb9, 0xfd, 0xf6, 0xab, 0x75, 0xd8, - 0x7f, 0x5b, 0x5f, 0x77, 0x86, 0x13, 0x6d, 0x2f, 0x7b, 0xf9, 0x06, 0x02, 0x42, 0xb1, 0x3f, 0xbc, - 0x7b, 0x38, 0x7d, 0x9e, 0x3c, 0x56, 0x86, 0x95, 0xe7, 0xd2, 0x43, 0xef, 0x49, 0x3b, 0x2c, 0xa8, - 0x97, 0x0f, 0x6b, 0xa5, 0xb6, 0xad, 0x5f, 0x94, 0xb4, 0xf3, 0xec, 0xc5, 0xdb, 0xa8, 0x75, 0xb0, - 0xf6, 0xf6, 0xd2, 0x31, 0xbc, 0xac, 0xdb, 0x2e, 0x69, 0x6b, 0x8f, 0xad, 0xd7, 0xe6, 0x85, 0x35, - 0xea, 0x5c, 0x77, 0xf3, 0xf9, 0xeb, 0x52, 0xa9, 0x52, 0x52, 0xbd, 0xfc, 0xf0, 0xe1, 0xa1, 0xb2, - 0x76, 0x9f, 0x7b, 0x54, 0xba, 0x57, 0xca, 0xda, 0x7a, 0x71, 0x7d, 0x4d, 0x7b, 0xbc, 0xc9, 0xed, - 0xbd, 0x4c, 0xac, 0xbd, 0xd7, 0xb3, 0x47, 0x90, 0x01, 0x0f, 0xdb, 0x95, 0xab, 0xe1, 0xc9, 0x81, - 0x73, 0x7d, 0x50, 0x6e, 0x1e, 0x3f, 0xde, 0xec, 0xee, 0xec, 0x3c, 0x3d, 0x1e, 0xec, 0xdd, 0xb7, - 0xfa, 0xa5, 0x83, 0x1c, 0xa0, 0x31, 0xaf, 0x97, 0x8a, 0x8f, 0xeb, 0xf7, 0x9e, 0xbe, 0x3d, 0x78, - 0x31, 0x2e, 0x4b, 0x6b, 0x8f, 0xde, 0xf6, 0xd3, 0x59, 0xfd, 0xde, 0x18, 0xe4, 0x3b, 0x8f, 0x6f, - 0xbb, 0x67, 0x6b, 0x57, 0xe9, 0xd2, 0x3e, 0x70, 0xf2, 0x46, 0xe1, 0xe2, 0xad, 0xf4, 0x0c, 0x6b, - 0xd8, 0x91, 0xda, 0xf2, 0x9a, 0xf7, 0x97, 0xd6, 0x68, 0x70, 0xd5, 0x3d, 0x9f, 0x1c, 0x1a, 0x83, - 0x13, 0x43, 0x1d, 0xad, 0x8f, 0xcc, 0xe6, 0x45, 0xdf, 0x1b, 0xa8, 0xcf, 0x56, 0xf6, 0xae, 0x31, - 0x5a, 0x07, 0x8e, 0xdc, 0xb8, 0x1e, 0x9d, 0xb5, 0x06, 0x40, 0x96, 0x4f, 0xa3, 0xfd, 0x5e, 0xaf, - 0xec, 0xae, 0xf5, 0xdc, 0x57, 0x47, 0xbf, 0xdf, 0x71, 0xbb, 0xf5, 0xbc, 0x5b, 0x30, 0xf7, 0x41, - 0x6c, 0x2e, 0x1e, 0xad, 0x5d, 0xa4, 0x55, 0x77, 0x3c, 0x1a, 0x3f, 0x35, 0xbd, 0xd3, 0x53, 0xa5, - 0xb0, 0xb7, 0xde, 0xec, 0xb5, 0xae, 0xcb, 0x8f, 0x6f, 0xeb, 0xfd, 0xa3, 0xe6, 0xbe, 0x72, 0xbb, - 0x5e, 0x3e, 0x51, 0xc6, 0x07, 0xf5, 0xb5, 0xe6, 0x78, 0x7d, 0x92, 0x36, 0xf2, 0xd9, 0xec, 0x5a, - 0xe1, 0x39, 0x7d, 0x98, 0xd7, 0x95, 0xbd, 0x83, 0x76, 0x7e, 0x6d, 0x50, 0xbf, 0x3b, 0x3f, 0xca, - 0xde, 0xf7, 0x76, 0x1e, 0x07, 0xf7, 0xaf, 0x47, 0xbb, 0xea, 0xe3, 0x58, 0x6d, 0xbb, 0x8a, 0xd1, - 0xba, 0xdb, 0xbf, 0x4b, 0xb7, 0x2f, 0x8c, 0xc3, 0xfe, 0xf6, 0x38, 0xfb, 0x7a, 0xb1, 0xd6, 0x2a, - 0x67, 0x07, 0x4f, 0x0f, 0x8a, 0x77, 0xad, 0xdd, 0x7a, 0xc7, 0x57, 0xc3, 0x72, 0x71, 0x02, 0xe4, - 0x5b, 0x1f, 0x3e, 0x94, 0xc7, 0xbb, 0xda, 0x5b, 0xfd, 0x21, 0x5b, 0xb9, 0xef, 0x57, 0x76, 0xba, - 0xbd, 0xec, 0x7a, 0xe9, 0x62, 0xfd, 0x62, 0xec, 0x9e, 0xef, 0x3c, 0x9a, 0xee, 0xc3, 0xfd, 0x55, - 0x7a, 0xcd, 0xde, 0x79, 0xab, 0x64, 0xcf, 0xcf, 0x9e, 0x4a, 0x6b, 0x4f, 0xf5, 0xa3, 0x83, 0xbd, - 0xf6, 0xcd, 0x28, 0xad, 0xda, 0x95, 0xbb, 0xf4, 0x51, 0xe1, 0xfc, 0xf6, 0x4e, 0x83, 0x39, 0x35, - 0xd2, 0x87, 0x69, 0xa3, 0xd5, 0x7a, 0x7d, 0xce, 0xad, 0xe5, 0x1f, 0xd6, 0x1e, 0x47, 0xa5, 0xee, - 0x71, 0xfd, 0xf6, 0xea, 0xe0, 0xf1, 0xf2, 0xaa, 0x7c, 0x35, 0x19, 0x5f, 0x77, 0xba, 0xda, 0x4e, - 0xfa, 0xaa, 0x55, 0xba, 0x37, 0xeb, 0x67, 0x3b, 0xf5, 0xc3, 0xfd, 0x61, 0xf9, 0xe6, 0xd8, 0xd3, - 0xbc, 0x82, 0x6d, 0x66, 0x2b, 0x85, 0x66, 0xf1, 0x71, 0xa7, 0x7e, 0xb4, 0x3d, 0x2c, 0x94, 0xac, - 0x8e, 0x7d, 0x73, 0x3d, 0xf1, 0x4a, 0x97, 0xcf, 0x20, 0x93, 0xde, 0x54, 0x4e, 0x1e, 0xeb, 0x7b, - 0x57, 0x27, 0x15, 0x73, 0xbf, 0xbb, 0xdd, 0x02, 0xb1, 0xf8, 0x76, 0x04, 0xb4, 0xff, 0x7a, 0xd8, - 0xd8, 0x3e, 0xb1, 0xf6, 0x0e, 0xd6, 0x4e, 0x9e, 0xae, 0x4e, 0xcf, 0xec, 0x67, 0xab, 0x34, 0xe8, - 0xa9, 0xd9, 0xcb, 0xa3, 0xfc, 0x64, 0xb0, 0x7d, 0x7f, 0xb1, 0x73, 0xd3, 0xd8, 0x7d, 0x52, 0x9f, - 0xed, 0xd7, 0xab, 0x72, 0x25, 0xfd, 0xa4, 0xe6, 0x2a, 0xcf, 0xdd, 0x83, 0xee, 0xe3, 0xd9, 0x4d, - 0xc5, 0xdc, 0xee, 0x3d, 0x9f, 0xb4, 0xf6, 0x9d, 0x93, 0x9d, 0xc7, 0xfd, 0xf2, 0xe4, 0xa4, 0xf1, - 0x74, 0x7d, 0xba, 0x5f, 0xf2, 0xae, 0x4b, 0x8f, 0x27, 0xbd, 0xdb, 0xb7, 0xb7, 0xf3, 0xfb, 0xb3, - 0x52, 0xbe, 0xbf, 0x3d, 0x1c, 0x5c, 0x9e, 0xe9, 0xa7, 0x6b, 0xe3, 0xcb, 0x71, 0xf1, 0x56, 0xbd, - 0xee, 0xee, 0xeb, 0xc7, 0x4f, 0xf5, 0xbb, 0x7d, 0xb7, 0xf5, 0x94, 0x3f, 0xbc, 0x3d, 0xea, 0xdd, - 0x5e, 0xb6, 0xf6, 0xd4, 0xc3, 0xd2, 0xfd, 0xfd, 0xee, 0x70, 0xd8, 0x1f, 0xb6, 0x2f, 0x3b, 0x46, - 0xe9, 0x44, 0xdd, 0x19, 0x5e, 0x54, 0xac, 0x5c, 0xba, 0xb3, 0xbf, 0xb3, 0xdd, 0x2c, 0xf7, 0x86, - 0x83, 0xd3, 0xb7, 0x8a, 0x71, 0x76, 0x7d, 0x31, 0xea, 0x3c, 0x5f, 0x9e, 0x57, 0x74, 0xd5, 0x59, - 0x57, 0xae, 0x77, 0x76, 0xf4, 0xeb, 0x9d, 0x63, 0xa7, 0x30, 0xe8, 0xbe, 0x1e, 0x76, 0xca, 0xa7, - 0xaf, 0xdd, 0xdb, 0xc7, 0x47, 0xb7, 0xd4, 0x7b, 0x1b, 0x0e, 0xd6, 0xbd, 0xb3, 0xa3, 0x8b, 0x5b, - 0x27, 0x3b, 0xb6, 0x87, 0xd7, 0xee, 0xf9, 0xdd, 0xb0, 0xfd, 0x94, 0xb5, 0xd3, 0xfd, 0xed, 0x8a, - 0xb9, 0x76, 0x97, 0x07, 0xae, 0xa8, 0xdc, 0xa4, 0xd5, 0xeb, 0xde, 0xa5, 0x7d, 0xde, 0x73, 0xcf, - 0xf7, 0x2f, 0x5e, 0xc7, 0xd6, 0x5e, 0x7e, 0xa0, 0xb8, 0x83, 0xd7, 0x1b, 0xdd, 0xee, 0x8e, 0x4b, - 0x95, 0xa3, 0xe3, 0x3a, 0x31, 0x51, 0xd4, 0x24, 0xa1, 0x63, 0x39, 0x7d, 0xd5, 0x4b, 0x7d, 0x45, - 0x05, 0xea, 0xab, 0x34, 0xab, 0x3a, 0x96, 0xe5, 0x4d, 0x57, 0x57, 0x5b, 0xab, 0xb9, 0xea, 0xe7, - 0x5c, 0x2e, 0xb7, 0x81, 0x8f, 0x9d, 0xea, 0xe7, 0x4e, 0xa7, 0x43, 0x1e, 0xf3, 0x55, 0x34, 0x0c, - 0x91, 0xc7, 0x42, 0xf5, 0x73, 0xa1, 0x50, 0x20, 0x8f, 0xc5, 0xea, 0xe7, 0x62, 0xb1, 0x48, 0x1e, - 0x4b, 0xd5, 0xcf, 0xa5, 0x52, 0x89, 0x3c, 0x96, 0xab, 0x9f, 0xcb, 0xe5, 0x32, 0x79, 0xac, 0x54, - 0x3f, 0x57, 0x2a, 0x15, 0xf2, 0xd8, 0xac, 0x7e, 0x6e, 0x36, 0x9b, 0xe4, 0xb1, 0x55, 0xfd, 0xdc, - 0x6a, 0xb5, 0xc8, 0xa3, 0x56, 0xfd, 0xac, 0x69, 0x1a, 0x79, 0x6c, 0x57, 0x3f, 0xb7, 0xdb, 0x6d, - 0xf2, 0xe8, 0x40, 0x86, 0x02, 0x6d, 0xad, 0x0b, 0x0d, 0xb7, 0x28, 0x38, 0x06, 0xb4, 0x56, 0x51, - 0xc9, 0xe3, 0xa4, 0xfa, 0x59, 0x5d, 0x57, 0xe0, 0xd1, 0x83, 0x7a, 0x95, 0x0c, 0x6d, 0xd7, 0xaa, - 0x3a, 0xdd, 0xa6, 0x9a, 0x2a, 0x14, 0x65, 0xc1, 0xff, 0xa7, 0x64, 0xd6, 0x25, 0xf2, 0xcd, 0x6b, - 0xce, 0x7f, 0x04, 0xad, 0x3e, 0x45, 0x6a, 0x90, 0xfc, 0x3c, 0x2a, 0xcd, 0x94, 0x53, 0xf2, 0xb2, - 0x10, 0xfe, 0x99, 0xcf, 0xd7, 0xa3, 0xf9, 0x4a, 0x39, 0x59, 0xf0, 0xff, 0x45, 0x33, 0x79, 0xbd, - 0xea, 0x9a, 0x62, 0x8f, 0xf1, 0xc9, 0xf6, 0x9f, 0xa0, 0x54, 0xb9, 0x40, 0xd3, 0x9a, 0x76, 0x35, - 0x57, 0xb4, 0xc7, 0x02, 0xfd, 0xa3, 0xb0, 0x27, 0xcc, 0x03, 0x5f, 0xd6, 0xe1, 0x55, 0x11, 0xd6, - 0xf0, 0x2f, 0x29, 0xd5, 0xae, 0x9a, 0x96, 0x89, 0x28, 0x72, 0xbb, 0x76, 0x55, 0x6c, 0xa2, 0x71, - 0x44, 0xc4, 0x0f, 0x7d, 0xaf, 0x0a, 0x25, 0x67, 0x68, 0x56, 0x9c, 0x12, 0x6b, 0xc2, 0xaa, 0x4a, - 0x0d, 0x28, 0x7d, 0x15, 0xe4, 0xff, 0x81, 0x41, 0xec, 0x0f, 0xb3, 0xa6, 0xd5, 0x9e, 0x4c, 0xfb, - 0xaa, 0xd3, 0xd5, 0xcd, 0xaa, 0xb2, 0x81, 0x16, 0xa6, 0xae, 0x63, 0x0d, 0xcc, 0x36, 0x35, 0xfc, - 0x55, 0x29, 0xd8, 0x30, 0xea, 0xd2, 0x06, 0xaf, 0x6f, 0x1f, 0x6a, 0xc6, 0x50, 0xf3, 0xf4, 0x96, - 0x2a, 0xdf, 0x69, 0x4e, 0x5b, 0x35, 0x55, 0xd9, 0x55, 0x4d, 0x77, 0xd5, 0xd5, 0x1c, 0xbd, 0x43, - 0x33, 0xba, 0xfa, 0x9b, 0x56, 0xcd, 0x01, 0x94, 0x1b, 0xd1, 0x8a, 0x3a, 0xd2, 0x86, 0xa7, 0x8d, - 0xbd, 0x55, 0xd5, 0xd0, 0xbb, 0x66, 0xb5, 0xa5, 0xa1, 0x35, 0x61, 0x03, 0x6d, 0x84, 0x2f, 0xba, - 0xb7, 0x4a, 0xc1, 0x6c, 0xa9, 0x86, 0x81, 0x56, 0x1d, 0xda, 0x2d, 0xf6, 0x69, 0x00, 0x75, 0x43, - 0xfd, 0x86, 0xd6, 0xf2, 0x3f, 0xf4, 0xad, 0xb7, 0xa4, 0x54, 0x77, 0x3e, 0x71, 0x3e, 0x97, 0xdf, - 0x9e, 0x6a, 0xaf, 0xf6, 0xf4, 0x6e, 0xcf, 0x40, 0xeb, 0x13, 0xeb, 0xb1, 0xe7, 0x40, 0x4f, 0x6c, - 0xd5, 0x01, 0xc8, 0x36, 0xdc, 0x96, 0x63, 0x19, 0x46, 0x53, 0x75, 0xa8, 0x61, 0xb5, 0x5a, 0x86, - 0xee, 0x84, 0x69, 0xd1, 0x8e, 0xb9, 0x4d, 0x49, 0xe0, 0xca, 0x12, 0xc4, 0xca, 0x04, 0xf9, 0x3d, - 0x0d, 0xab, 0xaf, 0xe6, 0x14, 0xe5, 0xcf, 0x0d, 0x5a, 0x0f, 0x79, 0xb4, 0x2d, 0x57, 0x27, 0xe3, - 0xd1, 0xd1, 0xc7, 0x5a, 0x7b, 0xc3, 0x82, 0x65, 0x95, 0xd6, 0xbd, 0xda, 0xd4, 0x7a, 0xea, 0x50, - 0x87, 0xba, 0x11, 0xd8, 0xd9, 0xe7, 0x66, 0x97, 0xab, 0x62, 0xd8, 0x0b, 0xeb, 0x18, 0x8e, 0xe2, - 0x95, 0xbc, 0xad, 0xea, 0x66, 0x5b, 0x1b, 0x57, 0x57, 0x73, 0x91, 0xb1, 0x0c, 0x72, 0x31, 0x7c, - 0x73, 0x9f, 0x1c, 0xcd, 0xd6, 0x54, 0x44, 0x0b, 0x7b, 0xe2, 0xbf, 0x91, 0x31, 0x6c, 0x21, 0x60, - 0x1b, 0x96, 0xad, 0xb6, 0x74, 0x6f, 0x02, 0x24, 0x42, 0xfa, 0x48, 0x6b, 0x63, 0x89, 0x42, 0xde, - 0x9d, 0xd9, 0x3e, 0x0d, 0x11, 0x6a, 0x55, 0x84, 0x3c, 0xfe, 0x9d, 0xa9, 0xb2, 0x5a, 0x1d, 0xea, - 0x90, 0x5b, 0x6b, 0xcb, 0xf6, 0x34, 0x8a, 0xaf, 0xb6, 0xc4, 0x7f, 0x9e, 0x12, 0xa2, 0x68, 0x6b, - 0x2d, 0xcb, 0x21, 0x74, 0x49, 0xbb, 0xde, 0x1c, 0x78, 0x9e, 0x65, 0x4e, 0x81, 0x18, 0x0c, 0xdd, - 0xd4, 0xa0, 0xf1, 0xd6, 0xc0, 0x71, 0xa1, 0x0e, 0xdb, 0xd2, 0xb1, 0x1f, 0xb3, 0x8c, 0xa1, 0x36, - 0x35, 0xc3, 0x0d, 0xe9, 0xd7, 0x56, 0xdb, 0x6d, 0xdd, 0xec, 0x56, 0x2b, 0x1c, 0x10, 0x9f, 0xd1, - 0x26, 0x4d, 0x32, 0x4e, 0x63, 0xd8, 0x6a, 0x5a, 0x50, 0x7d, 0xbf, 0x0a, 0xf4, 0xd6, 0x4a, 0x51, - 0xb0, 0x9a, 0x3d, 0x49, 0x48, 0x0b, 0x30, 0xcc, 0xd2, 0x86, 0x43, 0x30, 0x5e, 0x9e, 0x23, 0xe0, - 0xb6, 0x14, 0x83, 0x62, 0x63, 0xe4, 0x40, 0xa5, 0x66, 0x17, 0x08, 0xb2, 0xad, 0x55, 0x01, 0x59, - 0x38, 0x2f, 0x8c, 0x55, 0xc7, 0xa0, 0xa8, 0x42, 0x46, 0x0a, 0xdc, 0x13, 0x4d, 0x68, 0xa9, 0x5c, - 0x45, 0x69, 0x6b, 0x5d, 0x69, 0x96, 0x69, 0x3a, 0xfa, 0xd4, 0x87, 0x15, 0x66, 0xf6, 0x2c, 0x33, - 0x72, 0xd0, 0xfe, 0xe5, 0xc4, 0x21, 0xf4, 0x2c, 0x1b, 0x7a, 0x65, 0x68, 0x1d, 0x98, 0xcb, 0x0c, - 0x22, 0x7e, 0x60, 0x03, 0xa0, 0xbc, 0xa6, 0x14, 0x8c, 0x7d, 0x6e, 0x96, 0x41, 0x93, 0xb9, 0x9b, - 0x64, 0x20, 0xa3, 0x53, 0x13, 0x4d, 0x69, 0x80, 0x60, 0x60, 0xf0, 0x06, 0x37, 0x59, 0xf3, 0x00, - 0xc8, 0x27, 0xbd, 0x8f, 0xfb, 0x0b, 0x2a, 0xd0, 0x3e, 0x62, 0x7c, 0xd5, 0xa7, 0x3b, 0x2e, 0xbd, - 0xad, 0xbb, 0xb6, 0xa1, 0x4e, 0xaa, 0xba, 0x49, 0x72, 0x10, 0x7e, 0xc3, 0x5a, 0xcc, 0xc0, 0x58, - 0x45, 0x91, 0x85, 0x7d, 0x65, 0x9f, 0x3a, 0x9d, 0xd8, 0xb7, 0x32, 0xe2, 0xc1, 0xf2, 0x04, 0x9a, - 0x41, 0xce, 0x40, 0x5f, 0xd9, 0xb3, 0x3f, 0x9e, 0xab, 0x64, 0x00, 0x85, 0x22, 0x19, 0xc6, 0x4c, - 0x6f, 0xd0, 0x65, 0x46, 0x3f, 0x02, 0x6e, 0x31, 0x8f, 0x78, 0xb3, 0x0d, 0xa0, 0x68, 0x67, 0x22, - 0xdc, 0xd4, 0xb7, 0x4f, 0xf7, 0xe4, 0x8c, 0xab, 0x75, 0xbd, 0xa9, 0x87, 0xdb, 0x0c, 0xab, 0xcc, - 0x34, 0x4c, 0xf1, 0x18, 0x4e, 0xbb, 0x19, 0xc9, 0x23, 0xdc, 0xec, 0x06, 0xf8, 0xcf, 0x47, 0xba, - 0x3d, 0xc7, 0x9c, 0xb8, 0x36, 0x76, 0xe5, 0xa0, 0x30, 0xc7, 0xe3, 0x90, 0x67, 0xfb, 0x75, 0x29, - 0x1b, 0xc1, 0xf8, 0xd3, 0x3a, 0xfa, 0x7a, 0xbb, 0x6d, 0x68, 0xb3, 0xcc, 0x8b, 0x36, 0xf1, 0x18, - 0x91, 0xd3, 0x0f, 0x38, 0xa6, 0xb3, 0xcc, 0x50, 0x35, 0xa2, 0xc9, 0x64, 0x8c, 0x59, 0xba, 0xa0, - 0x73, 0xcd, 0xb8, 0x30, 0x58, 0x06, 0x00, 0x4f, 0xac, 0xce, 0x64, 0x4f, 0x64, 0x1a, 0x92, 0x17, - 0x79, 0x32, 0x90, 0xc2, 0x00, 0x18, 0x19, 0xfe, 0x01, 0x6a, 0xb5, 0x85, 0x99, 0x1e, 0x53, 0x34, - 0x07, 0x70, 0xc4, 0x85, 0x79, 0x1e, 0x52, 0x7c, 0x2d, 0x72, 0x90, 0x57, 0x8e, 0x40, 0x10, 0x9b, - 0x08, 0x73, 0x13, 0x1c, 0x8a, 0xa9, 0x0e, 0x70, 0x74, 0x92, 0x39, 0x20, 0x6d, 0xb5, 0xe9, 0x5a, - 0xc6, 0xc0, 0xd3, 0x08, 0x75, 0xc3, 0x4c, 0xa5, 0xf4, 0x9d, 0xcb, 0x23, 0x1e, 0x69, 0x4d, 0xab, - 0x1a, 0x9a, 0xbb, 0x5d, 0xca, 0xac, 0xd9, 0x4e, 0x01, 0x2e, 0x80, 0x8c, 0x1c, 0xf3, 0x64, 0xca, - 0x10, 0x6b, 0xf4, 0xa2, 0xaa, 0x7d, 0x2a, 0x25, 0x35, 0xf8, 0xed, 0xd0, 0x09, 0xb4, 0x8e, 0x53, - 0x3a, 0xc6, 0x47, 0x3a, 0x86, 0x33, 0x9d, 0x5f, 0xa7, 0xe2, 0xd3, 0x57, 0x91, 0x78, 0xee, 0x17, - 0x7c, 0x16, 0x32, 0x05, 0x77, 0x23, 0xb9, 0x77, 0xe1, 0xa4, 0xe5, 0x38, 0x13, 0x60, 0x75, 0x6c, - 0xcb, 0xf8, 0x47, 0x85, 0x09, 0xdb, 0x16, 0x48, 0xeb, 0x8b, 0x79, 0x85, 0x6e, 0x4c, 0x93, 0xe6, - 0xdc, 0x02, 0x4a, 0xfb, 0x6c, 0xe8, 0x43, 0x0d, 0xf7, 0x09, 0xfd, 0x35, 0x03, 0xf1, 0x16, 0xc1, - 0x06, 0xb7, 0x04, 0x35, 0x2d, 0x07, 0xc6, 0xb2, 0x0a, 0x93, 0x0b, 0xe6, 0xcc, 0x74, 0x6e, 0xf1, - 0xe7, 0x97, 0xc2, 0xf9, 0xb1, 0x85, 0xb9, 0xbb, 0x80, 0xa1, 0x06, 0x1c, 0x8b, 0x6f, 0x6a, 0x91, - 0x64, 0x01, 0xac, 0x8b, 0x34, 0x2f, 0x30, 0x66, 0xbf, 0x14, 0x8a, 0x8e, 0x61, 0xc1, 0x62, 0x85, - 0xb5, 0xfb, 0xb0, 0xd3, 0x01, 0x0e, 0x47, 0x85, 0x94, 0xc1, 0x11, 0x91, 0xe3, 0x15, 0x91, 0x61, - 0x5a, 0x2a, 0x9b, 0xb4, 0xa4, 0x8d, 0xbe, 0x6e, 0xb2, 0xb5, 0xbe, 0x48, 0x88, 0x0c, 0x99, 0x12, - 0x03, 0xcc, 0x1f, 0x41, 0x26, 0xc9, 0x35, 0x6d, 0xc8, 0xcd, 0xd6, 0x1d, 0xca, 0xc8, 0x12, 0xf3, - 0x35, 0x31, 0x1f, 0x23, 0xe1, 0xd2, 0x9f, 0x5c, 0x89, 0xb0, 0xcb, 0xd5, 0x1e, 0x2e, 0xb1, 0xd3, - 0x25, 0x18, 0xea, 0x49, 0x31, 0x48, 0xb5, 0x08, 0xce, 0x32, 0x28, 0xd8, 0x0d, 0xb5, 0x65, 0x35, - 0xa8, 0x12, 0xc7, 0xe3, 0xe2, 0x94, 0x3e, 0x7b, 0xb7, 0x82, 0xf2, 0xf2, 0xe2, 0xb8, 0x07, 0xac, - 0x02, 0x65, 0x3a, 0xa0, 0x21, 0x80, 0x08, 0xc0, 0x8f, 0x3b, 0x7d, 0xe4, 0x96, 0x58, 0x53, 0xfa, - 0x0b, 0x3f, 0x48, 0xfe, 0x64, 0x26, 0x9f, 0x30, 0x45, 0x58, 0xf5, 0x85, 0x64, 0x5b, 0x0a, 0x9e, - 0xa1, 0xeb, 0x3e, 0x9a, 0x57, 0x71, 0x42, 0x05, 0x39, 0x36, 0x92, 0xb8, 0x1f, 0xd7, 0x8c, 0x2e, - 0x2b, 0x52, 0x56, 0x08, 0x9a, 0x5c, 0x25, 0x6d, 0x4a, 0x8b, 0xa5, 0x2c, 0x44, 0x27, 0xdb, 0xca, - 0x9e, 0x72, 0x54, 0x16, 0x10, 0xb8, 0xa3, 0xa1, 0xc0, 0x3c, 0xd4, 0x16, 0xf4, 0x0d, 0xdf, 0xb3, - 0x7e, 0x6b, 0x12, 0x10, 0xe7, 0x18, 0xa9, 0x0c, 0xc9, 0x80, 0xd2, 0xe9, 0x2a, 0xa4, 0x04, 0xd3, - 0x8d, 0x40, 0x01, 0x8d, 0x8c, 0xaa, 0xea, 0xc0, 0xb3, 0x36, 0x78, 0xf9, 0x70, 0xb1, 0x14, 0xb8, - 0xd7, 0xe9, 0x80, 0xfc, 0xea, 0x4e, 0x7d, 0xd9, 0xd5, 0xaf, 0x63, 0x95, 0x66, 0xc7, 0xa6, 0x88, - 0xf8, 0x3c, 0xfb, 0x6c, 0x63, 0x3f, 0xe4, 0xcf, 0xf6, 0xab, 0x01, 0x7f, 0x06, 0x9e, 0x0e, 0x3f, - 0xb0, 0x6c, 0xd1, 0x44, 0x78, 0x08, 0x52, 0xf0, 0x21, 0xef, 0x6f, 0xc4, 0x56, 0x50, 0x57, 0xe0, - 0xb2, 0xc7, 0x72, 0xe1, 0xbc, 0xf0, 0x19, 0x0a, 0x32, 0x6a, 0x5f, 0xda, 0x83, 0x55, 0x42, 0xc0, - 0x4e, 0xa0, 0x9c, 0xc5, 0x32, 0x0b, 0xb8, 0x48, 0xea, 0xc1, 0x3c, 0x20, 0xc3, 0x86, 0xcc, 0x3d, - 0x0a, 0x18, 0x83, 0x28, 0x10, 0xdd, 0x48, 0x2d, 0x0c, 0x80, 0x60, 0x0a, 0x95, 0xc8, 0xfa, 0x0f, - 0x93, 0xc5, 0xed, 0x83, 0xfa, 0xd9, 0x9b, 0x26, 0x72, 0x5f, 0x6e, 0xd0, 0x3b, 0x72, 0x4e, 0xfa, - 0x2b, 0x53, 0x72, 0x25, 0x41, 0x53, 0x5d, 0x6d, 0x15, 0xd6, 0x7f, 0x32, 0xae, 0xab, 0x54, 0xfa, - 0x0b, 0x9a, 0x52, 0x84, 0x55, 0x52, 0xb3, 0xcf, 0x94, 0x57, 0x19, 0xdf, 0xe2, 0x59, 0xa5, 0x4f, - 0x7e, 0xc8, 0xe9, 0x10, 0xd5, 0x90, 0x16, 0xe7, 0x76, 0x0b, 0xe4, 0xfa, 0x88, 0xcc, 0xb6, 0x70, - 0x46, 0x15, 0xa4, 0x98, 0xe8, 0x15, 0xb4, 0xdc, 0x31, 0xb4, 0xf1, 0x06, 0xe1, 0xe9, 0xab, 0x20, - 0x19, 0xf7, 0x5d, 0x5f, 0x68, 0x7f, 0x1e, 0xb8, 0x9e, 0xde, 0x99, 0xac, 0x32, 0x2a, 0xf5, 0x93, - 0x03, 0xb1, 0x2f, 0x17, 0x08, 0xe9, 0x99, 0xf5, 0x12, 0xcf, 0x12, 0x33, 0x6b, 0x6e, 0xd2, 0xc2, - 0x0a, 0x58, 0xf5, 0xd4, 0x09, 0x74, 0x5d, 0x26, 0x0f, 0x00, 0x76, 0xb0, 0xce, 0xd0, 0x05, 0x26, - 0xe8, 0xae, 0x4f, 0x72, 0xd0, 0x7e, 0xeb, 0x65, 0x12, 0xa6, 0xd3, 0x77, 0x5e, 0x78, 0x22, 0x5d, - 0xf7, 0x21, 0xca, 0x6f, 0x44, 0x06, 0x97, 0x8e, 0xb0, 0xdf, 0xe8, 0x94, 0xe1, 0xbc, 0x84, 0x84, - 0x41, 0x65, 0x0a, 0x97, 0xd1, 0x62, 0x01, 0x75, 0x88, 0x68, 0xd9, 0x78, 0x9b, 0xc1, 0x4a, 0x13, - 0x94, 0x15, 0x7c, 0x5d, 0x80, 0x27, 0x3b, 0x14, 0xcd, 0x16, 0x88, 0x50, 0xd3, 0x04, 0x29, 0x3a, - 0x8f, 0xac, 0x66, 0xbc, 0x1a, 0x81, 0x22, 0x58, 0x0f, 0xc8, 0x0c, 0x89, 0x41, 0xc5, 0xe6, 0xb6, - 0xa3, 0xb6, 0xf5, 0x81, 0x5b, 0xcd, 0x95, 0x88, 0x04, 0x13, 0x63, 0x18, 0x7e, 0x83, 0x02, 0xac, - 0x25, 0x96, 0xe1, 0xe9, 0x36, 0x4a, 0x7b, 0x53, 0x54, 0x7b, 0x9a, 0xba, 0x81, 0xa3, 0xd5, 0x83, - 0x85, 0x5b, 0x33, 0x17, 0x53, 0x4a, 0x49, 0xfa, 0x88, 0x0a, 0xcd, 0x4f, 0x19, 0x02, 0x79, 0x14, - 0x36, 0xd4, 0x63, 0x18, 0x8d, 0x96, 0x15, 0x1e, 0xcc, 0x40, 0x5c, 0x09, 0xe8, 0xc8, 0xc7, 0x2d, - 0x21, 0x66, 0x42, 0xc6, 0x25, 0xc5, 0x5f, 0xb8, 0x56, 0xc9, 0xfb, 0xea, 0x3a, 0xb2, 0x80, 0xa5, - 0x2a, 0x61, 0x66, 0xad, 0xe4, 0x26, 0xf6, 0xbc, 0x5a, 0x55, 0x3b, 0x00, 0xef, 0xd4, 0xa7, 0x62, - 0x51, 0x5c, 0x20, 0x3a, 0x2d, 0x69, 0xbe, 0x14, 0x76, 0x8f, 0xf6, 0x89, 0x4b, 0xa0, 0xca, 0x0d, - 0xd4, 0xa3, 0xb7, 0xfd, 0xa4, 0x38, 0x3a, 0x79, 0x35, 0x7d, 0xd1, 0xb3, 0x0f, 0x3b, 0x5d, 0x9b, - 0x17, 0x8e, 0x1d, 0x79, 0x34, 0xb4, 0x00, 0x17, 0xb9, 0x19, 0xe1, 0x6e, 0x19, 0xad, 0x0d, 0xd3, - 0x85, 0x88, 0xa6, 0xbc, 0xe8, 0x05, 0x3a, 0x0c, 0xd4, 0x19, 0x49, 0x0a, 0x27, 0x0f, 0x08, 0xa1, - 0xba, 0xe3, 0xfa, 0x0c, 0x91, 0x72, 0x4d, 0xc2, 0x93, 0x3d, 0x4b, 0x85, 0xe4, 0x10, 0xdb, 0xcb, - 0x08, 0x85, 0xad, 0x30, 0x39, 0x20, 0x02, 0x82, 0x02, 0x21, 0x91, 0xb4, 0xd7, 0x01, 0xa1, 0x1f, - 0x20, 0xa9, 0x28, 0x05, 0x95, 0x38, 0x35, 0x27, 0x9f, 0xe7, 0x49, 0x28, 0x6a, 0x7a, 0x28, 0x85, - 0x83, 0x96, 0xa8, 0x57, 0xac, 0x96, 0x70, 0xf1, 0x5f, 0xa4, 0x7a, 0x63, 0xcd, 0x52, 0x5c, 0x4a, - 0x4b, 0x62, 0x5e, 0x14, 0x2d, 0x19, 0xb7, 0x67, 0x8d, 0x02, 0xdc, 0xe4, 0x36, 0x54, 0x53, 0xef, - 0x53, 0xfb, 0x41, 0x47, 0x6d, 0x6b, 0xba, 0x29, 0xc0, 0x62, 0x20, 0x87, 0x8f, 0x42, 0x1e, 0xff, - 0x38, 0x1a, 0x2e, 0xb2, 0x41, 0x15, 0x9a, 0xe3, 0x58, 0x0e, 0x57, 0xc7, 0x1c, 0x7e, 0x3f, 0x37, - 0xf3, 0xc9, 0x35, 0xcf, 0x32, 0xa0, 0xf2, 0xab, 0x73, 0x66, 0x05, 0x9f, 0xf5, 0xfb, 0xc2, 0xb0, - 0xaf, 0x02, 0xe0, 0x90, 0x72, 0x1d, 0xf6, 0x7a, 0x28, 0xe6, 0xe4, 0xb0, 0xbf, 0x0b, 0x87, 0xd4, - 0x4a, 0x94, 0x73, 0x1e, 0x53, 0x54, 0x82, 0x4a, 0x56, 0x46, 0x8a, 0x2e, 0xaf, 0x6c, 0xf0, 0xab, - 0x0c, 0x4e, 0xfc, 0x88, 0xe8, 0x81, 0x4a, 0x94, 0xe5, 0x6a, 0xd3, 0x38, 0x77, 0xa5, 0x7c, 0x9c, - 0x8a, 0x41, 0x54, 0x23, 0xfd, 0xac, 0x9b, 0x1d, 0x4b, 0xfe, 0x6c, 0x5a, 0x6d, 0xcd, 0x9d, 0xfa, - 0x43, 0x5d, 0x9c, 0x7d, 0x76, 0x88, 0xe8, 0xea, 0x27, 0x14, 0x66, 0x9f, 0xcd, 0xb6, 0x11, 0x2c, - 0xea, 0x39, 0x66, 0x80, 0x21, 0x99, 0x80, 0xef, 0x27, 0x9a, 0x37, 0x62, 0x18, 0x49, 0x0b, 0x25, - 0xc4, 0x08, 0x55, 0x09, 0xe3, 0xaa, 0x4b, 0x4c, 0x6d, 0xfb, 0x0c, 0x13, 0xcc, 0x84, 0x96, 0x3f, - 0x6a, 0xd7, 0x09, 0x6b, 0x2e, 0x72, 0xc4, 0x5c, 0x9a, 0x63, 0x96, 0x24, 0x65, 0x8e, 0x0a, 0xd0, - 0xa0, 0x1c, 0xd8, 0xd7, 0xf2, 0x14, 0x23, 0x82, 0xbf, 0x9a, 0x84, 0x93, 0x2b, 0xaf, 0x44, 0xd7, - 0x8d, 0x5c, 0x11, 0xab, 0xe3, 0x70, 0x19, 0xea, 0x00, 0x91, 0x2a, 0xd0, 0x02, 0x34, 0xe5, 0xaa, - 0x60, 0x5f, 0x89, 0x31, 0x83, 0x21, 0x9e, 0xbe, 0xbc, 0x63, 0xdf, 0x60, 0xc5, 0xda, 0x41, 0x99, - 0xf6, 0x34, 0x26, 0xe6, 0x54, 0x82, 0xca, 0x33, 0x4d, 0xcf, 0xf4, 0x07, 0xab, 0x14, 0x6d, 0x92, - 0x7c, 0x8b, 0xb4, 0x1b, 0xc9, 0xed, 0x03, 0xdf, 0xd6, 0x87, 0x7e, 0x26, 0x78, 0xe4, 0xd0, 0x50, - 0x5c, 0x9f, 0x5b, 0x2e, 0xa1, 0x48, 0xbf, 0x3b, 0xf2, 0x6b, 0xa8, 0x30, 0xc9, 0x11, 0x34, 0x56, - 0xbe, 0x5c, 0x99, 0xa0, 0x2f, 0xd1, 0xc8, 0xf4, 0xb9, 0x07, 0x0a, 0xbf, 0x37, 0x9d, 0x57, 0xf6, - 0xd6, 0x23, 0x7a, 0x5d, 0x68, 0xb2, 0x73, 0xb4, 0xf6, 0x0c, 0x9a, 0xe4, 0x6a, 0x27, 0x8b, 0x0a, - 0xbe, 0x72, 0xb2, 0xdb, 0x2c, 0x33, 0xd2, 0xa7, 0xc4, 0xd9, 0x74, 0x15, 0x38, 0x3f, 0x8c, 0x04, - 0x12, 0x85, 0x0d, 0x68, 0xc5, 0xa9, 0xd6, 0xde, 0x88, 0x7f, 0x69, 0x39, 0x00, 0xdb, 0xaa, 0xd6, - 0xee, 0x6a, 0xae, 0xaf, 0xd7, 0x11, 0x3e, 0xfd, 0x1f, 0x2f, 0xda, 0xa4, 0xe3, 0xa8, 0x7d, 0xc0, - 0x04, 0xe5, 0x10, 0xd3, 0x8e, 0x63, 0xf5, 0xa7, 0x01, 0x17, 0x08, 0x18, 0xf8, 0xcc, 0xb3, 0xa6, - 0xcb, 0xd9, 0x5f, 0xb8, 0x9a, 0xf8, 0xcb, 0x10, 0xc3, 0x47, 0xb0, 0x6a, 0x7e, 0xfd, 0xba, 0x68, - 0xd5, 0xcc, 0xfb, 0xf6, 0x94, 0xd0, 0xe0, 0x51, 0x09, 0x2d, 0x27, 0x51, 0xca, 0x0e, 0xd8, 0x4c, - 0x51, 0x8a, 0x8b, 0x32, 0xe5, 0x05, 0xc6, 0x98, 0xd0, 0xc0, 0x8c, 0x5b, 0x0c, 0x5d, 0x5e, 0x0b, - 0xfc, 0x4c, 0x48, 0x58, 0x88, 0x41, 0x4c, 0x72, 0x91, 0xa2, 0x5c, 0xbb, 0x38, 0xa8, 0xaa, 0xb3, - 0xda, 0xc5, 0xd6, 0xd0, 0x45, 0x72, 0x1d, 0x4d, 0x1d, 0xf2, 0x67, 0x45, 0x01, 0xc9, 0x3c, 0x57, - 0xfa, 0x53, 0x86, 0x81, 0x83, 0xfa, 0xba, 0xff, 0x5a, 0x7d, 0x9f, 0x95, 0x8e, 0x02, 0x15, 0x36, - 0xff, 0xc5, 0x0a, 0x15, 0xec, 0xf1, 0xe8, 0xdf, 0xab, 0xb0, 0xd3, 0xc1, 0x0a, 0x5f, 0x12, 0x2a, - 0x94, 0x3f, 0x8f, 0x9a, 0xaa, 0x11, 0x6f, 0xe5, 0xfd, 0xba, 0x3b, 0x9d, 0x4a, 0x27, 0xd7, 0x11, - 0x14, 0x52, 0xb7, 0x00, 0xab, 0xae, 0xfc, 0xb9, 0xd5, 0x6c, 0x37, 0x49, 0x3b, 0x3d, 0x6d, 0x3c, - 0x92, 0x69, 0x6b, 0xf2, 0xe7, 0xd7, 0x96, 0xbb, 0x0a, 0x6f, 0x4e, 0xb7, 0x49, 0xdf, 0xb1, 0x39, - 0x99, 0xf6, 0x2d, 0x26, 0xbe, 0x50, 0x10, 0x9a, 0x83, 0x26, 0xb2, 0x21, 0xce, 0x2e, 0x37, 0xaf, - 0x25, 0x27, 0x5a, 0xac, 0x62, 0x34, 0xa6, 0x24, 0x13, 0x63, 0x21, 0x41, 0xde, 0xe5, 0x6c, 0xe5, - 0xc4, 0x1c, 0x9c, 0x8f, 0x2c, 0x6c, 0x64, 0x73, 0x8c, 0xd2, 0x3a, 0x4a, 0xfc, 0x1c, 0x83, 0x08, - 0x45, 0x35, 0x21, 0x93, 0x87, 0xa5, 0x1f, 0xd5, 0x42, 0x39, 0x90, 0x51, 0xfd, 0x14, 0x4e, 0x94, - 0x9d, 0x93, 0xcb, 0x67, 0xc0, 0x64, 0x41, 0x29, 0x8d, 0x74, 0x9d, 0x08, 0x1d, 0x4b, 0xa5, 0x40, - 0xce, 0xf9, 0x96, 0xf8, 0xde, 0xfe, 0x08, 0xd4, 0x76, 0x34, 0xf3, 0xab, 0x90, 0xd6, 0xd2, 0xe6, - 0xac, 0x71, 0xa1, 0x11, 0x79, 0xf1, 0x7e, 0x5c, 0xc4, 0x24, 0x17, 0x5d, 0x0d, 0xe7, 0xda, 0xac, - 0x76, 0xac, 0xd6, 0xc0, 0x0d, 0x77, 0x4f, 0x12, 0x72, 0x84, 0xaa, 0x1d, 0xb5, 0xea, 0x3a, 0x03, - 0xd3, 0x24, 0xab, 0x0b, 0xb4, 0xd3, 0x7a, 0x99, 0x72, 0xc0, 0x31, 0x06, 0x52, 0x50, 0xe6, 0xac, - 0xa7, 0xfc, 0x18, 0xa2, 0xb2, 0xfe, 0x7e, 0x2b, 0x5e, 0x6f, 0xd0, 0x6f, 0x06, 0x7b, 0x5a, 0xbc, - 0x6a, 0x32, 0xbf, 0x14, 0x47, 0x4c, 0x87, 0x3c, 0x49, 0xc4, 0x80, 0x58, 0x84, 0x5f, 0x4e, 0x9c, - 0x06, 0x51, 0x32, 0x11, 0x38, 0xdc, 0x48, 0x24, 0x2f, 0xcb, 0x7b, 0x3d, 0x37, 0x16, 0x64, 0x8f, - 0x57, 0x91, 0xc9, 0xff, 0xa4, 0xf7, 0x6a, 0x26, 0x5d, 0xf6, 0x0d, 0x40, 0x4c, 0x38, 0xe7, 0x07, - 0xf3, 0x1f, 0x62, 0x23, 0x51, 0x4a, 0x44, 0x79, 0x67, 0xf6, 0x99, 0xf8, 0xb5, 0xbb, 0xc2, 0xef, - 0x0e, 0x4b, 0x25, 0x04, 0xa4, 0x12, 0x00, 0x82, 0x9b, 0x25, 0x31, 0xcd, 0x22, 0x17, 0xb1, 0xcf, - 0x11, 0x29, 0x62, 0x49, 0x8b, 0x0b, 0x30, 0x92, 0x54, 0xed, 0x8c, 0x17, 0x8c, 0xf8, 0x81, 0x60, - 0x8c, 0xa7, 0xa0, 0x24, 0x72, 0x1e, 0x7f, 0x85, 0x52, 0x02, 0x38, 0x12, 0x04, 0xac, 0x32, 0x27, - 0x9c, 0xb0, 0x1d, 0x4b, 0xdc, 0x61, 0x6a, 0x4f, 0x13, 0xcc, 0x3f, 0x9f, 0x9b, 0x8e, 0x4e, 0xca, - 0xce, 0xcb, 0x70, 0x9c, 0x49, 0xb2, 0xd9, 0xf7, 0xe2, 0x7c, 0xd5, 0x56, 0x0d, 0xb4, 0xc0, 0x91, - 0x13, 0x0f, 0xf3, 0x5c, 0x76, 0x38, 0xcf, 0x6c, 0xa3, 0xc6, 0x05, 0x0e, 0xd4, 0x19, 0xab, 0x65, - 0x4e, 0x39, 0x24, 0x22, 0x19, 0x2f, 0xed, 0xf3, 0x7d, 0x2a, 0xc6, 0x70, 0xc5, 0x31, 0xcc, 0xf5, - 0x0f, 0x6c, 0x6b, 0x46, 0x49, 0x2f, 0x5f, 0x8a, 0x70, 0xd6, 0xd5, 0xf6, 0x80, 0x6d, 0xd4, 0xa2, - 0x55, 0xdd, 0x27, 0x24, 0xa4, 0x4d, 0xf4, 0xcd, 0x5f, 0x9d, 0x37, 0x6f, 0x04, 0x5b, 0xee, 0xf3, - 0x84, 0x5a, 0x68, 0xd3, 0x59, 0x44, 0xf5, 0xa0, 0x05, 0xe5, 0x97, 0x96, 0x0b, 0x94, 0x9a, 0x96, - 0xa1, 0xdb, 0x54, 0x93, 0x8d, 0x26, 0x2d, 0xd4, 0x8b, 0x0b, 0xd2, 0x32, 0x13, 0x1d, 0xb3, 0x47, - 0x12, 0xc9, 0x77, 0xd5, 0xa5, 0xb6, 0x00, 0x39, 0xb4, 0x73, 0x26, 0xa5, 0xe6, 0xa3, 0xc9, 0xf8, - 0xe2, 0xdb, 0xf7, 0x17, 0xc1, 0x50, 0x92, 0x96, 0xe9, 0xf4, 0x33, 0x5a, 0xdf, 0x34, 0x22, 0xc0, - 0x06, 0xdb, 0x0e, 0xf0, 0x89, 0x98, 0x19, 0xfc, 0x1d, 0x53, 0x7f, 0x81, 0x04, 0x7a, 0x4e, 0xde, - 0x20, 0x5a, 0xb0, 0x7f, 0x8b, 0x15, 0x99, 0x53, 0x9e, 0x5a, 0x02, 0x62, 0xac, 0xf8, 0xd3, 0x03, - 0xf3, 0xf8, 0x33, 0x28, 0x97, 0xe7, 0xf2, 0x94, 0xe8, 0x06, 0x2d, 0xf9, 0x0e, 0xad, 0xb5, 0xdb, - 0xb2, 0xff, 0xdc, 0xd6, 0x0c, 0xfa, 0x3c, 0xf6, 0x3b, 0x50, 0x8c, 0x6e, 0xb7, 0x72, 0x36, 0x65, - 0xde, 0x14, 0xc2, 0x8a, 0xb0, 0xfa, 0xe9, 0x36, 0x30, 0xc2, 0xc0, 0x8f, 0x47, 0xf8, 0x5d, 0xe1, - 0xd4, 0x19, 0x4c, 0x5e, 0x88, 0xe9, 0x62, 0x6c, 0x44, 0xfd, 0xce, 0x14, 0x08, 0xdb, 0xa2, 0x6a, - 0x4c, 0x06, 0xab, 0x8a, 0x6a, 0x3a, 0x7c, 0x91, 0xf8, 0xf0, 0xcf, 0x0d, 0xfc, 0x74, 0x99, 0xc9, - 0x77, 0x09, 0x1d, 0x2e, 0xc2, 0x5f, 0xe8, 0xdc, 0x30, 0xea, 0xe9, 0x9e, 0xb6, 0x0a, 0x0b, 0x06, - 0x59, 0xdb, 0x90, 0x63, 0xcc, 0x28, 0x57, 0x99, 0x67, 0x0b, 0x90, 0xcc, 0x21, 0x2f, 0x2e, 0x78, - 0x15, 0x17, 0x68, 0x58, 0x3e, 0xb7, 0xe0, 0x14, 0x06, 0xf2, 0xcc, 0xbb, 0x02, 0xe4, 0x2b, 0xac, - 0xfe, 0x66, 0xc0, 0x4b, 0xb9, 0xdc, 0xe5, 0x78, 0xee, 0x70, 0x0d, 0xe3, 0x3a, 0x8d, 0x02, 0x29, - 0xe5, 0x95, 0xd3, 0xd8, 0xd2, 0x41, 0x9d, 0x74, 0x78, 0xd7, 0x88, 0x50, 0x16, 0x8a, 0xb1, 0xaf, - 0x65, 0x68, 0xfe, 0x18, 0x6b, 0x4b, 0x36, 0x93, 0xcd, 0x9b, 0x02, 0x12, 0xb9, 0x5e, 0xe9, 0xbf, - 0x9d, 0xeb, 0xcd, 0x3e, 0x7b, 0xde, 0x34, 0xc1, 0x5d, 0xa1, 0x65, 0xcc, 0x93, 0x20, 0x2a, 0x1a, - 0x74, 0xc3, 0xdf, 0x9e, 0xf2, 0x93, 0x96, 0x9a, 0x8a, 0x99, 0x11, 0x55, 0xeb, 0xb3, 0x2c, 0xc6, - 0x34, 0x79, 0xe3, 0x36, 0x58, 0x6c, 0x73, 0x45, 0x44, 0x1d, 0x0a, 0x28, 0x7e, 0x09, 0x8d, 0x2f, - 0x32, 0x0f, 0x14, 0x3d, 0x87, 0x37, 0xfd, 0xf8, 0x98, 0x75, 0x22, 0x02, 0x95, 0x09, 0xa2, 0x82, - 0xe6, 0xfc, 0x90, 0xb9, 0x24, 0x6c, 0xe3, 0xc7, 0xf4, 0x83, 0xea, 0x43, 0x4c, 0xee, 0x5a, 0x3a, - 0xda, 0xc9, 0xb6, 0x33, 0x42, 0x72, 0x9c, 0x62, 0x31, 0xbf, 0xb9, 0x9c, 0x77, 0x37, 0x42, 0x3f, - 0xa5, 0x04, 0x69, 0x14, 0x01, 0xee, 0xe8, 0x9a, 0xd1, 0xa6, 0x9e, 0x6b, 0x89, 0x5f, 0x92, 0x12, - 0x13, 0xf0, 0x30, 0xe7, 0x30, 0xe2, 0x8f, 0xa0, 0x12, 0x95, 0x70, 0x29, 0x8e, 0xe6, 0x47, 0x63, - 0xbe, 0x46, 0xaa, 0x2a, 0xcc, 0xe1, 0x97, 0x69, 0x10, 0x09, 0x58, 0x2e, 0x27, 0x8d, 0x4f, 0x28, - 0x51, 0xea, 0xa6, 0x89, 0xb6, 0x78, 0x1b, 0xa6, 0x36, 0xdd, 0xa2, 0x96, 0x97, 0xe5, 0x06, 0xbc, - 0x45, 0x73, 0x2f, 0xd2, 0x96, 0x28, 0xd3, 0x10, 0xe6, 0xba, 0xc8, 0x4c, 0x47, 0x40, 0xc0, 0xf1, - 0x4f, 0x19, 0xdb, 0x1b, 0x7b, 0xd3, 0xd8, 0x46, 0xad, 0xb0, 0x2a, 0xa0, 0xda, 0x2a, 0xcd, 0x30, - 0x0b, 0x88, 0xdf, 0xea, 0x82, 0xcd, 0xa0, 0x39, 0x3a, 0x9a, 0xaf, 0x07, 0x79, 0x69, 0xb0, 0x95, - 0xbd, 0xae, 0x24, 0x9b, 0x12, 0x17, 0xc9, 0xb8, 0xb0, 0xf0, 0x87, 0x24, 0xe3, 0x68, 0x84, 0xd0, - 0x88, 0xd2, 0x12, 0xa3, 0x3b, 0xce, 0x52, 0x39, 0xcb, 0xa8, 0xb6, 0x8e, 0x5d, 0x62, 0x4d, 0xae, - 0x41, 0x9f, 0xab, 0x55, 0xca, 0x36, 0xa3, 0x33, 0x2c, 0x80, 0x1b, 0xfd, 0x2b, 0x08, 0x16, 0x82, - 0x15, 0x9d, 0x09, 0x09, 0x09, 0x4e, 0x5d, 0xfe, 0xbe, 0x60, 0x80, 0x33, 0x24, 0x29, 0x7e, 0x61, - 0xb6, 0xd1, 0x99, 0x8e, 0xb8, 0x41, 0xe1, 0xc3, 0x74, 0x7e, 0x49, 0x8a, 0xb3, 0xda, 0xf9, 0x6d, - 0x85, 0x65, 0xc2, 0x9a, 0x66, 0x40, 0x9a, 0xab, 0xbb, 0xd1, 0x45, 0xa4, 0x18, 0x9d, 0x96, 0x64, - 0xf0, 0xb8, 0xed, 0x8c, 0xdc, 0xda, 0x92, 0xfd, 0xc2, 0x70, 0x1b, 0x8e, 0x80, 0x4e, 0x9c, 0x6d, - 0x02, 0xf8, 0x17, 0xb8, 0xde, 0x28, 0xbe, 0xf7, 0xdf, 0x2a, 0xe5, 0x70, 0x4d, 0x97, 0x5f, 0x91, - 0x98, 0x47, 0x5a, 0x65, 0x6e, 0xb3, 0xd8, 0xed, 0xda, 0x12, 0x6b, 0x66, 0x4a, 0x96, 0x62, 0xea, - 0xa0, 0x16, 0xbc, 0x03, 0x07, 0xb6, 0xf5, 0xf6, 0x87, 0xfc, 0xa0, 0x62, 0xe6, 0xcc, 0x79, 0x24, - 0x46, 0x49, 0x13, 0x87, 0xd8, 0xd4, 0x46, 0xd0, 0x2b, 0xdf, 0x25, 0xab, 0xad, 0x75, 0xd4, 0x81, - 0xe1, 0xa1, 0xf7, 0x5d, 0x00, 0x7b, 0x39, 0x10, 0xa3, 0x32, 0xe3, 0x50, 0x1e, 0xe3, 0xfc, 0xaa, - 0x8a, 0xc5, 0x88, 0x4c, 0x47, 0xb2, 0x05, 0xd2, 0x05, 0x11, 0x24, 0x42, 0xa2, 0x08, 0x2c, 0x8a, - 0x44, 0x3d, 0x69, 0xb9, 0x20, 0x0f, 0x8d, 0x43, 0xd1, 0x6b, 0x9e, 0xd6, 0xdb, 0x9c, 0x07, 0x49, - 0x98, 0x1f, 0x6a, 0x8f, 0x6f, 0xe4, 0xf1, 0xd9, 0x02, 0xcf, 0x4d, 0x99, 0x48, 0x34, 0x04, 0x0d, - 0x6e, 0x4f, 0x6d, 0x03, 0xa5, 0xac, 0xe2, 0x0a, 0x44, 0xfe, 0x28, 0x9c, 0x78, 0x27, 0x27, 0xa7, - 0x92, 0x94, 0xc4, 0xbc, 0xf1, 0x44, 0x18, 0x22, 0xd7, 0x73, 0xe7, 0x7d, 0xc1, 0x18, 0x0e, 0x88, - 0x4f, 0x90, 0x3d, 0x72, 0xe6, 0x5c, 0x19, 0x13, 0xdd, 0x51, 0xa0, 0x72, 0x99, 0xec, 0xef, 0xc4, - 0xdd, 0xcd, 0x54, 0x90, 0x71, 0xe6, 0xbd, 0x68, 0xda, 0xbc, 0x87, 0x6a, 0x40, 0x1c, 0xa1, 0xd1, - 0x3e, 0x34, 0xe7, 0xce, 0x32, 0x1d, 0xe7, 0x6d, 0x4a, 0xc8, 0xa5, 0x90, 0x4f, 0xdc, 0xcd, 0x45, - 0x92, 0x5a, 0x2d, 0xcc, 0xdb, 0x6a, 0xf8, 0xd5, 0x8d, 0x73, 0x18, 0xe5, 0x7c, 0xd1, 0xa0, 0xe2, - 0x28, 0x37, 0x68, 0xf5, 0xb4, 0xd6, 0x8b, 0x9c, 0x41, 0x86, 0x66, 0x2d, 0xf2, 0x10, 0x08, 0xb4, - 0xef, 0x78, 0x4f, 0x1d, 0x6d, 0xd8, 0xea, 0xbd, 0x18, 0xb1, 0xf9, 0xa3, 0x08, 0x28, 0x71, 0xfb, - 0x4a, 0x74, 0x60, 0x22, 0xe7, 0x84, 0x41, 0xec, 0xe4, 0xcd, 0xae, 0x30, 0x57, 0x5e, 0xa1, 0xa5, - 0x43, 0x17, 0x94, 0x55, 0x36, 0xb3, 0x08, 0x94, 0x74, 0x65, 0x60, 0xb0, 0xd2, 0x97, 0x04, 0x8c, - 0x86, 0xd6, 0xbe, 0x18, 0x72, 0x18, 0x49, 0xfb, 0x7e, 0x6b, 0x7e, 0xad, 0xd0, 0x90, 0xdf, 0x7f, - 0x7c, 0x4c, 0xa8, 0x91, 0x67, 0x54, 0x9c, 0x59, 0x94, 0x6e, 0xa3, 0xc5, 0x9d, 0xe2, 0xfe, 0x96, - 0x7e, 0x90, 0x07, 0xfa, 0x08, 0x21, 0x88, 0x30, 0x0c, 0x5e, 0x5a, 0x0f, 0xe7, 0x68, 0x3e, 0xff, - 0x8e, 0xf5, 0x68, 0xde, 0xa0, 0xc8, 0x75, 0x77, 0x3a, 0x6f, 0xaa, 0x65, 0x5f, 0xd9, 0x86, 0x38, - 0xc1, 0xed, 0xff, 0x9c, 0xc3, 0x4f, 0xf4, 0x6b, 0x08, 0xf0, 0x52, 0xfd, 0x36, 0xa8, 0x84, 0xba, - 0x06, 0x70, 0xa8, 0xfe, 0x88, 0xaf, 0x40, 0x02, 0xb1, 0x0a, 0xf1, 0x2a, 0xe9, 0x54, 0x59, 0x67, - 0x43, 0x12, 0x8e, 0x52, 0x29, 0x44, 0x1d, 0xe7, 0x33, 0x51, 0x8d, 0xa2, 0x3e, 0x90, 0x1f, 0x19, - 0x8f, 0x02, 0xf2, 0x83, 0xe1, 0x29, 0x50, 0x9d, 0x37, 0xb9, 0x3d, 0xe8, 0x82, 0xe5, 0x15, 0x4b, - 0xd3, 0x79, 0xf1, 0x9f, 0xad, 0x30, 0xc5, 0x12, 0xfa, 0x76, 0x92, 0xd3, 0x0a, 0x8b, 0xbe, 0x2d, - 0x48, 0x67, 0x64, 0x20, 0xcc, 0x21, 0xc9, 0xdf, 0x6d, 0xe4, 0xba, 0xe4, 0xd3, 0x60, 0x69, 0xde, - 0x93, 0xa2, 0xba, 0xba, 0xf6, 0x71, 0xeb, 0x22, 0x99, 0x89, 0xe1, 0x50, 0x93, 0x79, 0x19, 0xa1, - 0x45, 0xba, 0x4e, 0xf6, 0xe2, 0x5e, 0xd1, 0x1f, 0x59, 0xb6, 0x9a, 0xbe, 0x42, 0xb2, 0xca, 0x39, - 0x04, 0x65, 0x6c, 0x90, 0x86, 0xc8, 0x2a, 0xbd, 0x98, 0x72, 0xf2, 0x1f, 0x97, 0xf3, 0xa3, 0xde, - 0x0d, 0xc4, 0xaf, 0x6f, 0xa9, 0x28, 0x5f, 0x72, 0xe7, 0x94, 0xcd, 0xa8, 0x2d, 0x2c, 0x37, 0xef, - 0x19, 0x44, 0xfc, 0xca, 0x09, 0x32, 0x50, 0xfe, 0xe0, 0x44, 0x2b, 0xd6, 0xad, 0x68, 0x2a, 0xc9, - 0x2d, 0x64, 0x5c, 0xca, 0xdb, 0x12, 0xb9, 0xf7, 0x9a, 0x3f, 0xbf, 0xd7, 0xb1, 0x72, 0x43, 0x77, - 0x39, 0x56, 0x16, 0x73, 0x46, 0xa4, 0xae, 0x49, 0xef, 0x75, 0x89, 0x0d, 0x7c, 0xe0, 0x8a, 0x25, - 0xe4, 0x13, 0x8c, 0x82, 0x71, 0xb9, 0x0b, 0x5a, 0x76, 0xbd, 0xa3, 0x69, 0x82, 0x3b, 0xda, 0xc2, - 0x4d, 0x80, 0xf9, 0x71, 0x0a, 0xc4, 0x3b, 0xa6, 0xd5, 0xce, 0x3b, 0x73, 0xcd, 0x63, 0x77, 0xce, - 0xbf, 0x70, 0x83, 0x77, 0x41, 0x54, 0x92, 0xcc, 0x0a, 0x1c, 0xaf, 0x0c, 0x8d, 0x34, 0x04, 0xfc, - 0xe8, 0x52, 0x41, 0xa5, 0x65, 0xad, 0x3d, 0x4d, 0xdc, 0x09, 0x9d, 0xf9, 0xae, 0x89, 0xc4, 0x8f, - 0x91, 0x32, 0x34, 0x60, 0x2e, 0x5e, 0xea, 0x7b, 0xcb, 0x50, 0x5d, 0xf7, 0xaf, 0x9a, 0xbf, 0x56, - 0xfe, 0x90, 0x64, 0x52, 0xfb, 0xd2, 0x2c, 0x49, 0x6d, 0x94, 0xa4, 0x10, 0x06, 0x7e, 0x5e, 0x71, - 0x89, 0xc1, 0xf4, 0xe2, 0x12, 0x13, 0xf4, 0xe1, 0xc4, 0x8f, 0x71, 0xcd, 0x78, 0xde, 0xaa, 0x49, - 0xc0, 0x0e, 0xd1, 0x10, 0x5d, 0xa6, 0x62, 0x5f, 0x65, 0xf6, 0x4a, 0x46, 0x6a, 0x1a, 0x8a, 0x0c, - 0xd4, 0x99, 0x53, 0x08, 0xf2, 0x2d, 0xec, 0x3f, 0x9b, 0xd5, 0x79, 0x9f, 0xf9, 0x12, 0x4f, 0xd0, - 0xce, 0x18, 0x09, 0x5a, 0x48, 0x00, 0xa4, 0x52, 0x9c, 0xff, 0x4e, 0xdb, 0x0e, 0x4b, 0xa3, 0x61, - 0x7d, 0x69, 0xf1, 0x58, 0x86, 0x58, 0x79, 0x92, 0xea, 0xfb, 0xfa, 0xfa, 0x82, 0x45, 0x70, 0xaa, - 0x2e, 0x49, 0x75, 0xc0, 0x02, 0x0b, 0xf4, 0x1d, 0xfa, 0x11, 0xf8, 0xd5, 0x30, 0x61, 0xdf, 0x68, - 0x2d, 0x51, 0x36, 0x8b, 0x0b, 0x04, 0xe1, 0x9e, 0x3a, 0xc8, 0x75, 0x66, 0x7b, 0xba, 0xd8, 0xdf, - 0x30, 0x01, 0x34, 0x28, 0x30, 0x3f, 0xf8, 0x51, 0x29, 0x2d, 0xe2, 0xf0, 0x9f, 0xe4, 0x97, 0xcc, - 0xeb, 0x56, 0x38, 0xb5, 0x88, 0xc9, 0x37, 0xa6, 0x0c, 0xf8, 0xb3, 0x30, 0xce, 0x48, 0x13, 0xe6, - 0x6e, 0xb2, 0x32, 0xbd, 0xd4, 0xf4, 0x99, 0xd4, 0x8b, 0x39, 0xe3, 0x43, 0x8c, 0x90, 0x8b, 0x8b, - 0xca, 0x31, 0xcb, 0x7b, 0xe2, 0x37, 0xa4, 0xd2, 0x2a, 0xe0, 0xa6, 0xa5, 0xf5, 0x2c, 0x83, 0xf8, - 0x0b, 0xf6, 0xac, 0x91, 0x29, 0x2d, 0x9f, 0x2e, 0xb8, 0x1a, 0xe9, 0xe4, 0x10, 0x0c, 0xe7, 0xd7, - 0x4c, 0xe4, 0xae, 0x85, 0x1c, 0xb9, 0x5c, 0x64, 0xbb, 0x33, 0xab, 0xa6, 0xec, 0xdb, 0x85, 0x97, - 0x19, 0x1d, 0x17, 0x73, 0x4f, 0xe6, 0x64, 0x26, 0x84, 0x3b, 0x09, 0x0c, 0x10, 0xe1, 0xdf, 0xd8, - 0x5b, 0xc0, 0xae, 0x09, 0xfc, 0x84, 0xf0, 0x7b, 0x99, 0x24, 0x56, 0xd1, 0xa0, 0x59, 0xe4, 0x59, - 0x6b, 0xff, 0xcf, 0x79, 0xa1, 0xc7, 0x9f, 0xf6, 0xfc, 0xd9, 0x96, 0xc0, 0x13, 0x92, 0x4f, 0xf4, - 0x11, 0x1a, 0xa6, 0x80, 0x8e, 0x1d, 0x79, 0x45, 0x18, 0x22, 0x72, 0x7c, 0xd8, 0x6c, 0x4c, 0xf0, - 0x91, 0xa9, 0x0f, 0x60, 0x92, 0x3d, 0x9b, 0x5f, 0x6f, 0x5b, 0x49, 0xa6, 0x52, 0xdb, 0xca, 0x47, - 0x3a, 0x1a, 0xd7, 0x40, 0x40, 0xd5, 0x53, 0x1d, 0xff, 0x4c, 0x1b, 0x7a, 0x13, 0x65, 0x7a, 0xa0, - 0x1e, 0xd1, 0x21, 0xe6, 0x5d, 0xf7, 0xf3, 0xcb, 0xec, 0xd1, 0xcd, 0x40, 0x7b, 0xa4, 0x32, 0x23, - 0xb7, 0xef, 0xea, 0x1f, 0x25, 0x9d, 0x06, 0xc7, 0x4b, 0x93, 0xbe, 0xb2, 0x6d, 0xe9, 0xd8, 0x36, - 0x7b, 0x62, 0x46, 0xba, 0xa7, 0x3a, 0x3f, 0xff, 0xdc, 0x66, 0xe8, 0x55, 0x94, 0xc9, 0xcf, 0xdb, - 0xa8, 0x16, 0xd7, 0x36, 0x77, 0x38, 0x85, 0xab, 0xb3, 0x27, 0xcd, 0xfe, 0xa3, 0x0f, 0x03, 0xac, - 0x0a, 0x30, 0xad, 0x04, 0xe0, 0xb9, 0x02, 0x0c, 0x9f, 0x90, 0xf2, 0xd7, 0x43, 0x53, 0x93, 0xa6, - 0xdc, 0xde, 0x2b, 0xad, 0x29, 0x9d, 0xe0, 0x4f, 0xb1, 0xdc, 0x97, 0xc2, 0x6f, 0x23, 0xa8, 0x9f, - 0xf3, 0xd1, 0x46, 0x35, 0x32, 0x68, 0x84, 0x55, 0x16, 0xa1, 0xdc, 0x25, 0x85, 0x4b, 0x68, 0xba, - 0x90, 0x58, 0x6a, 0x20, 0xcc, 0x15, 0xd6, 0xd0, 0xa2, 0x37, 0xfd, 0x80, 0x27, 0xdc, 0xbc, 0xaf, - 0x9e, 0xbf, 0x75, 0x24, 0xc7, 0xb7, 0x92, 0x38, 0x4f, 0xc0, 0xf7, 0xfc, 0xe6, 0x0a, 0x28, 0x95, - 0x2d, 0x05, 0x1b, 0x39, 0x34, 0xf4, 0x99, 0x3b, 0x99, 0xe4, 0xfb, 0x0b, 0x64, 0xca, 0x7f, 0xc6, - 0x4e, 0xc0, 0xd2, 0xa3, 0x93, 0xf3, 0xb5, 0x05, 0xdd, 0x2d, 0xa1, 0x25, 0x5f, 0x8a, 0xb7, 0xb1, - 0x86, 0xb2, 0x60, 0x62, 0x1b, 0xc5, 0x4c, 0xfe, 0xa3, 0x6d, 0xcc, 0xd5, 0xc6, 0x6d, 0xaf, 0xc7, - 0x5c, 0x9f, 0x83, 0x2d, 0x76, 0x5e, 0x50, 0xe3, 0x64, 0x68, 0xba, 0xf3, 0xfe, 0xde, 0x80, 0xae, - 0xad, 0x57, 0xc8, 0xd0, 0x51, 0x88, 0xcf, 0x89, 0xab, 0xea, 0x47, 0x89, 0x21, 0x97, 0x2f, 0xae, - 0x73, 0x85, 0x2f, 0x5b, 0xfd, 0x58, 0x51, 0x8c, 0x45, 0x47, 0x42, 0xd0, 0x09, 0xdf, 0xb2, 0x2c, - 0x30, 0x27, 0x9e, 0xf0, 0x86, 0x1f, 0x18, 0x3f, 0x41, 0x6f, 0xd7, 0xc4, 0xd6, 0x50, 0x14, 0x88, - 0xfc, 0x53, 0x13, 0xd9, 0x81, 0x11, 0x71, 0x13, 0xc3, 0xe3, 0x01, 0xa6, 0x04, 0x0c, 0xee, 0x28, - 0xdc, 0x1e, 0x65, 0x32, 0x99, 0x6f, 0x59, 0xc8, 0xbf, 0x29, 0xac, 0x7c, 0x33, 0x2d, 0x16, 0xdb, - 0x8e, 0x54, 0x10, 0x2b, 0x28, 0x90, 0xb6, 0xe0, 0xdd, 0x9f, 0x05, 0xe2, 0xe6, 0x4a, 0xc3, 0x72, - 0x9c, 0x89, 0xec, 0x57, 0x25, 0x98, 0x9a, 0xd6, 0x76, 0x85, 0x63, 0x75, 0xa8, 0x36, 0x48, 0x3d, - 0x9f, 0x68, 0xcd, 0xdf, 0xb2, 0x41, 0xc5, 0x21, 0x68, 0xcd, 0xae, 0xb8, 0xc9, 0x1a, 0x26, 0x69, - 0x2b, 0xac, 0x39, 0x76, 0xea, 0x58, 0x24, 0x99, 0x00, 0xe9, 0x22, 0xfb, 0xce, 0x3e, 0xe3, 0x09, - 0xb3, 0xf9, 0x54, 0x20, 0x68, 0x2c, 0x87, 0xa9, 0x14, 0x59, 0xc2, 0x0a, 0x69, 0x83, 0x22, 0xce, - 0x1a, 0x61, 0x7d, 0x96, 0xd9, 0x32, 0x30, 0x08, 0x24, 0x54, 0xda, 0xed, 0x1a, 0x1a, 0x49, 0x4d, - 0x49, 0x01, 0x7e, 0xbc, 0xae, 0x01, 0x00, 0xe9, 0xfe, 0x2b, 0x39, 0xf4, 0x2b, 0x6e, 0x7e, 0xf9, - 0x3c, 0xd6, 0x94, 0x4a, 0x67, 0x03, 0x50, 0xad, 0x6f, 0x7e, 0xb3, 0x39, 0x28, 0xe8, 0x01, 0x1e, - 0x71, 0x93, 0xd4, 0xf3, 0x2d, 0x6b, 0x43, 0x67, 0x68, 0x73, 0x21, 0x0c, 0x21, 0x08, 0xe7, 0x86, - 0x28, 0xac, 0xc4, 0x00, 0x38, 0x37, 0xa0, 0xf5, 0xe4, 0x16, 0xf3, 0x6a, 0x7e, 0x63, 0x61, 0x83, - 0x18, 0xa3, 0x90, 0x34, 0xb8, 0xb2, 0xac, 0xc5, 0xc6, 0xc4, 0x6c, 0xcd, 0xf5, 0x19, 0x13, 0x13, - 0x1b, 0x5d, 0xc1, 0x56, 0x73, 0xb9, 0xf2, 0xe2, 0x56, 0xb1, 0xe8, 0x7b, 0xbd, 0x6c, 0x38, 0xf3, - 0xbd, 0x3c, 0x65, 0x47, 0x3f, 0x17, 0xf6, 0xb5, 0x98, 0x53, 0x16, 0xb7, 0xba, 0x72, 0xa9, 0x69, - 0x2f, 0xef, 0x35, 0x7b, 0x34, 0xd7, 0xcf, 0x23, 0x60, 0x67, 0x8b, 0xfb, 0xa9, 0x94, 0x97, 0xf4, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xdc, 0xbd, 0x59, 0x7a, 0xe3, 0xb8, + 0xd2, 0x28, 0xf8, 0xee, 0x55, 0x30, 0x99, 0x55, 0x99, 0x62, 0x89, 0x96, 0xa8, 0xd1, 0xb2, 0x9c, + 0xb2, 0x7f, 0x79, 0x9e, 0x27, 0x79, 0xce, 0x9b, 0xdf, 0x9f, 0x94, 0x44, 0x49, 0xb4, 0x29, 0x92, + 0x26, 0xa9, 0xc9, 0x4a, 0xdd, 0x25, 0xdc, 0xf7, 0x7e, 0xea, 0xd7, 0xfe, 0xba, 0x77, 0xd5, 0x2b, + 0xe8, 0x25, 0x74, 0x04, 0x00, 0x92, 0x20, 0x45, 0xc9, 0xce, 0x3a, 0x75, 0xee, 0x54, 0xe7, 0xa4, + 0x45, 0x82, 0x40, 0x00, 0x08, 0x04, 0x02, 0x11, 0x81, 0x40, 0xe0, 0xdb, 0xa7, 0xdd, 0x8b, 0x9d, + 0x9b, 0xc7, 0xcb, 0x3d, 0xa1, 0xe7, 0xf5, 0x8d, 0x4d, 0xe1, 0x1b, 0xfe, 0x08, 0x86, 0x6a, 0x76, + 0x6b, 0xa2, 0x66, 0x8a, 0x98, 0xa0, 0xa9, 0x6d, 0xf8, 0xe9, 0x6b, 0x9e, 0x2a, 0x98, 0x6a, 0x5f, + 0xab, 0x89, 0x43, 0x5d, 0x1b, 0xd9, 0x96, 0xe3, 0x89, 0xc2, 0x4a, 0xcb, 0x32, 0x3d, 0xcd, 0xf4, + 0x6a, 0xe2, 0x48, 0x6f, 0x7b, 0xbd, 0x5a, 0x5b, 0x1b, 0xea, 0x2d, 0x6d, 0x95, 0xbc, 0xc8, 0xba, + 0xa9, 0x7b, 0xba, 0x6a, 0xac, 0xba, 0x2d, 0xd5, 0xd0, 0x6a, 0x39, 0xb9, 0x0f, 0x09, 0xfd, 0x41, + 0xdf, 0x7f, 0x17, 0x7d, 0xa0, 0x2b, 0xad, 0x9e, 0xea, 0xb8, 0x1a, 0x00, 0x19, 0x78, 0x9d, 0xd5, + 0x8a, 0x18, 0xad, 0xcc, 0xeb, 0x69, 0x7d, 0x6d, 0xb5, 0x65, 0x19, 0x96, 0x23, 0x0a, 0x41, 0x75, + 0x9f, 0xf3, 0xe4, 0x3f, 0x0e, 0x86, 0xff, 0x65, 0xa2, 0xb9, 0x22, 0x2b, 0xaa, 0xda, 0xb6, 0xa1, + 0xad, 0xf6, 0xad, 0xa6, 0x0e, 0x3f, 0x23, 0xad, 0xb9, 0x0a, 0x09, 0xab, 0x2d, 0xd5, 0x56, 0x9b, + 0x86, 0x86, 0x25, 0x0d, 0xdd, 0x7c, 0x11, 0x1c, 0xcd, 0xa8, 0x89, 0x6e, 0x0f, 0xba, 0xd3, 0x1a, + 0x78, 0x82, 0x0e, 0x70, 0xa0, 0x5b, 0x3d, 0x47, 0xeb, 0xd4, 0xc4, 0xb6, 0xea, 0xa9, 0x55, 0xbd, + 0xaf, 0x76, 0xb5, 0xec, 0x78, 0x15, 0xbf, 0x6c, 0x34, 0x55, 0x57, 0x2b, 0x17, 0xe5, 0x7a, 0xbd, + 0xbe, 0x5d, 0xaf, 0xef, 0xd5, 0xf7, 0xe0, 0x2f, 0xfe, 0x1e, 0xd4, 0x77, 0x0e, 0xf0, 0x69, 0xbf, + 0x0b, 0x7f, 0x8e, 0x8c, 0xab, 0x9b, 0x97, 0xd6, 0xf9, 0x4e, 0xcf, 0x3a, 0xc1, 0xb4, 0xdd, 0x5b, + 0xe3, 0xe8, 0x7a, 0xff, 0x08, 0x1f, 0xaf, 0x68, 0xee, 0x2e, 0xc9, 0x7b, 0x98, 0xbd, 0xcc, 0x3e, + 0x62, 0xca, 0x5e, 0xee, 0xf8, 0x7a, 0x6f, 0xff, 0xf6, 0xe2, 0x28, 0xf7, 0x0c, 0x49, 0xd9, 0xcb, + 0xd1, 0xc5, 0xb8, 0x7b, 0x7e, 0xa0, 0xd5, 0x6f, 0xcf, 0xc6, 0x7b, 0xeb, 0x07, 0xe5, 0xd6, 0xd5, + 0xce, 0xc9, 0xee, 0x7d, 0xbd, 0x67, 0xd7, 0x77, 0x9f, 0xf2, 0x9d, 0xca, 0xe5, 0xd9, 0xf3, 0x76, + 0xa3, 0x70, 0x75, 0xaf, 0x54, 0xae, 0x4e, 0xf2, 0xca, 0x89, 0xfa, 0xb4, 0x93, 0xef, 0x76, 0x76, + 0xd6, 0x7b, 0x3b, 0xe6, 0xab, 0x35, 0xb0, 0xce, 0xbb, 0xf5, 0xeb, 0xee, 0xe3, 0xda, 0xdb, 0xd9, + 0xb8, 0x3e, 0x39, 0x37, 0x6e, 0xdb, 0x57, 0x87, 0xc6, 0x83, 0x5e, 0x37, 0x2e, 0xf2, 0x67, 0xbb, + 0xf5, 0xdd, 0x72, 0x61, 0xef, 0xee, 0xf5, 0xfc, 0xb0, 0xae, 0x29, 0x75, 0xd2, 0x10, 0x63, 0xff, + 0xe6, 0xa5, 0x31, 0xb8, 0xea, 0xef, 0xec, 0x88, 0x9b, 0x2b, 0xc2, 0x37, 0x4f, 0xf7, 0x0c, 0x6d, + 0xf3, 0xfe, 0x74, 0x6f, 0xf7, 0x5b, 0x96, 0x3e, 0x0b, 0xdf, 0xdc, 0x96, 0xa3, 0xdb, 0xde, 0xe6, + 0x4a, 0x67, 0x60, 0xb6, 0x3c, 0xdd, 0x32, 0x85, 0x8e, 0xa6, 0xb5, 0x9b, 0x6a, 0xeb, 0x25, 0x25, + 0x4d, 0x67, 0x43, 0xd5, 0x11, 0x60, 0xc8, 0xad, 0xd6, 0xa0, 0x0f, 0x98, 0xcf, 0x74, 0x35, 0x6f, + 0xcf, 0xd0, 0xf0, 0xd1, 0xdd, 0x9e, 0xdc, 0xa8, 0xdd, 0x73, 0x18, 0x83, 0x94, 0x88, 0xd4, 0x23, + 0x4a, 0xdf, 0x95, 0x1f, 0xb2, 0x11, 0x66, 0x6d, 0x39, 0x9a, 0xea, 0x69, 0x2c, 0x77, 0x4a, 0xa4, + 0xb5, 0x88, 0xd2, 0x86, 0x91, 0xf1, 0x26, 0x36, 0x1b, 0x38, 0xbd, 0xa5, 0x62, 0x8d, 0xd9, 0x67, + 0x75, 0xa8, 0xb2, 0x0c, 0xb2, 0x91, 0x71, 0x9d, 0x56, 0x4d, 0xd4, 0x1d, 0x2b, 0xf3, 0xec, 0xe2, + 0xab, 0xda, 0x6e, 0xef, 0x0d, 0x01, 0xc6, 0xa9, 0xee, 0xc2, 0xe8, 0x6b, 0x4e, 0x4a, 0x34, 0x2c, + 0xa8, 0x4f, 0xd6, 0x6a, 0x9b, 0xd3, 0x96, 0xad, 0xb7, 0x5e, 0x6a, 0xa6, 0x36, 0x12, 0x30, 0xff, + 0x0e, 0x12, 0xd0, 0x25, 0xa4, 0x60, 0xa6, 0xcf, 0x36, 0x79, 0x10, 0xe5, 0x29, 0xa1, 0xd4, 0x6a, + 0xbe, 0xac, 0xc8, 0xa3, 0x9e, 0xa6, 0x19, 0xa7, 0x7a, 0xb7, 0xe7, 0x99, 0x9a, 0xeb, 0x56, 0x3f, + 0xe5, 0x68, 0x4a, 0xdd, 0xec, 0x1a, 0x5a, 0x35, 0xbf, 0xc6, 0x32, 0xec, 0xea, 0x8e, 0x46, 0x30, + 0x51, 0x15, 0x5b, 0x86, 0xd5, 0x7a, 0x19, 0xe9, 0xae, 0x06, 0x0d, 0x51, 0x27, 0xd6, 0xc0, 0xab, + 0x7e, 0x9f, 0xb6, 0xac, 0xbe, 0x6d, 0x99, 0xd0, 0xa0, 0x2a, 0xd6, 0x39, 0xd0, 0x33, 0xf7, 0x58, + 0x48, 0xb6, 0x6c, 0x2c, 0xe2, 0x56, 0xa7, 0xb3, 0xd9, 0x8f, 0x99, 0x24, 0x93, 0x96, 0x65, 0x2c, + 0x33, 0x25, 0xea, 0xa6, 0x0d, 0xe5, 0x34, 0x13, 0x9a, 0x9c, 0x92, 0xa0, 0xcd, 0x30, 0x0b, 0x48, + 0x43, 0x53, 0x39, 0x29, 0x92, 0x8f, 0x90, 0x7f, 0x15, 0xe6, 0x89, 0xd9, 0xd5, 0x58, 0xd6, 0x81, + 0x0d, 0xe4, 0xa9, 0x5d, 0x36, 0x0c, 0xbd, 0xad, 0x39, 0x6e, 0x0a, 0xf2, 0x6f, 0xe0, 0x80, 0x78, + 0xef, 0x63, 0xd9, 0x7b, 0x07, 0xcb, 0x1e, 0xc5, 0xb2, 0x83, 0x95, 0x79, 0xd6, 0xa0, 0xd5, 0x23, + 0xc8, 0xf6, 0x96, 0x22, 0x9b, 0x64, 0x76, 0x6b, 0xd7, 0xf8, 0x73, 0x43, 0xca, 0x40, 0x57, 0x06, + 0x76, 0xea, 0x2b, 0xe9, 0xe1, 0x77, 0x5a, 0x21, 0xc9, 0x24, 0xfe, 0xf8, 0x2a, 0x4f, 0xa1, 0xb1, + 0x86, 0xe6, 0x41, 0x63, 0x21, 0xd7, 0x11, 0x4c, 0x5c, 0x67, 0xa8, 0x1a, 0x29, 0xd2, 0x2d, 0x11, + 0x51, 0x08, 0xdf, 0x34, 0xb1, 0x56, 0x0b, 0xbb, 0x02, 0x3d, 0x69, 0x4f, 0x1a, 0x1e, 0x74, 0xe7, + 0xcb, 0x97, 0x54, 0xcb, 0xd0, 0x54, 0x27, 0x28, 0xe5, 0x49, 0xb2, 0x65, 0x9e, 0x42, 0x43, 0x52, + 0x92, 0x34, 0x93, 0x73, 0x8a, 0x82, 0x98, 0x03, 0xb0, 0x37, 0x7a, 0x5f, 0x83, 0x41, 0xa1, 0x50, + 0x7b, 0x19, 0xe8, 0x2c, 0xa0, 0x79, 0xa7, 0xa7, 0x1b, 0x6d, 0x28, 0x32, 0x93, 0x4b, 0x1f, 0xc8, + 0x67, 0xd0, 0x7c, 0x2b, 0xdf, 0xb2, 0x6c, 0x1e, 0xc0, 0x84, 0xf0, 0x26, 0x30, 0x31, 0x56, 0xfe, + 0xa3, 0x03, 0xec, 0x66, 0xb5, 0xa3, 0xb6, 0xb4, 0x29, 0x7b, 0xea, 0xeb, 0xc6, 0xa4, 0x7a, 0x7f, + 0x04, 0x4c, 0xc2, 0xdd, 0x00, 0xf4, 0x55, 0x07, 0x8e, 0x91, 0x22, 0xfc, 0x03, 0xbf, 0x67, 0x47, + 0x56, 0xa7, 0x93, 0xdf, 0xf0, 0xf9, 0x1c, 0x61, 0x73, 0x3e, 0x2f, 0x69, 0x2b, 0xeb, 0x07, 0x67, + 0xdd, 0x3a, 0xe1, 0x24, 0xf5, 0xba, 0x79, 0x5b, 0xaf, 0xbb, 0x74, 0x7a, 0xe6, 0xf0, 0x6f, 0x7f, + 0xbf, 0x5e, 0x3f, 0x78, 0xea, 0x77, 0xeb, 0x0b, 0xff, 0xdb, 0xee, 0xd7, 0xeb, 0xdd, 0x87, 0xd1, + 0xf5, 0x4e, 0xfd, 0xb5, 0xf5, 0x78, 0xfc, 0x74, 0x54, 0xbf, 0x79, 0xdc, 0x39, 0xae, 0x9f, 0x8f, + 0x76, 0xde, 0xac, 0xfa, 0xf6, 0x0e, 0xb0, 0xa4, 0xd1, 0xe3, 0xe1, 0xd1, 0xb6, 0xbb, 0xb6, 0x5b, + 0xd1, 0x2f, 0x46, 0x6f, 0xdd, 0x7e, 0xe1, 0xec, 0xe1, 0xcc, 0x7c, 0x7b, 0xda, 0x79, 0xf1, 0xcc, + 0xe7, 0x56, 0xf3, 0x3c, 0x7d, 0x65, 0x1c, 0x9f, 0xaa, 0xc7, 0x85, 0x81, 0x71, 0x7b, 0x6a, 0x1b, + 0xf6, 0x7d, 0xf9, 0xf6, 0xf5, 0x5e, 0xb7, 0xb4, 0xc6, 0x7a, 0xee, 0x78, 0xa2, 0x29, 0xcf, 0xb7, + 0xc6, 0xf1, 0xe8, 0xc9, 0x29, 0x99, 0x37, 0xed, 0xbd, 0xc2, 0xa9, 0xe9, 0xb5, 0x2f, 0x87, 0xf5, + 0x6e, 0xba, 0xe3, 0x65, 0x3b, 0x4d, 0xf7, 0xd4, 0x3d, 0x30, 0xce, 0x4f, 0x07, 0x3d, 0xa3, 0x7f, + 0xf5, 0x7c, 0xa2, 0xaf, 0x9d, 0x5f, 0xee, 0xee, 0x1d, 0x75, 0x47, 0x37, 0x7d, 0xe0, 0x61, 0x6a, + 0xb9, 0xdf, 0x36, 0xd2, 0x8d, 0xc3, 0xdb, 0xed, 0xde, 0xde, 0x51, 0xfb, 0x70, 0x7f, 0xac, 0xbe, + 0xac, 0xb9, 0xc5, 0xbd, 0xec, 0xe4, 0xad, 0x77, 0xdc, 0x78, 0xde, 0x59, 0xdb, 0xbe, 0xba, 0x3a, + 0xed, 0xec, 0x8e, 0x2c, 0x7b, 0x3f, 0xab, 0x97, 0xd5, 0xd7, 0xc6, 0x9e, 0xb1, 0xb7, 0xbf, 0xfb, + 0x30, 0xae, 0x3c, 0xdd, 0xdd, 0x3f, 0x4f, 0x0a, 0xce, 0xa4, 0x5f, 0x3c, 0x2f, 0xef, 0x1b, 0x4f, + 0x57, 0xc5, 0xde, 0x20, 0x6d, 0x3e, 0xb8, 0x07, 0x47, 0xbb, 0x67, 0x57, 0xfb, 0x85, 0x6e, 0x7d, + 0xac, 0xe6, 0x8a, 0xf5, 0x6e, 0xdd, 0xf1, 0xee, 0xce, 0x7a, 0x9d, 0x97, 0xee, 0x73, 0x67, 0xaf, + 0xde, 0xd4, 0x77, 0x7a, 0xa3, 0x41, 0xe3, 0x68, 0xb4, 0x77, 0xbb, 0xd3, 0x1f, 0xb4, 0x2f, 0x7b, + 0xfa, 0x55, 0xfb, 0xa6, 0xec, 0x0c, 0x8f, 0x9e, 0x4f, 0x1b, 0xd7, 0x4f, 0x7b, 0xa3, 0xdd, 0xde, + 0xfe, 0xfa, 0xf6, 0x91, 0x6b, 0x59, 0x47, 0xa5, 0xc2, 0xcd, 0xd1, 0xf5, 0x91, 0x75, 0x74, 0xbb, + 0x5b, 0x79, 0x99, 0x9c, 0x3f, 0x1d, 0xad, 0xdd, 0x3e, 0xd7, 0x27, 0x67, 0xce, 0x75, 0x56, 0x3d, + 0xcb, 0xee, 0x8e, 0xd4, 0x0b, 0xdb, 0x7a, 0x53, 0x7b, 0xeb, 0xa7, 0x07, 0x3b, 0xee, 0x63, 0xfe, + 0xed, 0x3c, 0xff, 0x78, 0xf1, 0xe6, 0xe6, 0x4f, 0x0b, 0xe3, 0x57, 0xed, 0xdc, 0x2e, 0xbe, 0x3d, + 0x3c, 0xbf, 0x56, 0x9a, 0x0f, 0x37, 0xd9, 0xde, 0xd9, 0xf6, 0xe9, 0x73, 0xb6, 0x54, 0x78, 0xdc, + 0xad, 0x1f, 0x35, 0xd2, 0x6b, 0x83, 0x72, 0xb9, 0x62, 0x16, 0x0e, 0xd3, 0x87, 0xd7, 0x97, 0xed, + 0xa7, 0x76, 0x6e, 0x50, 0xb8, 0x79, 0x6b, 0x5f, 0x3f, 0xb5, 0xef, 0xce, 0x6e, 0x3a, 0x47, 0x46, + 0xe9, 0xb0, 0x73, 0xd2, 0x6d, 0xe7, 0x9a, 0x6b, 0x8d, 0xe1, 0x6b, 0x7b, 0xfd, 0x7e, 0x7d, 0x60, + 0x3b, 0xed, 0xcb, 0xca, 0xd5, 0xcd, 0x45, 0x5f, 0x53, 0xdf, 0x4a, 0x37, 0x97, 0x17, 0xd7, 0xc7, + 0xc6, 0xee, 0xee, 0xf3, 0xe1, 0xdd, 0xf3, 0x81, 0x52, 0x3f, 0x3f, 0xbb, 0x7a, 0x74, 0xfb, 0xd7, + 0xce, 0x89, 0xd1, 0xb7, 0x27, 0xaf, 0x77, 0x6b, 0x2f, 0x83, 0xe6, 0xd1, 0xd5, 0x4e, 0xfe, 0xa0, + 0x71, 0xf4, 0xb2, 0xdf, 0x48, 0x9f, 0x99, 0xda, 0xce, 0x71, 0xb1, 0x72, 0x7c, 0xbc, 0x7f, 0xb7, + 0xd3, 0xbb, 0xea, 0x0c, 0x46, 0x27, 0x67, 0x76, 0x7e, 0x72, 0xbb, 0x6e, 0xf7, 0x5f, 0x73, 0x77, + 0x27, 0xb7, 0xd7, 0x65, 0x47, 0xf3, 0x94, 0x03, 0x5b, 0x69, 0x3c, 0xdf, 0x3d, 0x5e, 0x5f, 0xef, + 0xa7, 0x1f, 0x9e, 0xd7, 0xd2, 0x17, 0xfa, 0x6d, 0xe3, 0x25, 0x7b, 0x70, 0xf4, 0x36, 0xc8, 0xf5, + 0xf5, 0xc3, 0xa7, 0xfb, 0x71, 0xba, 0x5b, 0x79, 0xcc, 0x5d, 0xdf, 0xbe, 0x78, 0x97, 0xfd, 0xd7, + 0x23, 0xdd, 0xbb, 0xbe, 0x79, 0xb8, 0x3b, 0x7f, 0x7b, 0xdb, 0xf1, 0x06, 0xfb, 0x97, 0x27, 0xad, + 0x43, 0xe5, 0xed, 0x7a, 0xfb, 0x20, 0xfd, 0xb8, 0x9e, 0xdd, 0x31, 0x7b, 0xdb, 0x6a, 0x5e, 0x19, + 0x96, 0xac, 0xc3, 0x8e, 0xbb, 0x77, 0x7b, 0xd6, 0x7d, 0x38, 0xbb, 0xdc, 0xeb, 0x5c, 0x94, 0x9e, + 0x5a, 0xc7, 0x63, 0x65, 0xff, 0xe8, 0x52, 0xbf, 0x9b, 0x8c, 0xba, 0xcf, 0xcd, 0xf2, 0xd9, 0xd1, + 0xe0, 0x2e, 0x6d, 0x3d, 0x15, 0x87, 0xf9, 0x97, 0x97, 0x72, 0xf6, 0xcd, 0x3c, 0x1a, 0xef, 0x9e, + 0x38, 0xdd, 0xc1, 0x59, 0x3e, 0x3f, 0x49, 0x37, 0xef, 0x2b, 0xa3, 0xdb, 0x83, 0x57, 0x7d, 0x4d, + 0x3d, 0xad, 0x74, 0xae, 0x8e, 0xdf, 0x46, 0xe6, 0xce, 0x73, 0xc5, 0x3b, 0xb2, 0xed, 0xf6, 0xd1, + 0x7a, 0xf3, 0x71, 0xb7, 0x71, 0x77, 0x7c, 0xb7, 0x73, 0x75, 0x64, 0xea, 0xf6, 0xbd, 0x72, 0xd8, + 0xf4, 0x5a, 0x46, 0xeb, 0x66, 0x6d, 0xb8, 0x33, 0x39, 0xed, 0x3f, 0xa8, 0x8d, 0x3b, 0xe7, 0xaa, + 0x71, 0x7e, 0x36, 0x69, 0xaa, 0xc7, 0xc7, 0xdb, 0xbd, 0xfc, 0xa5, 0xfe, 0xe0, 0x3c, 0x34, 0xbb, + 0xed, 0x72, 0xbd, 0xf9, 0xaa, 0xb5, 0xda, 0xbb, 0x37, 0x17, 0xeb, 0x7b, 0x57, 0x7b, 0x47, 0xda, + 0xbd, 0x72, 0x77, 0x79, 0x7f, 0xd5, 0x6a, 0x5f, 0x55, 0x0c, 0xef, 0xf2, 0x62, 0x6f, 0x90, 0x5e, + 0x2b, 0xbf, 0xe6, 0x8f, 0xc6, 0xb7, 0x37, 0xd6, 0xb1, 0x76, 0x6f, 0x77, 0x9e, 0xaf, 0xf4, 0xc3, + 0xc3, 0xc3, 0x12, 0x4c, 0xa5, 0xdd, 0xd3, 0xe7, 0x5c, 0xf3, 0xb0, 0x7b, 0x35, 0x7e, 0x70, 0x6f, + 0xa1, 0x43, 0x27, 0x8f, 0xcd, 0x6e, 0x7a, 0x67, 0x0c, 0xff, 0x2b, 0xaf, 0x6b, 0x87, 0xad, 0x8b, + 0x21, 0x30, 0xe8, 0xe3, 0x9c, 0x51, 0x6e, 0x2a, 0xe6, 0xee, 0xda, 0xf3, 0x41, 0xba, 0xd9, 0xa8, + 0xe7, 0xda, 0x3b, 0x4f, 0x77, 0xe3, 0xfe, 0xa8, 0xf2, 0x74, 0x9c, 0x3d, 0x7a, 0xf4, 0xc6, 0x97, + 0x5e, 0xf3, 0x78, 0x6c, 0xd8, 0x57, 0xd9, 0xd3, 0x83, 0xe7, 0xc6, 0xab, 0xa2, 0xdc, 0xf4, 0xdb, + 0xe7, 0x47, 0x4f, 0x63, 0xe7, 0x40, 0x33, 0xd2, 0x93, 0xb4, 0xf3, 0x74, 0xec, 0x58, 0x69, 0xf3, + 0xb6, 0x57, 0xb8, 0x74, 0xce, 0x8f, 0x0e, 0x46, 0x27, 0xe5, 0x7b, 0xe7, 0xe1, 0xfc, 0xec, 0x2e, + 0x3f, 0xbe, 0xd1, 0xae, 0xef, 0x0f, 0x1b, 0xcf, 0x8d, 0xd6, 0x8b, 0x77, 0x7a, 0xdc, 0xd1, 0x72, + 0x4e, 0x6b, 0xcd, 0xb5, 0x27, 0xc3, 0x97, 0x42, 0xb3, 0x7c, 0x57, 0x7c, 0x29, 0x56, 0x1a, 0x4e, + 0xa1, 0xde, 0xcf, 0x5d, 0x0e, 0xb3, 0x57, 0x7a, 0xa7, 0xe7, 0x1e, 0xe5, 0x07, 0x67, 0xc3, 0x56, + 0xa5, 0x5c, 0xb8, 0xd0, 0xaf, 0xae, 0xae, 0xcf, 0x2d, 0xad, 0x6d, 0x5f, 0x76, 0x0e, 0xcd, 0xc6, + 0xa8, 0x05, 0xbc, 0x30, 0xad, 0xee, 0xee, 0xed, 0x95, 0xd7, 0x5a, 0x27, 0x6f, 0x37, 0xdd, 0x6d, + 0xe3, 0xaa, 0xfb, 0x6c, 0x3f, 0x77, 0x6f, 0x76, 0xcd, 0x63, 0xef, 0xc0, 0x7c, 0xc8, 0xbf, 0x36, + 0xfb, 0x0f, 0xc7, 0xe5, 0xfd, 0x8b, 0xed, 0xd3, 0xa7, 0xb5, 0x91, 0xeb, 0xa4, 0x8f, 0x9f, 0xde, + 0x1e, 0xcd, 0xe6, 0x73, 0xbb, 0xf9, 0xb2, 0x33, 0xd8, 0xeb, 0xdc, 0x2a, 0x87, 0x43, 0x63, 0xf4, + 0xda, 0xf4, 0x6e, 0xbb, 0xc7, 0x6b, 0x6f, 0xd7, 0x0f, 0xfb, 0xe7, 0xc7, 0xee, 0xb0, 0x31, 0x36, + 0x46, 0x6f, 0xf9, 0xfb, 0x47, 0x4f, 0x2d, 0x8e, 0x9f, 0x1d, 0x3d, 0xdb, 0x71, 0x07, 0x86, 0x69, + 0xee, 0xdf, 0x5d, 0x4e, 0x2c, 0xd3, 0xbe, 0x54, 0xae, 0x4f, 0x4b, 0xd6, 0xdd, 0xf9, 0xc9, 0xcb, + 0x4b, 0x67, 0xcf, 0x38, 0x28, 0xb6, 0xdc, 0x9b, 0xdd, 0xf3, 0xba, 0xdb, 0x7d, 0xdb, 0x29, 0x54, + 0x0e, 0xd6, 0xba, 0x8d, 0x93, 0xbb, 0x6e, 0xe3, 0x69, 0xad, 0x9f, 0x6d, 0xed, 0x0d, 0x4f, 0xea, + 0xa7, 0xfd, 0xf1, 0xc9, 0x5b, 0x36, 0x3b, 0x58, 0xeb, 0x95, 0xb5, 0xee, 0xe1, 0xfe, 0xda, 0x99, + 0x73, 0x58, 0x7c, 0x3e, 0xb6, 0xb3, 0x4f, 0xe3, 0xe2, 0x6b, 0x21, 0xaf, 0x56, 0x6e, 0xd6, 0x72, + 0x63, 0xf3, 0xf0, 0xee, 0x7a, 0xe7, 0xc0, 0xe8, 0xec, 0x3f, 0x9d, 0x7b, 0x5e, 0x3b, 0xbf, 0xdf, + 0xba, 0x55, 0xd5, 0x49, 0x59, 0x5b, 0xbf, 0x7c, 0xe9, 0x0d, 0x5a, 0x93, 0x6b, 0xc5, 0xba, 0x1c, + 0xe4, 0xde, 0x72, 0x6f, 0xd9, 0xdd, 0xed, 0x74, 0x65, 0xa4, 0x8f, 0xeb, 0xfb, 0xed, 0xb3, 0xdb, + 0x5c, 0xd7, 0xec, 0x6f, 0x17, 0xc7, 0xf5, 0x51, 0xb9, 0x62, 0x8f, 0x0e, 0x5b, 0xf7, 0xcf, 0xc6, + 0xbe, 0xb3, 0x6d, 0x3e, 0x8c, 0x4f, 0x9f, 0x9f, 0xcb, 0x85, 0xdb, 0x83, 0xee, 0xf0, 0xfc, 0xe0, + 0xee, 0xa0, 0x7e, 0xbc, 0xff, 0x36, 0xde, 0x1f, 0xa5, 0xef, 0xad, 0xbe, 0xb9, 0x76, 0x56, 0xd7, + 0x9b, 0x77, 0xcd, 0x41, 0xd9, 0xd0, 0x0e, 0xaf, 0xb7, 0x4b, 0x6e, 0x2b, 0xa7, 0x74, 0x4e, 0xbd, + 0xa6, 0xd3, 0x76, 0xb2, 0xc7, 0xaf, 0x77, 0xe5, 0x47, 0x27, 0x6d, 0x0d, 0x47, 0xfb, 0xde, 0xf5, + 0xe1, 0xde, 0xda, 0x59, 0xf1, 0xed, 0x60, 0x5d, 0x79, 0x3d, 0xdf, 0x2e, 0x3f, 0x5e, 0xef, 0x59, + 0x56, 0x29, 0xf7, 0xb2, 0x7f, 0xac, 0x36, 0x5f, 0x0b, 0xe7, 0xda, 0xe1, 0xdd, 0x49, 0x5b, 0xeb, + 0x64, 0x7b, 0xee, 0xd9, 0xfe, 0x7e, 0xc3, 0xf6, 0x4a, 0xfd, 0xca, 0x43, 0xff, 0xf8, 0x75, 0x77, + 0xb7, 0x6e, 0x5e, 0x2b, 0xad, 0x62, 0xae, 0xd2, 0x1f, 0xf7, 0xc7, 0xce, 0xd5, 0xdb, 0xd5, 0x60, + 0x72, 0x69, 0xba, 0xf6, 0xf5, 0xa8, 0x53, 0x7f, 0x7c, 0xb1, 0xbd, 0xde, 0x9b, 0x03, 0x68, 0xb9, + 0xc9, 0x8d, 0xcf, 0x1b, 0x9d, 0xe2, 0xbd, 0xb7, 0x7d, 0x76, 0xb6, 0xbe, 0x7b, 0x75, 0x93, 0x5b, + 0x1f, 0x9c, 0xa6, 0xbb, 0xcd, 0xe2, 0x5a, 0x77, 0xff, 0xf4, 0xb2, 0xd0, 0xba, 0x51, 0x2a, 0xfb, + 0x95, 0xa3, 0x62, 0xfb, 0x69, 0x7c, 0x6c, 0x14, 0x73, 0x07, 0xee, 0x78, 0xfd, 0xfe, 0xf0, 0xed, + 0x74, 0xfb, 0xe2, 0xf0, 0xed, 0xfe, 0xf9, 0xba, 0xb1, 0x7e, 0x7e, 0xba, 0x73, 0x71, 0xbb, 0xbd, + 0xb3, 0x7f, 0x95, 0x1e, 0x1c, 0xf4, 0xb6, 0xb3, 0x77, 0x6b, 0x4f, 0x6f, 0xb7, 0xa3, 0x93, 0xbd, + 0xc6, 0x4d, 0x7f, 0xd7, 0xd1, 0x8f, 0xd3, 0xb7, 0x48, 0xfb, 0xd9, 0xe6, 0xfe, 0xc3, 0xfe, 0xd9, + 0xe9, 0xa9, 0xfb, 0xdc, 0xd5, 0xeb, 0x5e, 0xd1, 0xb6, 0xd7, 0x06, 0x86, 0x3d, 0x6e, 0xe6, 0xbd, + 0xb7, 0xbd, 0xca, 0x51, 0x65, 0xdc, 0x9b, 0x1c, 0x5e, 0xec, 0x6e, 0x9f, 0x14, 0x1a, 0x07, 0xdd, + 0xf2, 0xd5, 0x65, 0x2e, 0xbf, 0xad, 0x5f, 0x16, 0x1e, 0xcf, 0x46, 0x79, 0x67, 0x77, 0xdf, 0xbb, + 0xbf, 0xdd, 0x7d, 0x38, 0x4d, 0x6b, 0xae, 0x39, 0x2c, 0x1c, 0xae, 0x5f, 0x8d, 0x5f, 0x3b, 0xfd, + 0xe6, 0xae, 0xd9, 0x3c, 0x3b, 0x7d, 0x3e, 0xb8, 0xdd, 0xb7, 0x5f, 0x5f, 0x9f, 0x9a, 0xe6, 0x7d, + 0xa3, 0xab, 0x18, 0xbd, 0xfb, 0xe1, 0xfa, 0xe8, 0xb6, 0x50, 0x7a, 0xbd, 0x39, 0x7c, 0xbd, 0x5c, + 0x7f, 0x7b, 0xbd, 0x75, 0x4e, 0xd7, 0x5e, 0x5e, 0x4f, 0x9e, 0x2b, 0x8f, 0xcf, 0x4f, 0x6f, 0x5d, + 0x25, 0x67, 0x37, 0xd7, 0xd3, 0x93, 0xab, 0x8a, 0xfb, 0xf0, 0x64, 0x3f, 0x8e, 0x4f, 0x0e, 0xf4, + 0xfd, 0xe3, 0x9b, 0x73, 0xf7, 0x68, 0x34, 0xb2, 0x27, 0xd7, 0xc5, 0x62, 0x77, 0xef, 0xc2, 0xbc, + 0xcb, 0xa6, 0x35, 0x20, 0xa4, 0xf6, 0xe1, 0x6e, 0x36, 0x6f, 0x5c, 0x15, 0x06, 0x8d, 0xd2, 0x24, + 0xf7, 0xfa, 0x76, 0xf4, 0xe6, 0x3d, 0xdc, 0x9e, 0x5f, 0xee, 0x95, 0xad, 0xf6, 0xe3, 0xb1, 0x72, + 0xf9, 0x7a, 0xab, 0xdf, 0x1f, 0x7b, 0xdd, 0x93, 0x83, 0x93, 0xb3, 0xa3, 0xd3, 0xc7, 0xb2, 0xd2, + 0x1e, 0x6b, 0x8f, 0x13, 0xb3, 0xd9, 0x4c, 0xbb, 0xfb, 0x27, 0x27, 0xaf, 0xe7, 0xa6, 0x72, 0xff, + 0x96, 0x77, 0x4e, 0xbd, 0xb3, 0xe6, 0xf6, 0xd5, 0xfd, 0xa5, 0xf9, 0xe8, 0xf5, 0x8f, 0xd5, 0xe2, + 0xfd, 0xeb, 0xfe, 0xb5, 0xd5, 0xcc, 0xae, 0xf7, 0xfb, 0x83, 0x49, 0xeb, 0xea, 0x6e, 0xb8, 0xa6, + 0x77, 0x76, 0xce, 0x87, 0x0f, 0x8e, 0xd1, 0x7b, 0xeb, 0xee, 0x9e, 0xee, 0x0e, 0x41, 0x04, 0x4f, + 0x57, 0x0e, 0x4b, 0xe3, 0xe7, 0x93, 0xf5, 0x62, 0xa5, 0xb5, 0xab, 0x79, 0xe9, 0x7d, 0xf5, 0xa1, + 0xd3, 0x48, 0x9f, 0xbe, 0x58, 0xd9, 0x7b, 0x2f, 0x3d, 0x6c, 0xb4, 0x5e, 0x55, 0xe7, 0xb5, 0xfc, + 0xf2, 0x74, 0xd3, 0x7c, 0x29, 0x9e, 0xab, 0x27, 0xaf, 0xf6, 0x45, 0xf3, 0x65, 0x6f, 0xcf, 0x76, + 0xd5, 0xd6, 0xfa, 0x69, 0xce, 0xb9, 0x3e, 0x7f, 0x38, 0xee, 0x5e, 0x36, 0x9d, 0xfb, 0xc9, 0x6e, + 0xfb, 0xf1, 0x59, 0x2b, 0x7b, 0xdb, 0x57, 0xf5, 0x37, 0xef, 0xa5, 0xf9, 0xb8, 0xa3, 0x8c, 0x76, + 0xb5, 0xe2, 0xad, 0x79, 0xae, 0xdb, 0x7d, 0xf3, 0x09, 0x64, 0x95, 0x41, 0x76, 0xf0, 0xdc, 0x29, + 0x9f, 0x74, 0xd6, 0x86, 0x5a, 0x2e, 0x97, 0x3f, 0x1c, 0x74, 0xd6, 0xf3, 0x7b, 0xc3, 0xec, 0x9a, + 0x66, 0x6e, 0x67, 0xd3, 0xe6, 0xe5, 0x9a, 0xdd, 0x04, 0x21, 0xf3, 0xea, 0xf8, 0xa9, 0xa9, 0x2b, + 0xcf, 0x3b, 0x0d, 0xdb, 0x3a, 0x5f, 0x87, 0x8e, 0xdf, 0xbc, 0x3c, 0xaf, 0x1d, 0x9f, 0x8d, 0xec, + 0xe6, 0x7d, 0xd7, 0xb2, 0xeb, 0xcd, 0x9e, 0xd7, 0xbc, 0xb8, 0x7f, 0x99, 0x78, 0xf5, 0xfd, 0xc2, + 0x49, 0x3a, 0xfb, 0x6a, 0x29, 0x8d, 0x7a, 0xe3, 0xfc, 0x3e, 0x7f, 0x90, 0x6f, 0x9e, 0x76, 0x4c, + 0xb7, 0x67, 0x6f, 0x17, 0xd5, 0xf5, 0x76, 0xff, 0x6d, 0x2d, 0x7b, 0x38, 0xce, 0x66, 0xdb, 0xad, + 0xc2, 0xc5, 0xc3, 0xf9, 0x53, 0x11, 0x68, 0x75, 0xf2, 0x70, 0x7b, 0x97, 0x6f, 0x3f, 0x5e, 0xbb, + 0xbb, 0xeb, 0x6b, 0xaf, 0x27, 0xa7, 0x6b, 0xeb, 0xaf, 0xea, 0xdb, 0x00, 0xba, 0x76, 0x94, 0x1b, + 0x5e, 0x3e, 0xdc, 0xac, 0x15, 0xd6, 0x4a, 0xcd, 0xfb, 0xc6, 0x81, 0xd5, 0xda, 0xb6, 0x3a, 0xbb, + 0x79, 0xed, 0xe8, 0xfa, 0xed, 0x58, 0x69, 0x9d, 0xed, 0x28, 0x20, 0xab, 0x8d, 0xae, 0x94, 0x6e, + 0x67, 0x38, 0x68, 0xb4, 0x87, 0xed, 0x5c, 0xb1, 0x93, 0x1b, 0x00, 0xd5, 0x9f, 0x5e, 0xee, 0x15, + 0x8e, 0x8f, 0x0f, 0x4f, 0xcb, 0x83, 0x9d, 0x76, 0xd6, 0x2c, 0x99, 0x95, 0x76, 0xa1, 0x74, 0x7b, + 0x71, 0x72, 0x69, 0x96, 0xcd, 0x9e, 0x03, 0x0b, 0xa4, 0x73, 0x57, 0x50, 0xdb, 0x05, 0xf3, 0x2d, + 0xaf, 0xdf, 0xe8, 0xe7, 0xa7, 0xc5, 0x5c, 0x71, 0xcf, 0xd4, 0x3a, 0xa7, 0xd9, 0xe3, 0x83, 0x53, + 0xe3, 0xfe, 0xc9, 0x7b, 0xba, 0x57, 0x5f, 0xad, 0xbd, 0x5e, 0x71, 0xdc, 0x78, 0x1e, 0xba, 0x07, + 0xcd, 0x6c, 0xb9, 0xbf, 0xee, 0xa8, 0xfb, 0x86, 0x7b, 0xda, 0x2f, 0x0e, 0x0e, 0x5f, 0xae, 0xee, + 0x8d, 0xe1, 0xda, 0x4d, 0x76, 0xa4, 0x3d, 0xbd, 0x3d, 0x1f, 0x1e, 0x6a, 0x6b, 0xe3, 0x27, 0xfd, + 0xf6, 0xcd, 0x3e, 0x2e, 0xdd, 0xd7, 0xef, 0xb7, 0x4f, 0x77, 0xcf, 0x47, 0xd7, 0x27, 0xe3, 0xd1, + 0xf5, 0xa3, 0xb9, 0x6f, 0x3d, 0x1c, 0x8c, 0x5b, 0xea, 0xc9, 0xf8, 0xbc, 0xbc, 0x7b, 0x5d, 0xd9, + 0x3e, 0x37, 0xf3, 0xd6, 0xfa, 0xf9, 0x2b, 0x8c, 0xb0, 0x37, 0x74, 0xd4, 0xd2, 0x8d, 0x79, 0xf4, + 0xfc, 0x70, 0xb6, 0x6d, 0xf4, 0x8f, 0xf6, 0x9f, 0x0a, 0x93, 0xcb, 0xc7, 0x87, 0xc2, 0x99, 0xb7, + 0x3e, 0x2c, 0xf5, 0xfb, 0x87, 0x83, 0xd1, 0xe3, 0x70, 0x38, 0xbe, 0x1c, 0x6a, 0xce, 0xe9, 0xba, + 0xd6, 0x18, 0xba, 0x6f, 0x0f, 0xe7, 0xcf, 0xb7, 0x0f, 0xce, 0x4b, 0xf3, 0xb5, 0x75, 0x70, 0x71, + 0x77, 0x9f, 0x6f, 0xee, 0x35, 0x77, 0x0f, 0x4e, 0xf4, 0xc2, 0xd9, 0xe9, 0xdd, 0xcd, 0xfd, 0xdb, + 0xdb, 0xfd, 0xe1, 0x7e, 0xa9, 0xb8, 0x3d, 0xc8, 0xe6, 0x9d, 0x7a, 0xee, 0xf5, 0xc5, 0x2a, 0x1b, + 0xeb, 0x9d, 0xfd, 0xee, 0x5d, 0x73, 0x7b, 0xe0, 0x74, 0xee, 0xb6, 0xef, 0xf7, 0xf7, 0x8d, 0xbb, + 0xfb, 0xdc, 0xa0, 0x3b, 0xbe, 0x18, 0xb5, 0xdc, 0x74, 0xe5, 0x3e, 0x9b, 0x05, 0xfe, 0xf4, 0x74, + 0xac, 0x6b, 0xa7, 0xc6, 0xfa, 0xfd, 0x43, 0xbd, 0xa2, 0x1d, 0x9c, 0x96, 0x5a, 0xce, 0xf6, 0x5a, + 0xa7, 0x77, 0x71, 0x36, 0x19, 0x1b, 0x95, 0xe6, 0xf3, 0xd5, 0xfd, 0xc1, 0xf3, 0x76, 0xae, 0x79, + 0x9f, 0xb5, 0x5e, 0xca, 0xb7, 0xad, 0x57, 0xcd, 0x74, 0x9d, 0xb5, 0xfd, 0xca, 0xe1, 0xda, 0xc0, + 0x73, 0xfb, 0xed, 0x57, 0xeb, 0xb0, 0xff, 0xb6, 0xbe, 0xee, 0x0c, 0x27, 0xda, 0x5e, 0xf6, 0xf2, + 0x0d, 0x04, 0x84, 0x62, 0x7f, 0x78, 0xf7, 0x70, 0xfa, 0x3c, 0x79, 0xac, 0x0c, 0x2b, 0xcf, 0xa5, + 0x87, 0xde, 0x93, 0x76, 0x58, 0x50, 0x2f, 0x1f, 0xd6, 0x4a, 0x6d, 0x5b, 0xbf, 0x28, 0x69, 0xe7, + 0xd9, 0x8b, 0xb7, 0x51, 0xeb, 0x60, 0xed, 0xed, 0xa5, 0x63, 0x78, 0x59, 0xb7, 0x5d, 0xd2, 0xd6, + 0x1e, 0x5b, 0xaf, 0xcd, 0x0b, 0x6b, 0xd4, 0xb9, 0xee, 0xe6, 0xf3, 0xd7, 0xa5, 0x52, 0xa5, 0xa4, + 0x7a, 0xf9, 0xe1, 0xc3, 0x43, 0x65, 0xed, 0x3e, 0xf7, 0xa8, 0x74, 0xaf, 0x94, 0xb5, 0xf5, 0xe2, + 0xfa, 0x9a, 0xf6, 0x78, 0x93, 0xdb, 0x7b, 0x99, 0x58, 0x7b, 0xaf, 0x67, 0x8f, 0x20, 0x03, 0x1e, + 0xb6, 0x2b, 0x57, 0xc3, 0x93, 0x03, 0xe7, 0xfa, 0xa0, 0xdc, 0x3c, 0x7e, 0xbc, 0xd9, 0xdd, 0xd9, + 0x79, 0x7a, 0x3c, 0xd8, 0xbb, 0x6f, 0xf5, 0x4b, 0x07, 0x39, 0x40, 0x63, 0x5e, 0x2f, 0x15, 0x1f, + 0xd7, 0xef, 0x3d, 0x7d, 0x7b, 0xf0, 0x62, 0x5c, 0x96, 0xd6, 0x1e, 0xbd, 0xed, 0xa7, 0xb3, 0xfa, + 0xbd, 0x31, 0xc8, 0x77, 0x1e, 0xdf, 0x76, 0xcf, 0xd6, 0xae, 0xd2, 0xa5, 0x7d, 0xe0, 0xe4, 0x8d, + 0xc2, 0xc5, 0x5b, 0xe9, 0x19, 0xd6, 0xb0, 0x23, 0xb5, 0xe5, 0x35, 0xef, 0x2f, 0xad, 0xd1, 0xe0, + 0xaa, 0x7b, 0x3e, 0x39, 0x34, 0x06, 0x27, 0x86, 0x3a, 0x5a, 0x1f, 0x99, 0xcd, 0x8b, 0xbe, 0x37, + 0x50, 0x9f, 0xad, 0xec, 0x5d, 0x63, 0xb4, 0x0e, 0x1c, 0xb9, 0x71, 0x3d, 0x3a, 0x6b, 0x0d, 0x80, + 0x2c, 0x9f, 0x46, 0xfb, 0xbd, 0x5e, 0xd9, 0x5d, 0xeb, 0xb9, 0xaf, 0x8e, 0x7e, 0xbf, 0xe3, 0x76, + 0xeb, 0x79, 0xb7, 0x60, 0xee, 0x83, 0xd8, 0x5c, 0x3c, 0x5a, 0xbb, 0x48, 0xab, 0xee, 0x78, 0x34, + 0x7e, 0x6a, 0x7a, 0xa7, 0xa7, 0x4a, 0x61, 0x6f, 0xbd, 0xd9, 0x6b, 0x5d, 0x97, 0x1f, 0xdf, 0xd6, + 0xfb, 0x47, 0xcd, 0x7d, 0xe5, 0x76, 0xbd, 0x7c, 0xa2, 0x8c, 0x0f, 0xea, 0x6b, 0xcd, 0xf1, 0xfa, + 0x24, 0x6d, 0xe4, 0xb3, 0xd9, 0xb5, 0xc2, 0x73, 0xfa, 0x30, 0xaf, 0x2b, 0x7b, 0x07, 0xed, 0xfc, + 0xda, 0xa0, 0x7e, 0x77, 0x7e, 0x94, 0xbd, 0xef, 0xed, 0x3c, 0x0e, 0xee, 0x5f, 0x8f, 0x76, 0xd5, + 0xc7, 0xb1, 0xda, 0x76, 0x15, 0xa3, 0x75, 0xb7, 0x7f, 0x97, 0x6e, 0x5f, 0x18, 0x87, 0xfd, 0xed, + 0x71, 0xf6, 0xf5, 0x62, 0xad, 0x55, 0xce, 0x0e, 0x9e, 0x1e, 0x14, 0xef, 0x5a, 0xbb, 0xf5, 0x8e, + 0xaf, 0x86, 0xe5, 0xe2, 0x04, 0xc8, 0xb7, 0x3e, 0x7c, 0x28, 0x8f, 0x77, 0xb5, 0xb7, 0xfa, 0x43, + 0xb6, 0x72, 0xdf, 0xaf, 0xec, 0x74, 0x7b, 0xd9, 0xf5, 0xd2, 0xc5, 0xfa, 0xc5, 0xd8, 0x3d, 0xdf, + 0x79, 0x34, 0xdd, 0x87, 0xfb, 0xab, 0xf4, 0x9a, 0xbd, 0xf3, 0x56, 0xc9, 0x9e, 0x9f, 0x3d, 0x95, + 0xd6, 0x9e, 0xea, 0x47, 0x07, 0x7b, 0xed, 0x9b, 0x51, 0x5a, 0xb5, 0x2b, 0x77, 0xe9, 0xa3, 0xc2, + 0xf9, 0xed, 0x9d, 0x06, 0x73, 0x6a, 0xa4, 0x0f, 0xd3, 0x46, 0xab, 0xf5, 0xfa, 0x9c, 0x5b, 0xcb, + 0x3f, 0xac, 0x3d, 0x8e, 0x4a, 0xdd, 0xe3, 0xfa, 0xed, 0xd5, 0xc1, 0xe3, 0xe5, 0x55, 0xf9, 0x6a, + 0x32, 0xbe, 0xee, 0x74, 0xb5, 0x9d, 0xf4, 0x55, 0xab, 0x74, 0x6f, 0xd6, 0xcf, 0x76, 0xea, 0x87, + 0xfb, 0xc3, 0xf2, 0xcd, 0xb1, 0xa7, 0x79, 0x05, 0xdb, 0xcc, 0x56, 0x0a, 0xcd, 0xe2, 0xe3, 0x4e, + 0xfd, 0x68, 0x7b, 0x58, 0x28, 0x59, 0x1d, 0xfb, 0xe6, 0x7a, 0xe2, 0x95, 0x2e, 0x9f, 0x41, 0x26, + 0xbd, 0xa9, 0x9c, 0x3c, 0xd6, 0xf7, 0xae, 0x4e, 0x2a, 0xe6, 0x7e, 0x77, 0xbb, 0x05, 0x62, 0xf1, + 0xed, 0x08, 0x68, 0xff, 0xf5, 0xb0, 0xb1, 0x7d, 0x62, 0xed, 0x1d, 0xac, 0x9d, 0x3c, 0x5d, 0x9d, + 0x9e, 0xd9, 0xcf, 0x56, 0x69, 0xd0, 0x53, 0xb3, 0x97, 0x47, 0xf9, 0xc9, 0x60, 0xfb, 0xfe, 0x62, + 0xe7, 0xa6, 0xb1, 0xfb, 0xa4, 0x3e, 0xdb, 0xaf, 0x57, 0xe5, 0x4a, 0xfa, 0x49, 0xcd, 0x55, 0x9e, + 0xbb, 0x07, 0xdd, 0xc7, 0xb3, 0x9b, 0x8a, 0xb9, 0xdd, 0x7b, 0x3e, 0x69, 0xed, 0x3b, 0x27, 0x3b, + 0x8f, 0xfb, 0xe5, 0xc9, 0x49, 0xe3, 0xe9, 0xfa, 0x74, 0xbf, 0xe4, 0x5d, 0x97, 0x1e, 0x4f, 0x7a, + 0xb7, 0x6f, 0x6f, 0xe7, 0xf7, 0x67, 0xa5, 0x7c, 0x7f, 0x7b, 0x38, 0xb8, 0x3c, 0xd3, 0x4f, 0xd7, + 0xc6, 0x97, 0xe3, 0xe2, 0xad, 0x7a, 0xdd, 0xdd, 0xd7, 0x8f, 0x9f, 0xea, 0x77, 0xfb, 0x6e, 0xeb, + 0x29, 0x7f, 0x78, 0x7b, 0xd4, 0xbb, 0xbd, 0x6c, 0xed, 0xa9, 0x87, 0xa5, 0xfb, 0xfb, 0xdd, 0xe1, + 0xb0, 0x3f, 0x6c, 0x5f, 0x76, 0x8c, 0xd2, 0x89, 0xba, 0x33, 0xbc, 0xa8, 0x58, 0xb9, 0x74, 0x67, + 0x7f, 0x67, 0xbb, 0x59, 0xee, 0x0d, 0x07, 0xa7, 0x6f, 0x15, 0xe3, 0xec, 0xfa, 0x62, 0xd4, 0x79, + 0xbe, 0x3c, 0xaf, 0xe8, 0xaa, 0xb3, 0xae, 0x5c, 0xef, 0xec, 0xe8, 0xd7, 0x3b, 0xc7, 0x4e, 0x61, + 0xd0, 0x7d, 0x3d, 0xec, 0x94, 0x4f, 0x5f, 0xbb, 0xb7, 0x8f, 0x8f, 0x6e, 0xa9, 0xf7, 0x36, 0x1c, + 0xac, 0x7b, 0x67, 0x47, 0x17, 0xb7, 0x4e, 0x76, 0x6c, 0x0f, 0xaf, 0xdd, 0xf3, 0xbb, 0x61, 0xfb, + 0x29, 0x6b, 0xa7, 0xfb, 0xdb, 0x15, 0x73, 0xed, 0x2e, 0x0f, 0x5c, 0x51, 0xb9, 0x49, 0xab, 0xd7, + 0xbd, 0x4b, 0xfb, 0xbc, 0xe7, 0x9e, 0xef, 0x5f, 0xbc, 0x8e, 0xad, 0xbd, 0xfc, 0x40, 0x71, 0x07, + 0xaf, 0x37, 0xba, 0xdd, 0x1d, 0x97, 0x2a, 0x47, 0xc7, 0x75, 0x62, 0xa2, 0xa8, 0x49, 0x42, 0xc7, + 0x72, 0xfa, 0xaa, 0x97, 0xfa, 0x8a, 0x0a, 0xd4, 0x57, 0x69, 0x56, 0x75, 0x2c, 0xcb, 0x9b, 0xae, + 0xae, 0xb6, 0x56, 0x73, 0xd5, 0xcf, 0xb9, 0x5c, 0x6e, 0x03, 0x1f, 0x3b, 0xd5, 0xcf, 0x9d, 0x4e, + 0x87, 0x3c, 0xe6, 0xab, 0x68, 0x18, 0x22, 0x8f, 0x85, 0xea, 0xe7, 0x42, 0xa1, 0x40, 0x1e, 0x8b, + 0xd5, 0xcf, 0xc5, 0x62, 0x91, 0x3c, 0x96, 0xaa, 0x9f, 0x4b, 0xa5, 0x12, 0x79, 0x2c, 0x57, 0x3f, + 0x97, 0xcb, 0x65, 0xf2, 0x58, 0xa9, 0x7e, 0xae, 0x54, 0x2a, 0xe4, 0xb1, 0x59, 0xfd, 0xdc, 0x6c, + 0x36, 0xc9, 0x63, 0xab, 0xfa, 0xb9, 0xd5, 0x6a, 0x91, 0x47, 0xad, 0xfa, 0x59, 0xd3, 0x34, 0xf2, + 0xd8, 0xae, 0x7e, 0x6e, 0xb7, 0xdb, 0xe4, 0xd1, 0x81, 0x0c, 0x05, 0x5a, 0x5b, 0x17, 0x2a, 0x6e, + 0xd1, 0xe6, 0x18, 0x50, 0x5b, 0x45, 0x25, 0x8f, 0x93, 0xea, 0x67, 0x75, 0x5d, 0x81, 0x47, 0x0f, + 0xe0, 0x2a, 0x19, 0x5a, 0xaf, 0x55, 0x75, 0xba, 0x4d, 0x35, 0x55, 0x28, 0xca, 0x82, 0xff, 0x4f, + 0xc9, 0xac, 0x4b, 0xe4, 0x9b, 0xd7, 0x9c, 0xff, 0x08, 0x5a, 0x7d, 0x8a, 0x40, 0x90, 0xfc, 0x3c, + 0x2a, 0xcd, 0x94, 0x53, 0xf2, 0xb2, 0x10, 0xfe, 0x99, 0xcf, 0xd7, 0xa3, 0xf9, 0x4a, 0x39, 0x59, + 0xf0, 0xff, 0x45, 0x33, 0x79, 0xbd, 0xea, 0x9a, 0x62, 0x8f, 0xf1, 0xc9, 0xf6, 0x9f, 0xa0, 0x54, + 0xb9, 0x40, 0xd3, 0x9a, 0x76, 0x35, 0x57, 0xb4, 0xc7, 0x02, 0xfd, 0xa3, 0xb0, 0x27, 0xcc, 0x03, + 0x5f, 0xd6, 0xe1, 0x55, 0x11, 0xd6, 0xf0, 0x2f, 0x29, 0xd5, 0xae, 0x9a, 0x96, 0x89, 0x28, 0x72, + 0xbb, 0x76, 0x55, 0x6c, 0xa2, 0x71, 0x44, 0xc4, 0x0f, 0x7d, 0xaf, 0x0a, 0x25, 0x67, 0x68, 0x56, + 0x9c, 0x12, 0x6b, 0xc2, 0xaa, 0x4a, 0x0d, 0x28, 0x7d, 0x15, 0xe4, 0xff, 0x81, 0x41, 0xec, 0x0f, + 0xb3, 0xa6, 0xd5, 0x9e, 0x4c, 0xfb, 0xaa, 0xd3, 0xd5, 0xcd, 0xaa, 0xb2, 0x81, 0x16, 0xa6, 0xae, + 0x63, 0x0d, 0xcc, 0x36, 0x35, 0xfc, 0x55, 0x69, 0xb3, 0x61, 0xd4, 0xa5, 0x0d, 0x5e, 0xdf, 0x3e, + 0xd4, 0x8c, 0xa1, 0xe6, 0xe9, 0x2d, 0x55, 0xbe, 0xd3, 0x9c, 0xb6, 0x6a, 0xaa, 0xb2, 0xab, 0x9a, + 0xee, 0xaa, 0xab, 0x39, 0x7a, 0x87, 0x66, 0x74, 0xf5, 0x37, 0xad, 0x9a, 0x83, 0x56, 0x6e, 0x44, + 0x01, 0x75, 0xa4, 0x0d, 0x4f, 0x1b, 0x7b, 0xab, 0xaa, 0xa1, 0x77, 0xcd, 0x6a, 0x4b, 0x43, 0x6b, + 0xc2, 0x06, 0xda, 0x08, 0x5f, 0x74, 0x6f, 0x95, 0x36, 0xb3, 0xa5, 0x1a, 0x06, 0x5a, 0x75, 0x68, + 0xb7, 0xd8, 0xa7, 0x01, 0xc0, 0x06, 0xf8, 0x86, 0xd6, 0xf2, 0x3f, 0xf4, 0xad, 0xb7, 0xa4, 0x54, + 0x77, 0x3e, 0x71, 0x3e, 0x97, 0x5f, 0x9f, 0x6a, 0xaf, 0xf6, 0xf4, 0x6e, 0xcf, 0x40, 0xeb, 0x13, + 0xeb, 0xb1, 0xe7, 0x40, 0x4f, 0x6c, 0xd5, 0x81, 0x96, 0x6d, 0xb8, 0x2d, 0xc7, 0x32, 0x8c, 0xa6, + 0xea, 0x50, 0xc3, 0x6a, 0xb5, 0x0c, 0xdd, 0x09, 0xd3, 0xa2, 0x1d, 0x73, 0x9b, 0x92, 0xc0, 0x95, + 0x25, 0x88, 0x95, 0x09, 0xf2, 0x7b, 0x1a, 0x82, 0xaf, 0xe6, 0x14, 0xe5, 0xcf, 0x0d, 0x0a, 0x87, + 0x3c, 0xda, 0x96, 0xab, 0x93, 0xf1, 0xe8, 0xe8, 0x63, 0xad, 0xbd, 0x61, 0xc1, 0xb2, 0x4a, 0x61, + 0xaf, 0x36, 0xb5, 0x9e, 0x3a, 0xd4, 0x01, 0x36, 0x36, 0x76, 0xf6, 0xb9, 0xd9, 0xe5, 0x40, 0x0c, + 0x7b, 0x21, 0x8c, 0xe1, 0x28, 0x0e, 0xe4, 0x6d, 0x55, 0x37, 0xdb, 0xda, 0xb8, 0xba, 0x9a, 0x8b, + 0x8c, 0x65, 0x90, 0x8b, 0xe1, 0x9b, 0xfb, 0xe4, 0x68, 0xb6, 0xa6, 0x22, 0x5a, 0xd8, 0x13, 0xff, + 0x8d, 0x8c, 0x61, 0x0b, 0x1b, 0xb6, 0x61, 0xd9, 0x6a, 0x4b, 0xf7, 0x26, 0x40, 0x22, 0xa4, 0x8f, + 0x14, 0x1a, 0x4b, 0x14, 0xf2, 0xee, 0xcc, 0xf6, 0x69, 0x88, 0x50, 0xab, 0x22, 0xe4, 0xf1, 0xef, + 0x4c, 0x95, 0xd5, 0xea, 0x50, 0x87, 0xdc, 0x5a, 0x5b, 0xb6, 0xa7, 0x51, 0x7c, 0xb5, 0x25, 0xfe, + 0xf3, 0x94, 0x10, 0x45, 0x5b, 0x6b, 0x59, 0x0e, 0xa1, 0x4b, 0xda, 0xf5, 0xe6, 0xc0, 0xf3, 0x2c, + 0x73, 0x0a, 0xc4, 0x60, 0xe8, 0xa6, 0x06, 0x95, 0xb7, 0x06, 0x8e, 0x0b, 0x30, 0x6c, 0x4b, 0xc7, + 0x7e, 0xcc, 0x32, 0x86, 0xda, 0xd4, 0x0c, 0x37, 0xa4, 0x5f, 0x5b, 0x6d, 0xb7, 0x75, 0xb3, 0x5b, + 0xad, 0x70, 0x8d, 0xf8, 0x8c, 0x36, 0x69, 0x92, 0x71, 0x1a, 0xc3, 0x56, 0xd3, 0x02, 0xf0, 0xfd, + 0x2a, 0xd0, 0x5b, 0x2b, 0x45, 0x9b, 0xd5, 0xec, 0x49, 0x42, 0x5a, 0x80, 0x61, 0x96, 0x36, 0x1c, + 0x82, 0xf1, 0xf2, 0x1c, 0x01, 0xb7, 0xa5, 0x58, 0x2b, 0x36, 0x46, 0x0e, 0x00, 0x35, 0xbb, 0x40, + 0x90, 0x6d, 0xad, 0x0a, 0xc8, 0xc2, 0x79, 0x61, 0xac, 0x3a, 0x06, 0x45, 0x15, 0x32, 0x52, 0xe0, + 0x9e, 0x68, 0x42, 0x4b, 0xe5, 0x2a, 0x4a, 0x5b, 0xeb, 0x4a, 0xb3, 0x4c, 0xd3, 0xd1, 0xa7, 0x7e, + 0x5b, 0x61, 0x66, 0xcf, 0x32, 0x23, 0x07, 0xed, 0x5f, 0x4e, 0xbc, 0x85, 0x9e, 0x65, 0x43, 0xaf, + 0x0c, 0xad, 0x03, 0x73, 0x99, 0xb5, 0x88, 0x1f, 0xd8, 0xa0, 0x51, 0x5e, 0x53, 0x0a, 0xc6, 0x3e, + 0x37, 0xcb, 0xa0, 0xc9, 0xdc, 0x4d, 0x32, 0x90, 0xd1, 0xa9, 0x89, 0xa6, 0x34, 0x40, 0x30, 0x30, + 0x78, 0x83, 0x9b, 0xac, 0x79, 0x68, 0xc8, 0x27, 0xbd, 0x8f, 0xfb, 0x0b, 0x2a, 0xd0, 0x3e, 0x62, + 0x7c, 0xd5, 0xa7, 0x3b, 0x2e, 0xbd, 0xad, 0xbb, 0xb6, 0xa1, 0x4e, 0xaa, 0xba, 0x49, 0x72, 0x10, + 0x7e, 0xc3, 0x6a, 0xcc, 0xc0, 0x58, 0x45, 0x91, 0x85, 0x7d, 0x65, 0x9f, 0x3a, 0x9d, 0xd8, 0xb7, + 0x32, 0xe2, 0xc1, 0xf2, 0x04, 0x9a, 0x41, 0xce, 0x40, 0x5f, 0xd9, 0xb3, 0x3f, 0x9e, 0xab, 0x64, + 0x00, 0x85, 0x22, 0x19, 0xc6, 0x4c, 0x6f, 0xd0, 0x65, 0x46, 0x3f, 0xd2, 0xdc, 0x62, 0x1e, 0xf1, + 0x66, 0x1b, 0x40, 0xd1, 0xce, 0x44, 0xb8, 0xa9, 0x6f, 0x9f, 0xee, 0xc9, 0x19, 0x57, 0xeb, 0x7a, + 0x53, 0x0f, 0xb7, 0x19, 0x56, 0x99, 0x69, 0x98, 0xe2, 0x31, 0x9c, 0x76, 0x33, 0x92, 0x47, 0xb8, + 0xd9, 0x0d, 0xf0, 0x9f, 0x8f, 0x74, 0x7b, 0x8e, 0x39, 0x71, 0x75, 0xec, 0xca, 0x41, 0x61, 0x8e, + 0xc7, 0x21, 0xcf, 0xf6, 0x61, 0x29, 0x1b, 0xc1, 0xf8, 0x53, 0x18, 0x7d, 0xbd, 0xdd, 0x36, 0xb4, + 0x59, 0xe6, 0x45, 0x9b, 0x78, 0x8c, 0xc8, 0xe9, 0x07, 0x1c, 0xd3, 0x59, 0x66, 0xa8, 0x1a, 0xd1, + 0x64, 0x32, 0xc6, 0x2c, 0x5d, 0xd0, 0xb9, 0x6a, 0x5c, 0x18, 0x2c, 0x03, 0x1a, 0x4f, 0xac, 0xce, + 0x64, 0x4f, 0x64, 0x1a, 0x92, 0x17, 0x79, 0x32, 0x90, 0xc2, 0xa0, 0x31, 0x32, 0xfc, 0x03, 0xd4, + 0x6a, 0x0b, 0x33, 0x3d, 0xa6, 0x68, 0x0e, 0xe0, 0x88, 0x0b, 0xf3, 0x3c, 0xa4, 0x78, 0x28, 0x72, + 0x90, 0x57, 0x8e, 0xb4, 0x20, 0x36, 0x11, 0xe6, 0x26, 0x38, 0x14, 0x53, 0x1d, 0xe0, 0xe8, 0x24, + 0x73, 0x40, 0xda, 0x6a, 0xd3, 0xb5, 0x8c, 0x81, 0xa7, 0x11, 0xea, 0x86, 0x99, 0x4a, 0xe9, 0x3b, + 0x07, 0xe3, 0xc0, 0xc6, 0x09, 0x29, 0x71, 0x83, 0x91, 0x5e, 0x9e, 0x4c, 0x0f, 0x62, 0x79, 0x5e, + 0x04, 0xc6, 0xa7, 0x48, 0xc2, 0xda, 0x7d, 0x98, 0x74, 0xb2, 0xac, 0xe3, 0xf4, 0x8d, 0xf1, 0x8c, + 0x8e, 0xe1, 0x4c, 0xe7, 0xd7, 0xa4, 0xf8, 0x54, 0x55, 0x24, 0x9e, 0xd3, 0x05, 0x9f, 0x85, 0x4c, + 0xc1, 0xdd, 0x48, 0xee, 0x49, 0x38, 0x41, 0x39, 0x2e, 0x04, 0x18, 0x1c, 0xdb, 0x32, 0xfe, 0x51, + 0x61, 0x72, 0xb6, 0x05, 0x52, 0xfb, 0x62, 0xbe, 0xa0, 0x1b, 0xd3, 0xa4, 0xf9, 0xb5, 0x80, 0xaa, + 0x3e, 0x1b, 0xfa, 0x50, 0xc3, 0x3d, 0x41, 0x7f, 0x7d, 0x40, 0xbc, 0x45, 0xb0, 0xc1, 0x2d, 0x37, + 0x4d, 0xcb, 0x81, 0x71, 0xab, 0xc2, 0x44, 0x82, 0xf9, 0x31, 0x9d, 0x5b, 0xe8, 0xf9, 0x65, 0x6f, + 0x7e, 0x1c, 0x61, 0x9e, 0x2e, 0x60, 0x9e, 0x01, 0x77, 0xe2, 0xab, 0x5a, 0x24, 0x45, 0x00, 0x9b, + 0x22, 0xd5, 0x0b, 0x8c, 0xb1, 0x2f, 0x6d, 0x45, 0xc7, 0xb0, 0x60, 0x61, 0x42, 0xe8, 0x7e, 0xdb, + 0xe9, 0x00, 0x87, 0xa3, 0x42, 0xca, 0xe0, 0x88, 0xc8, 0x71, 0x40, 0x64, 0x98, 0x96, 0xca, 0x21, + 0x2d, 0x69, 0xa3, 0xaf, 0x9b, 0x6c, 0x5d, 0x2f, 0x12, 0x22, 0x43, 0x06, 0xc4, 0x1a, 0xe6, 0x8f, + 0x20, 0x93, 0xda, 0x9a, 0x36, 0xe4, 0x66, 0x6b, 0x0c, 0x65, 0x5a, 0x89, 0xf9, 0x9a, 0x98, 0x8f, + 0x91, 0x70, 0xe9, 0x4f, 0xae, 0x44, 0xd8, 0xe5, 0x6a, 0x0f, 0x97, 0xd3, 0xe9, 0x12, 0x0c, 0xf5, + 0xa4, 0x58, 0x4b, 0xb5, 0x08, 0xce, 0x32, 0x28, 0xc4, 0x0d, 0xb5, 0x65, 0x10, 0x54, 0x89, 0xe3, + 0x67, 0x71, 0x4a, 0x9f, 0xbd, 0x0b, 0xa0, 0xbc, 0xbc, 0x38, 0xee, 0xf7, 0xaa, 0x40, 0x99, 0x0e, + 0x68, 0x03, 0xb0, 0xdc, 0xf3, 0xe3, 0x4e, 0x1f, 0xb9, 0xe5, 0xd4, 0x94, 0xfe, 0xc2, 0x0f, 0x92, + 0x3f, 0x99, 0xc9, 0x27, 0x4c, 0x11, 0x56, 0x7d, 0x81, 0xd8, 0x96, 0x82, 0x67, 0xe8, 0xba, 0x8f, + 0xe6, 0x55, 0x9c, 0x50, 0x41, 0x8e, 0x8d, 0x24, 0x4e, 0xc7, 0x55, 0xa3, 0xcb, 0x8a, 0x94, 0x15, + 0x82, 0x2a, 0x57, 0x49, 0x9d, 0xd2, 0x62, 0x89, 0x0a, 0xd1, 0xc9, 0xb6, 0xad, 0xa7, 0x1c, 0x95, + 0x05, 0x04, 0xee, 0x68, 0x28, 0x1c, 0x0f, 0xb5, 0x05, 0x7d, 0xc3, 0xf7, 0xac, 0x5f, 0x9b, 0x04, + 0xc4, 0x39, 0x46, 0x2a, 0x43, 0x32, 0xa0, 0x74, 0xba, 0x0a, 0x29, 0xc1, 0x74, 0x23, 0xad, 0x80, + 0x4a, 0x46, 0x55, 0x75, 0xe0, 0x59, 0x1b, 0xbc, 0x2c, 0xb8, 0x58, 0xe2, 0xdb, 0xeb, 0x74, 0x40, + 0x56, 0x75, 0xa7, 0xbe, 0x9c, 0xea, 0xc3, 0x58, 0xa5, 0xd9, 0xb1, 0x2a, 0x22, 0x2a, 0xcf, 0x3e, + 0xdb, 0xd8, 0x0f, 0xf9, 0xb3, 0xfd, 0x6a, 0xc0, 0x9f, 0x81, 0xa7, 0xc3, 0x0f, 0x2c, 0x51, 0x34, + 0x11, 0x1e, 0x82, 0x14, 0x7c, 0xc8, 0xfb, 0x9b, 0xae, 0x15, 0xd4, 0x0b, 0xb8, 0xec, 0xb1, 0x5c, + 0x38, 0x2f, 0x7c, 0x86, 0x82, 0x4c, 0xd9, 0x97, 0xec, 0x60, 0x45, 0x10, 0xb0, 0x13, 0x28, 0x53, + 0xb1, 0xcc, 0x02, 0x2e, 0x88, 0x7a, 0x30, 0x0f, 0xc8, 0xb0, 0x21, 0x23, 0x8f, 0x36, 0x8c, 0xb5, + 0x28, 0x10, 0xd3, 0x08, 0x14, 0xd6, 0x80, 0x60, 0x0a, 0x95, 0xc8, 0x5a, 0x0f, 0x93, 0xc5, 0xed, + 0x83, 0xaa, 0xd9, 0x9b, 0x26, 0x72, 0x5f, 0x6e, 0xd0, 0x3b, 0x72, 0x4e, 0xfa, 0x2b, 0x53, 0x72, + 0x25, 0x41, 0x53, 0x5d, 0x6d, 0x15, 0xd6, 0x7a, 0x32, 0xae, 0xab, 0x54, 0xd2, 0x0b, 0xaa, 0x52, + 0x84, 0x55, 0x02, 0xd9, 0x67, 0xca, 0xab, 0x8c, 0x6f, 0xf1, 0xac, 0xd2, 0x27, 0x3f, 0xe4, 0x74, + 0x88, 0x6a, 0x48, 0x8b, 0x73, 0xbb, 0x05, 0x32, 0x7c, 0x44, 0x3e, 0x5b, 0x38, 0xa3, 0x0a, 0x52, + 0x4c, 0xcc, 0x0a, 0x6a, 0xee, 0x18, 0xda, 0x78, 0x83, 0xf0, 0xf4, 0x55, 0x90, 0x82, 0xfb, 0xae, + 0x2f, 0xa0, 0x3f, 0x0f, 0x5c, 0x4f, 0xef, 0x4c, 0x56, 0x19, 0x95, 0xfa, 0xc9, 0x81, 0x88, 0x97, + 0x0b, 0x04, 0xf2, 0xcc, 0x7a, 0x89, 0x67, 0x89, 0x99, 0x35, 0x5c, 0x9e, 0xc8, 0x4a, 0xb7, 0xaa, + 0xe1, 0x9e, 0xb1, 0xcb, 0x48, 0xde, 0xf5, 0xd4, 0x09, 0x74, 0x5d, 0x26, 0x0f, 0xd0, 0xec, 0x60, + 0x9d, 0xa1, 0x0b, 0x4c, 0xd0, 0x5d, 0x9f, 0xe4, 0xa0, 0xfe, 0xd6, 0xcb, 0x24, 0x4c, 0xa7, 0xef, + 0xbc, 0xa0, 0x44, 0xba, 0xee, 0xb7, 0x28, 0xbf, 0x11, 0x19, 0x5c, 0x3a, 0xc2, 0x7e, 0xa5, 0x53, + 0x86, 0xf3, 0x12, 0x12, 0x06, 0x95, 0x1f, 0x5c, 0x46, 0x8b, 0x05, 0x45, 0x09, 0x29, 0x8c, 0x96, + 0x8d, 0xd7, 0x19, 0xac, 0x34, 0x41, 0x59, 0xc1, 0x97, 0xfb, 0x79, 0xb2, 0x43, 0x31, 0x6c, 0x81, + 0xb8, 0xb4, 0x98, 0xd7, 0xe5, 0x91, 0xe1, 0x8c, 0x57, 0x23, 0x6d, 0x09, 0x56, 0x05, 0x32, 0x4f, + 0x62, 0x6d, 0x63, 0x33, 0xdc, 0x51, 0xdb, 0xfa, 0xc0, 0xa5, 0x63, 0x39, 0xc7, 0x36, 0x40, 0xc4, + 0xd0, 0x0d, 0x6f, 0x59, 0xb5, 0x45, 0xc6, 0x35, 0x7a, 0x6a, 0x1b, 0x18, 0x03, 0x12, 0x29, 0xe8, + 0x19, 0xe4, 0x1f, 0xa7, 0x6f, 0xc7, 0xaa, 0x2a, 0x73, 0x32, 0x51, 0x39, 0xde, 0x2e, 0xa1, 0xc8, + 0x09, 0xa1, 0xa8, 0xfc, 0xe4, 0x93, 0x1a, 0xc6, 0xab, 0x08, 0x14, 0x33, 0x02, 0x2c, 0x7a, 0x96, + 0xe1, 0xe9, 0x36, 0x8a, 0xa0, 0x53, 0xd4, 0xc5, 0x9a, 0xba, 0x81, 0x64, 0xd5, 0x03, 0x09, 0x43, + 0x33, 0x17, 0x93, 0x74, 0x29, 0xd2, 0x03, 0x94, 0xd0, 0x03, 0x53, 0x45, 0x31, 0xda, 0x8d, 0x0f, + 0xa8, 0xff, 0x3c, 0x0b, 0x40, 0x10, 0xb1, 0xae, 0x97, 0x03, 0xc1, 0x30, 0x57, 0x56, 0xf8, 0x7e, + 0x05, 0xe2, 0x57, 0xd0, 0x2f, 0x9f, 0x56, 0xc8, 0xe4, 0x24, 0xd3, 0xb2, 0xa4, 0xf8, 0x0b, 0xf1, + 0x2a, 0x79, 0x5f, 0x5d, 0x47, 0xd4, 0x2c, 0x55, 0x67, 0x33, 0x6b, 0x25, 0x37, 0x11, 0x41, 0xd5, + 0xaa, 0xda, 0xc1, 0x71, 0xf5, 0x67, 0xa5, 0x28, 0x2e, 0x10, 0x05, 0x97, 0x54, 0x5f, 0x0a, 0xbb, + 0x47, 0xfb, 0xc4, 0x25, 0x50, 0xc5, 0x0c, 0xe0, 0xe8, 0x6d, 0x3f, 0x29, 0x8e, 0x75, 0xde, 0xc4, + 0xb0, 0xe8, 0xd9, 0x6f, 0x3b, 0x95, 0x35, 0x16, 0x0e, 0x31, 0x79, 0x34, 0xb4, 0x00, 0x17, 0xb9, + 0x19, 0xe1, 0xd6, 0x19, 0xad, 0x0d, 0xd3, 0x9f, 0x88, 0xda, 0xbc, 0x28, 0x09, 0xfa, 0x17, 0xc0, + 0x8c, 0x24, 0x85, 0xcc, 0x00, 0x28, 0x5e, 0x85, 0x8f, 0xf3, 0xf4, 0x13, 0xe0, 0x19, 0xe7, 0x84, + 0xe3, 0xfa, 0x4b, 0x00, 0x5d, 0x27, 0xc8, 0x2a, 0xe4, 0x59, 0x2a, 0x24, 0x87, 0xe3, 0xb1, 0x9c, + 0xe2, 0xc8, 0x9a, 0x9a, 0x03, 0x32, 0x21, 0x48, 0x12, 0x12, 0xa7, 0xf1, 0x3a, 0xa0, 0xfc, 0x03, + 0x44, 0x17, 0xa5, 0xb1, 0x12, 0x37, 0x7f, 0xf2, 0x91, 0xc9, 0x13, 0x35, 0xac, 0x94, 0xc2, 0x61, + 0x4d, 0xd4, 0x9a, 0x56, 0x4b, 0x28, 0xee, 0x2c, 0x32, 0x2c, 0x20, 0x64, 0x29, 0x2e, 0x97, 0x26, + 0xb1, 0x6b, 0x8a, 0x96, 0x8c, 0xdb, 0xb3, 0x46, 0x01, 0x6e, 0x72, 0x1b, 0xaa, 0xa9, 0xf7, 0xa9, + 0x75, 0x04, 0xd1, 0xad, 0x9b, 0x02, 0x2c, 0x7f, 0x72, 0xf8, 0x28, 0xe4, 0xf1, 0x8f, 0xa3, 0xa1, + 0x58, 0x11, 0x80, 0xd0, 0x1c, 0xc7, 0x72, 0x38, 0x18, 0x73, 0xf8, 0xfd, 0xdc, 0xcc, 0x27, 0x43, + 0x9e, 0x65, 0xfa, 0x56, 0x5b, 0x9d, 0x33, 0x9a, 0xf8, 0x8b, 0x9d, 0x2f, 0xfe, 0xfb, 0x4a, 0x0f, + 0x0e, 0x29, 0xd7, 0x61, 0xaf, 0x87, 0x82, 0x5d, 0x0e, 0xfb, 0xbb, 0x70, 0x48, 0xad, 0x44, 0xc9, + 0xee, 0x31, 0x45, 0x65, 0xc6, 0x64, 0xf5, 0xab, 0xe8, 0xf2, 0x7c, 0x8e, 0x5f, 0x57, 0x91, 0x35, + 0x44, 0x84, 0x2d, 0x54, 0x1b, 0x2d, 0x57, 0x9b, 0xc6, 0xd7, 0x13, 0xba, 0x72, 0x51, 0xc1, 0x8f, + 0xea, 0xdb, 0x9f, 0x75, 0xb3, 0x63, 0xc9, 0x9f, 0x4d, 0xab, 0xad, 0xb9, 0x53, 0x7f, 0xa8, 0x8b, + 0xb3, 0xcf, 0x0e, 0x11, 0xd6, 0xfd, 0x84, 0xc2, 0xec, 0xb3, 0xd9, 0x36, 0x02, 0x31, 0x26, 0xc7, + 0xcc, 0x4b, 0x24, 0x13, 0xac, 0x74, 0x89, 0xc6, 0x9b, 0x18, 0x46, 0xd2, 0x42, 0x09, 0x31, 0x42, + 0x15, 0xde, 0xb8, 0xb2, 0x16, 0x53, 0x54, 0x3f, 0xc3, 0x14, 0x34, 0xa1, 0xe6, 0x8f, 0x5a, 0xad, + 0x42, 0xc8, 0xfc, 0x62, 0x50, 0x9a, 0x63, 0xa7, 0x24, 0x65, 0x8e, 0x0a, 0xd0, 0x5c, 0x1e, 0x58, + 0x0f, 0xf3, 0x14, 0x23, 0x82, 0xbf, 0x7e, 0x86, 0x93, 0x2b, 0x1f, 0x5b, 0x23, 0x73, 0x45, 0x04, + 0xc7, 0xe1, 0x32, 0xd4, 0x7a, 0x22, 0x20, 0xd0, 0xbe, 0x35, 0xe5, 0x40, 0xb0, 0xaf, 0xc4, 0x54, + 0xc3, 0x10, 0x4f, 0x5f, 0xde, 0xb1, 0xde, 0xb0, 0x62, 0xed, 0xa0, 0x4c, 0x7b, 0x1a, 0x13, 0xec, + 0x2a, 0x01, 0xf0, 0x4c, 0xd3, 0x33, 0xfd, 0xc1, 0x2a, 0x45, 0xab, 0x24, 0xdf, 0x22, 0xf5, 0x46, + 0x72, 0xfb, 0x8d, 0x6f, 0xeb, 0x43, 0x3f, 0x13, 0x3c, 0x72, 0x68, 0x28, 0xae, 0xcf, 0x89, 0x06, + 0x50, 0xa4, 0xdf, 0x1d, 0xf9, 0x10, 0x2a, 0x4c, 0x56, 0x06, 0x1d, 0x9d, 0x2f, 0x57, 0x26, 0xe8, + 0x4b, 0x34, 0xa1, 0x7d, 0xee, 0x69, 0xaa, 0xe3, 0x4d, 0xe7, 0xd5, 0xdb, 0xf5, 0x88, 0x26, 0x1b, + 0x1a, 0x24, 0x1d, 0xad, 0x3d, 0x83, 0x2a, 0x39, 0xe8, 0x64, 0xd9, 0xc1, 0x57, 0x4e, 0x5a, 0x9d, + 0x65, 0x46, 0xfa, 0x94, 0xb8, 0xd2, 0xae, 0xc2, 0xda, 0x00, 0x23, 0x81, 0x44, 0x61, 0x03, 0x5a, + 0x71, 0xaa, 0xb5, 0x37, 0xe2, 0x5f, 0x5a, 0x0e, 0xb4, 0x6d, 0x55, 0x6b, 0x77, 0x35, 0xd7, 0xd7, + 0x64, 0x09, 0x9f, 0xfe, 0x8f, 0x17, 0x6d, 0xd2, 0x71, 0xd4, 0x3e, 0x60, 0x82, 0x72, 0x88, 0x69, + 0xc7, 0xb1, 0xfa, 0xd3, 0x80, 0x0b, 0x84, 0x8c, 0xde, 0xb3, 0xa6, 0xcb, 0xd9, 0x5f, 0xb8, 0xde, + 0xf8, 0x0b, 0x15, 0xc3, 0x47, 0xb0, 0xae, 0x7e, 0xfd, 0xba, 0x68, 0x5d, 0xcd, 0xfb, 0xd6, 0xa2, + 0xd0, 0xc4, 0x53, 0x09, 0xe5, 0xa2, 0x28, 0x65, 0x47, 0xa5, 0x2d, 0x7e, 0x06, 0x10, 0x24, 0x26, + 0xb0, 0x5d, 0xce, 0x7c, 0x8e, 0x1b, 0x28, 0x5d, 0x5e, 0xef, 0xfd, 0x4c, 0x48, 0x58, 0x88, 0xb5, + 0x98, 0xe4, 0x22, 0x45, 0xb9, 0x7a, 0x71, 0x50, 0x55, 0x67, 0xb5, 0x8b, 0xb5, 0xa1, 0x03, 0xe8, + 0x3a, 0x1a, 0x77, 0xe4, 0xcf, 0x8a, 0x02, 0xba, 0x48, 0xae, 0xf4, 0xa7, 0x0c, 0x03, 0x07, 0xf0, + 0xba, 0xff, 0x18, 0xbc, 0xcf, 0x4a, 0x47, 0x01, 0x80, 0xcd, 0x7f, 0x10, 0xa0, 0x82, 0x3d, 0x1e, + 0xfd, 0x73, 0x00, 0x3b, 0x1d, 0x04, 0xf8, 0x92, 0x00, 0x50, 0xfe, 0x3c, 0x6a, 0xaa, 0x46, 0xbc, + 0x96, 0xf7, 0x61, 0x77, 0x3a, 0x95, 0x4e, 0xae, 0x23, 0x28, 0x04, 0xb6, 0x00, 0xab, 0xae, 0xfc, + 0xb9, 0xd5, 0x6c, 0x37, 0x49, 0x3d, 0x3d, 0x6d, 0x3c, 0x92, 0x69, 0x6d, 0xf2, 0xe7, 0xd7, 0x96, + 0xbb, 0x0a, 0x6f, 0x4e, 0xb7, 0x49, 0xdf, 0xb1, 0x3a, 0x99, 0xf6, 0x2d, 0x26, 0xe0, 0xd0, 0x26, + 0x34, 0x07, 0x4d, 0x64, 0x43, 0x9c, 0x25, 0x72, 0x5e, 0x8e, 0x4e, 0xb4, 0xd1, 0xc5, 0x68, 0x4c, + 0x49, 0x26, 0xc6, 0x42, 0x82, 0x44, 0xcc, 0xed, 0x04, 0x10, 0xe9, 0x39, 0x1f, 0x59, 0xd8, 0xc8, + 0xd6, 0x1f, 0xa5, 0x75, 0xd4, 0x71, 0x38, 0x06, 0x11, 0xca, 0x5b, 0x42, 0x26, 0x0f, 0x4b, 0x3f, + 0x2a, 0xc2, 0x72, 0x20, 0xc5, 0xfa, 0x29, 0x9c, 0xb0, 0x3b, 0x27, 0xa0, 0xcd, 0x80, 0xc9, 0x82, + 0x1a, 0x1e, 0xe9, 0x3a, 0x11, 0x3a, 0x96, 0xca, 0x89, 0x9c, 0x6b, 0x31, 0xf1, 0x2c, 0xfe, 0x11, + 0x18, 0x2a, 0x70, 0x13, 0x43, 0x85, 0xb4, 0x96, 0x36, 0x67, 0x7f, 0x0c, 0x4d, 0xe4, 0x8b, 0x77, + 0x1b, 0x23, 0x46, 0xc8, 0xe8, 0x6a, 0x38, 0x57, 0x67, 0xb5, 0x63, 0xb5, 0x06, 0x6e, 0xb8, 0x37, + 0x94, 0x90, 0x23, 0x54, 0x66, 0xa9, 0xcd, 0xda, 0x19, 0x98, 0x26, 0x59, 0x5d, 0xa0, 0x9e, 0xd6, + 0xcb, 0x94, 0x6b, 0x1c, 0x63, 0x20, 0x05, 0x65, 0xce, 0x5e, 0xcc, 0x8f, 0x21, 0x9a, 0x27, 0xde, + 0xaf, 0xc5, 0xeb, 0x0d, 0xfa, 0xcd, 0x60, 0xc7, 0x8e, 0x57, 0x5e, 0xe6, 0x97, 0xe2, 0x88, 0xb1, + 0x94, 0x27, 0x89, 0x58, 0x23, 0x16, 0xe1, 0x97, 0x13, 0xa7, 0x41, 0x94, 0x4c, 0x6c, 0x1c, 0x6e, + 0x93, 0x92, 0x97, 0xe5, 0xbd, 0x9e, 0x1b, 0x0b, 0xb2, 0x83, 0xad, 0xc8, 0xe4, 0x7f, 0xd2, 0x7b, + 0x90, 0x49, 0x97, 0x7d, 0x93, 0x17, 0x13, 0xce, 0xf9, 0xc1, 0xfc, 0x17, 0xb1, 0x91, 0x28, 0x25, + 0xa2, 0xbc, 0x33, 0xfb, 0x4c, 0xbc, 0xf6, 0x5d, 0xe1, 0x77, 0x87, 0xa5, 0x12, 0x36, 0xa4, 0x12, + 0x34, 0x04, 0xb7, 0x82, 0x62, 0x9a, 0x45, 0x2e, 0x62, 0x91, 0x24, 0x52, 0xc4, 0x92, 0x1a, 0x17, + 0x60, 0x24, 0x09, 0xec, 0x8c, 0x17, 0x8c, 0xf8, 0x81, 0x60, 0x8c, 0xa7, 0xa0, 0x2c, 0xd5, 0xe0, + 0x95, 0xa0, 0x1d, 0x09, 0x02, 0x56, 0x99, 0x13, 0x4e, 0xd8, 0x7e, 0x2c, 0xee, 0x9f, 0xb5, 0xa7, + 0x09, 0x06, 0xaf, 0xcf, 0x4d, 0x47, 0x27, 0x65, 0xe7, 0x65, 0x38, 0xce, 0x08, 0xdb, 0xec, 0x7b, + 0x71, 0xbe, 0x6a, 0xab, 0x06, 0xda, 0x1c, 0xc9, 0x79, 0x8e, 0x79, 0x2e, 0x3b, 0x9c, 0x67, 0xb6, + 0x51, 0x43, 0x0a, 0xd7, 0xd4, 0x19, 0x83, 0x32, 0xa7, 0x1c, 0x12, 0x91, 0x8c, 0x97, 0xf6, 0xf9, + 0x3e, 0x15, 0x63, 0xb8, 0xe2, 0x18, 0xe6, 0xfa, 0x07, 0x36, 0x6d, 0x63, 0xd6, 0x95, 0x52, 0x84, + 0xb3, 0xae, 0xb6, 0x07, 0x6c, 0x1b, 0x1a, 0xf7, 0x11, 0x7c, 0x42, 0x42, 0xda, 0xc4, 0x93, 0x07, + 0xab, 0xf3, 0x7a, 0x6e, 0xe0, 0x50, 0x30, 0x4f, 0xa8, 0x85, 0x36, 0x9d, 0x45, 0x54, 0x0f, 0x5a, + 0x50, 0x7e, 0x69, 0xb9, 0x40, 0xa9, 0x69, 0x19, 0xba, 0x4d, 0x35, 0xd9, 0x68, 0xd2, 0x42, 0xbd, + 0xb8, 0x20, 0x2d, 0x33, 0x4a, 0x32, 0x0b, 0x2c, 0x91, 0x7c, 0x57, 0x5d, 0x6a, 0x2d, 0x90, 0x43, + 0xcb, 0x6e, 0x52, 0x6a, 0x3e, 0x9a, 0x8c, 0x2f, 0xfe, 0x8e, 0xc6, 0xa2, 0x36, 0x94, 0xa4, 0x65, + 0x3a, 0xfd, 0x8c, 0xc2, 0x9b, 0x46, 0x04, 0xd8, 0x60, 0xa3, 0x05, 0x3e, 0x11, 0x43, 0x84, 0xbf, + 0x1f, 0xec, 0x2f, 0x90, 0x40, 0xcf, 0xc9, 0x5b, 0x62, 0x0b, 0x76, 0xa7, 0x11, 0x90, 0x39, 0xe5, + 0xa9, 0x25, 0x20, 0xc6, 0x8a, 0x3f, 0x3d, 0x30, 0x8f, 0x3f, 0x83, 0x72, 0x79, 0x2e, 0x4f, 0x89, + 0x6e, 0x3f, 0x93, 0xef, 0x50, 0x5b, 0xbb, 0x2d, 0xfb, 0xcf, 0x6d, 0xcd, 0xa0, 0xcf, 0x63, 0xbf, + 0x03, 0xc5, 0xe8, 0x66, 0x32, 0x67, 0x45, 0xe7, 0x8d, 0x25, 0xac, 0x08, 0x83, 0x4f, 0x37, 0xb9, + 0xb1, 0x0d, 0xfc, 0x78, 0x84, 0xdf, 0x15, 0x4e, 0x9d, 0xc1, 0xe4, 0x85, 0x98, 0x2e, 0xc6, 0x46, + 0xd4, 0xef, 0x4c, 0x81, 0xb0, 0x2d, 0xaa, 0xc6, 0x64, 0x10, 0x54, 0x54, 0xd3, 0xe1, 0x8b, 0xc4, + 0x87, 0x7f, 0x6e, 0xe0, 0xa7, 0xcb, 0x8c, 0xdc, 0x4b, 0xe8, 0x70, 0x11, 0xfe, 0x42, 0xd7, 0x8d, + 0x51, 0x4f, 0xf7, 0xb4, 0x55, 0x58, 0x30, 0xc8, 0xda, 0x86, 0x1c, 0x63, 0x46, 0xb9, 0xca, 0x3c, + 0x5b, 0x80, 0x64, 0x0e, 0x79, 0x71, 0xc1, 0xab, 0xb8, 0x40, 0xc3, 0xf2, 0xb9, 0x05, 0xa7, 0x30, + 0x90, 0x67, 0xde, 0xd1, 0x21, 0x5f, 0x61, 0xf0, 0x9b, 0x01, 0x2f, 0x8d, 0x99, 0x5d, 0x23, 0xb9, + 0xc3, 0x35, 0x8c, 0xeb, 0x34, 0x0a, 0xa4, 0x94, 0x57, 0x4e, 0x63, 0x4b, 0x07, 0x75, 0x41, 0xe2, + 0x1d, 0x3f, 0x04, 0x8e, 0xab, 0x29, 0x71, 0x16, 0xb6, 0x0c, 0xd5, 0x1f, 0x63, 0x6f, 0xc1, 0x5a, + 0xcc, 0x19, 0xca, 0x62, 0x8c, 0x4f, 0x59, 0xc4, 0xf8, 0x4a, 0xff, 0x1c, 0xe3, 0x5b, 0x24, 0xbd, + 0x90, 0xf5, 0x32, 0x9e, 0xf8, 0x77, 0xb9, 0x64, 0x94, 0x2f, 0x6a, 0x06, 0x30, 0x46, 0x57, 0x77, + 0x67, 0x9f, 0x3d, 0x6f, 0x9a, 0xe0, 0xd3, 0xd1, 0x32, 0xe6, 0x29, 0x19, 0xf5, 0x15, 0x36, 0x46, + 0xc4, 0xdf, 0xc1, 0x96, 0xf9, 0x17, 0x23, 0xfa, 0xa6, 0x4d, 0x79, 0xf6, 0xb0, 0x31, 0x2f, 0x55, + 0x15, 0x91, 0x54, 0xdb, 0xfa, 0x90, 0xe6, 0x9f, 0xce, 0xef, 0x12, 0x04, 0xdf, 0x3e, 0x62, 0x55, + 0x76, 0x98, 0x42, 0x8f, 0xa3, 0x05, 0xd4, 0x94, 0x0f, 0x9d, 0x25, 0x14, 0xbf, 0x42, 0xc5, 0x1f, + 0x5a, 0x5f, 0x41, 0x4e, 0x90, 0xc3, 0xfc, 0xc1, 0xf7, 0x35, 0xe7, 0xc5, 0x59, 0x98, 0x1f, 0x45, + 0x8c, 0x7e, 0x40, 0xbb, 0x8a, 0x61, 0x61, 0x1e, 0xb7, 0xf4, 0xcc, 0xe5, 0xf4, 0xe3, 0xd4, 0xdb, + 0x89, 0x88, 0x97, 0x26, 0x08, 0x4e, 0x9a, 0xf3, 0x43, 0xe6, 0x92, 0xb0, 0x8e, 0x1f, 0xd3, 0x0f, + 0x2a, 0x53, 0x1f, 0xa5, 0xfc, 0x52, 0x74, 0xc7, 0x24, 0x3e, 0xf9, 0x38, 0x35, 0x6b, 0xde, 0xb9, + 0x20, 0xef, 0x6e, 0x84, 0x3e, 0x69, 0x09, 0xd4, 0x8d, 0x0d, 0xee, 0xe8, 0x9a, 0xd1, 0x9e, 0x23, + 0xf1, 0xf0, 0x4b, 0x52, 0x62, 0x02, 0x1e, 0xe6, 0x9c, 0x83, 0xd8, 0xb0, 0x97, 0x94, 0xa8, 0xbc, + 0x4f, 0x71, 0x34, 0x3f, 0x1a, 0xf3, 0x10, 0xa9, 0xe2, 0x34, 0x87, 0x5f, 0xa6, 0x4f, 0x25, 0x60, + 0xb9, 0x9c, 0x34, 0x3e, 0xa1, 0x7c, 0xad, 0x9b, 0x26, 0xee, 0x5d, 0xd8, 0xc0, 0xe8, 0xa8, 0x8b, + 0x82, 0xbc, 0x2c, 0x37, 0xe0, 0x2d, 0x9a, 0x7b, 0x91, 0xee, 0x48, 0x59, 0xa8, 0x30, 0xd7, 0x45, + 0x66, 0x48, 0xd3, 0xfa, 0x73, 0xbd, 0xcf, 0xd8, 0xde, 0xd8, 0x9b, 0xc6, 0x36, 0xea, 0x85, 0x55, + 0x01, 0x95, 0x78, 0x69, 0x86, 0x59, 0x80, 0xc2, 0xd5, 0xa4, 0x1e, 0xe6, 0x13, 0xe8, 0x68, 0x1e, + 0x0e, 0xae, 0x2c, 0x81, 0x2b, 0xc3, 0xba, 0x92, 0x6c, 0x58, 0x5d, 0x24, 0xf1, 0x83, 0x18, 0x14, + 0x92, 0x8c, 0xa3, 0x11, 0x42, 0x23, 0xfc, 0x2e, 0x46, 0x77, 0x9c, 0xdd, 0x76, 0x96, 0x51, 0x6d, + 0x1d, 0xbb, 0xc4, 0xaa, 0x5c, 0x83, 0x3e, 0x57, 0xab, 0x74, 0xfe, 0x45, 0x67, 0x58, 0xd0, 0x6e, + 0xf4, 0xaf, 0x21, 0x58, 0x08, 0xe4, 0x1b, 0x26, 0x32, 0x25, 0x38, 0xf0, 0xf9, 0xfb, 0xc2, 0x01, + 0xce, 0x90, 0xa4, 0x78, 0x31, 0xc5, 0x46, 0xc7, 0x49, 0xe2, 0xf2, 0x86, 0x0f, 0xd3, 0xf9, 0x05, + 0x3a, 0xbe, 0xe8, 0xcc, 0x6f, 0xb2, 0x2c, 0x13, 0x5d, 0x7d, 0x16, 0x1d, 0x5d, 0x52, 0xe7, 0x36, + 0x32, 0x8b, 0x64, 0x85, 0x0c, 0x4c, 0x9c, 0x6b, 0x4b, 0xf6, 0x8b, 0xc3, 0x0d, 0x58, 0xd2, 0x74, + 0xe2, 0x6c, 0x15, 0xb4, 0x7f, 0x81, 0xeb, 0x95, 0xe2, 0x7b, 0x7a, 0xae, 0x96, 0x11, 0xe3, 0x6e, + 0xd3, 0x8d, 0xac, 0xcf, 0x14, 0x81, 0x95, 0x39, 0x67, 0x01, 0xb7, 0x6b, 0x4b, 0xac, 0x9a, 0x29, + 0x11, 0x4c, 0xa8, 0x33, 0x62, 0xf0, 0x0e, 0x02, 0xa3, 0xad, 0xb7, 0x3f, 0xe4, 0xf3, 0x16, 0x33, + 0xee, 0xce, 0x23, 0x31, 0x4a, 0x9a, 0x38, 0xc4, 0xa6, 0x36, 0x82, 0x5e, 0xf9, 0xee, 0x77, 0x6d, + 0xad, 0xa3, 0x0e, 0x0c, 0x0f, 0x3d, 0x2d, 0x83, 0xb6, 0x97, 0x03, 0xa1, 0x32, 0x33, 0x0e, 0xa5, + 0x53, 0xce, 0xaf, 0xae, 0x58, 0x8c, 0x48, 0xb8, 0x24, 0x5b, 0x20, 0x6b, 0x55, 0xc3, 0xe5, 0x05, + 0x89, 0x22, 0xb0, 0xaf, 0x12, 0x65, 0xad, 0xe5, 0x82, 0x74, 0x38, 0x0e, 0x05, 0xd1, 0x79, 0x5a, + 0x6f, 0x73, 0x1e, 0x44, 0x61, 0x7e, 0x80, 0x1e, 0xdf, 0xf8, 0xe4, 0xb3, 0x05, 0x5e, 0xba, 0x32, + 0x91, 0xef, 0x08, 0x1a, 0xd8, 0xf6, 0xf2, 0x2a, 0x0a, 0x57, 0xe4, 0x8f, 0xc2, 0x09, 0xbb, 0x72, + 0x72, 0x2a, 0x49, 0x49, 0xcc, 0x1b, 0x4f, 0x84, 0x21, 0x72, 0x3d, 0x77, 0xde, 0x17, 0x90, 0xe1, + 0x80, 0xf8, 0x84, 0xd9, 0x23, 0x67, 0xce, 0x6d, 0x35, 0xd1, 0x1d, 0x09, 0x80, 0xcb, 0x64, 0xb7, + 0x2b, 0xee, 0x6e, 0xa8, 0x82, 0xc4, 0x37, 0xef, 0x45, 0xd5, 0xe6, 0xbd, 0x91, 0x03, 0xe2, 0x08, + 0xb7, 0x30, 0x42, 0xe3, 0xf6, 0x2c, 0xd3, 0x71, 0xde, 0xa6, 0x84, 0x5c, 0x0a, 0xf9, 0xc4, 0xdd, + 0x6f, 0x24, 0xa9, 0xd5, 0xc2, 0xbc, 0xe5, 0x8a, 0x5f, 0xdd, 0xb8, 0x9d, 0x7f, 0xce, 0x17, 0x11, + 0x00, 0x47, 0xb9, 0x41, 0xab, 0xa7, 0xb5, 0x5e, 0xe4, 0x0c, 0x32, 0x34, 0x6b, 0x91, 0x87, 0x48, + 0x60, 0x8b, 0x88, 0xf7, 0xd4, 0xd1, 0x86, 0xad, 0xde, 0x8b, 0x11, 0x9b, 0x3f, 0x8a, 0x80, 0xfa, + 0x87, 0x6f, 0x52, 0x08, 0x36, 0x0c, 0x38, 0xd1, 0x18, 0x3b, 0x79, 0xb3, 0x2b, 0xcc, 0x95, 0x57, + 0x68, 0xe9, 0xd0, 0x05, 0x69, 0x95, 0xcd, 0x2c, 0xd2, 0x4a, 0xba, 0x32, 0xb0, 0xb6, 0xd2, 0x97, + 0x04, 0x8c, 0x86, 0xb6, 0xcf, 0x18, 0x72, 0x02, 0xa1, 0x89, 0x49, 0x51, 0x0c, 0x2a, 0x54, 0xe4, + 0xf7, 0x1f, 0x1f, 0x13, 0x20, 0xf2, 0x8c, 0x8a, 0x33, 0x12, 0xd3, 0x4d, 0xc5, 0xb8, 0x53, 0xe4, + 0xdf, 0xd2, 0x96, 0xf2, 0x40, 0x1f, 0x61, 0x0b, 0x22, 0x0c, 0x83, 0xd7, 0x5d, 0x38, 0x7f, 0xd9, + 0xfc, 0x3b, 0xb6, 0xb4, 0x79, 0xf3, 0x2a, 0xd7, 0xdd, 0xe9, 0xbc, 0xe1, 0x9a, 0x7d, 0x65, 0x0e, + 0x04, 0x04, 0xb7, 0xff, 0x75, 0x0e, 0x3f, 0xd1, 0xaf, 0x61, 0x83, 0x97, 0x6a, 0xfb, 0x01, 0x10, + 0x2a, 0xf4, 0x72, 0xa8, 0xfe, 0x88, 0x14, 0x9c, 0x40, 0xac, 0x42, 0x1c, 0x24, 0x9d, 0x2a, 0xeb, + 0x6c, 0x48, 0xc2, 0x51, 0x2a, 0x85, 0xa8, 0xe3, 0x7c, 0x4c, 0xaa, 0x71, 0xf9, 0x36, 0xea, 0x9c, + 0x01, 0xe4, 0x07, 0xc3, 0x53, 0xa0, 0x16, 0x80, 0xe4, 0xfa, 0xa0, 0x0b, 0x96, 0x57, 0x2c, 0x4d, + 0xe7, 0x35, 0x21, 0xb6, 0xc2, 0x14, 0x4b, 0xe8, 0xdb, 0x4b, 0x4e, 0xa6, 0x2c, 0xfa, 0xb6, 0x20, + 0x9d, 0x91, 0x81, 0x30, 0x87, 0x24, 0x7f, 0xef, 0x95, 0xeb, 0x92, 0x4f, 0x83, 0xa5, 0x79, 0xcf, + 0x93, 0xea, 0xea, 0xda, 0xc7, 0x6d, 0xad, 0x64, 0x26, 0x86, 0x43, 0x4d, 0xe6, 0x65, 0x84, 0x16, + 0xe9, 0x3a, 0xd9, 0x8b, 0x7b, 0xc0, 0x7f, 0x64, 0xd9, 0x6a, 0xfa, 0x46, 0xc0, 0x55, 0xce, 0x21, + 0x2c, 0x63, 0x83, 0x34, 0x44, 0x56, 0xe9, 0xa5, 0x6e, 0x5a, 0x1f, 0x95, 0xf3, 0xa3, 0xbe, 0x1e, + 0xc4, 0xaf, 0x73, 0xa9, 0x28, 0x5f, 0x72, 0xe7, 0xd4, 0xee, 0xa8, 0x82, 0x9c, 0x9b, 0xf7, 0x09, + 0x23, 0x67, 0x08, 0x08, 0x32, 0x50, 0xfe, 0xe0, 0x44, 0x2b, 0xd6, 0xad, 0x68, 0x2a, 0xc9, 0x2d, + 0x64, 0x5c, 0xca, 0xdb, 0x12, 0xb9, 0xf7, 0x9a, 0x3f, 0xbf, 0xd7, 0x09, 0xbf, 0x27, 0xde, 0x63, + 0xc0, 0x9e, 0x49, 0x89, 0x44, 0x53, 0x46, 0xd8, 0xa0, 0x0c, 0x48, 0x85, 0x73, 0x1b, 0x48, 0xf8, + 0x8f, 0xf0, 0xcd, 0x38, 0x2a, 0xe6, 0x44, 0xad, 0x64, 0x2b, 0x9a, 0x4f, 0xcb, 0xb4, 0x25, 0xd5, + 0xae, 0xa3, 0x4e, 0x48, 0xec, 0x28, 0xe6, 0x99, 0x91, 0x9c, 0x3c, 0xcb, 0x18, 0x4d, 0x63, 0xd5, + 0x4d, 0x6e, 0x70, 0x8c, 0x5a, 0x98, 0x3c, 0x52, 0xf9, 0x33, 0xe9, 0xbc, 0x85, 0xa1, 0xbb, 0xde, + 0x74, 0x91, 0x33, 0x2e, 0x75, 0xca, 0x7b, 0x6f, 0x48, 0x19, 0xe1, 0x07, 0xae, 0x88, 0x42, 0x3e, + 0xc1, 0x44, 0x1c, 0x47, 0x06, 0xd4, 0xec, 0x7a, 0x47, 0xd3, 0x04, 0x77, 0xcc, 0x85, 0x5b, 0x42, + 0xf3, 0x74, 0x1a, 0x88, 0xb7, 0xcc, 0x66, 0x31, 0xef, 0xcc, 0x38, 0x4f, 0x5d, 0x73, 0xfe, 0xb5, + 0x1b, 0xbc, 0x0b, 0xae, 0x92, 0x64, 0x64, 0xe2, 0xd6, 0x8a, 0xd0, 0x64, 0x47, 0x9a, 0x1f, 0x5d, + 0x2a, 0xa9, 0xb6, 0xa0, 0xb5, 0xa7, 0x89, 0xfb, 0xe2, 0x33, 0xdf, 0x35, 0x97, 0xf8, 0xf1, 0x52, + 0x86, 0x0e, 0xcc, 0xd5, 0x4b, 0x7d, 0x6f, 0x19, 0xaa, 0xeb, 0xfe, 0x55, 0xf3, 0x65, 0x85, 0x1f, + 0x92, 0x4c, 0xa0, 0x2f, 0xcd, 0x92, 0x54, 0x47, 0x49, 0x0a, 0xdb, 0xc0, 0xf3, 0x15, 0x2e, 0x31, + 0x60, 0x2f, 0x5c, 0x62, 0x82, 0x3d, 0x20, 0xf1, 0x63, 0xdc, 0x32, 0x30, 0x6f, 0xe3, 0x26, 0xcd, + 0x0e, 0xd1, 0x10, 0x5d, 0xa6, 0x63, 0x5f, 0x65, 0xf6, 0x4a, 0x46, 0x6a, 0xca, 0x3b, 0x15, 0x46, + 0x7c, 0x35, 0x13, 0xbc, 0x1c, 0x99, 0xbf, 0xb3, 0x10, 0x80, 0x5a, 0x88, 0x22, 0xc6, 0xf8, 0xf2, + 0xfe, 0xfa, 0x44, 0x9c, 0xa5, 0x3b, 0x63, 0xa4, 0x79, 0x21, 0xa1, 0xad, 0x95, 0xe2, 0xfc, 0x77, + 0xda, 0xbc, 0xb0, 0x34, 0xee, 0xc4, 0x2c, 0x2d, 0x1e, 0xcb, 0x10, 0x2b, 0x4f, 0x52, 0x7d, 0x77, + 0x78, 0x9f, 0x93, 0x04, 0x87, 0x4c, 0x93, 0xb4, 0x2b, 0x2c, 0xb0, 0x48, 0x25, 0x5c, 0xa0, 0xe3, + 0xfd, 0x5d, 0x8e, 0x02, 0x35, 0xc1, 0xfa, 0x30, 0x4c, 0xd8, 0xb5, 0x5c, 0x4b, 0x94, 0x85, 0xe3, + 0x02, 0x58, 0xe8, 0xd1, 0x01, 0x7c, 0xd5, 0x6c, 0x4f, 0x17, 0x7b, 0xf6, 0x26, 0xb9, 0xf1, 0x9a, + 0x09, 0xc4, 0x16, 0x95, 0x8a, 0x23, 0x07, 0x6c, 0x92, 0xce, 0x01, 0xf0, 0xba, 0x2c, 0x4e, 0x65, + 0xb2, 0xe1, 0x10, 0x53, 0xbe, 0xfc, 0x59, 0x1f, 0xe7, 0xd6, 0x09, 0xbc, 0x22, 0xd9, 0x78, 0xb1, + 0x6c, 0x03, 0xe8, 0x6f, 0x62, 0x3e, 0xa9, 0xef, 0x73, 0x26, 0xa2, 0x39, 0xb7, 0xe6, 0x05, 0xe5, + 0xd8, 0x6e, 0x51, 0xe2, 0x37, 0x9c, 0x28, 0x55, 0xc0, 0x68, 0x4b, 0xeb, 0x59, 0x06, 0xf1, 0x82, + 0xed, 0x59, 0x23, 0x53, 0x5a, 0x3e, 0xa9, 0x51, 0x66, 0xd0, 0xc9, 0xb1, 0x34, 0xee, 0xf4, 0x01, + 0x91, 0x8e, 0x17, 0xae, 0x1b, 0xe5, 0x22, 0xdb, 0x51, 0x5c, 0x35, 0x65, 0x7f, 0x2f, 0x63, 0x89, + 0x3f, 0xe9, 0x12, 0x1e, 0xcf, 0x1c, 0x23, 0x85, 0x70, 0xf7, 0x8b, 0x35, 0x44, 0xf8, 0x27, 0xf6, + 0xc3, 0xb0, 0x6b, 0x02, 0x3f, 0x27, 0xfd, 0x5e, 0x26, 0x09, 0xbf, 0x34, 0x8c, 0x1d, 0x79, 0xd6, + 0xda, 0xff, 0x75, 0x5e, 0x34, 0xf5, 0x39, 0x0f, 0x7f, 0x02, 0x2d, 0xf0, 0xef, 0xe5, 0x13, 0x7d, + 0x84, 0x86, 0x29, 0x6e, 0xd3, 0x8d, 0xbc, 0x62, 0x1b, 0x22, 0xda, 0x56, 0x58, 0x6d, 0x4c, 0x3c, + 0x95, 0xa9, 0xdf, 0x6a, 0x92, 0x1c, 0xc0, 0x4b, 0x45, 0xad, 0x24, 0xbb, 0xbc, 0x6d, 0xe5, 0x23, + 0x1d, 0x8d, 0xeb, 0x89, 0xa0, 0x90, 0xab, 0x8e, 0x7f, 0xca, 0x14, 0x3d, 0xe0, 0x32, 0x3d, 0x50, + 0x62, 0xe9, 0x10, 0xf3, 0x07, 0x6c, 0xf2, 0xcb, 0xf6, 0x4f, 0x9a, 0x81, 0x8e, 0x4f, 0x25, 0x7b, + 0xce, 0x57, 0xc0, 0x3f, 0xdc, 0x3d, 0x0d, 0x0e, 0x7c, 0x27, 0x7d, 0x65, 0xae, 0x14, 0x31, 0xd7, + 0x90, 0xc4, 0x8c, 0xd4, 0x0f, 0x60, 0x7e, 0xd6, 0xba, 0xcd, 0xd0, 0x13, 0x2e, 0x93, 0x9f, 0xb7, + 0x24, 0x2e, 0x86, 0x36, 0x77, 0x84, 0x8c, 0x83, 0xd9, 0x93, 0x66, 0xff, 0xd1, 0x87, 0x01, 0x56, + 0x05, 0x98, 0x56, 0x02, 0xb0, 0x7d, 0x01, 0x86, 0x4f, 0x48, 0xf9, 0xab, 0xb6, 0xa9, 0x49, 0x53, + 0xce, 0x5f, 0x80, 0x42, 0x4a, 0x27, 0xf8, 0x00, 0x2d, 0xf7, 0xff, 0xf1, 0xeb, 0x08, 0xe0, 0x73, + 0x67, 0x28, 0x50, 0xd9, 0x0f, 0x2a, 0x61, 0xc0, 0x22, 0x94, 0xbb, 0xa4, 0x70, 0x09, 0x0d, 0x4c, + 0x12, 0x4b, 0x0d, 0x24, 0xdc, 0xc2, 0x1a, 0xda, 0x5d, 0xa7, 0x1f, 0xf0, 0xde, 0x9c, 0xf7, 0x2f, + 0xf5, 0xb7, 0x3b, 0xe5, 0xf8, 0xf6, 0x27, 0xe7, 0xbd, 0xfa, 0x9e, 0xaf, 0x67, 0x01, 0x65, 0xc7, + 0xa5, 0xcd, 0x46, 0xbe, 0x0e, 0x7d, 0xe6, 0xce, 0x0f, 0xfa, 0x3e, 0x2e, 0x99, 0xf2, 0x9f, 0xb1, + 0x33, 0xe9, 0xf4, 0x30, 0xf3, 0x3c, 0xb4, 0xa0, 0xbb, 0xa5, 0x62, 0x2e, 0x44, 0x42, 0x50, 0xc7, + 0x1a, 0x4a, 0xac, 0x89, 0x75, 0x14, 0x33, 0xf9, 0x8f, 0xd6, 0x31, 0x07, 0x8d, 0x73, 0x09, 0x89, + 0x39, 0xf4, 0x07, 0x6e, 0x21, 0xbc, 0x38, 0xc9, 0x69, 0x3a, 0xd4, 0x5b, 0xe4, 0xbd, 0x01, 0x5d, + 0x5b, 0xaf, 0x90, 0xa1, 0xa3, 0x2d, 0x3e, 0x27, 0xee, 0xd5, 0x1f, 0x25, 0x86, 0x5c, 0xbe, 0xb8, + 0xce, 0x15, 0xbe, 0x6c, 0xf5, 0x63, 0x45, 0x31, 0x3a, 0x24, 0x09, 0x0a, 0x29, 0x7c, 0xcb, 0xb2, + 0x50, 0xb9, 0x18, 0x73, 0x01, 0x7e, 0x60, 0xfc, 0x04, 0xbd, 0x5d, 0x13, 0x5b, 0x43, 0x51, 0x20, + 0x22, 0x58, 0x4d, 0x64, 0xc7, 0xba, 0xc4, 0x4d, 0x0c, 0x58, 0x09, 0x98, 0x12, 0x30, 0xdc, 0xaa, + 0x70, 0x7b, 0x94, 0xc9, 0x64, 0xbe, 0x65, 0x21, 0xff, 0xa6, 0xb0, 0xf2, 0xcd, 0xb4, 0x58, 0xb4, + 0x49, 0x02, 0x20, 0x56, 0x50, 0x20, 0x75, 0xc1, 0xbb, 0x3f, 0x0b, 0xc4, 0xcd, 0x95, 0x86, 0xe5, + 0x38, 0x13, 0xd9, 0x07, 0x25, 0x98, 0x9a, 0xd6, 0x76, 0x85, 0x63, 0x75, 0xa8, 0x36, 0x08, 0x9c, + 0x4f, 0x14, 0xf2, 0xb7, 0x6c, 0x00, 0x38, 0x6c, 0x5a, 0xb3, 0x2b, 0x6e, 0xb2, 0x8a, 0x49, 0xda, + 0x0a, 0xab, 0x8e, 0xc5, 0x01, 0x10, 0x49, 0x26, 0x40, 0xba, 0xc8, 0xbe, 0xb3, 0xcf, 0x78, 0x0e, + 0x74, 0x3e, 0x15, 0x08, 0x1a, 0xcb, 0x61, 0x2a, 0x45, 0x96, 0xb0, 0x42, 0xea, 0xa0, 0x88, 0xb3, + 0x46, 0x08, 0xcf, 0x32, 0x5b, 0x06, 0x86, 0x65, 0x05, 0xa0, 0xdd, 0xae, 0xa1, 0x91, 0xd4, 0x94, + 0x14, 0xe0, 0xc7, 0xeb, 0x1a, 0xd0, 0x20, 0xdd, 0x7f, 0x25, 0xc7, 0xf0, 0xc5, 0xcd, 0x2f, 0x9f, + 0xc7, 0x9a, 0x52, 0xe9, 0x6c, 0x00, 0xaa, 0xf5, 0xcd, 0x6f, 0x36, 0xd7, 0x0a, 0x7a, 0xcc, 0x4e, + 0xdc, 0x24, 0x70, 0xbe, 0x65, 0x6d, 0xe8, 0x0c, 0xad, 0x2e, 0x6c, 0x43, 0xd8, 0x84, 0x73, 0x43, + 0x14, 0x56, 0x62, 0x0d, 0x38, 0x37, 0xa0, 0xf6, 0xe4, 0x1a, 0xf3, 0x6a, 0x7e, 0x63, 0x61, 0x85, + 0x18, 0x35, 0x94, 0x54, 0xb8, 0xb2, 0xac, 0xc6, 0xc6, 0xc4, 0x6c, 0xcd, 0xf5, 0x19, 0x13, 0x13, + 0x2b, 0x5d, 0xc1, 0x5a, 0x73, 0xb9, 0xf2, 0xe2, 0x5a, 0xb1, 0xe8, 0x7b, 0xbd, 0x6c, 0x38, 0xf3, + 0xbd, 0x3c, 0x65, 0x07, 0xb4, 0x17, 0xf6, 0xb5, 0x98, 0x53, 0x16, 0xd7, 0xba, 0x72, 0xa9, 0x69, + 0x2f, 0xef, 0x55, 0x7b, 0x34, 0xd7, 0xcf, 0x23, 0x60, 0x67, 0x8b, 0xfb, 0xa9, 0x94, 0x97, 0xf4, 0x13, 0x8b, 0xbe, 0x3b, 0x9a, 0x38, 0x8d, 0x13, 0x06, 0x14, 0x93, 0x17, 0x8f, 0x69, 0xbe, 0xbd, - 0xb8, 0x55, 0x52, 0x74, 0x25, 0xb9, 0x5d, 0xbf, 0x95, 0xaf, 0x23, 0x10, 0xc9, 0xad, 0x51, 0x06, - 0xa4, 0x08, 0xb2, 0xdf, 0x9b, 0xa1, 0x71, 0x69, 0xb3, 0xae, 0xe6, 0xe1, 0x51, 0x7f, 0x57, 0xfc, - 0x8a, 0x0d, 0xaf, 0x24, 0xd0, 0xef, 0x32, 0x6a, 0xda, 0xb1, 0xcc, 0x8e, 0xde, 0x4d, 0x6e, 0x99, - 0x9f, 0x43, 0xad, 0xfe, 0xfc, 0x0c, 0x6a, 0x9d, 0x01, 0xd8, 0xa9, 0x4f, 0xca, 0xc2, 0x2e, 0x17, - 0x82, 0x2e, 0xaf, 0x24, 0x4c, 0x9c, 0x1d, 0x01, 0xcb, 0xc7, 0x9a, 0xe6, 0x38, 0x02, 0x69, 0x9d, - 0x32, 0x61, 0x9c, 0xd8, 0x01, 0xf4, 0xbd, 0x36, 0x0c, 0xe4, 0xb6, 0xe3, 0x47, 0x67, 0xc5, 0x0a, - 0x22, 0xcc, 0x40, 0x37, 0x30, 0x7b, 0x14, 0x20, 0x81, 0x3b, 0x22, 0x1e, 0x19, 0xb9, 0xae, 0x71, - 0x83, 0x31, 0x85, 0x71, 0xd8, 0xe8, 0xcc, 0xa3, 0xb4, 0x11, 0xa9, 0x30, 0x94, 0x17, 0x04, 0x56, - 0x37, 0x4a, 0x7f, 0x14, 0x3d, 0xf4, 0x1b, 0x40, 0x43, 0xd0, 0x43, 0x62, 0xb2, 0x42, 0xa2, 0xe6, - 0x41, 0x0a, 0x32, 0x17, 0xcb, 0x24, 0x79, 0x6b, 0x22, 0x8d, 0xd0, 0x7a, 0xe3, 0xa8, 0xba, 0x91, - 0xf2, 0x7a, 0xba, 0x0b, 0xdf, 0x80, 0xd3, 0xd7, 0xc4, 0x7c, 0xa9, 0x04, 0xf0, 0xc0, 0xe2, 0x57, - 0x13, 0x73, 0xa2, 0xc0, 0x87, 0x46, 0x05, 0x79, 0xd9, 0x18, 0xc0, 0x5b, 0x2e, 0x5f, 0x11, 0x93, - 0xe0, 0x61, 0x6b, 0x41, 0xc8, 0x45, 0x7d, 0x2e, 0x4e, 0xa5, 0x99, 0x68, 0x66, 0x2a, 0x87, 0x60, - 0x5e, 0xfa, 0x35, 0xc4, 0x34, 0xfb, 0xd1, 0x89, 0x9f, 0x38, 0xc1, 0xb9, 0x7f, 0x5a, 0x1b, 0xe0, - 0x22, 0xb1, 0x5f, 0xd5, 0x26, 0x3a, 0xf5, 0x37, 0x0d, 0xd5, 0x7c, 0xc1, 0x0a, 0x68, 0xce, 0xb9, - 0x0a, 0x38, 0xf8, 0x82, 0xa3, 0xb7, 0x3e, 0xdc, 0x04, 0x53, 0xd4, 0xf3, 0x4d, 0xe4, 0x68, 0x90, - 0x89, 0xf7, 0x22, 0x37, 0xde, 0x2c, 0x16, 0xaf, 0x9f, 0x09, 0xd6, 0x0d, 0x04, 0x3f, 0xb6, 0x52, - 0x60, 0xc6, 0x9e, 0x4f, 0x16, 0xef, 0x8f, 0x53, 0x38, 0x4c, 0x87, 0x73, 0x15, 0x23, 0x29, 0xb0, - 0x11, 0x42, 0xd7, 0xf8, 0x43, 0x3a, 0x66, 0xdc, 0x38, 0xd2, 0x08, 0xbc, 0x8a, 0x3f, 0x5c, 0x85, - 0xd2, 0x3a, 0x3c, 0xe1, 0x68, 0x29, 0xb1, 0xd1, 0x5a, 0x61, 0xc3, 0xa5, 0xe0, 0x42, 0xa9, 0xd9, - 0x80, 0x36, 0x73, 0xb2, 0x74, 0xdc, 0x00, 0xbb, 0x74, 0x41, 0x7d, 0xd7, 0x6d, 0x1a, 0xa4, 0x7c, - 0x21, 0x4f, 0xfc, 0xb1, 0x15, 0x21, 0xb7, 0x4e, 0x5d, 0xc7, 0x85, 0x02, 0xf5, 0x21, 0xef, 0x08, - 0xa5, 0x3c, 0xf5, 0xfd, 0x16, 0xca, 0x15, 0xcc, 0x03, 0x0f, 0x15, 0xe6, 0xae, 0x2e, 0xe2, 0x12, - 0xc1, 0x0d, 0xd2, 0xb7, 0xa6, 0x33, 0x3f, 0xc3, 0xdc, 0x8f, 0x23, 0x92, 0x23, 0xf8, 0xc6, 0x3c, - 0x26, 0x23, 0x88, 0x6c, 0xbc, 0x87, 0x48, 0x50, 0xfd, 0x7d, 0xba, 0x57, 0x16, 0xd0, 0xbd, 0xf2, - 0x5f, 0x80, 0xca, 0xcf, 0xaa, 0xaa, 0x0a, 0x0a, 0xc3, 0xce, 0x42, 0xe4, 0xac, 0x04, 0xd8, 0x19, - 0xfe, 0x1d, 0x32, 0xbb, 0x13, 0x03, 0x7e, 0x97, 0x8c, 0x9d, 0xbb, 0x0f, 0x61, 0xc7, 0x47, 0xce, - 0xca, 0x3f, 0xc4, 0x4e, 0xb4, 0x9f, 0x2b, 0x89, 0x54, 0xf0, 0xf2, 0x77, 0xfa, 0x79, 0xf2, 0x5e, - 0x3f, 0x4f, 0x3e, 0xd0, 0xcf, 0xf5, 0x1c, 0xeb, 0x69, 0x6e, 0x5d, 0x59, 0xd4, 0xd9, 0x32, 0xe8, - 0x45, 0xbf, 0xc3, 0x03, 0xe7, 0xb8, 0x05, 0xf3, 0x70, 0x8d, 0x2c, 0x23, 0xf4, 0x6c, 0xae, 0x80, - 0xab, 0xc9, 0xf5, 0xc1, 0xb6, 0x40, 0x14, 0xe4, 0x70, 0x2d, 0x21, 0xa5, 0x48, 0x99, 0xc8, 0xb2, - 0xb2, 0xf2, 0x5b, 0x08, 0xba, 0x7e, 0x8f, 0xdf, 0x5c, 0x77, 0x9b, 0xef, 0xa1, 0x88, 0x2c, 0x10, - 0x4b, 0x39, 0xce, 0x6f, 0x2e, 0x10, 0xf1, 0xa1, 0xef, 0xd2, 0x5e, 0xae, 0x44, 0x56, 0xcf, 0xdf, - 0xe9, 0xe5, 0xc1, 0xff, 0x0d, 0xbd, 0x6c, 0xfe, 0xd3, 0x5e, 0x6e, 0xff, 0x9f, 0xdc, 0xcb, 0x38, - 0xbd, 0x8f, 0x96, 0x51, 0xfb, 0x3d, 0x1a, 0x8c, 0x05, 0x84, 0xd2, 0xd4, 0x8c, 0x28, 0xc5, 0x8f, - 0x7a, 0x7a, 0x13, 0x45, 0x99, 0x95, 0x8f, 0x62, 0xe5, 0xfe, 0x9d, 0x75, 0xe0, 0x1e, 0x51, 0xb2, - 0xf2, 0xf7, 0x70, 0x32, 0x8f, 0x92, 0x95, 0xbf, 0x33, 0xf2, 0xe8, 0xcd, 0xbe, 0x08, 0x15, 0x2b, - 0x14, 0x17, 0x90, 0x03, 0xfd, 0xb9, 0xe6, 0x24, 0xc9, 0x77, 0xbb, 0x5f, 0x4f, 0xe4, 0x80, 0xbc, - 0x18, 0x48, 0x6b, 0x26, 0x22, 0x5f, 0x86, 0x74, 0x28, 0xb1, 0xdf, 0x2b, 0xff, 0x82, 0xe0, 0x37, - 0x47, 0x04, 0xc4, 0x0f, 0x37, 0x56, 0x03, 0xa4, 0x85, 0x72, 0xfc, 0x57, 0x7b, 0x27, 0x25, 0xa2, - 0x54, 0x01, 0xff, 0x89, 0xd2, 0x57, 0x81, 0x5c, 0xf4, 0x50, 0x13, 0xaf, 0xb5, 0x76, 0xd2, 0x8a, - 0xba, 0x1a, 0x98, 0x1c, 0xa3, 0xe2, 0xd8, 0xb2, 0x9a, 0x55, 0x56, 0xf3, 0x0a, 0xab, 0xfa, 0x82, - 0xf5, 0x70, 0x51, 0xe5, 0x7e, 0x91, 0x85, 0x0d, 0xac, 0xc4, 0x5b, 0x68, 0x55, 0x22, 0xb0, 0x3f, - 0x6a, 0x86, 0x61, 0x8d, 0x96, 0x36, 0x40, 0x4a, 0x6c, 0x46, 0x56, 0xfa, 0x65, 0x5d, 0x00, 0xf5, - 0x89, 0x6f, 0xe0, 0x5e, 0x75, 0xfa, 0x02, 0xa1, 0x9a, 0x25, 0x38, 0xf2, 0x8b, 0x7d, 0xbc, 0x1b, - 0xf8, 0x1f, 0xdf, 0x0a, 0x6d, 0x60, 0x49, 0xfd, 0x9d, 0x64, 0xeb, 0x09, 0xd4, 0x2e, 0xa0, 0x23, - 0x74, 0xbc, 0x1f, 0x8a, 0x12, 0x1b, 0xe4, 0x6d, 0x03, 0x2a, 0x5d, 0xd6, 0x05, 0x6e, 0x18, 0xa8, - 0xc4, 0xf0, 0x6e, 0x1f, 0x40, 0x06, 0xe5, 0xfb, 0x70, 0xa9, 0x83, 0xbe, 0xb0, 0xa4, 0x0b, 0xca, - 0xe2, 0x2e, 0x24, 0x41, 0x1f, 0xa9, 0x7b, 0x1b, 0x26, 0xc8, 0x92, 0xba, 0x15, 0xac, 0x7b, 0xe5, - 0x63, 0x44, 0x8a, 0x35, 0xb7, 0x2a, 0x5c, 0xdd, 0x3b, 0x13, 0xd5, 0x5c, 0x8e, 0x18, 0x52, 0xe0, - 0xa3, 0x63, 0xab, 0x54, 0x10, 0x33, 0x5c, 0xfd, 0x07, 0x8e, 0xa6, 0x99, 0xcb, 0x80, 0xa7, 0x05, - 0x3e, 0x48, 0xa1, 0x8e, 0xd9, 0xe6, 0xa7, 0xae, 0x6a, 0xb6, 0xad, 0xfe, 0x87, 0xe4, 0x61, 0xcf, - 0x12, 0x88, 0x0a, 0x8d, 0xb2, 0xb0, 0x6c, 0x91, 0x79, 0x49, 0x34, 0x0c, 0xb9, 0x8b, 0xf0, 0x11, - 0x8d, 0x42, 0xb6, 0x07, 0x8e, 0x6d, 0x68, 0x0b, 0x4e, 0x72, 0xad, 0xe6, 0xd0, 0x4c, 0x0b, 0x78, - 0xbe, 0x5e, 0xc0, 0x78, 0x5b, 0xae, 0x21, 0x46, 0xcd, 0x27, 0x90, 0xa2, 0x88, 0x9c, 0xcd, 0x4e, - 0x18, 0x8f, 0x5d, 0x78, 0xe5, 0x15, 0x72, 0xba, 0x73, 0xda, 0x30, 0x2c, 0x8f, 0x2c, 0x11, 0x78, - 0x6b, 0xc6, 0xaa, 0x43, 0x78, 0x24, 0x79, 0xec, 0x86, 0x8f, 0xcd, 0xf0, 0x71, 0x84, 0x8f, 0x9b, - 0xb9, 0xd0, 0x8c, 0xb0, 0x12, 0x6b, 0x35, 0x97, 0xd8, 0x6a, 0x52, 0xa3, 0xb9, 0x68, 0xa3, 0x2b, - 0xef, 0xb6, 0x9a, 0x4f, 0xb6, 0x14, 0x41, 0xa3, 0xf9, 0x70, 0x71, 0x78, 0xaf, 0xd5, 0xfc, 0x47, - 0xba, 0xba, 0xc2, 0xb5, 0x5a, 0x98, 0x37, 0x99, 0xcc, 0xad, 0x6f, 0xa2, 0x0f, 0xc8, 0x29, 0x35, - 0xb8, 0x84, 0xcb, 0x1b, 0xd5, 0xa0, 0xb5, 0xf1, 0x28, 0xc9, 0x50, 0xc2, 0xa2, 0xea, 0xf1, 0xe6, - 0x9e, 0xae, 0x41, 0x85, 0x9b, 0x88, 0x21, 0x2b, 0xa2, 0x15, 0x42, 0x65, 0x2d, 0x7f, 0xf9, 0xc6, - 0x4d, 0xad, 0x24, 0xb1, 0xe0, 0x45, 0x9b, 0xb4, 0xad, 0x91, 0x49, 0x32, 0xef, 0xe1, 0x66, 0x17, - 0xca, 0x06, 0xb8, 0x65, 0xe5, 0xdf, 0xf2, 0x52, 0x13, 0x2d, 0x98, 0xe5, 0xa0, 0x15, 0xaa, 0x63, - 0x43, 0x33, 0xbb, 0x5e, 0xaf, 0x26, 0x56, 0x62, 0x14, 0x84, 0xed, 0x98, 0x9d, 0xc8, 0x68, 0xd2, - 0x03, 0x36, 0x1c, 0xb8, 0x44, 0x91, 0xd7, 0xc6, 0xcc, 0x12, 0x17, 0x31, 0x88, 0x09, 0xfe, 0xe1, - 0x24, 0xda, 0x95, 0xc2, 0x3a, 0xb3, 0x3d, 0xbe, 0x87, 0x4c, 0x8a, 0x4a, 0xdc, 0xc2, 0x47, 0xbe, - 0xf2, 0x21, 0x8c, 0x31, 0x08, 0x08, 0xc6, 0x9a, 0x05, 0x8a, 0x31, 0x22, 0xfa, 0x08, 0x50, 0x8d, - 0xe6, 0x79, 0xa1, 0xb4, 0xb1, 0xe2, 0x57, 0x3e, 0x8a, 0xea, 0x1a, 0x91, 0x95, 0x9f, 0x46, 0x43, - 0x12, 0x3a, 0x30, 0xdd, 0x03, 0xcc, 0xf3, 0xe8, 0x5e, 0xe1, 0x36, 0x90, 0x6b, 0x62, 0x83, 0xc4, - 0x38, 0x0c, 0x65, 0xb1, 0xaf, 0x34, 0xe8, 0x21, 0x11, 0x43, 0x64, 0x91, 0xb9, 0x22, 0x90, 0x85, - 0xd9, 0x32, 0xc9, 0x96, 0xf6, 0xc2, 0x1c, 0xf3, 0x04, 0x12, 0xc6, 0x38, 0xe4, 0xe7, 0x2d, 0xa6, - 0x9a, 0xcc, 0xb2, 0x45, 0x71, 0x5b, 0xe9, 0xf8, 0x64, 0x12, 0x47, 0x57, 0x10, 0x7f, 0xd1, 0xb7, - 0x4f, 0xe6, 0x68, 0xce, 0x95, 0x38, 0x07, 0xf1, 0xc1, 0x08, 0x06, 0x03, 0x5f, 0xa2, 0x88, 0xc1, - 0x6d, 0x62, 0x72, 0x7d, 0x17, 0x8e, 0x53, 0x30, 0xd8, 0x74, 0x93, 0x96, 0xb8, 0x32, 0x71, 0xa3, - 0x82, 0x37, 0x14, 0x5d, 0x52, 0xe4, 0x13, 0x3b, 0xed, 0x5c, 0x45, 0x9c, 0x41, 0xca, 0xb5, 0x55, - 0x33, 0xa8, 0xce, 0xf7, 0xb5, 0x80, 0x0f, 0x6c, 0xf7, 0x24, 0x93, 0xc9, 0x00, 0xad, 0x60, 0x26, - 0x4e, 0xfe, 0x22, 0x30, 0x2c, 0x92, 0xcd, 0xa9, 0xf2, 0x1d, 0xf6, 0x8d, 0xc5, 0x4e, 0x7b, 0xc7, - 0x1e, 0xd6, 0x19, 0x2f, 0x10, 0x5d, 0xe9, 0xb4, 0xc3, 0xf0, 0xae, 0x6c, 0x76, 0xd3, 0xfa, 0x84, - 0x3e, 0x33, 0xa9, 0x2e, 0xa4, 0x1e, 0x56, 0xed, 0xbe, 0xce, 0x53, 0xd2, 0x0a, 0x4f, 0x4a, 0xbf, - 0x41, 0x49, 0xd4, 0x27, 0x66, 0x09, 0x21, 0x05, 0x19, 0xfe, 0x5b, 0xe9, 0x88, 0x41, 0xf1, 0x2f, - 0x92, 0xd1, 0xfe, 0xc3, 0xff, 0x76, 0x02, 0x0a, 0x18, 0x37, 0x8b, 0x2e, 0xc6, 0x93, 0x09, 0x4d, - 0x0a, 0xd7, 0x56, 0xfa, 0xfe, 0xae, 0x19, 0x9c, 0x49, 0x09, 0x51, 0xb7, 0xb9, 0x28, 0x1b, 0xdb, - 0x07, 0x69, 0xe0, 0x2d, 0x30, 0x8f, 0x17, 0xf2, 0x25, 0xce, 0x3c, 0xfe, 0x61, 0x2d, 0xb1, 0x61, - 0x6b, 0xa8, 0x53, 0x24, 0xe8, 0xcf, 0x9c, 0xaa, 0x44, 0x32, 0x7d, 0xdc, 0x66, 0xfe, 0xaf, 0xaa, - 0x4e, 0xcc, 0x64, 0xbe, 0xf2, 0x9e, 0xcd, 0x9c, 0x0c, 0x6a, 0xd8, 0x2f, 0x32, 0xf5, 0x42, 0xac, - 0x73, 0x01, 0xb9, 0x60, 0x99, 0x60, 0x13, 0xd2, 0xc5, 0x6e, 0xc5, 0x47, 0x3a, 0x3a, 0x6e, 0xb9, - 0xc4, 0x71, 0x5b, 0x59, 0x3c, 0x70, 0x1f, 0x18, 0x37, 0x02, 0x9a, 0xeb, 0x8f, 0x5b, 0x51, 0x59, - 0xa7, 0x5b, 0x98, 0xbf, 0xa7, 0xde, 0xe2, 0xbd, 0x6a, 0xe8, 0xbf, 0x39, 0x79, 0x6f, 0xec, 0x82, - 0x8c, 0xff, 0x37, 0x8c, 0x5f, 0xc2, 0x68, 0xc5, 0xc7, 0x34, 0x17, 0x8e, 0x9f, 0xee, 0x77, 0x6d, - 0xf9, 0x18, 0xe6, 0x63, 0x63, 0x28, 0xf4, 0xc8, 0xbe, 0xc5, 0xf2, 0x81, 0x8c, 0x6c, 0x80, 0xfe, - 0xa6, 0x05, 0x7e, 0x27, 0x97, 0x24, 0x63, 0xf1, 0x76, 0x96, 0x81, 0xeb, 0x59, 0x7d, 0x22, 0xd0, - 0xae, 0xfc, 0xde, 0x90, 0x24, 0x9a, 0x60, 0x7f, 0xcf, 0x06, 0xf3, 0xc1, 0x3d, 0x28, 0xc4, 0xe8, - 0xca, 0x47, 0x06, 0x24, 0x2f, 0x6e, 0xd2, 0xfe, 0x08, 0xb9, 0xe5, 0xe3, 0x50, 0x88, 0x1b, 0xaf, - 0xb8, 0x81, 0x58, 0x3e, 0x0e, 0xfe, 0x36, 0xe9, 0x6f, 0xf2, 0xb6, 0x9d, 0xfc, 0x7b, 0x93, 0x83, - 0x0d, 0x44, 0xfe, 0xdf, 0x99, 0x1a, 0xe5, 0xff, 0xd6, 0x89, 0x51, 0x80, 0x89, 0xc1, 0x06, 0x22, - 0xbf, 0x7c, 0x20, 0x8a, 0x7f, 0x7b, 0x42, 0x28, 0x5a, 0xe5, 0x6f, 0x4d, 0x88, 0xc2, 0xc7, 0x26, - 0x44, 0xe1, 0xff, 0x17, 0x13, 0xa2, 0x18, 0x4c, 0x88, 0xc2, 0x9c, 0x18, 0x11, 0x17, 0x1b, 0xa8, - 0x82, 0xd1, 0xd0, 0xba, 0xe4, 0x3e, 0xd6, 0x77, 0x24, 0x4e, 0xe6, 0x69, 0x1e, 0x97, 0x54, 0xe2, - 0x32, 0x08, 0xf5, 0x65, 0x17, 0x79, 0x09, 0xb3, 0x69, 0x91, 0x8a, 0xe2, 0xd4, 0xc0, 0x42, 0x11, - 0xf0, 0xbe, 0x39, 0x31, 0xed, 0x8d, 0xa9, 0x57, 0x8e, 0x0b, 0x2f, 0xdc, 0x2a, 0xe6, 0x00, 0xc4, - 0x64, 0x05, 0xbb, 0xd6, 0x60, 0xf4, 0x40, 0xde, 0xa3, 0xf0, 0xcf, 0x29, 0x6b, 0x2b, 0xdf, 0xec, - 0xcd, 0x9b, 0xf0, 0xa0, 0x01, 0x3f, 0x45, 0xbd, 0x04, 0x45, 0x94, 0x0e, 0x26, 0x75, 0x57, 0x0f, - 0x87, 0x98, 0x0c, 0x7a, 0xb9, 0x94, 0x29, 0x11, 0xb1, 0x08, 0xb7, 0xd5, 0x94, 0x4c, 0x2e, 0x18, - 0x6c, 0x25, 0xb3, 0x06, 0xb4, 0x69, 0x36, 0x5d, 0x7b, 0x83, 0xf9, 0x1b, 0xc4, 0x7a, 0x79, 0xe9, - 0x20, 0x8c, 0x0b, 0x70, 0x1b, 0x6e, 0x27, 0xda, 0xaf, 0x86, 0xb8, 0x44, 0x63, 0x07, 0x89, 0x9c, - 0x55, 0xb4, 0x5c, 0x84, 0x27, 0x43, 0x60, 0xbb, 0x51, 0x19, 0xfe, 0x5d, 0x11, 0x7e, 0x65, 0x81, - 0x36, 0x48, 0x86, 0x1b, 0x44, 0xf8, 0x05, 0xaa, 0x20, 0xfb, 0x9c, 0x30, 0x73, 0x79, 0x09, 0xfe, - 0x63, 0x02, 0xfc, 0xca, 0x07, 0x25, 0xf8, 0x39, 0x45, 0x90, 0x00, 0x11, 0x93, 0xdf, 0x57, 0x28, - 0xd7, 0x8a, 0xaa, 0x77, 0x14, 0x7d, 0x48, 0x35, 0x21, 0xf9, 0x2e, 0x62, 0x54, 0x36, 0x25, 0xe1, - 0x95, 0x85, 0x34, 0xbc, 0xd0, 0xc3, 0x81, 0xc4, 0x39, 0xb7, 0xd8, 0xac, 0x64, 0x65, 0x62, 0xc4, - 0x8d, 0x5e, 0x99, 0xba, 0xf9, 0xc2, 0x1b, 0x26, 0x2c, 0x5b, 0x33, 0x6f, 0xd4, 0x66, 0x6a, 0xb1, - 0xc3, 0x0c, 0x33, 0x14, 0x24, 0x3b, 0xcc, 0x50, 0x07, 0x8a, 0x64, 0x57, 0x9d, 0xb9, 0x46, 0x57, - 0xe6, 0x5a, 0xcd, 0x7d, 0xc0, 0x4d, 0x67, 0xbe, 0x51, 0xa6, 0xa6, 0xae, 0x7c, 0xb0, 0xd9, 0xb9, - 0x56, 0xf3, 0x0b, 0xdd, 0xb0, 0x0a, 0xc5, 0xe6, 0x12, 0x77, 0xb3, 0x60, 0xb2, 0xff, 0xcd, 0xde, - 0x16, 0x16, 0xf5, 0x56, 0x29, 0xb6, 0x16, 0x37, 0xcb, 0xc8, 0x67, 0x65, 0xb9, 0x53, 0x12, 0x0b, - 0xf1, 0x19, 0x35, 0x01, 0x53, 0x77, 0x45, 0x15, 0xd5, 0xcc, 0xa8, 0x36, 0xeb, 0xec, 0x61, 0x30, - 0xd7, 0x1b, 0xfc, 0x84, 0x27, 0xf4, 0xa5, 0xf9, 0x62, 0xc1, 0x91, 0xe2, 0x65, 0x3e, 0x65, 0xb1, - 0x32, 0xe8, 0xb1, 0x1b, 0x4c, 0x08, 0xe2, 0x8d, 0xbf, 0x84, 0xc1, 0x12, 0xcb, 0xa3, 0xe5, 0x6a, - 0x1f, 0x75, 0x94, 0x13, 0xc8, 0x51, 0x41, 0x8a, 0xaf, 0x5c, 0x45, 0x65, 0xde, 0x8f, 0x21, 0x3e, - 0x02, 0x20, 0xfa, 0x5d, 0x6a, 0x42, 0xec, 0x77, 0xfd, 0xf2, 0x23, 0x5d, 0x14, 0x54, 0xc3, 0x63, - 0xae, 0x43, 0xdc, 0xa5, 0xe9, 0xb6, 0xd9, 0xf5, 0x6f, 0x39, 0xd6, 0xef, 0xb6, 0x2f, 0xae, 0x47, - 0xca, 0xc9, 0x41, 0xd7, 0xc2, 0x9b, 0xbd, 0xce, 0x1b, 0xb7, 0xbd, 0xbd, 0x5b, 0xbc, 0xd5, 0x78, - 0x9b, 0xdc, 0xf4, 0xb5, 0xbf, 0x53, 0x7f, 0x84, 0x9f, 0x9d, 0xd2, 0xfe, 0xa0, 0x53, 0x22, 0xd7, - 0x1a, 0x3f, 0x9c, 0x37, 0xae, 0x95, 0xa3, 0xba, 0xe3, 0x16, 0x5b, 0x65, 0x72, 0x6f, 0xfa, 0xb5, - 0x79, 0x75, 0x9b, 0xdb, 0x86, 0x3c, 0xe3, 0xe7, 0xd1, 0xb0, 0xf2, 0x78, 0x75, 0x8b, 0x89, 0xc7, - 0xad, 0xbd, 0xde, 0x53, 0x6b, 0x54, 0xaf, 0xef, 0xba, 0x67, 0xf0, 0xba, 0xb6, 0x5b, 0x6f, 0xb5, - 0x87, 0xaf, 0x07, 0x58, 0x60, 0xbb, 0xd9, 0xb8, 0xbd, 0xde, 0xbe, 0xdb, 0xe9, 0xdd, 0x18, 0x8f, - 0xeb, 0xcd, 0x5d, 0xab, 0x3e, 0xda, 0x3d, 0x3b, 0xbf, 0x5f, 0x33, 0xd7, 0xcd, 0xd1, 0x8e, 0x6e, - 0x4f, 0xbc, 0xab, 0xf3, 0xe2, 0x53, 0xc5, 0x6b, 0x3a, 0x37, 0x87, 0xfd, 0xdd, 0xfe, 0x7e, 0xd1, - 0xba, 0x7c, 0x9b, 0x18, 0xed, 0xd1, 0xf5, 0xab, 0x9d, 0x6b, 0x34, 0xda, 0xe6, 0x5d, 0xf6, 0x7c, - 0xf0, 0x34, 0x78, 0x7b, 0xd5, 0x9c, 0xfa, 0xf6, 0x64, 0xfc, 0xf0, 0x66, 0x6e, 0x8f, 0x0a, 0x7a, - 0xf7, 0x45, 0xdb, 0xdf, 0xeb, 0x3c, 0x4c, 0x6e, 0x07, 0xbd, 0x93, 0xec, 0x64, 0xff, 0x4c, 0xd9, - 0x19, 0x1f, 0x77, 0x26, 0xaf, 0x0f, 0x4f, 0x7b, 0x17, 0xad, 0x72, 0xb6, 0xe1, 0xac, 0x67, 0x9b, - 0x9d, 0xb5, 0xc1, 0xd1, 0x4e, 0xe9, 0x7c, 0xd4, 0x5e, 0xb3, 0x9c, 0xb3, 0x61, 0xfd, 0x32, 0xf1, - 0xa6, 0xf5, 0xb8, 0x23, 0xc6, 0x30, 0xca, 0xb9, 0x22, 0xfb, 0x2f, 0x73, 0x33, 0x00, 0x07, 0x98, - 0x39, 0x74, 0xf3, 0xb4, 0xe3, 0x68, 0xaf, 0x03, 0xcd, 0xf5, 0x8e, 0x5d, 0xcb, 0xa4, 0xeb, 0x67, - 0x07, 0xe8, 0xba, 0xb7, 0x70, 0x1e, 0x2d, 0xa8, 0x25, 0x46, 0x81, 0x47, 0x26, 0x30, 0x48, 0xb3, - 0xa5, 0x09, 0x78, 0xe5, 0xf7, 0x6f, 0xd6, 0xe5, 0xfb, 0x2e, 0xe2, 0xec, 0x4c, 0x89, 0x59, 0x2a, - 0x74, 0x89, 0xb2, 0xf8, 0x9f, 0xae, 0x66, 0xe0, 0xbe, 0xce, 0xe6, 0x2d, 0x49, 0x11, 0xe8, 0x85, - 0xf3, 0x73, 0x7e, 0x88, 0x49, 0x75, 0x13, 0x89, 0x01, 0x67, 0x6b, 0x54, 0x68, 0x68, 0x99, 0x1d, - 0x22, 0x2e, 0xd0, 0x7e, 0x37, 0x2d, 0xcb, 0x8b, 0x55, 0x1a, 0x18, 0x87, 0x08, 0x52, 0x79, 0xb9, - 0xb7, 0x27, 0x6e, 0x9e, 0xa9, 0x6d, 0x4d, 0x18, 0xe9, 0x5e, 0x8f, 0x53, 0xf5, 0x49, 0x84, 0x57, - 0x9c, 0x0b, 0x30, 0x79, 0x2b, 0xc5, 0x0d, 0x98, 0x13, 0xfb, 0x7b, 0xca, 0xde, 0x06, 0x5b, 0x54, - 0x56, 0x84, 0xe6, 0x44, 0xa8, 0xeb, 0x4e, 0xcb, 0xb2, 0xac, 0x17, 0x5d, 0x23, 0x3e, 0xdc, 0x5e, - 0x4f, 0x13, 0xbe, 0xa9, 0x02, 0xf5, 0xcf, 0xec, 0x79, 0x9e, 0xed, 0x56, 0xb3, 0xd9, 0x91, 0xa1, - 0xb5, 0x33, 0x20, 0x1d, 0xb6, 0x2c, 0xd0, 0xda, 0xb5, 0x0c, 0xee, 0xca, 0xd8, 0x59, 0x90, 0x46, - 0x54, 0xa7, 0xab, 0x81, 0x1c, 0xfa, 0x9f, 0xcc, 0xbf, 0x6e, 0x85, 0xf8, 0x52, 0xb7, 0xac, 0x7e, - 0x7f, 0x60, 0x12, 0xa5, 0x53, 0xdd, 0x5c, 0xb4, 0x7c, 0x99, 0xd4, 0x0d, 0xf5, 0x9f, 0xf2, 0x80, - 0x45, 0x6e, 0xab, 0x1f, 0x65, 0x02, 0x18, 0x5d, 0x59, 0xdc, 0x24, 0x60, 0xeb, 0x8c, 0x44, 0xdc, - 0x39, 0xaa, 0x36, 0xe7, 0xa9, 0x9a, 0x89, 0x45, 0xcc, 0x96, 0xb1, 0x28, 0x98, 0xbe, 0xf8, 0x51, - 0x6a, 0xc5, 0xd5, 0x3f, 0xe8, 0xca, 0x3c, 0xc5, 0x27, 0x6f, 0x51, 0x91, 0x28, 0xd0, 0xa1, 0x04, - 0x10, 0xe0, 0x30, 0x86, 0x09, 0xbc, 0xe6, 0x29, 0xe6, 0xad, 0x1c, 0x6c, 0x89, 0x12, 0x8f, 0x49, - 0x98, 0xb4, 0x5b, 0xe1, 0x5c, 0xa5, 0x2e, 0x56, 0x37, 0x96, 0x30, 0x70, 0x35, 0xa1, 0x39, 0xd0, - 0x0d, 0x0c, 0x3e, 0x23, 0x68, 0x74, 0x25, 0x95, 0x49, 0x2a, 0xca, 0x2d, 0xd0, 0xb4, 0x03, 0x12, - 0x29, 0x3b, 0xcd, 0x20, 0x00, 0xff, 0x87, 0x19, 0x42, 0xca, 0x0b, 0x8f, 0xd6, 0x40, 0x68, 0x41, - 0x1e, 0x47, 0xf3, 0x06, 0x8e, 0x29, 0xe0, 0x5e, 0x9d, 0x06, 0x5c, 0x55, 0xef, 0x6b, 0xc4, 0xc0, - 0x8b, 0x34, 0x87, 0xe7, 0x95, 0x5c, 0xf4, 0xe3, 0x47, 0x6a, 0xc3, 0x40, 0xd6, 0x80, 0x14, 0xf2, - 0x8c, 0x52, 0x22, 0x1e, 0x83, 0x03, 0x22, 0x72, 0x4c, 0xcd, 0xc9, 0x30, 0x87, 0xaf, 0x39, 0x24, - 0x46, 0x76, 0xa2, 0xbc, 0x53, 0xcb, 0x21, 0x12, 0xc2, 0x85, 0x0f, 0x95, 0x45, 0x1c, 0x22, 0x96, - 0x4c, 0xc5, 0xf9, 0xf2, 0x79, 0xbe, 0xfc, 0xc0, 0xc4, 0xb3, 0xae, 0x0e, 0x99, 0x82, 0x41, 0x3d, - 0xdc, 0xa4, 0x5b, 0x09, 0x67, 0xdd, 0xca, 0xbe, 0xe5, 0x40, 0xf7, 0x5d, 0x4f, 0xb0, 0x35, 0x87, - 0x5c, 0xf2, 0x08, 0x6d, 0xcb, 0x82, 0x0e, 0x32, 0x3c, 0x46, 0x46, 0xc7, 0xc9, 0xa0, 0x91, 0x33, - 0x58, 0x80, 0x07, 0x82, 0x0f, 0xab, 0xd3, 0x61, 0xdd, 0x06, 0xb4, 0xf4, 0x11, 0x09, 0x2e, 0xcc, - 0x2a, 0x60, 0x4d, 0xa3, 0x9e, 0x66, 0x92, 0x83, 0x3f, 0x80, 0x0b, 0x40, 0x73, 0x66, 0x25, 0x3e, - 0x77, 0xf4, 0x70, 0xd8, 0x11, 0x67, 0x62, 0xc2, 0x38, 0xcf, 0x75, 0x4b, 0x91, 0xc2, 0xb1, 0x5f, - 0x09, 0x07, 0x9f, 0x9d, 0x68, 0x58, 0x19, 0x02, 0xea, 0x0d, 0xab, 0xa5, 0xdb, 0xf2, 0xe8, 0x5e, - 0x66, 0x7b, 0x3b, 0xee, 0x2e, 0x2c, 0x7c, 0xf2, 0xc8, 0x95, 0x5b, 0xe8, 0xd0, 0x2a, 0x13, 0xcd, - 0xd1, 0x95, 0x71, 0xfc, 0x40, 0xd3, 0x93, 0x21, 0x77, 0xed, 0x53, 0x4e, 0x36, 0xad, 0x73, 0x6d, - 0x84, 0x3a, 0x0e, 0xbe, 0xe8, 0xee, 0x85, 0x49, 0x12, 0x8d, 0x3a, 0x7d, 0x3d, 0x1d, 0xd2, 0x5f, - 0x5c, 0xa2, 0xe9, 0x13, 0xa1, 0x6e, 0x7c, 0x74, 0x27, 0x66, 0xab, 0x01, 0x18, 0xf1, 0x9f, 0x6f, - 0xba, 0xc6, 0xb5, 0xd6, 0x82, 0xfc, 0x8a, 0xdc, 0x53, 0x5d, 0xe2, 0x3b, 0x80, 0x9f, 0xe0, 0xf9, - 0xfa, 0x60, 0x9b, 0x3d, 0xed, 0xec, 0xdc, 0xd0, 0xea, 0x77, 0x07, 0x4e, 0xad, 0xac, 0xc0, 0xc3, - 0x8d, 0xea, 0xd4, 0xf0, 0x17, 0x9d, 0xb0, 0x49, 0x4d, 0xec, 0xcc, 0xea, 0xfe, 0x18, 0x92, 0xf1, - 0xf0, 0x28, 0x3c, 0xac, 0x86, 0xc9, 0x97, 0xaa, 0x01, 0xe9, 0x2d, 0x78, 0xc5, 0x9f, 0x81, 0x83, - 0xd1, 0x19, 0xa8, 0xb8, 0x84, 0xb9, 0x30, 0xff, 0x65, 0x03, 0x9f, 0x00, 0x9f, 0x1e, 0xe5, 0xe6, - 0x90, 0x0f, 0x74, 0xb6, 0x1d, 0x0b, 0x28, 0x01, 0x1e, 0x81, 0xfd, 0x05, 0x8f, 0xd6, 0x08, 0x06, - 0xfb, 0xd6, 0x84, 0x11, 0x6a, 0xc3, 0x2b, 0xa8, 0x5e, 0x80, 0x05, 0x4c, 0xa7, 0x3f, 0x76, 0xcb, - 0x07, 0x89, 0x3e, 0x11, 0x84, 0x60, 0xb5, 0x23, 0xf8, 0xe8, 0x39, 0xb5, 0x35, 0xb9, 0x5d, 0x6b, - 0x83, 0xa6, 0x82, 0x02, 0xa2, 0xdc, 0x19, 0xa3, 0x8c, 0x51, 0xfb, 0xfe, 0x43, 0xb6, 0x71, 0xb9, - 0xab, 0x4d, 0x67, 0xb2, 0xe6, 0x3f, 0x18, 0xfe, 0x83, 0x7d, 0x5e, 0x13, 0x45, 0xd9, 0x3e, 0xc2, - 0xca, 0xcf, 0x07, 0x7d, 0xfc, 0xe9, 0x7b, 0xb5, 0x1c, 0xfe, 0x3d, 0x6d, 0xd0, 0xb7, 0x53, 0xa8, - 0x1f, 0x41, 0x80, 0x1f, 0x64, 0x2e, 0x58, 0x4a, 0x77, 0xcf, 0xb0, 0xe5, 0x3e, 0x36, 0xdb, 0xef, - 0x61, 0xaf, 0x3b, 0xdd, 0xda, 0xd4, 0x43, 0x77, 0xf1, 0xea, 0x14, 0x45, 0x99, 0x2a, 0xc8, 0x37, - 0xce, 0x8b, 0x28, 0x37, 0xbb, 0xd5, 0xe9, 0xc0, 0x31, 0xaa, 0xa2, 0x38, 0x93, 0x55, 0xc3, 0xee, - 0xa9, 0xf0, 0xb9, 0x5b, 0xcd, 0x94, 0x65, 0x90, 0x2c, 0xab, 0x99, 0xca, 0x4c, 0xa6, 0x3b, 0xfb, - 0x98, 0x08, 0x59, 0xf0, 0xb5, 0x6f, 0x57, 0xe9, 0x09, 0x3e, 0xb7, 0x3a, 0xa5, 0x2e, 0xcf, 0x55, - 0x18, 0x3c, 0xa7, 0xdb, 0xac, 0x42, 0x83, 0xaf, 0x03, 0x48, 0xc1, 0xf7, 0x9e, 0x36, 0x86, 0x77, - 0xe8, 0x07, 0x51, 0x0f, 0x31, 0xc5, 0x6e, 0xf5, 0x81, 0x31, 0x62, 0x26, 0x5b, 0x6f, 0x63, 0x02, - 0x20, 0xd8, 0xd0, 0xcc, 0x2a, 0x19, 0xbe, 0xae, 0x3d, 0x72, 0xf0, 0xa9, 0xe5, 0x92, 0xbc, 0xbd, - 0xb6, 0x3a, 0x71, 0xb1, 0xfc, 0x4c, 0x06, 0x4d, 0xb0, 0xf6, 0xfd, 0xbb, 0x22, 0xe7, 0x72, 0x72, - 0xbe, 0x28, 0x17, 0xe5, 0x60, 0x51, 0x52, 0x83, 0x85, 0x2b, 0xd3, 0x85, 0x55, 0x6f, 0xd0, 0xcc, - 0xe8, 0x56, 0x76, 0xdc, 0x57, 0xdd, 0x0c, 0x88, 0x6b, 0xe2, 0x0f, 0x19, 0xca, 0xe4, 0xe5, 0xdc, - 0x9a, 0x9c, 0x0b, 0x8b, 0x10, 0x69, 0xce, 0xcd, 0x90, 0x7e, 0xb6, 0x2c, 0xdc, 0x88, 0xc8, 0x40, - 0x7f, 0xb2, 0xc5, 0xf5, 0x1c, 0xfe, 0xcb, 0xe5, 0x0b, 0x99, 0x67, 0x9b, 0x14, 0xcd, 0x2b, 0xf9, - 0x92, 0x5c, 0x90, 0xf3, 0x58, 0xc5, 0xf2, 0x06, 0x35, 0x40, 0x3a, 0x30, 0x2a, 0xd6, 0x24, 0x94, - 0x2b, 0x40, 0xb9, 0xf5, 0xdf, 0x2f, 0x56, 0x84, 0x22, 0x85, 0xdc, 0x6f, 0x96, 0x53, 0xe4, 0x32, - 0x60, 0x84, 0xef, 0x20, 0xac, 0xbb, 0x3a, 0x90, 0xef, 0x5c, 0x17, 0x71, 0xf3, 0x1a, 0x57, 0x99, - 0xec, 0x48, 0x35, 0x0c, 0x5b, 0x05, 0x5e, 0x95, 0x2d, 0xe5, 0xca, 0x6b, 0xeb, 0x79, 0x86, 0x93, - 0x2c, 0x74, 0x1c, 0x52, 0x94, 0xf5, 0x7c, 0xae, 0x50, 0x2e, 0xe4, 0xd7, 0xf3, 0xa5, 0x42, 0x99, - 0xb6, 0x00, 0x98, 0xff, 0xbb, 0x2d, 0xe4, 0x72, 0xeb, 0x95, 0x8a, 0xa2, 0xf0, 0x4d, 0xe4, 0x4b, - 0xf9, 0x7c, 0x45, 0x59, 0x2b, 0x56, 0x72, 0xa5, 0x4a, 0xa9, 0xac, 0x28, 0xe2, 0x8f, 0x1f, 0x1b, - 0x9d, 0x81, 0x49, 0x82, 0x6d, 0x09, 0x3d, 0x10, 0x40, 0x0c, 0xed, 0x2e, 0x38, 0xbc, 0xb8, 0x43, - 0xec, 0x5f, 0x29, 0x69, 0xfa, 0xa9, 0x9d, 0xa1, 0xa1, 0x0e, 0xbe, 0x7c, 0x31, 0xb5, 0x91, 0x00, - 0x0c, 0x0a, 0xe3, 0xf5, 0xfb, 0x73, 0x75, 0xb3, 0xa0, 0x15, 0xbe, 0x7c, 0x89, 0xc8, 0x8d, 0xb3, - 0xa0, 0x4e, 0x17, 0x34, 0xcf, 0x94, 0x26, 0x7b, 0xd2, 0x14, 0x24, 0x18, 0x36, 0xf1, 0xf6, 0x0c, - 0x0d, 0x7f, 0x32, 0x64, 0xf9, 0xce, 0x00, 0x17, 0xb8, 0x74, 0x40, 0xb8, 0x73, 0xbc, 0x09, 0xc9, - 0x18, 0x96, 0xed, 0x1e, 0xb5, 0x53, 0x9a, 0x34, 0x65, 0x0b, 0x59, 0x3b, 0x03, 0xc2, 0x0e, 0x2b, - 0xba, 0x3d, 0x21, 0x9f, 0xb8, 0xac, 0x7b, 0xdb, 0x3b, 0xe7, 0x0b, 0x32, 0xbb, 0xdb, 0x93, 0x1d, - 0xe4, 0xd4, 0xe7, 0xa0, 0x2a, 0x45, 0x0a, 0xe9, 0xee, 0x5e, 0xdf, 0xc6, 0x56, 0x83, 0x62, 0x4a, - 0xad, 0x56, 0xbb, 0x68, 0x3e, 0x03, 0xd3, 0xc2, 0x1b, 0x0e, 0x5d, 0xf8, 0x92, 0xa1, 0xde, 0x04, - 0x7c, 0x21, 0xc8, 0xc0, 0x15, 0xd1, 0xbe, 0x7c, 0x11, 0x2d, 0x52, 0x44, 0xac, 0xd5, 0xd0, 0x8e, - 0x62, 0x75, 0x30, 0xed, 0x53, 0xdd, 0x71, 0xd4, 0x49, 0x46, 0x77, 0xc9, 0x6f, 0xac, 0xd9, 0xeb, - 0x6e, 0x93, 0xf8, 0x50, 0x45, 0x5b, 0xb6, 0x55, 0x10, 0xee, 0x8e, 0x4c, 0x2f, 0xa5, 0x65, 0x1c, - 0xe9, 0xcb, 0x97, 0x68, 0x4a, 0x77, 0x2e, 0xa5, 0xc9, 0x55, 0x09, 0xb3, 0xbf, 0xe1, 0x39, 0x61, - 0x75, 0xe8, 0xb4, 0x9c, 0x12, 0xd3, 0x50, 0x51, 0x1a, 0x24, 0x65, 0xf8, 0xed, 0xb2, 0xdf, 0x66, - 0x5a, 0x94, 0xc4, 0x48, 0x39, 0x3c, 0x6c, 0x12, 0x94, 0xcb, 0xe4, 0x73, 0xf9, 0xf2, 0x5f, 0x11, - 0x40, 0xd2, 0x99, 0xb5, 0x5c, 0x29, 0xff, 0x57, 0x04, 0x94, 0x74, 0x46, 0x59, 0xcb, 0x47, 0xd2, - 0x78, 0x60, 0xd0, 0x5c, 0xda, 0x38, 0xc5, 0x4a, 0x61, 0x3d, 0x13, 0xbc, 0x9a, 0x96, 0x41, 0x36, - 0x0b, 0xa9, 0x99, 0xd1, 0x16, 0x57, 0x24, 0x48, 0x94, 0xaa, 0xc0, 0x8b, 0x50, 0x24, 0x35, 0x35, - 0xf1, 0x53, 0xad, 0xd6, 0x45, 0x37, 0xcf, 0xbe, 0x3d, 0x80, 0x75, 0xa3, 0x81, 0x04, 0x82, 0x83, - 0x80, 0x96, 0xa9, 0x06, 0x09, 0x94, 0xb5, 0x41, 0x57, 0x26, 0x40, 0x30, 0x8f, 0x46, 0xbf, 0x32, - 0x69, 0x0b, 0x9e, 0x29, 0x59, 0x85, 0xee, 0x4b, 0xc4, 0xf6, 0x51, 0xf3, 0x51, 0x14, 0x64, 0x95, - 0xdd, 0x5f, 0xbf, 0x82, 0xdc, 0x2d, 0x3f, 0x0f, 0x41, 0x47, 0x90, 0x67, 0x33, 0x97, 0x5f, 0xdb, - 0x22, 0x3e, 0x64, 0x62, 0x95, 0xb8, 0xda, 0x89, 0x52, 0xb0, 0x4c, 0x7e, 0xf9, 0xe2, 0x6d, 0x2a, - 0x5f, 0xbe, 0x24, 0x34, 0x58, 0xfb, 0x19, 0x77, 0x98, 0xa2, 0x97, 0x1f, 0xca, 0xc2, 0x1f, 0xd3, - 0x39, 0x30, 0x66, 0x42, 0x41, 0xf9, 0x53, 0xc6, 0x91, 0x48, 0xfd, 0x31, 0xf5, 0x66, 0x72, 0xf0, - 0x47, 0x92, 0x7e, 0x4a, 0x52, 0x35, 0xe5, 0x37, 0x07, 0xc0, 0xc2, 0x22, 0x23, 0xc9, 0x49, 0xcd, - 0x25, 0x14, 0xfe, 0x99, 0xd0, 0x3d, 0x2f, 0xa1, 0x3b, 0xdc, 0xb8, 0xa9, 0xb6, 0x6d, 0x4c, 0x76, - 0x3a, 0x5d, 0x98, 0xf0, 0x2d, 0x7a, 0xb0, 0x49, 0x24, 0x17, 0x09, 0x03, 0x5d, 0xd7, 0x60, 0xf9, - 0xca, 0x90, 0xd5, 0x2b, 0x83, 0x8b, 0x97, 0xb4, 0x81, 0x82, 0x8b, 0xc6, 0xa5, 0x92, 0x06, 0x32, - 0xcd, 0xee, 0x06, 0xa0, 0x85, 0x4c, 0x79, 0x91, 0x04, 0xbd, 0x16, 0x65, 0x96, 0xd7, 0x23, 0x79, - 0x71, 0xf1, 0x62, 0xf7, 0x5a, 0x6d, 0xf8, 0xb9, 0xbc, 0xa6, 0x2d, 0xca, 0xde, 0x96, 0x98, 0x70, - 0x41, 0x34, 0x00, 0x49, 0x9e, 0x31, 0xf6, 0x13, 0x0d, 0x93, 0x0f, 0x0f, 0x30, 0x02, 0x7e, 0xd1, - 0x26, 0x2b, 0xca, 0xdd, 0x20, 0xed, 0x17, 0x61, 0xc7, 0x78, 0xf9, 0xcc, 0xbd, 0x36, 0xc9, 0x4c, - 0x2f, 0x94, 0xae, 0x52, 0x72, 0xe3, 0x3e, 0xf7, 0x3d, 0xf2, 0x59, 0x21, 0xcd, 0x96, 0x22, 0xed, - 0x78, 0xab, 0x4d, 0x51, 0x0e, 0xfb, 0x4a, 0x38, 0x2f, 0xde, 0xc3, 0x16, 0xe6, 0x70, 0xbb, 0x36, - 0xcd, 0x41, 0x7a, 0x48, 0x97, 0xd3, 0x2d, 0xda, 0x84, 0x7f, 0x85, 0x35, 0x64, 0xd6, 0x71, 0x33, - 0x1c, 0x25, 0x38, 0xd5, 0x68, 0x78, 0x96, 0x03, 0x4c, 0x19, 0x99, 0xdf, 0x91, 0xa7, 0xf5, 0x53, - 0x22, 0xaa, 0x78, 0xb7, 0x3a, 0x60, 0x5f, 0x94, 0x8f, 0x1b, 0x17, 0xe7, 0x30, 0x6e, 0x78, 0x3b, - 0x87, 0xde, 0x99, 0xa4, 0xa0, 0x5a, 0x49, 0x0a, 0x84, 0x0b, 0xe0, 0x47, 0x6d, 0xf7, 0xcb, 0x17, - 0xaa, 0x05, 0xdf, 0x1e, 0xf1, 0xac, 0xd6, 0x77, 0x1c, 0x9a, 0x06, 0x80, 0x50, 0x31, 0x21, 0x03, - 0xb2, 0x40, 0xed, 0x53, 0x42, 0xa2, 0x1c, 0x8e, 0x78, 0xa4, 0x16, 0x76, 0xaa, 0x6d, 0x1a, 0x1d, - 0xf4, 0xda, 0x22, 0x6a, 0xd8, 0xa2, 0xa2, 0x4c, 0x95, 0x7d, 0x5f, 0x54, 0xab, 0xbf, 0xab, 0x3c, - 0x8d, 0x51, 0x02, 0x07, 0x1a, 0x4d, 0x58, 0x54, 0x01, 0xf1, 0x23, 0x9b, 0xeb, 0x1c, 0xd0, 0xfe, - 0x7c, 0xe7, 0x20, 0x31, 0xb1, 0x16, 0x46, 0xd7, 0xc0, 0x9a, 0xb4, 0xad, 0x54, 0x84, 0x4e, 0x45, - 0xbc, 0x97, 0x9d, 0x1b, 0xf3, 0xd6, 0x6a, 0x07, 0x13, 0x89, 0xe3, 0x2b, 0x97, 0x98, 0xc7, 0xc4, - 0x76, 0xbb, 0x1d, 0x49, 0x2c, 0x60, 0x62, 0xb3, 0xd9, 0x8c, 0x24, 0x16, 0x31, 0x51, 0x55, 0xd5, - 0x48, 0x62, 0x09, 0x13, 0xd7, 0xd7, 0xd7, 0x23, 0x89, 0xe5, 0xa4, 0xc4, 0x0a, 0x26, 0x56, 0x2a, - 0x95, 0x48, 0x62, 0x13, 0x13, 0x8b, 0xc5, 0x62, 0x24, 0xb1, 0x85, 0x89, 0x85, 0x42, 0x21, 0x92, - 0x88, 0x06, 0x12, 0xbc, 0xd7, 0x3e, 0x92, 0xd8, 0xc6, 0xc4, 0x7c, 0x3e, 0x1f, 0x49, 0x74, 0x08, - 0x9c, 0xf9, 0x68, 0xce, 0x2e, 0xc9, 0xa9, 0x46, 0x13, 0x0d, 0x92, 0x58, 0x6e, 0x45, 0x12, 0x2d, - 0x48, 0x24, 0x17, 0x07, 0xe4, 0x95, 0xa2, 0x2c, 0x84, 0x7f, 0xf0, 0x26, 0xfa, 0x48, 0x46, 0xb7, - 0xc9, 0xf0, 0x59, 0x88, 0x25, 0xf7, 0x58, 0x7a, 0x39, 0x92, 0xee, 0x35, 0x17, 0x54, 0xcc, 0x5d, - 0x3c, 0x1f, 0x2b, 0xa0, 0xfa, 0x25, 0x72, 0x6b, 0x8a, 0x2c, 0x84, 0x7f, 0x16, 0x97, 0xe8, 0x7d, - 0xa8, 0x0d, 0x14, 0x43, 0xa8, 0xb9, 0x52, 0x62, 0xec, 0xb4, 0x03, 0x6a, 0x39, 0xee, 0x8e, 0xe8, - 0x26, 0xc6, 0x24, 0x4f, 0x29, 0x99, 0x0a, 0xe4, 0xab, 0xc6, 0x09, 0x2a, 0x8e, 0x7e, 0x42, 0x50, - 0x74, 0x0d, 0x89, 0x11, 0x54, 0x7c, 0x4c, 0x0a, 0x49, 0x43, 0x5a, 0x4c, 0x1a, 0x7c, 0x42, 0x50, - 0xa5, 0x52, 0x69, 0x9e, 0xa0, 0xca, 0xe5, 0xf2, 0x07, 0x09, 0x2a, 0x4e, 0xb9, 0x84, 0xa0, 0x5a, - 0xad, 0xd6, 0x3c, 0x41, 0xc5, 0xa7, 0x48, 0x3b, 0x69, 0x36, 0x10, 0x82, 0xd2, 0x8a, 0xf9, 0x79, - 0x82, 0x2a, 0x6a, 0xf9, 0x79, 0x82, 0x2a, 0x56, 0xd4, 0x64, 0x82, 0x2a, 0xc0, 0x40, 0xf8, 0xff, - 0x16, 0x50, 0x13, 0x20, 0x33, 0x91, 0x9a, 0x20, 0xbd, 0xb4, 0x80, 0x9a, 0xf8, 0x5a, 0x3f, 0x42, - 0x4a, 0x4a, 0x1e, 0xa8, 0x28, 0xf8, 0xf3, 0x01, 0x52, 0x2a, 0xe5, 0x64, 0xc1, 0xff, 0xf7, 0x51, - 0x3a, 0x1a, 0x98, 0xb0, 0x0e, 0x88, 0x1c, 0x9f, 0x42, 0x41, 0x7e, 0xbb, 0x1b, 0x8a, 0x50, 0xa4, - 0x68, 0xb3, 0x8b, 0x6d, 0xd6, 0xda, 0x99, 0x96, 0xa3, 0x01, 0xf3, 0x67, 0xd2, 0x2d, 0xa9, 0x52, - 0x94, 0x36, 0xf4, 0x4e, 0xca, 0xcd, 0xa0, 0xe1, 0x5c, 0x93, 0x45, 0xe0, 0xd1, 0x20, 0x2f, 0x04, - 0x3a, 0x03, 0x68, 0x89, 0xee, 0xa0, 0x9f, 0xb1, 0x7b, 0x96, 0x67, 0xb9, 0xd9, 0xdc, 0x7a, 0x5e, - 0xc9, 0xe6, 0x94, 0x8a, 0x82, 0x9c, 0x5c, 0x93, 0x3a, 0x96, 0x83, 0x57, 0x36, 0x09, 0x66, 0xcd, - 0x17, 0xed, 0x65, 0xd0, 0xd2, 0x37, 0x8c, 0x6f, 0xa0, 0xf8, 0x31, 0xe1, 0x77, 0xc3, 0x48, 0xa7, - 0xa5, 0x29, 0x66, 0x52, 0x6b, 0x20, 0x83, 0xc2, 0x87, 0xef, 0xc6, 0x8f, 0xef, 0xca, 0x8f, 0x2d, - 0x13, 0xa5, 0xec, 0xfd, 0x81, 0x61, 0x3c, 0x82, 0xb4, 0x93, 0x92, 0xaa, 0xc1, 0x17, 0xd9, 0x0a, - 0x6a, 0x4b, 0xa9, 0x32, 0x4b, 0xce, 0xfd, 0xf0, 0x9f, 0xf2, 0x3f, 0x24, 0x59, 0x0f, 0x73, 0x58, - 0x00, 0x3d, 0xae, 0x84, 0xe4, 0x45, 0xc7, 0x3a, 0xc9, 0x93, 0x94, 0x66, 0xd9, 0x0b, 0x90, 0xdd, - 0xdc, 0xac, 0x59, 0xa0, 0x7d, 0x7c, 0xab, 0xe9, 0x20, 0x72, 0xd1, 0x8e, 0xb2, 0xaf, 0xc5, 0x1f, - 0xd2, 0x0c, 0x74, 0xca, 0x76, 0x7b, 0x0f, 0xef, 0x75, 0x42, 0x03, 0xb3, 0x66, 0x6a, 0x4e, 0x8a, - 0x18, 0xf5, 0x40, 0xfe, 0xa8, 0x6d, 0x4e, 0x69, 0xf7, 0x88, 0xe8, 0xb9, 0x8f, 0x91, 0x37, 0x52, - 0xf1, 0xb5, 0xbc, 0xd9, 0x05, 0x08, 0x40, 0x3f, 0x38, 0x4f, 0x99, 0x20, 0x66, 0xa7, 0xcc, 0x5a, - 0xa6, 0x2c, 0xc9, 0xbe, 0x7e, 0xc2, 0x62, 0x56, 0xd4, 0xcc, 0x20, 0x25, 0x14, 0xbd, 0x8e, 0x50, - 0xb3, 0xaa, 0xfd, 0x04, 0x05, 0x1e, 0xe4, 0x2f, 0x02, 0x15, 0x91, 0xbc, 0x6a, 0x26, 0xe0, 0x64, - 0x16, 0x1b, 0xcf, 0xc6, 0x8b, 0x6e, 0xee, 0x34, 0x1a, 0x38, 0xa8, 0x30, 0x56, 0x9f, 0xa8, 0x72, - 0x43, 0xd1, 0xea, 0xd5, 0x62, 0xfa, 0xca, 0x8d, 0xda, 0x25, 0xda, 0x0a, 0x1a, 0x90, 0x61, 0x76, - 0x21, 0x46, 0x13, 0x06, 0x1e, 0x37, 0xb0, 0x60, 0xe4, 0xdd, 0x8c, 0xde, 0x86, 0x51, 0x87, 0x55, - 0x4f, 0x33, 0x70, 0x27, 0x72, 0x82, 0x37, 0xfa, 0x68, 0x40, 0x50, 0x90, 0x14, 0x6e, 0xec, 0x66, - 0x41, 0xb5, 0xc7, 0x14, 0x62, 0x59, 0x4e, 0x81, 0x10, 0xb2, 0x45, 0xe8, 0x03, 0xc8, 0x43, 0x4c, - 0x13, 0x13, 0x54, 0x55, 0xcc, 0x88, 0x52, 0x5a, 0xcc, 0xba, 0x00, 0x67, 0x86, 0x65, 0x26, 0xf1, - 0x45, 0x6a, 0x22, 0xfa, 0x2e, 0x43, 0xef, 0x31, 0xb8, 0x06, 0x88, 0xd3, 0x3d, 0xdd, 0x68, 0xa7, - 0x5c, 0x69, 0x16, 0x76, 0xcf, 0x32, 0xd1, 0x40, 0x0b, 0x8b, 0xb3, 0x08, 0x14, 0xad, 0x55, 0x81, - 0xb0, 0xe2, 0xf1, 0x06, 0x6c, 0xc7, 0x42, 0x5f, 0x6d, 0x03, 0xb0, 0x4b, 0x2c, 0x58, 0x8a, 0x9c, - 0x22, 0x8d, 0xd6, 0x22, 0xd2, 0x50, 0xd7, 0x97, 0x86, 0x20, 0xf5, 0xc8, 0x06, 0xe1, 0x14, 0x44, - 0x58, 0x9a, 0x0d, 0xca, 0x83, 0xaa, 0x96, 0x12, 0xf7, 0xa1, 0x7e, 0x72, 0xf4, 0x3f, 0x23, 0x5c, - 0x1a, 0x78, 0xd7, 0x91, 0x40, 0x42, 0x1f, 0xd1, 0x28, 0x22, 0x47, 0x97, 0x9f, 0xc4, 0x45, 0xf2, - 0x15, 0xad, 0x51, 0x26, 0xb5, 0x49, 0x92, 0x2f, 0xc0, 0x26, 0xb7, 0x1e, 0xca, 0x62, 0x12, 0xca, - 0xb3, 0x48, 0x2e, 0xb5, 0xbe, 0xe6, 0x74, 0xb5, 0x5d, 0x4d, 0xb3, 0xf1, 0x8d, 0x8a, 0x68, 0x84, - 0xa0, 0x70, 0x0c, 0x25, 0x99, 0xd8, 0xb2, 0x2e, 0x6f, 0x3d, 0xdd, 0x00, 0x01, 0x2f, 0x14, 0x3c, - 0x42, 0x91, 0x90, 0x18, 0x54, 0xb6, 0x3a, 0x9a, 0xd7, 0xea, 0xa5, 0x96, 0x21, 0xbf, 0x87, 0xd1, - 0xae, 0x20, 0x6b, 0xe6, 0x19, 0xf4, 0x68, 0x51, 0x9e, 0xf6, 0x35, 0xaf, 0x67, 0xb5, 0xab, 0x22, - 0xc0, 0x26, 0xce, 0x24, 0x24, 0x5a, 0x33, 0x05, 0x24, 0xad, 0x91, 0xef, 0x29, 0x29, 0x4c, 0x99, - 0xc6, 0xf5, 0x4d, 0x80, 0x1b, 0x4d, 0x37, 0xa0, 0x78, 0x4a, 0x19, 0x18, 0x04, 0x68, 0x17, 0x73, - 0xa1, 0xa9, 0xd2, 0x02, 0x12, 0x36, 0xac, 0x6e, 0x4a, 0x3c, 0xb7, 0x04, 0x15, 0x73, 0x0b, 0xa0, - 0xb2, 0xfa, 0x0d, 0xa3, 0xf5, 0x33, 0x02, 0x44, 0x46, 0xd8, 0xa5, 0xb1, 0x97, 0x5d, 0x42, 0xc5, - 0x5a, 0x1b, 0x00, 0x85, 0x2a, 0x3b, 0xba, 0x09, 0x54, 0x31, 0x49, 0xa5, 0x24, 0xa8, 0x95, 0xb1, - 0x2b, 0x4e, 0x2c, 0xec, 0x66, 0x60, 0x4e, 0x40, 0xbe, 0xea, 0xa2, 0x4f, 0x21, 0x6a, 0x80, 0xd4, - 0xbe, 0x7c, 0xe1, 0x27, 0x88, 0x88, 0x14, 0xb8, 0x03, 0x04, 0x28, 0xc9, 0x91, 0x13, 0x1d, 0x32, - 0xf3, 0xb7, 0x61, 0x3b, 0xb7, 0x98, 0x42, 0x8d, 0x70, 0x8b, 0x47, 0xf1, 0x12, 0xa4, 0x7a, 0xa4, - 0x08, 0xce, 0x77, 0x3b, 0x00, 0x78, 0xff, 0x01, 0x0d, 0xad, 0xfc, 0x3b, 0x7d, 0x86, 0x91, 0xbc, - 0xa1, 0xc6, 0xd6, 0xf0, 0xdb, 0x25, 0x67, 0x9a, 0xa5, 0xa9, 0x51, 0x73, 0x87, 0x34, 0x93, 0x71, - 0x7b, 0x76, 0x46, 0xfe, 0x47, 0xa9, 0x81, 0x11, 0x43, 0x3b, 0x81, 0x33, 0x85, 0xe1, 0xa1, 0xa8, - 0x87, 0x91, 0x28, 0x27, 0x5b, 0x5e, 0xe4, 0x4f, 0xb9, 0x40, 0x6b, 0x20, 0x2b, 0x40, 0x6b, 0x18, - 0x2c, 0x1d, 0x3e, 0x57, 0x52, 0x64, 0xd1, 0x73, 0x06, 0x1a, 0x4c, 0xb9, 0x64, 0x2c, 0xd8, 0xad, - 0xbe, 0x08, 0xb4, 0x10, 0x8f, 0xba, 0xb1, 0xe1, 0xb3, 0x1d, 0xe8, 0x85, 0x33, 0x69, 0x10, 0x34, - 0x5b, 0x4e, 0xdd, 0x30, 0x52, 0x5f, 0xb9, 0x18, 0x73, 0xcc, 0x6d, 0xe9, 0xc7, 0x57, 0xbc, 0xc2, - 0x94, 0x2e, 0x13, 0x2e, 0x12, 0x8b, 0x27, 0x25, 0x31, 0x5c, 0x72, 0x5d, 0x37, 0x5a, 0xc6, 0x51, - 0x93, 0x22, 0xed, 0x6d, 0x13, 0x27, 0x25, 0xe8, 0xc3, 0xa2, 0xdc, 0xc0, 0x4e, 0x62, 0x79, 0x43, - 0xa6, 0x12, 0x1b, 0x6d, 0xcd, 0x67, 0x95, 0xd4, 0xd4, 0x13, 0x6e, 0xe0, 0x27, 0xc0, 0x46, 0x0c, - 0xf3, 0xd8, 0x14, 0xb0, 0xc4, 0xbe, 0x35, 0x04, 0x3e, 0x4a, 0x2f, 0x84, 0x87, 0xbc, 0xd4, 0x2c, - 0xfc, 0xeb, 0x97, 0xf7, 0x5d, 0xfb, 0xc1, 0xe5, 0x03, 0xf8, 0xc2, 0x4c, 0x1c, 0x63, 0x63, 0x1e, - 0x01, 0x9a, 0xec, 0xd5, 0x60, 0x30, 0xa6, 0xb4, 0xf4, 0x97, 0x2f, 0x9f, 0x3c, 0xe0, 0x4c, 0x7a, - 0x03, 0x9d, 0x82, 0x80, 0xf3, 0xfe, 0xe7, 0x0e, 0x57, 0x13, 0xed, 0x0d, 0x10, 0x31, 0xb9, 0xe2, - 0x5b, 0x24, 0x63, 0x08, 0x19, 0xe6, 0x6d, 0x5d, 0x20, 0x38, 0xe8, 0xa2, 0x4c, 0x2b, 0x99, 0xa3, - 0x6d, 0x8d, 0x57, 0xcc, 0x31, 0x20, 0x1c, 0xf5, 0x01, 0xf0, 0xe1, 0xf0, 0x60, 0x76, 0x53, 0x8a, - 0x60, 0xee, 0x04, 0xd2, 0x02, 0xab, 0x87, 0xe8, 0x47, 0x37, 0x73, 0x40, 0x02, 0x21, 0x83, 0xee, - 0x52, 0x61, 0x82, 0xba, 0x1b, 0x90, 0xc5, 0x03, 0xef, 0x36, 0x38, 0xbc, 0x39, 0x3b, 0x25, 0x6b, - 0x48, 0x14, 0x25, 0xa0, 0x10, 0x93, 0xeb, 0x64, 0x41, 0xb9, 0x43, 0x20, 0x60, 0x2e, 0x11, 0xaf, - 0x04, 0x7f, 0x7e, 0xb0, 0x4d, 0x09, 0x1c, 0x60, 0xda, 0x7c, 0x70, 0xab, 0x2c, 0x33, 0xe7, 0xf8, - 0xdb, 0x16, 0xb5, 0xf8, 0xa4, 0x4a, 0x1a, 0x23, 0xda, 0xc2, 0x4c, 0xce, 0xaf, 0xc3, 0x54, 0x92, - 0xa1, 0x8b, 0x3c, 0xb3, 0xd2, 0x62, 0xf8, 0xe0, 0x1c, 0x23, 0xa4, 0x69, 0x88, 0x20, 0x71, 0x07, - 0x10, 0xa2, 0x31, 0x95, 0xd1, 0x12, 0x88, 0x46, 0x2a, 0x74, 0x54, 0x58, 0x35, 0xda, 0x9f, 0x60, - 0x2c, 0x14, 0x5e, 0x17, 0x8c, 0xf9, 0x57, 0x68, 0xb5, 0x92, 0x56, 0x08, 0x88, 0x8c, 0xc7, 0x91, - 0xc7, 0x01, 0xcb, 0xe2, 0x93, 0xb8, 0x29, 0x86, 0x18, 0xe4, 0xb3, 0xc9, 0x38, 0x59, 0xd4, 0x75, - 0x6f, 0x61, 0xd7, 0xe5, 0xa4, 0x4f, 0xac, 0x99, 0x99, 0x1c, 0x21, 0x09, 0x98, 0xdf, 0xd7, 0xb8, - 0x4b, 0xd6, 0xd7, 0x98, 0xdd, 0x8f, 0x82, 0x1d, 0x9a, 0xd7, 0x50, 0x52, 0x3c, 0x53, 0xbd, 0x5e, - 0xa6, 0x63, 0x58, 0x30, 0x3d, 0xbc, 0x6c, 0xa5, 0x5c, 0x44, 0xb4, 0x9a, 0x7c, 0x6a, 0xca, 0x5b, - 0x25, 0xc9, 0x7f, 0xb9, 0x52, 0xb6, 0x50, 0xc6, 0xcf, 0x46, 0xf2, 0xe7, 0x55, 0xfc, 0xfa, 0x97, - 0x29, 0x65, 0xcb, 0x90, 0x47, 0xad, 0xb9, 0x5b, 0x6e, 0x5a, 0x14, 0xc4, 0x74, 0x2a, 0x57, 0x83, - 0x67, 0x50, 0xff, 0x27, 0x22, 0xee, 0x67, 0x4c, 0x5c, 0x5c, 0xc3, 0x64, 0x41, 0xc4, 0xc8, 0xd6, - 0xcc, 0xae, 0xa9, 0xa6, 0x6b, 0xe6, 0xaf, 0x5f, 0xee, 0x96, 0x19, 0x14, 0x30, 0x61, 0xed, 0xb3, - 0x06, 0x48, 0x52, 0xf8, 0x03, 0x45, 0x20, 0xb7, 0xfc, 0x09, 0xd6, 0x00, 0x13, 0x50, 0x09, 0xd9, - 0xb1, 0x02, 0x40, 0xc5, 0x66, 0x69, 0x1d, 0xe6, 0x99, 0x4b, 0xd3, 0x8c, 0x34, 0xf1, 0xb6, 0xc3, - 0xf4, 0x6f, 0x08, 0x0a, 0xda, 0xde, 0xf0, 0x3b, 0x97, 0x9f, 0xa5, 0x63, 0x8a, 0xb7, 0x5a, 0x56, - 0xfe, 0xc2, 0x22, 0xae, 0x86, 0x4a, 0x8c, 0xca, 0x99, 0x5e, 0x4d, 0xe0, 0x15, 0xd6, 0x08, 0xe7, - 0x11, 0x9a, 0x1c, 0x45, 0xdf, 0xee, 0xf9, 0xf3, 0x9b, 0xe7, 0x6c, 0x7e, 0xf3, 0xda, 0xfe, 0x96, - 0xde, 0x8b, 0x36, 0xf1, 0xda, 0xe2, 0xe6, 0x1f, 0x53, 0x6d, 0xf6, 0x2d, 0xeb, 0xb5, 0xf9, 0x4f, - 0x43, 0xd5, 0xa0, 0x9f, 0xbc, 0x19, 0x88, 0x7c, 0xec, 0x73, 0x16, 0x8a, 0xff, 0x8c, 0x8c, 0xce, - 0x29, 0xb7, 0x4f, 0x75, 0x99, 0xa2, 0xe3, 0xa3, 0xd5, 0x72, 0x01, 0xaf, 0x22, 0xdb, 0x8c, 0x64, - 0xdb, 0x49, 0xf2, 0x40, 0x0c, 0xff, 0xf2, 0x45, 0x4b, 0xa7, 0x7d, 0x9c, 0x69, 0x9b, 0xf9, 0x12, - 0xb1, 0x2c, 0xd6, 0xe0, 0x57, 0x92, 0x35, 0x8e, 0x66, 0x31, 0x68, 0xe4, 0x2d, 0x54, 0xc9, 0xb1, - 0x43, 0xa0, 0xd4, 0x9f, 0x36, 0x42, 0xaa, 0xb7, 0x7f, 0x4a, 0xf4, 0x9c, 0xf8, 0xc6, 0x27, 0x52, - 0xf3, 0x77, 0xef, 0xc7, 0xaf, 0x5f, 0xca, 0x27, 0xac, 0x1d, 0xdb, 0xd8, 0x0a, 0xb3, 0x62, 0x18, - 0x48, 0xc8, 0x1c, 0x4e, 0x7d, 0x0f, 0x9b, 0xdc, 0x12, 0xbf, 0x7c, 0x5e, 0x07, 0x15, 0x71, 0x43, - 0x38, 0xda, 0x15, 0xfa, 0x03, 0xd7, 0x13, 0x9a, 0x9a, 0x00, 0xe9, 0x82, 0xe5, 0x08, 0x20, 0x53, - 0xba, 0x19, 0x1c, 0xd8, 0xea, 0x92, 0x5a, 0x7e, 0xfa, 0xe5, 0x71, 0x27, 0x77, 0xe4, 0xe8, 0x18, - 0x5b, 0x4a, 0xf8, 0x63, 0x6a, 0x13, 0x59, 0xd6, 0x93, 0x66, 0x9f, 0x38, 0x1c, 0xd9, 0xcc, 0x1c, - 0xcf, 0xba, 0xc1, 0xbc, 0x20, 0x81, 0x46, 0x34, 0x1f, 0x0d, 0xa4, 0x0f, 0x5f, 0xbe, 0xd0, 0xae, - 0x68, 0x3f, 0xc2, 0xa7, 0x0c, 0x52, 0x0a, 0x10, 0x7b, 0xf0, 0x0a, 0xc3, 0xcf, 0x9b, 0xd7, 0x2f, - 0x0d, 0x75, 0x82, 0x7e, 0x7e, 0x9c, 0x79, 0x3d, 0xc8, 0x6b, 0xb3, 0x6f, 0x5c, 0x6d, 0x7e, 0x52, - 0xc6, 0x76, 0x39, 0xf0, 0x54, 0x5b, 0xbf, 0x53, 0x0d, 0x5f, 0x5a, 0x27, 0x99, 0x7f, 0xfd, 0xfa, - 0xe4, 0x17, 0x92, 0x98, 0x9d, 0x5d, 0x64, 0x0b, 0x29, 0xdb, 0x34, 0x00, 0x0a, 0xd1, 0xbb, 0x66, - 0x0a, 0xb7, 0x0d, 0xfd, 0x8c, 0x7e, 0x6f, 0xbc, 0x0c, 0xc8, 0xc4, 0x5b, 0xe4, 0x6f, 0x35, 0xd5, - 0xd6, 0xf0, 0xcc, 0x22, 0xa4, 0x99, 0x72, 0xf0, 0x68, 0x87, 0x8f, 0xaf, 0x46, 0xdc, 0x08, 0xe8, - 0xf1, 0x93, 0xff, 0xd5, 0xf0, 0x71, 0xf7, 0x2e, 0xa6, 0x5e, 0x8d, 0x2d, 0xee, 0x19, 0xb7, 0x10, - 0x43, 0x5a, 0xb2, 0xb7, 0x5b, 0x2f, 0x01, 0x65, 0x52, 0x0d, 0x13, 0xed, 0x94, 0x1b, 0x1a, 0x0b, - 0x41, 0x9c, 0x22, 0xc6, 0x66, 0xcd, 0x6b, 0xf8, 0xb7, 0xb1, 0x5c, 0x93, 0xed, 0x20, 0x45, 0x5e, - 0x27, 0xff, 0xa1, 0x6c, 0xa3, 0x8d, 0xb5, 0xd6, 0x8e, 0xd5, 0xef, 0x83, 0xf8, 0x82, 0x6b, 0x91, - 0x3d, 0x41, 0x99, 0x8d, 0x67, 0xc6, 0xb6, 0x4e, 0xb7, 0xde, 0xf1, 0x6e, 0x94, 0xa6, 0xa5, 0x3a, - 0xc0, 0x85, 0xb9, 0x8e, 0xd8, 0x64, 0xcc, 0x09, 0x0f, 0x0e, 0x29, 0x01, 0xf7, 0x23, 0x61, 0x6a, - 0x6e, 0x78, 0xce, 0x64, 0x9a, 0x72, 0x97, 0x09, 0x77, 0xa0, 0x20, 0x30, 0x0d, 0x75, 0x33, 0xa7, - 0x10, 0x92, 0x40, 0x06, 0xcf, 0x84, 0x5d, 0x69, 0x3a, 0xa3, 0x7a, 0xdf, 0x4f, 0xde, 0xf9, 0x92, - 0xc4, 0x87, 0x6d, 0x89, 0x40, 0x94, 0xda, 0xd6, 0x57, 0xdf, 0x7d, 0x84, 0x0f, 0xff, 0xc8, 0x87, - 0x4c, 0x15, 0x72, 0x18, 0x50, 0x5f, 0xfc, 0x5a, 0xfd, 0xba, 0xc0, 0x4f, 0x34, 0xf9, 0x30, 0x4d, - 0x34, 0x9e, 0x24, 0x94, 0x9f, 0x6d, 0xfe, 0xdc, 0x30, 0xd3, 0x30, 0x01, 0x45, 0xf4, 0xcd, 0xe8, - 0xa9, 0x43, 0x4d, 0x30, 0x2d, 0xd6, 0x79, 0x57, 0x98, 0x68, 0xde, 0x27, 0x98, 0x58, 0x2c, 0x1c, - 0x22, 0x08, 0xc9, 0x8e, 0x26, 0x8c, 0x54, 0x17, 0xdd, 0x3c, 0x74, 0xd7, 0x1d, 0x68, 0x44, 0xec, - 0xc6, 0x89, 0x34, 0x01, 0x76, 0xe9, 0x97, 0x82, 0xc5, 0x0c, 0x65, 0x00, 0xa8, 0x55, 0x44, 0x8f, - 0x02, 0xfc, 0x27, 0xca, 0xb4, 0x8d, 0x43, 0xe0, 0x3c, 0x18, 0x55, 0x97, 0x55, 0xa5, 0xbb, 0x02, - 0x0a, 0x05, 0x03, 0x9b, 0x15, 0x25, 0xa7, 0x82, 0x51, 0x50, 0x52, 0x31, 0x61, 0xa8, 0x5b, 0x03, - 0x97, 0xfa, 0xde, 0x18, 0x86, 0x4a, 0xb7, 0x01, 0x86, 0xb0, 0x5c, 0x62, 0x58, 0x50, 0xe2, 0x4f, - 0xf2, 0x3f, 0x4c, 0x41, 0x10, 0x52, 0x0d, 0x75, 0x88, 0x10, 0xa8, 0x7e, 0x1d, 0x23, 0xdd, 0x30, - 0x88, 0x53, 0xbe, 0x80, 0xce, 0xba, 0xc4, 0x71, 0xc9, 0x62, 0x53, 0x5e, 0x23, 0xde, 0x15, 0xb4, - 0x49, 0x09, 0xfa, 0x75, 0xc8, 0x80, 0x50, 0x7d, 0x30, 0x2c, 0xea, 0x7f, 0x81, 0x06, 0x6d, 0xe1, - 0xc5, 0xb4, 0x46, 0xc0, 0x2e, 0x2d, 0xab, 0x8d, 0x6e, 0x28, 0x1e, 0xa8, 0x8e, 0xd8, 0x89, 0xaf, - 0xdf, 0xfc, 0x8b, 0x8c, 0xa8, 0x8f, 0x6c, 0x8b, 0xc4, 0x0e, 0xf3, 0xd3, 0x36, 0x03, 0xb0, 0x12, - 0x9c, 0x7b, 0xc8, 0x3d, 0x73, 0xbc, 0x4b, 0x17, 0x25, 0x72, 0x74, 0x80, 0xb5, 0x27, 0x11, 0x42, - 0x0c, 0xfc, 0x4a, 0xbe, 0x4a, 0x32, 0x41, 0x23, 0xf1, 0xf2, 0x10, 0xa9, 0xa0, 0xcd, 0x1c, 0x97, - 0x39, 0xd6, 0x66, 0xca, 0x81, 0xcc, 0x45, 0x66, 0x09, 0x65, 0xb4, 0x35, 0x37, 0xa6, 0xe4, 0xfb, - 0xb4, 0xa1, 0x11, 0x13, 0x00, 0xe1, 0x1d, 0xc0, 0x7d, 0xd1, 0x63, 0xa0, 0x46, 0x74, 0x15, 0xf2, - 0xbc, 0xa9, 0x48, 0xfe, 0xc4, 0xb5, 0xec, 0x01, 0x9e, 0x88, 0xf7, 0x8b, 0x7d, 0x62, 0x3a, 0x0d, - 0x3a, 0x14, 0xc0, 0xaf, 0x3c, 0xb4, 0xf4, 0xb6, 0x00, 0xe2, 0xff, 0x46, 0x0a, 0x44, 0x56, 0x48, - 0xf8, 0x54, 0x63, 0x5f, 0x41, 0xec, 0x58, 0xa6, 0x4c, 0x12, 0x5d, 0x92, 0x91, 0xca, 0x3b, 0xaa, - 0x64, 0x0a, 0x74, 0x89, 0x17, 0x58, 0xa1, 0x63, 0x32, 0x95, 0x1c, 0xa8, 0x98, 0x9c, 0x8e, 0x49, - 0xdd, 0x24, 0xb4, 0x08, 0x88, 0xf1, 0x2e, 0x44, 0xf5, 0x4d, 0x5e, 0x74, 0x25, 0x9d, 0xe3, 0x66, - 0x3c, 0x08, 0xb2, 0x71, 0x45, 0x12, 0x77, 0x8f, 0x42, 0x71, 0x49, 0x03, 0x4e, 0x23, 0xc5, 0xcd, - 0x28, 0x81, 0x22, 0xe7, 0xa3, 0xf8, 0x5d, 0x3c, 0x60, 0x3f, 0xb2, 0xbe, 0x73, 0xcd, 0xbf, 0x83, - 0x08, 0xea, 0x1d, 0xc2, 0x98, 0x3e, 0xa8, 0x35, 0x8e, 0x8e, 0x00, 0x49, 0x21, 0x32, 0x82, 0x93, - 0xc2, 0xcb, 0xb0, 0x91, 0xd0, 0x7b, 0x54, 0xf5, 0xb8, 0xbd, 0x9d, 0x58, 0xdf, 0x41, 0x45, 0xfd, - 0xbd, 0x5e, 0x33, 0xbf, 0xb1, 0x7f, 0xa7, 0xd3, 0xda, 0x3b, 0x9d, 0x66, 0xee, 0xde, 0xff, 0x7a, - 0x9f, 0x89, 0xd2, 0xfd, 0x7b, 0xfd, 0xa6, 0x9e, 0x3d, 0xff, 0x4e, 0xb7, 0x53, 0xcc, 0x4d, 0x08, - 0x66, 0xe0, 0xf7, 0x1f, 0xa0, 0x67, 0xf5, 0xf4, 0x0e, 0x66, 0xa5, 0xa9, 0x99, 0x81, 0x49, 0x13, - 0xc4, 0xff, 0xd8, 0xf8, 0xb4, 0xa1, 0x88, 0xd1, 0xbe, 0x87, 0x0e, 0x46, 0x7f, 0x03, 0x0b, 0xb8, - 0x7a, 0x21, 0x34, 0x6c, 0x36, 0xc8, 0xf6, 0xd5, 0x29, 0xd4, 0x14, 0x7a, 0x6b, 0xf8, 0x68, 0xbf, - 0x3a, 0x0d, 0x16, 0x71, 0x58, 0x35, 0x81, 0xe1, 0x40, 0x46, 0x7f, 0x59, 0x54, 0x00, 0x61, 0x81, - 0xc0, 0x69, 0xd1, 0x4f, 0xb0, 0x52, 0x81, 0x26, 0x82, 0x9e, 0x16, 0xb5, 0x4d, 0xed, 0xbb, 0xf2, - 0x63, 0xd3, 0x83, 0x3f, 0xd0, 0x75, 0xe4, 0xbb, 0x49, 0xa7, 0x4a, 0xae, 0xd0, 0xa5, 0x88, 0x0c, - 0x05, 0x7a, 0xb6, 0x7f, 0x45, 0x38, 0x08, 0x26, 0x24, 0x28, 0xf1, 0x73, 0x01, 0x0b, 0x1e, 0xbb, - 0x02, 0xde, 0x3b, 0xc5, 0x42, 0x1f, 0x80, 0xac, 0x0c, 0x4d, 0xcc, 0x5e, 0x8d, 0xa6, 0xe8, 0x07, - 0x1b, 0xc1, 0xa4, 0xfc, 0x8f, 0x2d, 0xfc, 0x83, 0x42, 0x49, 0xd4, 0x71, 0x8e, 0xb2, 0x92, 0x14, - 0x2b, 0x26, 0x6d, 0x10, 0x69, 0xfb, 0x7b, 0xee, 0xc7, 0x2c, 0xe0, 0xd9, 0x3f, 0x37, 0x28, 0x9b, - 0x7e, 0x35, 0x80, 0x13, 0xc7, 0xb4, 0x78, 0x3f, 0xea, 0x3a, 0x8c, 0x05, 0x74, 0x41, 0x13, 0x12, - 0x73, 0x06, 0xda, 0x55, 0x90, 0x99, 0xaf, 0x91, 0x53, 0x89, 0x67, 0x73, 0xf8, 0x0e, 0x58, 0xbc, - 0xcf, 0xdd, 0x53, 0x94, 0x2d, 0x72, 0x36, 0xc1, 0xe5, 0x32, 0x8b, 0x44, 0x85, 0x43, 0x69, 0xca, - 0xe4, 0x3d, 0x2a, 0xa0, 0x29, 0x3f, 0x98, 0x28, 0x09, 0xda, 0x90, 0x1b, 0x9f, 0x65, 0xb4, 0x00, - 0x28, 0xeb, 0x64, 0xf0, 0x5a, 0x7d, 0xfb, 0x52, 0xf2, 0xe9, 0x81, 0x0a, 0x39, 0x48, 0x18, 0x6c, - 0xa0, 0x0d, 0x32, 0xd0, 0xd4, 0x55, 0xcd, 0xa5, 0x23, 0x45, 0x44, 0x58, 0xea, 0xb8, 0x62, 0x00, - 0x1e, 0x25, 0x09, 0x97, 0x37, 0xdd, 0x04, 0x45, 0x01, 0xb7, 0x17, 0xb4, 0x50, 0x6d, 0x34, 0x90, - 0x14, 0x36, 0xa8, 0xa5, 0x1f, 0x73, 0x82, 0xcc, 0xb8, 0xa1, 0xc2, 0x9a, 0x05, 0x64, 0x63, 0x0f, - 0xdc, 0x5e, 0xea, 0xbb, 0x26, 0xab, 0xb2, 0x2f, 0xb9, 0xa3, 0x55, 0x9e, 0x26, 0x03, 0x13, 0xf0, - 0xd2, 0x09, 0x82, 0x16, 0x39, 0x19, 0xef, 0xd3, 0x80, 0x36, 0xb3, 0xc4, 0xcd, 0x9f, 0xa1, 0xdd, - 0xcf, 0xd6, 0xdb, 0x28, 0xb3, 0xc5, 0xcb, 0xe9, 0x81, 0xde, 0x85, 0xeb, 0xf1, 0xcf, 0x84, 0x9a, - 0xc9, 0x4d, 0x77, 0xc1, 0xa9, 0xf8, 0x64, 0xca, 0xd1, 0x66, 0x12, 0x56, 0x13, 0xd1, 0x05, 0xb6, - 0xc4, 0xc0, 0x37, 0xf7, 0x6b, 0x34, 0xa2, 0xc7, 0x57, 0xea, 0xa8, 0x5c, 0x58, 0x27, 0xfe, 0xb9, - 0xa8, 0xe5, 0xcc, 0x7c, 0xad, 0x45, 0x93, 0x66, 0x20, 0x6b, 0xc4, 0x9d, 0x7a, 0x83, 0x5b, 0x00, - 0x84, 0x8e, 0xe1, 0x70, 0x3d, 0x34, 0xf1, 0x43, 0xf4, 0x30, 0x75, 0x43, 0x03, 0x85, 0x00, 0xbe, - 0xa5, 0x73, 0x8a, 0x32, 0xf3, 0x83, 0x7a, 0xb4, 0x58, 0x14, 0x61, 0xd2, 0xc7, 0xa4, 0xfa, 0x63, - 0x95, 0xbb, 0x5a, 0x57, 0xf3, 0xeb, 0xe0, 0xaa, 0xa7, 0xd4, 0x1b, 0xaf, 0xbd, 0xb0, 0x4e, 0x0f, - 0xda, 0x63, 0xbd, 0xb1, 0x11, 0x01, 0x9d, 0x93, 0x0f, 0x35, 0xe0, 0xd7, 0x1d, 0x54, 0x1d, 0x40, - 0xc4, 0xb0, 0x4f, 0x5c, 0x1e, 0xd3, 0xe9, 0xd9, 0x02, 0xa1, 0xc8, 0x23, 0xdf, 0x37, 0x95, 0xad, - 0x14, 0x11, 0x6e, 0x88, 0x74, 0xf2, 0xe5, 0x8b, 0xc2, 0x7e, 0x53, 0x8b, 0x3d, 0x1d, 0xd0, 0x2e, - 0x8b, 0x52, 0x04, 0x9b, 0x0a, 0x40, 0x75, 0xc4, 0xe7, 0x72, 0x71, 0xfe, 0x39, 0xaf, 0x08, 0x3a, - 0x23, 0x24, 0xdf, 0x04, 0x8c, 0x75, 0x55, 0x23, 0xc2, 0x45, 0x60, 0x2f, 0xbe, 0xac, 0xa7, 0xc2, - 0x35, 0x0a, 0x99, 0x25, 0x65, 0x0b, 0x9c, 0x9c, 0xc1, 0x09, 0x6e, 0x32, 0x6a, 0xdc, 0xbc, 0x16, - 0x48, 0x26, 0x46, 0xc7, 0x22, 0x5b, 0x71, 0xbe, 0x7f, 0xa7, 0xc6, 0x66, 0xaa, 0x96, 0x41, 0x0a, - 0xa4, 0x8c, 0x23, 0x3c, 0x87, 0x13, 0x45, 0x90, 0x96, 0xc1, 0x90, 0xb8, 0x44, 0x39, 0x11, 0x53, - 0x18, 0xd0, 0x5a, 0x02, 0x15, 0xd7, 0x23, 0xbb, 0x14, 0x7e, 0x22, 0x4b, 0x69, 0x67, 0x28, 0x6f, - 0xf4, 0x42, 0x77, 0x57, 0x8d, 0x78, 0x7b, 0xc0, 0x74, 0x81, 0x97, 0x88, 0xb7, 0x2e, 0xfa, 0xf5, - 0x38, 0xbe, 0xf3, 0x2b, 0xcb, 0x05, 0x6f, 0x30, 0x94, 0xc4, 0x3b, 0x55, 0xcb, 0x74, 0xdc, 0x0c, - 0x0a, 0x67, 0xfd, 0x51, 0xf8, 0x15, 0x50, 0x37, 0xde, 0x8a, 0xbc, 0x65, 0x46, 0x55, 0xe2, 0x9d, - 0xba, 0x2c, 0x4b, 0x0f, 0xb2, 0xa4, 0xd0, 0x9b, 0xb5, 0x3f, 0x42, 0x6f, 0xa7, 0x3e, 0xae, 0x29, - 0xbf, 0x7e, 0xa1, 0xe8, 0x7f, 0x46, 0x1c, 0xe6, 0xc5, 0xfc, 0x2e, 0x9a, 0x5f, 0xb4, 0xcc, 0x00, - 0x96, 0xb0, 0xcc, 0x20, 0x53, 0x1f, 0xb4, 0x75, 0xeb, 0x5a, 0xa3, 0xa6, 0xd4, 0x48, 0xc6, 0xff, - 0xf7, 0x7f, 0xfd, 0x3f, 0x42, 0x44, 0xf9, 0x63, 0x43, 0xe2, 0xa3, 0x97, 0xe3, 0x7e, 0x00, 0xbf, - 0xa3, 0x69, 0x3d, 0x4d, 0xb5, 0xb3, 0x39, 0xad, 0xb0, 0xe1, 0xd6, 0xdc, 0x8c, 0x67, 0xed, 0xeb, - 0x63, 0xad, 0x9d, 0xca, 0x49, 0x8c, 0xe3, 0x31, 0x30, 0xed, 0x91, 0x23, 0x1b, 0x35, 0xf1, 0xdc, - 0xf2, 0x04, 0xbc, 0xc7, 0x94, 0xd4, 0xd8, 0x16, 0x37, 0xcc, 0x4d, 0x28, 0xb8, 0x65, 0xd4, 0x52, - 0x26, 0xfc, 0x3f, 0x5b, 0x83, 0x17, 0x29, 0xa8, 0x02, 0xbe, 0x29, 0x5b, 0x4a, 0x35, 0x27, 0x81, - 0xb8, 0x20, 0xd4, 0xc5, 0xaa, 0x49, 0xdc, 0xb8, 0x48, 0xde, 0x92, 0xf2, 0x17, 0xb1, 0x7f, 0x11, - 0x0b, 0x2a, 0x14, 0x04, 0x62, 0xc0, 0x4c, 0xfd, 0xba, 0xe8, 0x73, 0x45, 0xba, 0xc4, 0x42, 0x4f, - 0xc9, 0xc6, 0x29, 0x4e, 0x56, 0xef, 0x3b, 0x8c, 0xcd, 0x0f, 0xd0, 0x6a, 0xe2, 0x92, 0x11, 0xe4, - 0x91, 0x5c, 0x60, 0xa2, 0x5b, 0x6a, 0xba, 0xe6, 0x1b, 0x9e, 0x20, 0x2b, 0xd9, 0xcc, 0x43, 0x2e, - 0x5c, 0x8d, 0xa6, 0xd3, 0x16, 0xac, 0x9a, 0x78, 0x32, 0x18, 0xf4, 0xd4, 0x97, 0x81, 0x08, 0x8a, - 0x38, 0xe8, 0x54, 0x19, 0x62, 0x51, 0x77, 0xef, 0x75, 0xaf, 0x97, 0xc2, 0x73, 0xa5, 0x85, 0x0c, - 0xb1, 0x39, 0x42, 0xbe, 0x1b, 0xeb, 0x45, 0x27, 0xa8, 0xc7, 0x5c, 0x3a, 0xf0, 0x84, 0x01, 0xc1, - 0xf3, 0x6a, 0xd3, 0xf0, 0x73, 0x5c, 0x4f, 0x06, 0xcf, 0xc4, 0x6a, 0xa6, 0x65, 0x5a, 0x26, 0x49, - 0xc2, 0x07, 0xca, 0x52, 0x87, 0x30, 0xe9, 0xb1, 0xe4, 0x4c, 0x80, 0xc5, 0xd8, 0x9a, 0x05, 0x6a, - 0xe4, 0x37, 0x72, 0x25, 0x04, 0xb0, 0x80, 0x3f, 0xa6, 0xea, 0x0c, 0xff, 0xfa, 0x20, 0x8a, 0xdb, - 0x03, 0xdd, 0xc0, 0x1d, 0xd5, 0xcc, 0x50, 0x6f, 0x4b, 0xd1, 0x4f, 0x0d, 0xbd, 0x0b, 0xd2, 0x0c, - 0xf1, 0xa9, 0x47, 0xb9, 0x03, 0x33, 0x8d, 0xf4, 0x8e, 0x9e, 0x71, 0x49, 0x7a, 0x5a, 0xfc, 0x53, - 0x20, 0xde, 0x88, 0x24, 0xcd, 0x71, 0x5d, 0x5d, 0x16, 0x85, 0xf6, 0x76, 0x5f, 0x12, 0x63, 0xd5, - 0xdc, 0xda, 0x68, 0xd1, 0x04, 0x1d, 0x2c, 0x6a, 0xdd, 0xcc, 0x0c, 0x48, 0xba, 0x14, 0xcb, 0x8d, - 0xe1, 0x45, 0x04, 0x24, 0x12, 0x20, 0x19, 0xa8, 0xf0, 0x65, 0x9b, 0x55, 0xa7, 0x65, 0x6c, 0xd7, - 0x51, 0xfb, 0x5b, 0xd1, 0x8c, 0x97, 0x8d, 0xeb, 0xfa, 0x99, 0x28, 0xa7, 0xd8, 0xd7, 0x6c, 0x4e, - 0xc9, 0x17, 0x25, 0x8e, 0xac, 0x58, 0x0d, 0xc8, 0xfb, 0x23, 0xad, 0xec, 0xc1, 0xa4, 0xef, 0x23, - 0x51, 0x09, 0xcc, 0x71, 0x5d, 0x94, 0x8d, 0x18, 0x20, 0x75, 0x40, 0x23, 0xb0, 0x2c, 0x61, 0xff, - 0xb2, 0x81, 0x3d, 0x27, 0x74, 0xd9, 0xb1, 0xdd, 0x58, 0xae, 0xb3, 0xfa, 0x8e, 0x00, 0x02, 0x0a, - 0x1e, 0xbd, 0xc0, 0x5c, 0x7d, 0xb5, 0x15, 0xef, 0x8f, 0x6e, 0x68, 0xee, 0xc4, 0x05, 0xa6, 0x87, - 0xdf, 0x61, 0x06, 0x0f, 0x40, 0x9c, 0x45, 0xb4, 0xc1, 0xa3, 0x97, 0x46, 0xf0, 0x10, 0x8b, 0x1c, - 0x7d, 0x02, 0xcb, 0xfe, 0x8b, 0x66, 0xcc, 0xd2, 0x4c, 0x40, 0xab, 0x7f, 0xce, 0x21, 0x75, 0xcf, - 0x1c, 0xea, 0x8e, 0x65, 0xf6, 0x09, 0xe8, 0x5a, 0x06, 0x8f, 0xcd, 0x12, 0x5b, 0x2c, 0x3a, 0xed, - 0x39, 0x1a, 0x3c, 0x92, 0xa1, 0x31, 0x46, 0xba, 0x8d, 0xbe, 0xa1, 0x58, 0x18, 0x74, 0x6d, 0x42, - 0x03, 0x3f, 0xa9, 0x32, 0xfc, 0x32, 0x8c, 0xf2, 0x34, 0x22, 0x69, 0x10, 0xc1, 0x01, 0x75, 0xf9, - 0x30, 0xcb, 0x02, 0x8f, 0xdb, 0xd8, 0xe1, 0x76, 0x89, 0x88, 0x24, 0x81, 0x6b, 0xa8, 0x6f, 0x83, - 0x60, 0x25, 0x1b, 0x3a, 0x6e, 0x80, 0x74, 0x37, 0x3c, 0xdf, 0xc5, 0x8d, 0x9d, 0xae, 0xe7, 0x77, - 0x9b, 0x7d, 0xc6, 0xe1, 0x9f, 0xf3, 0xe4, 0x99, 0x07, 0x11, 0x68, 0xdc, 0x9a, 0xcf, 0xaa, 0x37, - 0xf8, 0x43, 0x04, 0xd1, 0x93, 0x03, 0xf4, 0xc0, 0xc0, 0x46, 0xe8, 0xfe, 0xa0, 0x6c, 0x98, 0xdf, - 0xd0, 0x61, 0x52, 0xeb, 0x52, 0x41, 0x9f, 0xf9, 0x3e, 0x98, 0xe8, 0xfb, 0xe0, 0x57, 0x93, 0x4e, - 0x93, 0x49, 0x6a, 0xd4, 0x48, 0xbe, 0xef, 0xe6, 0x0f, 0xd2, 0x9e, 0xca, 0x09, 0x50, 0x19, 0x98, - 0x1b, 0x1b, 0x2a, 0xee, 0xc6, 0x85, 0xad, 0x91, 0xa5, 0x90, 0x6b, 0x5c, 0x4d, 0x03, 0xb9, 0xa9, - 0x9b, 0x08, 0x01, 0x7e, 0x42, 0x40, 0x54, 0x89, 0xd4, 0x64, 0x51, 0x3b, 0x1c, 0xd4, 0x2d, 0xa6, - 0x55, 0xf4, 0x91, 0xf8, 0xf4, 0xc9, 0xfa, 0xf2, 0xc5, 0x4a, 0xde, 0x7f, 0x08, 0x44, 0x57, 0xd9, - 0x61, 0x12, 0x12, 0x5b, 0xce, 0x6d, 0x9c, 0xba, 0xe1, 0xf1, 0xfa, 0xa6, 0x2b, 0x12, 0x7b, 0xc9, - 0x02, 0x21, 0x03, 0x38, 0xa8, 0xf0, 0xc7, 0xd4, 0xc8, 0x58, 0xe6, 0x16, 0xee, 0x80, 0x89, 0x54, - 0x1e, 0x0f, 0x24, 0x03, 0x75, 0x06, 0x19, 0xa2, 0x52, 0x16, 0x00, 0x7c, 0x39, 0x72, 0x52, 0xf8, - 0x4d, 0x0a, 0xaf, 0xb9, 0x60, 0x22, 0xc7, 0xb2, 0xc8, 0x0b, 0xd4, 0x6a, 0xc3, 0x45, 0xc1, 0xa0, - 0x0d, 0x90, 0xb0, 0xb1, 0x4b, 0xc3, 0x2f, 0x40, 0x8b, 0xe8, 0x98, 0x4b, 0x5b, 0xfc, 0x9d, 0x48, - 0x18, 0x0b, 0xe2, 0xe2, 0x63, 0x7f, 0xa1, 0x55, 0xe8, 0x67, 0x96, 0x01, 0xf5, 0x5e, 0x54, 0x0c, - 0xd2, 0xb3, 0x40, 0x5c, 0x63, 0xd2, 0x51, 0x0b, 0xf0, 0x4e, 0xa3, 0x3e, 0xf9, 0xd1, 0xeb, 0xc9, - 0xbd, 0x52, 0xec, 0x92, 0x57, 0x3c, 0x4a, 0x86, 0x67, 0x85, 0x34, 0x01, 0x05, 0xd1, 0xb3, 0x2d, - 0x11, 0x37, 0x49, 0x74, 0x87, 0xda, 0x52, 0xc5, 0x59, 0xe4, 0xe8, 0x3d, 0x29, 0xd8, 0xb4, 0xc6, - 0x11, 0xc4, 0x43, 0x3d, 0x31, 0x3c, 0x40, 0x85, 0x3e, 0x12, 0xb0, 0x0b, 0x90, 0x61, 0x4b, 0x64, - 0x17, 0x49, 0x91, 0x71, 0xdb, 0x8c, 0x1c, 0x4a, 0x0c, 0x2e, 0xb4, 0x22, 0x61, 0xa8, 0x44, 0xff, - 0x30, 0xa0, 0x1f, 0x2b, 0xea, 0xa7, 0xdc, 0x7e, 0x07, 0xfe, 0x33, 0x1d, 0x65, 0xa9, 0xf7, 0x01, - 0xed, 0xc7, 0x6f, 0x30, 0x38, 0xd3, 0x79, 0x30, 0xfb, 0xfa, 0x3f, 0x82, 0xd2, 0x46, 0xa1, 0xa0, - 0x4b, 0x56, 0x5e, 0xf7, 0x0c, 0xd5, 0xad, 0x8f, 0x61, 0xfd, 0x03, 0xf8, 0x7d, 0x9c, 0x47, 0xef, - 0x63, 0x04, 0xbf, 0x8f, 0xff, 0x08, 0xf0, 0xee, 0xbf, 0x85, 0xde, 0xc7, 0x39, 0xf4, 0x46, 0xc0, - 0xec, 0xff, 0x23, 0x30, 0xe7, 0x35, 0x2c, 0xbc, 0xcb, 0x13, 0xd5, 0x04, 0xa8, 0x1c, 0x38, 0x19, - 0x2e, 0x55, 0xc0, 0x70, 0xb4, 0xee, 0x96, 0xe8, 0x9f, 0xe7, 0x22, 0xad, 0x20, 0x55, 0x6f, 0x85, - 0x5c, 0x68, 0x8e, 0x6d, 0x90, 0xe9, 0x9e, 0xd4, 0x7f, 0x1a, 0x13, 0x8d, 0xb1, 0xa4, 0xf7, 0xfa, - 0xee, 0x6a, 0x46, 0xb4, 0xf3, 0xc8, 0x2e, 0xf9, 0xce, 0x43, 0x4a, 0xac, 0xf7, 0xa4, 0xe2, 0x0f, - 0x60, 0x80, 0x4c, 0x64, 0x8a, 0x84, 0x25, 0x2a, 0x98, 0xf3, 0x16, 0x81, 0x87, 0xbc, 0x87, 0x0a, - 0x18, 0xfa, 0x34, 0x90, 0x35, 0x0c, 0x7e, 0x99, 0x9f, 0x4c, 0x4a, 0xda, 0x08, 0x63, 0x9f, 0x11, - 0x40, 0x37, 0x08, 0x93, 0x44, 0x60, 0xa1, 0xf4, 0x96, 0xcb, 0x34, 0x02, 0xfa, 0x0b, 0xd5, 0xd6, - 0x6a, 0x2a, 0xe0, 0xb1, 0x98, 0x43, 0xe7, 0x75, 0x0c, 0x60, 0x83, 0x3f, 0x85, 0x7c, 0x49, 0x9c, - 0x25, 0x69, 0x71, 0xec, 0xa6, 0xf7, 0x68, 0x28, 0x50, 0x40, 0xc9, 0xde, 0xd8, 0xe7, 0xc7, 0xd8, - 0x7d, 0x6c, 0xcb, 0xdc, 0x82, 0x7f, 0x55, 0x3f, 0x74, 0x0b, 0x2c, 0xf8, 0x28, 0xce, 0x09, 0x1f, - 0x51, 0x65, 0x59, 0x57, 0x17, 0x2b, 0xb3, 0x6a, 0x5c, 0x91, 0x0d, 0x78, 0xe2, 0x87, 0x75, 0x59, - 0x35, 0x51, 0x8f, 0x55, 0x13, 0x74, 0xd8, 0x3f, 0xa6, 0x71, 0xc7, 0x7a, 0x87, 0x0a, 0x69, 0x71, - 0xbc, 0xe8, 0x66, 0x04, 0x7c, 0x78, 0x9d, 0xa7, 0xb1, 0x48, 0x7c, 0x51, 0xdb, 0x1b, 0x7b, 0x42, - 0xb0, 0xe0, 0x70, 0x45, 0xbd, 0xc4, 0xd8, 0xa2, 0x61, 0x68, 0xd1, 0x42, 0x9e, 0x5f, 0x48, 0x18, - 0xa2, 0x91, 0xfc, 0x23, 0xb1, 0x53, 0x48, 0x9c, 0x52, 0x01, 0x47, 0x2b, 0x93, 0xc9, 0x88, 0x74, - 0xa1, 0xa1, 0xd2, 0x75, 0x80, 0x20, 0x10, 0x51, 0x48, 0x70, 0x1a, 0x8f, 0x81, 0xea, 0xf9, 0x3b, - 0x1b, 0x5e, 0x7b, 0x93, 0x2d, 0x1a, 0x0d, 0x14, 0xff, 0x85, 0x07, 0xdc, 0x21, 0x22, 0x4f, 0xa7, - 0x7b, 0xbb, 0x22, 0xdd, 0x75, 0x8e, 0xe5, 0xe4, 0xb1, 0x04, 0x70, 0x6e, 0x89, 0xf7, 0x78, 0x13, - 0x18, 0x29, 0x67, 0xd9, 0x58, 0xc1, 0x5c, 0x06, 0x7a, 0x5a, 0x1c, 0xc4, 0x1a, 0x3f, 0xd3, 0xc2, - 0xba, 0x71, 0xe9, 0xba, 0xe8, 0x74, 0xd0, 0x4b, 0x35, 0xfc, 0x4e, 0x76, 0xbd, 0xe7, 0xc0, 0x66, - 0xe8, 0x8e, 0x2e, 0xe7, 0xd8, 0xc7, 0xe8, 0xe8, 0xb8, 0x4b, 0x83, 0xe9, 0xfc, 0x31, 0x45, 0x9d, - 0x73, 0xab, 0x3f, 0xaa, 0xfa, 0xba, 0xb0, 0xb4, 0x9a, 0x9b, 0x45, 0x96, 0x6f, 0xa2, 0x16, 0xcd, - 0xe6, 0x84, 0x81, 0x53, 0xcd, 0x0c, 0xc5, 0x84, 0x20, 0x6a, 0x2c, 0x34, 0x4a, 0xa3, 0xc6, 0x32, - 0x12, 0x8b, 0xf6, 0xf1, 0x83, 0x20, 0x6b, 0xbf, 0x0d, 0x72, 0x2a, 0x8e, 0x72, 0x06, 0x76, 0x55, - 0x91, 0xe2, 0x9d, 0xb1, 0xec, 0x77, 0x72, 0xff, 0xf3, 0x7e, 0xfa, 0xbb, 0x95, 0xdc, 0xc5, 0x91, - 0xc8, 0xb8, 0x1c, 0x6f, 0x43, 0x64, 0xc3, 0xdc, 0x4e, 0x13, 0x35, 0x50, 0x4c, 0xb7, 0x90, 0x9c, - 0x17, 0xa3, 0xc5, 0x17, 0x68, 0x48, 0x58, 0xae, 0x39, 0xc6, 0x6f, 0x75, 0xe2, 0x88, 0xe2, 0x7a, - 0x6a, 0x75, 0x96, 0xf5, 0x65, 0x73, 0x9e, 0xb8, 0x58, 0x53, 0xcc, 0x41, 0x63, 0x93, 0x4e, 0x82, - 0x47, 0xdf, 0x2b, 0x03, 0x60, 0x9d, 0x43, 0x9b, 0x78, 0x48, 0x6e, 0xb1, 0xf4, 0x89, 0xfa, 0x51, - 0x94, 0xd2, 0x5f, 0x83, 0xfc, 0xa1, 0xbf, 0x86, 0x5f, 0xe3, 0x07, 0x46, 0xff, 0x6b, 0x5a, 0x4d, - 0x7f, 0x75, 0x1f, 0x97, 0x8e, 0xff, 0xd7, 0x74, 0xaa, 0xdf, 0x5b, 0xcd, 0x41, 0x5b, 0x41, 0x7f, - 0xbf, 0xa6, 0xd9, 0x08, 0x3e, 0x62, 0x62, 0x42, 0xa7, 0x49, 0xbd, 0x0b, 0x46, 0x90, 0x7d, 0xdb, - 0x0c, 0x21, 0xff, 0x20, 0x9c, 0xda, 0x47, 0xe0, 0x5c, 0x44, 0x6b, 0x8f, 0x55, 0xb4, 0x78, 0xf0, - 0x5d, 0x48, 0x51, 0xea, 0x7c, 0x7c, 0xbf, 0xc8, 0x3f, 0xec, 0xe0, 0x32, 0xf2, 0xfc, 0x9a, 0xee, - 0xfa, 0xa4, 0x09, 0x5a, 0x6a, 0x38, 0x86, 0x22, 0x5b, 0x09, 0xa2, 0x2c, 0xe8, 0x00, 0xe3, 0x63, - 0x80, 0x16, 0x19, 0x9d, 0xe5, 0x0d, 0xf4, 0x98, 0x8c, 0x27, 0xfe, 0x8f, 0x71, 0xa1, 0xf5, 0x69, - 0x75, 0xb5, 0x8e, 0x2e, 0xbb, 0xab, 0xab, 0xf0, 0xa6, 0xfd, 0x3b, 0xec, 0xad, 0xeb, 0xd8, 0x89, - 0xa3, 0x90, 0xe3, 0x35, 0x14, 0x6e, 0x5a, 0x40, 0xfe, 0xff, 0xad, 0xbc, 0xcc, 0xb5, 0x5b, 0x4b, - 0xa9, 0x24, 0x0e, 0x1f, 0xe4, 0xff, 0x97, 0xe0, 0x5b, 0xb4, 0x61, 0x34, 0xa7, 0x62, 0x06, 0xe5, - 0x63, 0xf2, 0x44, 0x10, 0x86, 0x3b, 0x08, 0x39, 0x47, 0xa5, 0xcd, 0xc4, 0xa0, 0xdc, 0x09, 0xa3, - 0x99, 0xf5, 0x0d, 0x5c, 0x51, 0xad, 0xaf, 0x27, 0x34, 0xed, 0x08, 0x8a, 0x80, 0xc4, 0x79, 0xe5, - 0x2f, 0x58, 0x08, 0x5b, 0x94, 0xe0, 0x96, 0x09, 0xf6, 0xa4, 0xb7, 0xac, 0x00, 0x89, 0x2e, 0x67, - 0x63, 0xf0, 0x94, 0xaa, 0x48, 0x05, 0x7e, 0x16, 0xcd, 0x83, 0x12, 0xee, 0x07, 0x44, 0x60, 0x56, - 0x91, 0x67, 0x43, 0x0d, 0xa0, 0x69, 0xcd, 0x78, 0x79, 0x98, 0xad, 0x3a, 0x88, 0xb2, 0x1b, 0x3b, - 0x85, 0x6e, 0x9a, 0x44, 0xf9, 0x02, 0x96, 0xc7, 0x04, 0x64, 0xfc, 0x6a, 0x64, 0x3c, 0x3b, 0x22, - 0x23, 0x57, 0x13, 0x74, 0x32, 0x0a, 0xcc, 0xc7, 0xc4, 0x66, 0x5e, 0x6e, 0x8e, 0x20, 0xb1, 0xad, - 0x05, 0x5a, 0xfe, 0xe2, 0x71, 0x66, 0x5d, 0x73, 0xa8, 0x10, 0x18, 0x5c, 0x1c, 0x62, 0x6b, 0xaa, - 0xc7, 0x22, 0x7f, 0xa0, 0x5b, 0x30, 0x17, 0xcb, 0xcf, 0xfe, 0x10, 0x39, 0x44, 0x6f, 0x4a, 0xf4, - 0x09, 0xe0, 0x83, 0xc0, 0xb4, 0x23, 0xc0, 0xec, 0x92, 0x8d, 0x39, 0x0e, 0x84, 0x36, 0xaf, 0x76, - 0xbc, 0x03, 0x82, 0x52, 0x58, 0x9b, 0x07, 0x21, 0x66, 0x3a, 0x48, 0x14, 0x6b, 0x61, 0x5c, 0x9c, - 0x59, 0xb0, 0xf5, 0x32, 0xf3, 0x2d, 0x41, 0x09, 0xbb, 0x2e, 0xbc, 0x35, 0x69, 0xb3, 0x46, 0xb7, - 0x01, 0xb6, 0x52, 0x7e, 0x01, 0x12, 0x99, 0x8e, 0x2f, 0xf0, 0x75, 0x3e, 0x54, 0xd1, 0x58, 0xef, - 0x0f, 0xfa, 0x02, 0x9d, 0xfa, 0x68, 0xc5, 0xf3, 0x03, 0x24, 0x62, 0xac, 0x18, 0x18, 0xf7, 0xb6, - 0x1f, 0xf7, 0xee, 0x2b, 0x1f, 0x69, 0x44, 0x91, 0xaa, 0xc1, 0x1b, 0xe8, 0xe1, 0xbc, 0x9b, 0x3b, - 0x1f, 0x8f, 0x24, 0x74, 0xc8, 0x56, 0x6b, 0xca, 0x86, 0xfa, 0xad, 0x86, 0xb8, 0xdb, 0x50, 0xd3, - 0x69, 0x29, 0x64, 0x1b, 0x6a, 0xe0, 0xf1, 0x4c, 0x8c, 0x37, 0xc4, 0xa7, 0x30, 0xb4, 0x06, 0xfd, - 0x94, 0x98, 0xc3, 0x3b, 0x92, 0x09, 0x5a, 0xc2, 0x98, 0x7b, 0x31, 0xb3, 0xc9, 0xf8, 0xce, 0xc5, - 0x7c, 0x29, 0xd0, 0x82, 0x7e, 0x4a, 0x19, 0x46, 0xd1, 0xbf, 0x7e, 0xf9, 0xc8, 0x30, 0xf0, 0xe8, - 0x4a, 0x90, 0x4e, 0x80, 0xf3, 0x6d, 0x79, 0xdf, 0xf2, 0xbe, 0x43, 0x0f, 0x8e, 0xbf, 0x98, 0x46, - 0x28, 0x93, 0x1b, 0x92, 0xe4, 0x4f, 0xc4, 0xf2, 0xf0, 0x89, 0xef, 0x7d, 0x7c, 0x35, 0x0c, 0x4c, - 0x80, 0x21, 0x54, 0x58, 0xe3, 0xcc, 0xf5, 0x9d, 0x32, 0x25, 0x58, 0x27, 0xd3, 0x8b, 0x72, 0x69, - 0x41, 0xae, 0x6f, 0xbe, 0xf8, 0xc8, 0x41, 0xe7, 0x2c, 0x80, 0x8e, 0x5e, 0x0e, 0x2e, 0x86, 0xc8, - 0xa2, 0xd1, 0x32, 0xe3, 0xf9, 0xfc, 0x1e, 0x6f, 0xe6, 0x62, 0xc7, 0x9f, 0xe7, 0x6d, 0xaa, 0x81, - 0x0f, 0x07, 0xf3, 0x28, 0x20, 0x3e, 0x1f, 0x32, 0xb1, 0xac, 0x6a, 0xbe, 0xeb, 0x43, 0x60, 0xff, - 0xf5, 0x60, 0x78, 0xbd, 0x6f, 0x9a, 0x6f, 0x29, 0xf5, 0x60, 0x84, 0xb5, 0xef, 0xde, 0x8f, 0xda, - 0x54, 0x6f, 0x57, 0xf1, 0x01, 0x77, 0x3a, 0x50, 0xfd, 0xa1, 0x2f, 0xb9, 0x1f, 0x33, 0xac, 0x83, - 0xf7, 0x3e, 0x20, 0xfb, 0x67, 0xe4, 0x90, 0x90, 0xa1, 0xe1, 0x99, 0x7f, 0xd5, 0xd1, 0x52, 0x1e, - 0x49, 0x94, 0xc8, 0x96, 0x12, 0xf3, 0xad, 0xc0, 0xfa, 0x14, 0x5a, 0x93, 0xd8, 0xc0, 0xb3, 0x29, - 0xe2, 0x2c, 0x04, 0xc2, 0x05, 0x20, 0xdc, 0x10, 0x08, 0x17, 0x80, 0xc0, 0x0d, 0x9a, 0xef, 0xee, - 0x0f, 0x5a, 0xbb, 0x6e, 0xb6, 0xb5, 0xf1, 0x45, 0x27, 0x25, 0x62, 0x68, 0x2f, 0x67, 0x88, 0xf6, - 0xd2, 0x6f, 0x0a, 0xb5, 0x3f, 0x9b, 0x35, 0x92, 0x4d, 0x6f, 0x03, 0xe8, 0xb5, 0x2e, 0x1e, 0x4b, - 0x40, 0xea, 0xd4, 0x5d, 0xb2, 0xf1, 0x78, 0xe8, 0xf5, 0x8d, 0x14, 0xc6, 0xd0, 0x97, 0x4d, 0x39, - 0xa8, 0x4d, 0x46, 0xfe, 0xfa, 0x20, 0xca, 0xa2, 0x28, 0x47, 0xcf, 0xdb, 0x50, 0x4f, 0x0f, 0xf4, - 0xca, 0xa2, 0x6e, 0x21, 0xcc, 0xff, 0xc2, 0xdc, 0xa2, 0xef, 0xdf, 0xcd, 0x1f, 0x19, 0x77, 0xd0, - 0x74, 0x3d, 0x0c, 0x94, 0x84, 0x8e, 0x2a, 0x74, 0x76, 0xfb, 0x11, 0xee, 0xf9, 0xc9, 0x9d, 0xe0, - 0x70, 0x10, 0x38, 0x13, 0xb1, 0x41, 0x21, 0xde, 0x47, 0xff, 0x87, 0x8c, 0x07, 0x33, 0x7a, 0xe0, - 0x88, 0x04, 0x36, 0xf8, 0x25, 0x43, 0xb3, 0x10, 0xd1, 0xcc, 0x3f, 0x4b, 0x94, 0xd9, 0x90, 0xc4, - 0x70, 0x7e, 0xe9, 0x7f, 0xfe, 0x19, 0x0f, 0x9b, 0x6f, 0x13, 0x2b, 0x29, 0x93, 0x1d, 0xff, 0x98, - 0x42, 0xed, 0x90, 0xf7, 0x12, 0x12, 0x77, 0x5c, 0x37, 0xc5, 0x2a, 0x93, 0x82, 0x9d, 0xed, 0x9f, - 0xbe, 0x9f, 0x87, 0x7f, 0x49, 0x45, 0x32, 0xea, 0x1d, 0xad, 0xed, 0xa8, 0x23, 0x56, 0x51, 0x8a, - 0x52, 0x8b, 0x96, 0x74, 0x5a, 0x46, 0xfc, 0xcc, 0x6a, 0x12, 0x32, 0xc4, 0xd9, 0x41, 0xda, 0xe0, - 0xfd, 0x6d, 0x04, 0x2d, 0xdc, 0xec, 0xd0, 0x6a, 0x5e, 0xb4, 0x78, 0x4a, 0xcc, 0x04, 0xf0, 0xd3, - 0x73, 0x66, 0x2c, 0x5a, 0x43, 0x2d, 0xda, 0x07, 0x2f, 0x88, 0x94, 0x01, 0x1d, 0xe1, 0xf7, 0x41, - 0x62, 0x5d, 0x25, 0x5e, 0x1e, 0x7c, 0x0c, 0xa9, 0xf0, 0x50, 0x40, 0x98, 0xf6, 0x5d, 0xfb, 0x81, - 0xfb, 0x97, 0x9f, 0x3c, 0xdf, 0x81, 0xd9, 0xbf, 0x15, 0x5c, 0x20, 0x0c, 0x61, 0x23, 0x57, 0x03, - 0x30, 0xe9, 0x78, 0xe1, 0xf6, 0x34, 0x10, 0x49, 0x0d, 0x9d, 0x70, 0x62, 0xd4, 0x8e, 0xe9, 0x12, - 0xfb, 0x8e, 0x7b, 0xf7, 0x20, 0x2d, 0x4a, 0xfe, 0xe9, 0x12, 0xe6, 0x89, 0x42, 0xbb, 0xac, 0x6c, - 0x68, 0xdf, 0xfc, 0xfa, 0x36, 0x34, 0xdc, 0x49, 0x21, 0x3b, 0xa6, 0x82, 0x51, 0xc3, 0xf3, 0x37, - 0x74, 0xf3, 0x44, 0xb6, 0x64, 0x5d, 0x76, 0x80, 0x35, 0x23, 0x60, 0xd1, 0x76, 0x0c, 0x49, 0x72, - 0x6a, 0xe8, 0x93, 0x92, 0x85, 0x16, 0xfe, 0xca, 0x29, 0x8a, 0x4c, 0xdd, 0x52, 0x64, 0x0b, 0x7e, - 0xf2, 0x3f, 0x64, 0x1d, 0x7e, 0x0a, 0x3f, 0x36, 0xc8, 0x7e, 0x3e, 0x14, 0x16, 0x1d, 0x3c, 0x06, - 0x25, 0xa9, 0x08, 0x0f, 0xdb, 0xc7, 0x25, 0x77, 0x1a, 0xc1, 0xfa, 0x64, 0x25, 0xa4, 0xe9, 0xf3, - 0x69, 0xa4, 0x2a, 0x36, 0x5c, 0xd8, 0xd0, 0x6a, 0x8e, 0xed, 0x36, 0xd3, 0xc3, 0x36, 0x2e, 0x5d, - 0x4b, 0x74, 0xa3, 0xed, 0x68, 0xe6, 0x06, 0xb7, 0xed, 0x43, 0xfc, 0xab, 0xfd, 0x61, 0x72, 0xb0, - 0xb9, 0xe4, 0x4f, 0x5d, 0x6c, 0x35, 0xf9, 0x53, 0x53, 0x9a, 0x7d, 0x02, 0xec, 0xd7, 0x1c, 0x5c, - 0x59, 0x6b, 0x5a, 0xd6, 0x47, 0x1b, 0x76, 0x1b, 0x0f, 0xd8, 0x10, 0x47, 0x1b, 0x16, 0xe9, 0x43, - 0xc5, 0x20, 0x1f, 0x16, 0xfe, 0xd1, 0x67, 0x12, 0x06, 0x15, 0x99, 0xfd, 0xf9, 0x53, 0x9a, 0xb1, - 0xa3, 0x0c, 0xdc, 0xbd, 0x4d, 0xc2, 0xc2, 0x8b, 0x9b, 0xf0, 0xb4, 0xea, 0xb3, 0xa5, 0x93, 0xb3, - 0x6b, 0x1b, 0x3f, 0xa3, 0x44, 0x35, 0x3f, 0x3b, 0xc9, 0x71, 0x09, 0xe0, 0x83, 0x06, 0x5a, 0xe2, - 0xd5, 0xc8, 0xb9, 0x89, 0xd8, 0x6c, 0xfc, 0x63, 0xaa, 0x00, 0x05, 0x6d, 0xe1, 0x84, 0xc4, 0x50, - 0x7c, 0xcc, 0x38, 0x40, 0x2e, 0x1f, 0x42, 0x49, 0x0b, 0x4f, 0x4d, 0xb0, 0x57, 0xcb, 0xf6, 0xf0, - 0x9d, 0xda, 0x01, 0x77, 0xa8, 0x98, 0xf5, 0xc7, 0xd4, 0x9c, 0x91, 0x40, 0x26, 0x52, 0x82, 0xf1, - 0x38, 0xf9, 0x42, 0x8d, 0x64, 0x0b, 0x6c, 0x82, 0xe5, 0x8f, 0x14, 0xe7, 0x74, 0x1a, 0x04, 0x04, - 0xd9, 0x0b, 0x3e, 0x6b, 0x33, 0x71, 0xde, 0x6a, 0x4c, 0x0a, 0x2c, 0x10, 0x7f, 0x17, 0x5d, 0xdd, - 0x31, 0x2f, 0x44, 0x87, 0xb7, 0x77, 0x90, 0x6f, 0x02, 0x9e, 0x19, 0xa1, 0xb9, 0x78, 0x69, 0x3a, - 0x10, 0x0e, 0x03, 0xb1, 0x1a, 0xe4, 0x02, 0x4e, 0x16, 0x0c, 0x86, 0xa7, 0x89, 0x9d, 0xc1, 0xb9, - 0xee, 0x8e, 0x74, 0xe6, 0xe6, 0xde, 0xc2, 0x53, 0xb0, 0x85, 0x7c, 0x95, 0x4d, 0xe8, 0xbd, 0xc6, - 0x65, 0x21, 0x2f, 0x6e, 0x90, 0xd4, 0x0a, 0x9f, 0x5a, 0xc9, 0x97, 0xcb, 0x22, 0x23, 0x12, 0x71, - 0x8b, 0x5b, 0xfb, 0x9b, 0x66, 0xe4, 0x34, 0x81, 0x88, 0x67, 0x69, 0xf1, 0x04, 0x39, 0xe1, 0xbe, - 0x5b, 0xb0, 0x82, 0xda, 0x55, 0xfa, 0x3c, 0xbf, 0x34, 0xd1, 0xa0, 0x89, 0x24, 0xbc, 0x13, 0x9d, - 0xfd, 0x40, 0x1f, 0x26, 0xfe, 0xc1, 0x23, 0xe4, 0x30, 0x23, 0x61, 0xf1, 0xc0, 0x1c, 0xd2, 0x94, - 0x3d, 0x7c, 0x7c, 0xb9, 0x89, 0xc9, 0x90, 0x7e, 0x79, 0xc6, 0x4a, 0x54, 0xff, 0x40, 0xba, 0x55, - 0x63, 0x5f, 0xbe, 0xab, 0x84, 0xb1, 0x59, 0xb4, 0xb8, 0x19, 0x7a, 0x56, 0xfc, 0x4c, 0x8a, 0x5e, - 0x18, 0x78, 0x21, 0x5a, 0xd0, 0xbb, 0x59, 0xe4, 0x7e, 0x16, 0x76, 0x60, 0x99, 0x9d, 0xe4, 0xf8, - 0xca, 0x7c, 0x4c, 0x59, 0xce, 0xaf, 0xd4, 0x19, 0x91, 0x62, 0xcc, 0x92, 0x38, 0x87, 0x44, 0xf9, - 0x27, 0x24, 0x93, 0xc1, 0xb1, 0xc8, 0xa1, 0x6b, 0xf8, 0x86, 0xce, 0x14, 0xfa, 0x26, 0x99, 0x11, - 0x16, 0xfa, 0x4c, 0x6c, 0x89, 0xe7, 0xd9, 0xba, 0x58, 0x25, 0xcf, 0x33, 0xd4, 0x10, 0x7e, 0x4a, - 0xb2, 0x91, 0x4e, 0xcf, 0x66, 0x80, 0x88, 0x76, 0xeb, 0x9b, 0xb2, 0xe5, 0xa6, 0x6b, 0x62, 0x24, - 0x52, 0x2a, 0xfa, 0xcd, 0x03, 0x83, 0x46, 0x7d, 0xb5, 0x9d, 0x11, 0xab, 0x50, 0x11, 0x1e, 0xa0, - 0xc6, 0x6c, 0xe7, 0x96, 0x60, 0xa1, 0x7f, 0x7f, 0x18, 0x36, 0x53, 0xe8, 0xe0, 0x94, 0xcf, 0xe0, - 0x01, 0x0c, 0xdc, 0xce, 0x09, 0x94, 0x5c, 0xce, 0x13, 0x60, 0x87, 0x3a, 0x30, 0x04, 0x65, 0xaa, - 0xe8, 0x0f, 0x40, 0xf0, 0x35, 0x23, 0x19, 0x4d, 0x62, 0x54, 0x8f, 0x6d, 0xfe, 0x9b, 0x91, 0x35, - 0xd2, 0x8d, 0x3a, 0xe7, 0xb2, 0xa0, 0x99, 0x1f, 0xf4, 0xca, 0xa5, 0x41, 0x47, 0x3f, 0xe2, 0x94, - 0x1b, 0x9c, 0x1f, 0x19, 0x18, 0x6d, 0x12, 0x93, 0x11, 0x1b, 0x13, 0xb0, 0x35, 0x01, 0x17, 0x5b, - 0x7a, 0x94, 0x2f, 0xd1, 0x5b, 0x37, 0x29, 0x6a, 0xb2, 0x1c, 0x25, 0x57, 0xdf, 0x39, 0x40, 0xd6, - 0xde, 0xf1, 0x54, 0x9e, 0x3b, 0x8b, 0x4a, 0x74, 0x15, 0xba, 0xd0, 0xa2, 0x37, 0x32, 0x86, 0x4f, - 0xa0, 0x73, 0x66, 0x23, 0x70, 0x67, 0x50, 0x11, 0xc3, 0xd8, 0xce, 0x47, 0xdd, 0x21, 0xd0, 0xf1, - 0x13, 0x67, 0xca, 0x97, 0x2f, 0x8b, 0x23, 0x60, 0x79, 0xc4, 0xb9, 0xc2, 0x3f, 0x39, 0x7a, 0x87, - 0x2c, 0x8c, 0xc4, 0x2c, 0xea, 0x8a, 0x92, 0x3f, 0xf1, 0xb4, 0x4c, 0x4f, 0x75, 0xeb, 0x9e, 0xe7, - 0xe8, 0x40, 0x91, 0xf0, 0x15, 0x94, 0x42, 0x51, 0x82, 0xc9, 0xab, 0xfa, 0x49, 0xc4, 0x41, 0x8c, - 0xea, 0x18, 0x55, 0x58, 0xf7, 0xfc, 0x83, 0x80, 0xbc, 0x27, 0x09, 0xf9, 0x98, 0x75, 0xa5, 0x0d, - 0xf3, 0x1b, 0x39, 0x7f, 0x06, 0xb3, 0x28, 0x2f, 0x31, 0x87, 0x87, 0x9f, 0xc9, 0x77, 0x62, 0xb3, - 0x10, 0x17, 0xcd, 0xae, 0x44, 0xe8, 0xe7, 0x4f, 0x3f, 0xa1, 0xb5, 0x5a, 0x64, 0x29, 0xd2, 0xcf, - 0x8d, 0x45, 0x71, 0x13, 0x8c, 0x19, 0x9d, 0xe0, 0x11, 0xb4, 0x2d, 0xc2, 0x60, 0x10, 0x12, 0x81, - 0xde, 0x77, 0x40, 0x11, 0xa7, 0xe2, 0x81, 0x3f, 0xde, 0x5d, 0x97, 0x29, 0x51, 0x5c, 0xdc, 0x20, - 0xee, 0x70, 0x31, 0x89, 0xfb, 0x93, 0xa1, 0x51, 0x73, 0xff, 0x6e, 0x93, 0x49, 0x27, 0x7d, 0xb9, - 0x0b, 0x19, 0xd8, 0x19, 0xd6, 0x18, 0xe1, 0xa0, 0xc6, 0x4b, 0xc9, 0x26, 0x54, 0xfb, 0x34, 0xd4, - 0x0c, 0xe7, 0xce, 0x6d, 0xc6, 0xbe, 0xb3, 0xee, 0xc8, 0x6e, 0x72, 0x8e, 0x50, 0x6b, 0x84, 0xe1, - 0x74, 0xe7, 0x2d, 0xb4, 0x4a, 0xd5, 0x93, 0xd8, 0xa6, 0xf9, 0xa2, 0x36, 0x1e, 0xb9, 0x2a, 0xfe, - 0xaa, 0xa5, 0x16, 0x35, 0x14, 0x66, 0x93, 0x92, 0x9b, 0xf1, 0xe9, 0x44, 0x64, 0x67, 0xdb, 0x24, - 0xe2, 0x27, 0x67, 0x82, 0xca, 0x69, 0xd4, 0xf0, 0xec, 0x27, 0xac, 0x29, 0xae, 0x58, 0xc5, 0xe3, - 0x9f, 0xc4, 0xd7, 0x4e, 0xcc, 0x91, 0xcd, 0x26, 0x68, 0x14, 0xe6, 0xd1, 0xa7, 0x1a, 0xdf, 0x56, - 0xd7, 0xb1, 0x7d, 0xc4, 0xa8, 0xc9, 0xd0, 0x90, 0x1c, 0x3e, 0xd4, 0xd6, 0x82, 0x8e, 0xd9, 0xad, - 0x20, 0xcf, 0x06, 0x30, 0x4e, 0x42, 0x29, 0x35, 0xe6, 0x3d, 0xa8, 0x53, 0xda, 0x6f, 0x69, 0x30, - 0x9d, 0xcd, 0x6c, 0x4a, 0x4d, 0x5b, 0x00, 0xff, 0x27, 0x1a, 0x01, 0x44, 0x47, 0xc1, 0x56, 0xdd, - 0xcc, 0xfd, 0xfa, 0x65, 0x6d, 0x2a, 0xf8, 0x6c, 0x00, 0x3b, 0x15, 0x52, 0x28, 0x6a, 0x09, 0x43, - 0xdd, 0xf1, 0x06, 0xaa, 0x21, 0xfd, 0xa4, 0xfa, 0x9b, 0xdf, 0x16, 0xe0, 0x20, 0x72, 0x0c, 0xd2, - 0x98, 0xc5, 0x09, 0x00, 0x7d, 0x50, 0xa9, 0x58, 0xb9, 0xa1, 0xf9, 0x07, 0xd8, 0xd1, 0x5b, 0x55, - 0xe4, 0x94, 0x37, 0xa2, 0x2f, 0x48, 0x89, 0xa7, 0x83, 0xfd, 0x6d, 0x77, 0x89, 0x2b, 0x8d, 0xee, - 0xf5, 0xbf, 0x5b, 0x1a, 0x46, 0x24, 0x12, 0x7d, 0x15, 0xcf, 0x07, 0x44, 0x4f, 0x91, 0x46, 0x3e, - 0xcf, 0x2c, 0x50, 0x97, 0x80, 0x31, 0x79, 0x71, 0x17, 0xfb, 0xb0, 0x4a, 0x39, 0xb5, 0xa8, 0xec, - 0xab, 0xd1, 0x84, 0x61, 0x5c, 0x5a, 0x78, 0x0e, 0x4d, 0x78, 0xf2, 0x61, 0x4a, 0xcf, 0x58, 0x91, - 0x65, 0xf5, 0xd2, 0x1a, 0x69, 0x8e, 0xef, 0xb7, 0x8f, 0x53, 0xb1, 0x86, 0xa1, 0x6e, 0xb7, 0xfc, - 0x83, 0xfa, 0x78, 0x70, 0x98, 0xcb, 0x7d, 0x6e, 0x44, 0xb2, 0x9a, 0x46, 0x7d, 0x51, 0xce, 0xc6, - 0xc4, 0x6c, 0x45, 0xf2, 0xfa, 0x51, 0x71, 0x23, 0x05, 0x70, 0x2e, 0xb3, 0x05, 0x8e, 0x19, 0xab, - 0x1a, 0x61, 0x3c, 0x5b, 0xd4, 0xa8, 0xe6, 0xd2, 0xf7, 0xc7, 0xa9, 0x79, 0xbb, 0x96, 0x7f, 0x07, - 0xb8, 0xa3, 0x03, 0xb7, 0x5e, 0xf4, 0x95, 0xde, 0x72, 0xb6, 0xf8, 0x7b, 0x78, 0x9b, 0xd6, 0xe2, - 0x3c, 0x3b, 0xb9, 0x65, 0x1f, 0xf3, 0xcb, 0x3e, 0x16, 0xf0, 0xa3, 0x1f, 0x59, 0x31, 0xb5, 0x20, - 0xd7, 0xf5, 0x92, 0x1a, 0x0e, 0x96, 0x7c, 0xdb, 0x26, 0x67, 0x1e, 0xc2, 0xb0, 0x89, 0x0b, 0xb2, - 0xdd, 0x8b, 0xbe, 0xd5, 0x8f, 0xde, 0x40, 0x1e, 0xb7, 0x62, 0xf9, 0x15, 0xc4, 0x6c, 0x58, 0xac, - 0x08, 0x5e, 0xd4, 0x9d, 0x50, 0x62, 0x67, 0xe7, 0x26, 0x96, 0x9f, 0x0b, 0x5d, 0xc8, 0x45, 0x8c, - 0xa3, 0x56, 0x01, 0x72, 0xad, 0x69, 0xbc, 0x16, 0x0d, 0x43, 0xe5, 0x25, 0x36, 0x4a, 0xa3, 0xef, - 0x26, 0x35, 0x4b, 0xf0, 0x08, 0x0b, 0x0b, 0xc9, 0x90, 0x58, 0xb6, 0xb7, 0xa8, 0x8f, 0x34, 0xb8, - 0xe5, 0xd2, 0xb2, 0xee, 0x3f, 0x28, 0x3b, 0x5c, 0x52, 0x36, 0xb1, 0xc0, 0xcb, 0xf2, 0xc6, 0x12, - 0x71, 0x4c, 0x4b, 0x82, 0xae, 0xba, 0xb4, 0xac, 0x86, 0x61, 0xfa, 0x12, 0x4b, 0xd2, 0xdb, 0xc7, - 0x17, 0x97, 0x23, 0x51, 0x8e, 0xe3, 0x25, 0x39, 0x6f, 0x7f, 0xf6, 0xd8, 0xa0, 0x97, 0x1d, 0xa6, - 0xe6, 0xd6, 0xe3, 0xb9, 0x79, 0xcc, 0x1f, 0x82, 0x0e, 0x4c, 0x43, 0x32, 0x0a, 0x74, 0x51, 0x93, - 0xcd, 0x4f, 0x1a, 0x1c, 0x85, 0xea, 0x8d, 0xbe, 0xc9, 0xea, 0xc7, 0xf7, 0x40, 0xa9, 0xe4, 0x02, - 0x5e, 0xcf, 0xc4, 0x1f, 0x94, 0x7b, 0x82, 0x4a, 0x13, 0x98, 0x9f, 0x15, 0xdf, 0x4a, 0xa2, 0xcd, - 0xd9, 0x82, 0x38, 0x36, 0xed, 0xa2, 0x73, 0xd0, 0x32, 0x46, 0x2e, 0xcf, 0xc1, 0x45, 0x4c, 0x49, - 0xdf, 0x39, 0x3d, 0x3b, 0x0e, 0x09, 0x45, 0xdb, 0xef, 0x95, 0x59, 0xc2, 0xb9, 0x17, 0x20, 0x14, - 0x19, 0x20, 0x8f, 0x4b, 0xdf, 0xc0, 0xf9, 0x1e, 0x2a, 0x3b, 0xe3, 0x24, 0x2c, 0xee, 0x8f, 0xff, - 0x2b, 0x91, 0x18, 0x9c, 0x23, 0xf8, 0x28, 0x5a, 0x7c, 0x70, 0x50, 0x82, 0x31, 0x97, 0x2c, 0x89, - 0xb8, 0x7d, 0x49, 0x28, 0xaf, 0xce, 0xa2, 0xb0, 0xec, 0x58, 0xa6, 0xe7, 0x58, 0x46, 0x2a, 0xac, - 0x88, 0x0b, 0x98, 0xfe, 0xa9, 0x46, 0xe3, 0xa5, 0x7f, 0xf9, 0xb2, 0x0a, 0xd2, 0x51, 0x64, 0x0d, - 0xfd, 0xf5, 0x8b, 0x86, 0x46, 0xff, 0x14, 0x4d, 0x4e, 0xc8, 0xc9, 0x47, 0x07, 0x60, 0xd3, 0xe5, - 0x1a, 0x0f, 0x64, 0x53, 0xd5, 0x9c, 0xce, 0x46, 0x72, 0x5d, 0x81, 0x3f, 0xa7, 0x82, 0x5b, 0xb9, - 0x6b, 0xfe, 0x01, 0x15, 0x85, 0x58, 0xfe, 0x2c, 0x07, 0x09, 0x85, 0x39, 0xa6, 0x81, 0x4a, 0x2a, - 0x72, 0x97, 0x76, 0x2b, 0x78, 0x65, 0x77, 0x95, 0x4f, 0x01, 0xb5, 0xe1, 0x4f, 0x49, 0x0c, 0x46, - 0xc3, 0xd0, 0xed, 0x2d, 0xf2, 0x17, 0xe3, 0x7f, 0xf8, 0xba, 0xfa, 0x26, 0x6e, 0xb3, 0x80, 0xde, - 0x2d, 0xe0, 0xd5, 0xca, 0x82, 0x98, 0x76, 0x19, 0x93, 0x37, 0xa2, 0x5e, 0xe5, 0x3f, 0xe9, 0x25, - 0x10, 0x24, 0x66, 0xbf, 0xa6, 0x93, 0xd3, 0xe6, 0x08, 0x05, 0x1e, 0xd4, 0xcf, 0x18, 0xfd, 0x19, - 0xb1, 0x19, 0xa1, 0xed, 0x84, 0xa9, 0xa5, 0x61, 0x14, 0xfe, 0x79, 0x76, 0x4d, 0xfb, 0x43, 0x3a, - 0xb3, 0x70, 0xbf, 0x03, 0x8f, 0xd0, 0x51, 0xe4, 0xa0, 0x35, 0x54, 0xc3, 0xa3, 0x6e, 0xa6, 0x7f, - 0x28, 0x3b, 0x38, 0x14, 0xb9, 0x41, 0x8d, 0x95, 0xd0, 0x35, 0xf2, 0x1d, 0x28, 0x50, 0x85, 0xb1, - 0x6c, 0x6b, 0x75, 0x12, 0x8d, 0xca, 0xac, 0x79, 0x09, 0xc9, 0x1b, 0xe3, 0x9a, 0xbb, 0x59, 0x5c, - 0x03, 0xe2, 0xfb, 0x56, 0xaa, 0x80, 0x32, 0xbb, 0x59, 0x2e, 0xe2, 0xf3, 0x7a, 0x0e, 0x9f, 0xd7, - 0xcb, 0xf8, 0x9c, 0xcb, 0x17, 0xf0, 0x05, 0x94, 0xb0, 0x2d, 0xb1, 0x06, 0xa0, 0x6d, 0x8a, 0xf2, - 0xa4, 0x66, 0x92, 0x42, 0x26, 0x29, 0x64, 0x92, 0x42, 0x26, 0x29, 0x64, 0x92, 0x42, 0x26, 0x2d, - 0x64, 0xf2, 0x85, 0x58, 0x60, 0x89, 0x54, 0x8a, 0x40, 0xe7, 0x07, 0xb1, 0xd8, 0x12, 0xbf, 0x89, - 0xd5, 0xb1, 0x94, 0x66, 0x5d, 0x8a, 0x59, 0x57, 0x88, 0xc5, 0x36, 0x9a, 0x77, 0x22, 0xa5, 0x69, - 0x3f, 0xe8, 0x61, 0x73, 0x45, 0x9e, 0x9a, 0x83, 0xbe, 0xe6, 0xe8, 0xad, 0xea, 0x27, 0x85, 0x57, - 0x81, 0xfb, 0xea, 0x8b, 0x76, 0xdf, 0x80, 0xe9, 0x3d, 0x72, 0x7f, 0xfd, 0x0a, 0xa2, 0xd1, 0x8e, - 0xdc, 0x6f, 0xca, 0xaf, 0x5f, 0xa9, 0xd4, 0xc8, 0x25, 0xe1, 0xfc, 0xee, 0xb5, 0x66, 0x03, 0xf0, - 0xad, 0x79, 0xa9, 0x14, 0x8b, 0x3e, 0xb8, 0x24, 0x16, 0xdc, 0x96, 0x38, 0x72, 0x41, 0x27, 0x80, - 0xbf, 0x68, 0x22, 0x20, 0x26, 0x03, 0x62, 0x41, 0xa0, 0x76, 0x83, 0x78, 0xa9, 0x9e, 0xe5, 0x7a, - 0xc4, 0x56, 0x91, 0x16, 0xb3, 0x58, 0x42, 0xca, 0x34, 0x75, 0x53, 0x75, 0x26, 0x37, 0xc4, 0xba, - 0x47, 0xe2, 0x98, 0x35, 0x07, 0x9d, 0x0e, 0xd0, 0xb8, 0x3c, 0x72, 0x33, 0x78, 0xde, 0xc1, 0x75, - 0x51, 0xc9, 0x44, 0xcd, 0x1e, 0xc7, 0x98, 0x85, 0x5c, 0x0e, 0x8c, 0x1f, 0x20, 0x2f, 0x13, 0x23, - 0xf3, 0x36, 0x29, 0x14, 0x68, 0x62, 0x7c, 0x64, 0x37, 0x52, 0x40, 0xa2, 0xf6, 0x72, 0x72, 0xaa, - 0x43, 0x9a, 0x46, 0x42, 0xfd, 0x70, 0xa7, 0x73, 0x25, 0x99, 0x7b, 0x21, 0x47, 0x95, 0xf9, 0xcb, - 0x0c, 0x82, 0xc8, 0x8a, 0x71, 0xeb, 0x84, 0x1f, 0xd7, 0xeb, 0xa3, 0x51, 0x9c, 0x8c, 0x60, 0xb6, - 0x79, 0x19, 0x7a, 0xbe, 0x61, 0x2b, 0x15, 0x9e, 0x51, 0x73, 0xa5, 0x88, 0xcc, 0x4a, 0xef, 0x7f, - 0xf8, 0xf2, 0x25, 0x72, 0xd0, 0xca, 0x95, 0xa4, 0x2a, 0x77, 0x3e, 0x82, 0xf2, 0x40, 0x54, 0xd0, - 0x21, 0xc3, 0x16, 0xfb, 0xad, 0x7a, 0x1b, 0x11, 0x26, 0xe2, 0xca, 0x26, 0x06, 0x35, 0x53, 0xdb, - 0x0d, 0xfc, 0x9a, 0x32, 0x41, 0x70, 0x9f, 0x51, 0x24, 0x93, 0x5b, 0x61, 0x08, 0x8a, 0x7f, 0x3b, - 0x1a, 0x95, 0xcc, 0x1d, 0xc0, 0xa3, 0xb4, 0x25, 0xe7, 0x4a, 0x68, 0xac, 0x19, 0xb1, 0xf0, 0x89, - 0xb4, 0x05, 0x8c, 0xc0, 0x45, 0x1a, 0x70, 0xb4, 0x57, 0xf7, 0x54, 0xeb, 0xaa, 0x46, 0x2d, 0x4a, - 0x97, 0x21, 0x5c, 0x7e, 0x70, 0x2c, 0x32, 0xa3, 0xd9, 0x64, 0xc6, 0x5d, 0x05, 0xbc, 0x1d, 0x43, - 0x83, 0xaa, 0xe4, 0xb8, 0x34, 0xce, 0x62, 0x38, 0x68, 0x78, 0x14, 0x80, 0x5c, 0x9e, 0xa1, 0x65, - 0x4c, 0x3c, 0x07, 0xc1, 0x6e, 0xba, 0x20, 0x6f, 0xed, 0x81, 0xc3, 0xee, 0xbb, 0x20, 0xaf, 0x1e, - 0xcd, 0xba, 0xaf, 0x62, 0xe0, 0x2f, 0x4c, 0xe8, 0xc0, 0x53, 0x78, 0xa9, 0x86, 0x96, 0x19, 0xb4, - 0x6d, 0x13, 0x96, 0x21, 0xb3, 0xed, 0x5f, 0x6b, 0x11, 0xe1, 0xd3, 0xb1, 0xcb, 0x2f, 0x40, 0x52, - 0x33, 0x80, 0xc9, 0xe2, 0x91, 0xa4, 0x2a, 0x3e, 0xe3, 0x0d, 0x15, 0x8c, 0x37, 0x93, 0x0b, 0x6d, - 0x28, 0xc4, 0x9e, 0x17, 0x80, 0xea, 0x39, 0xd9, 0x9c, 0x22, 0x27, 0x1c, 0x80, 0x61, 0x54, 0xa1, - 0xc8, 0x78, 0x8e, 0x85, 0x5d, 0xde, 0x11, 0xdc, 0xe7, 0x11, 0x5c, 0xe1, 0x11, 0xdb, 0x29, 0x4c, - 0x38, 0xed, 0xe2, 0xd1, 0xed, 0x53, 0x85, 0xe8, 0xe9, 0xf4, 0x90, 0x8b, 0x87, 0x3b, 0x68, 0x9c, - 0x1b, 0x38, 0x61, 0xe7, 0x1e, 0x34, 0x94, 0xa3, 0xf1, 0x61, 0x48, 0x0e, 0x58, 0xcf, 0xa4, 0xa9, - 0xf9, 0x8d, 0xf2, 0x7a, 0x0f, 0x99, 0x63, 0x9e, 0x19, 0x04, 0x22, 0x81, 0xab, 0x89, 0xc5, 0xa0, - 0xf5, 0x9d, 0xab, 0xf8, 0x07, 0x83, 0xf6, 0x57, 0xed, 0xd3, 0xa7, 0x54, 0xee, 0x8b, 0x11, 0x2a, - 0x0a, 0x24, 0xa5, 0xc2, 0x52, 0x00, 0x7e, 0xf2, 0x5e, 0x84, 0xf7, 0xc0, 0x6a, 0x84, 0x95, 0xb8, - 0xc4, 0x7a, 0x86, 0x76, 0x05, 0x50, 0xb0, 0x13, 0x1b, 0x53, 0xb9, 0x56, 0xe6, 0x1a, 0x89, 0xb5, - 0x11, 0x34, 0x81, 0x34, 0xa4, 0xfa, 0x0b, 0x02, 0x67, 0x91, 0x3c, 0xb7, 0x04, 0x1f, 0xeb, 0xcc, - 0x08, 0x49, 0xb8, 0x66, 0xa8, 0xbe, 0xb2, 0x43, 0x7c, 0x49, 0xfb, 0x45, 0xe1, 0xb6, 0x98, 0xc5, - 0xd0, 0xbd, 0x9a, 0xdb, 0xd0, 0x36, 0x71, 0x93, 0x6c, 0x75, 0x55, 0xb2, 0x22, 0x5b, 0x48, 0x35, - 0x15, 0x15, 0x13, 0x48, 0x22, 0xc1, 0x54, 0x23, 0x5b, 0x48, 0xe1, 0xa7, 0x5c, 0xec, 0x53, 0x33, - 0xfc, 0x94, 0xff, 0xc1, 0x29, 0x5c, 0xa9, 0x48, 0xae, 0x51, 0x98, 0x0b, 0x03, 0xab, 0xb2, 0x68, - 0xfd, 0x16, 0x89, 0x55, 0x84, 0x41, 0x64, 0xc3, 0x90, 0x8b, 0x78, 0x61, 0x8b, 0x6f, 0xa1, 0x81, - 0x32, 0x2d, 0x90, 0x3c, 0xc8, 0x0f, 0x80, 0x1c, 0x38, 0x27, 0x50, 0x41, 0x27, 0x20, 0x50, 0xf2, - 0x5d, 0x92, 0xe7, 0x35, 0xdb, 0xe0, 0xbb, 0x3b, 0x96, 0x93, 0xf5, 0xda, 0x20, 0x87, 0x1e, 0xc9, - 0x81, 0x5a, 0x6d, 0x58, 0x79, 0x6e, 0x0b, 0xff, 0x54, 0x15, 0x39, 0xa6, 0xda, 0x86, 0x39, 0xf2, - 0x98, 0x23, 0x1f, 0xcb, 0x51, 0xe0, 0x73, 0x14, 0x30, 0x47, 0x01, 0x72, 0x68, 0x19, 0x12, 0x5c, - 0x8d, 0x9c, 0x58, 0x66, 0xcf, 0x74, 0x19, 0xd0, 0x71, 0x17, 0xdb, 0xdf, 0x61, 0xf1, 0x3f, 0x90, - 0x1d, 0x95, 0x9c, 0x52, 0x85, 0x8f, 0xa1, 0x5d, 0xba, 0x8f, 0x7e, 0x15, 0x42, 0x27, 0x38, 0xb9, - 0xf7, 0x49, 0xdc, 0x68, 0x02, 0x47, 0x7a, 0xa1, 0xfb, 0x2f, 0xb9, 0x1c, 0xe6, 0xc6, 0xb3, 0xa9, - 0x9a, 0x69, 0x0d, 0xba, 0x3d, 0xc1, 0xb5, 0xd5, 0x16, 0xde, 0xb2, 0x24, 0xb8, 0x18, 0x04, 0x88, - 0x9e, 0x57, 0x8e, 0x15, 0xc9, 0x63, 0x11, 0x16, 0x0c, 0x0b, 0x5b, 0x60, 0x66, 0xfd, 0x48, 0x9e, - 0x02, 0xe6, 0x39, 0xd3, 0xe9, 0x1d, 0x4e, 0xba, 0x43, 0xe3, 0x74, 0x46, 0xb3, 0xac, 0x63, 0x96, - 0x3a, 0x07, 0x99, 0x40, 0xba, 0x21, 0x00, 0x55, 0x08, 0x56, 0x0b, 0xd8, 0x10, 0xee, 0x28, 0xcc, - 0x38, 0xca, 0x26, 0xab, 0x12, 0x39, 0x16, 0x48, 0x32, 0xc2, 0x82, 0x0c, 0x2f, 0x3a, 0x31, 0x84, - 0xb3, 0x0b, 0x7d, 0x12, 0xc4, 0x57, 0xbc, 0xd8, 0x47, 0x85, 0xe5, 0xd2, 0xe0, 0x6f, 0x00, 0x52, - 0x33, 0x9d, 0xb1, 0x1c, 0xdb, 0x41, 0x97, 0x93, 0x02, 0xd6, 0x2f, 0x14, 0x94, 0x79, 0x4e, 0x9e, - 0xfa, 0x90, 0xa3, 0x85, 0x26, 0xf9, 0x96, 0x78, 0xb6, 0x0f, 0xf5, 0x1f, 0x20, 0x78, 0x30, 0xdf, - 0x0b, 0x2d, 0xf0, 0xbd, 0x50, 0xe4, 0x1c, 0xb2, 0xa6, 0xb9, 0xf4, 0x9c, 0x44, 0xb6, 0x36, 0x31, - 0x36, 0xdd, 0xf7, 0x1f, 0x55, 0xe0, 0xdf, 0xb6, 0xa1, 0x03, 0x4a, 0x36, 0x30, 0x78, 0x1c, 0x46, - 0x3c, 0xf6, 0x03, 0x21, 0xff, 0xfa, 0x85, 0x99, 0x70, 0x43, 0x1a, 0xf3, 0xe1, 0xaf, 0x9f, 0x55, - 0x16, 0xd1, 0x12, 0xe9, 0xe7, 0xfb, 0x96, 0xf7, 0x73, 0xe6, 0x58, 0xce, 0x5c, 0x24, 0xa7, 0x1e, - 0xe6, 0x2c, 0xf8, 0x39, 0xf3, 0x2c, 0x67, 0x3e, 0x92, 0xd3, 0xa9, 0xe1, 0xd9, 0xc3, 0xea, 0x14, - 0x6f, 0xfe, 0xa1, 0x46, 0xcb, 0xbe, 0x6e, 0xa6, 0x4a, 0x32, 0x17, 0xa5, 0x8f, 0xa3, 0x73, 0x97, - 0x63, 0x37, 0xac, 0x01, 0x29, 0xb4, 0x11, 0xd2, 0x23, 0x8e, 0x2d, 0x7a, 0xa2, 0x11, 0xd1, 0x64, - 0xd7, 0xb8, 0xb2, 0x62, 0x1a, 0x16, 0xf9, 0x2e, 0x9f, 0x42, 0x02, 0xf6, 0x63, 0x32, 0x91, 0x80, - 0x30, 0x40, 0x1f, 0xac, 0x18, 0x20, 0x88, 0x56, 0xb6, 0xf2, 0xd5, 0x96, 0xf4, 0xeb, 0x57, 0xe8, - 0xe5, 0xf2, 0xe5, 0x8b, 0x28, 0x02, 0x8b, 0xf8, 0x6e, 0xfe, 0x20, 0x63, 0xc6, 0x7f, 0x20, 0xae, - 0x2f, 0x81, 0x0f, 0x4e, 0x4d, 0x94, 0x7c, 0x9b, 0xe3, 0xa0, 0x36, 0xf7, 0x49, 0xee, 0xb1, 0x2e, - 0xaa, 0x63, 0x18, 0xaa, 0xa0, 0xb7, 0xb8, 0x5b, 0x11, 0xd8, 0x78, 0x79, 0x57, 0x9a, 0x41, 0x3a, - 0x27, 0x61, 0x2c, 0x5f, 0x5c, 0xad, 0xb6, 0x52, 0x5e, 0x94, 0x27, 0x45, 0xf9, 0x4e, 0x0f, 0x50, - 0x89, 0xeb, 0x01, 0xb0, 0x1f, 0x78, 0x26, 0x76, 0xe8, 0xb9, 0x12, 0xf3, 0xbc, 0x28, 0x28, 0xa5, - 0x93, 0x52, 0xf1, 0x02, 0x3b, 0x20, 0xb0, 0x9a, 0xab, 0x00, 0x43, 0x2c, 0xfb, 0x77, 0xb1, 0xc5, - 0xbe, 0xa4, 0x45, 0x50, 0x6c, 0x31, 0x1d, 0xc1, 0xae, 0x71, 0xb0, 0xc3, 0xc4, 0x85, 0x2e, 0x0e, - 0xa4, 0x59, 0x04, 0x89, 0x9f, 0x18, 0x16, 0xb7, 0xba, 0x9c, 0x66, 0x84, 0x09, 0x55, 0x3e, 0x81, - 0x74, 0x57, 0x64, 0x57, 0xcc, 0xbb, 0xa4, 0x9b, 0xb4, 0x43, 0x62, 0xfc, 0xda, 0x79, 0x10, 0xae, - 0xe9, 0x45, 0xcf, 0x0c, 0x1c, 0xd9, 0x4e, 0xd0, 0x88, 0x89, 0x13, 0x3f, 0x0b, 0x8a, 0x60, 0xc7, - 0xd5, 0x5a, 0xf6, 0x11, 0xc9, 0xa7, 0xc3, 0x19, 0xda, 0xe3, 0x1b, 0x54, 0x51, 0x1a, 0x94, 0x32, - 0x3d, 0xe2, 0x81, 0x0f, 0xa4, 0x97, 0xae, 0xe5, 0x2b, 0x64, 0x73, 0x6c, 0x18, 0xf7, 0x9e, 0x49, - 0x89, 0x9f, 0xa9, 0x75, 0x40, 0xe0, 0xb5, 0xf6, 0x21, 0x60, 0x78, 0xe8, 0x4b, 0x8f, 0xe4, 0x1a, - 0xbf, 0x5a, 0x27, 0x2d, 0xe2, 0x6d, 0x1c, 0x64, 0x62, 0xf7, 0x71, 0x6f, 0xb9, 0x89, 0x7f, 0x8e, - 0xd8, 0xd9, 0xdd, 0xd0, 0xcf, 0x24, 0x61, 0xc9, 0x8d, 0x78, 0x9e, 0x60, 0xf9, 0x49, 0xb8, 0x30, - 0xa7, 0x35, 0x89, 0x6e, 0x18, 0xfb, 0x1c, 0x84, 0x12, 0x31, 0x59, 0x07, 0x91, 0x88, 0x27, 0x0b, - 0x9c, 0xed, 0xe4, 0x48, 0x89, 0x4f, 0x41, 0x11, 0xac, 0xfe, 0x85, 0x3c, 0x87, 0xdc, 0x26, 0x2f, - 0x6d, 0x4c, 0xb8, 0x81, 0x7b, 0x91, 0x5f, 0x68, 0x6e, 0xe8, 0x64, 0x3f, 0x5d, 0x6b, 0xa6, 0x5f, - 0xd2, 0x40, 0xf6, 0x69, 0x4c, 0xc1, 0x4e, 0x61, 0x1c, 0x4b, 0x3a, 0x0c, 0x93, 0xe8, 0x68, 0x6b, - 0x5b, 0xe2, 0xfe, 0x98, 0x8c, 0x31, 0x3c, 0x6d, 0x77, 0x71, 0x54, 0x5d, 0x71, 0xe3, 0x53, 0x4e, - 0x3e, 0x02, 0x3d, 0x32, 0x5c, 0xae, 0x35, 0x49, 0x3e, 0x4a, 0xa7, 0x59, 0x74, 0x8b, 0xad, 0x49, - 0xa2, 0x2b, 0x63, 0x75, 0x71, 0xbf, 0xf8, 0x46, 0x45, 0x20, 0x18, 0x0d, 0x4f, 0x29, 0x2f, 0x68, - 0x84, 0xf9, 0xaf, 0x01, 0x1e, 0x4f, 0xe7, 0x62, 0x5e, 0xf4, 0xc9, 0x48, 0xfd, 0x11, 0x18, 0xd3, - 0x30, 0xb0, 0xe9, 0x28, 0x34, 0xad, 0x89, 0x8c, 0x9d, 0xfc, 0xfa, 0xa5, 0x07, 0x51, 0x8a, 0x28, - 0xea, 0x75, 0xe0, 0xa7, 0x5f, 0xbe, 0xb0, 0x5d, 0x18, 0x0c, 0x44, 0x43, 0xc6, 0xe1, 0x8f, 0x05, - 0xa6, 0x4a, 0x0a, 0xf6, 0x6a, 0xd4, 0x06, 0xc8, 0x57, 0x89, 0x55, 0xcc, 0x71, 0x9e, 0x41, 0x6d, - 0x2e, 0xf9, 0x23, 0x5c, 0x87, 0x14, 0x8a, 0x71, 0x1d, 0xec, 0xe5, 0x78, 0x8e, 0xaa, 0x7f, 0x06, - 0x0e, 0x61, 0xef, 0x98, 0x0a, 0x7b, 0x81, 0x6d, 0x6b, 0x0c, 0xe4, 0x30, 0xe6, 0xcc, 0x5b, 0x8c, - 0xe7, 0x40, 0x19, 0xe4, 0x1c, 0xd8, 0x74, 0x8d, 0x6b, 0x3f, 0xe0, 0x1c, 0x11, 0xf4, 0x7d, 0x62, - 0xf8, 0xdb, 0x1a, 0x71, 0x23, 0x81, 0x09, 0xd5, 0x51, 0xc4, 0x11, 0x38, 0xe6, 0xb9, 0x0c, 0x03, - 0x1b, 0xbf, 0x83, 0xdb, 0xbf, 0x45, 0x26, 0x7a, 0xab, 0xb4, 0x40, 0xd6, 0x67, 0x81, 0xf5, 0xe3, - 0x2b, 0x25, 0xb2, 0xff, 0x8a, 0xaa, 0x89, 0xcc, 0x83, 0x7e, 0xcd, 0x5f, 0xe5, 0x3f, 0x92, 0xbd, - 0x7e, 0x93, 0xc9, 0xe6, 0x13, 0x47, 0x37, 0xa0, 0xf2, 0xf2, 0x03, 0x27, 0x7d, 0xaa, 0x71, 0xf2, - 0x0a, 0xba, 0x57, 0x05, 0xf8, 0x8d, 0xe6, 0x93, 0x12, 0x22, 0x1b, 0x84, 0x8e, 0x82, 0xf3, 0xbe, - 0x7f, 0xcc, 0xe5, 0x8f, 0x28, 0x50, 0x47, 0xdf, 0x0a, 0xf3, 0x26, 0x56, 0x9a, 0x83, 0xb8, 0xff, - 0xb0, 0x19, 0x72, 0xa3, 0x8d, 0xbd, 0x90, 0xfa, 0xfe, 0x12, 0x76, 0x80, 0x2c, 0x6b, 0xa8, 0x01, - 0x26, 0xf2, 0xdd, 0xaa, 0xb6, 0x90, 0x5f, 0xe3, 0x76, 0x25, 0xbd, 0xbd, 0x8c, 0xf4, 0x06, 0x37, - 0xda, 0xa2, 0x77, 0xb0, 0x39, 0x54, 0x4f, 0xe2, 0xd4, 0xe6, 0xdc, 0x06, 0xa7, 0x34, 0x87, 0x19, - 0xb9, 0x50, 0x85, 0xbf, 0xa7, 0xc4, 0x4f, 0x40, 0x89, 0xff, 0xa4, 0xfd, 0xfa, 0x15, 0x34, 0x21, - 0x4d, 0x39, 0x23, 0xc8, 0xaf, 0x5f, 0xbc, 0x7d, 0x64, 0x2e, 0x0a, 0xf2, 0x08, 0xe4, 0x89, 0x11, - 0x1a, 0x68, 0x2d, 0x17, 0xf7, 0xd1, 0x98, 0xd2, 0x2f, 0xc7, 0x23, 0xb2, 0xcd, 0xe4, 0x82, 0x56, - 0x90, 0x7c, 0xdf, 0x52, 0x9a, 0xa5, 0xf6, 0x9e, 0x9f, 0x89, 0xab, 0xa3, 0x17, 0x12, 0x6b, 0x01, - 0xed, 0x03, 0x13, 0x62, 0x20, 0xa8, 0xd5, 0x6a, 0x81, 0x7d, 0x2a, 0x73, 0x71, 0xb9, 0x77, 0x0e, - 0x42, 0x1f, 0x30, 0x54, 0xdb, 0x72, 0xf1, 0xac, 0x18, 0x3a, 0xa3, 0x90, 0xd0, 0x2e, 0xe8, 0x23, - 0x40, 0xee, 0xc3, 0x04, 0x4d, 0x1c, 0x20, 0xe6, 0x03, 0x22, 0xa3, 0x0d, 0x27, 0x63, 0x5a, 0xa3, - 0x94, 0x84, 0x71, 0x69, 0xfc, 0x90, 0x30, 0x81, 0x92, 0xbe, 0x41, 0x64, 0x1f, 0x98, 0xe1, 0x7a, - 0x1b, 0x16, 0x5f, 0xfa, 0x00, 0x52, 0x13, 0xf5, 0x14, 0xe1, 0xd4, 0x7a, 0xdf, 0x75, 0x29, 0xa0, - 0xbe, 0x9c, 0xf2, 0x97, 0xea, 0xef, 0x55, 0x5b, 0x9f, 0x40, 0xcb, 0x27, 0xce, 0xa0, 0x61, 0x81, - 0x9a, 0x25, 0xcd, 0x52, 0xcc, 0x36, 0x15, 0x86, 0x40, 0xd2, 0xb8, 0xf0, 0xa7, 0xc5, 0x02, 0x71, - 0xd8, 0x40, 0xa9, 0x79, 0x66, 0x6e, 0x8d, 0x5c, 0x62, 0x82, 0x48, 0xc1, 0x20, 0x7c, 0x9d, 0x8a, - 0x43, 0xb1, 0x8a, 0x21, 0xe2, 0x67, 0x5f, 0xa5, 0x2a, 0xf5, 0xd3, 0x71, 0x03, 0x17, 0x1c, 0x43, - 0xc6, 0x0b, 0x26, 0x34, 0xbc, 0x4a, 0x12, 0x23, 0x67, 0xa3, 0x13, 0xdb, 0x2a, 0x7a, 0x2f, 0x01, - 0x3e, 0xf0, 0x16, 0x03, 0x9d, 0xda, 0xde, 0x08, 0x56, 0x37, 0x04, 0xb4, 0x73, 0xa2, 0xd5, 0xe2, - 0xf6, 0x66, 0x7f, 0xb5, 0x22, 0xce, 0xe4, 0xa6, 0xd5, 0x9e, 0x54, 0x3d, 0xde, 0x81, 0xe7, 0x37, - 0xac, 0x63, 0xbf, 0x13, 0x80, 0xef, 0x23, 0x96, 0x34, 0x24, 0x93, 0xdf, 0x34, 0xa6, 0x75, 0x25, - 0xbc, 0x9e, 0x0c, 0xe6, 0x9e, 0x3b, 0x68, 0xb5, 0x34, 0x97, 0xde, 0x97, 0xa6, 0x13, 0x93, 0x19, - 0x67, 0x54, 0xa3, 0x49, 0x0b, 0xac, 0x69, 0xbe, 0xbd, 0x41, 0xe2, 0xed, 0x63, 0x1a, 0xb3, 0xa6, - 0xb1, 0xdf, 0xaa, 0xc6, 0xa2, 0x5c, 0x11, 0x26, 0x45, 0xe7, 0x2c, 0x8d, 0x5e, 0x85, 0x0b, 0x6b, - 0xc2, 0x5d, 0x03, 0x2c, 0xbe, 0x1c, 0x3f, 0x4d, 0x96, 0x10, 0xf1, 0xaf, 0x5f, 0xbe, 0x65, 0x16, - 0x6f, 0x21, 0xc8, 0x97, 0x10, 0x92, 0xd0, 0x52, 0x26, 0x55, 0x79, 0x15, 0x0f, 0xdb, 0x86, 0xb9, - 0xef, 0xda, 0xc0, 0xa0, 0x35, 0x91, 0x05, 0x22, 0x5c, 0xe6, 0x00, 0x15, 0xf7, 0xa3, 0x21, 0x1b, - 0xf2, 0xc1, 0x16, 0xcf, 0xd4, 0x32, 0xab, 0xf4, 0xee, 0x59, 0xfc, 0x3b, 0x23, 0x96, 0xb6, 0x2f, - 0x5f, 0x7c, 0x9c, 0x84, 0x4f, 0xcc, 0x22, 0x1f, 0x79, 0x05, 0x9e, 0x45, 0xcd, 0x08, 0xd4, 0x5e, - 0x8f, 0x51, 0x7f, 0x89, 0x41, 0x07, 0x83, 0x25, 0x52, 0xcb, 0x8e, 0x42, 0x1d, 0xd7, 0xe3, 0xa5, - 0xe4, 0x8e, 0xf3, 0x86, 0x37, 0x93, 0x92, 0x7e, 0x86, 0x4c, 0x6c, 0xce, 0xe5, 0xe7, 0xdc, 0x88, - 0x04, 0x86, 0x4f, 0x91, 0xcb, 0x71, 0xe1, 0x8f, 0xb4, 0xf5, 0x13, 0x51, 0x0e, 0x13, 0x97, 0xec, - 0xf4, 0x67, 0xf0, 0xbe, 0x64, 0x87, 0x05, 0x8a, 0x27, 0x61, 0x6d, 0x89, 0xc9, 0xe7, 0x8f, 0x29, - 0x31, 0xfa, 0x6d, 0x2a, 0x5b, 0x22, 0x2c, 0x61, 0x55, 0x72, 0x00, 0x7c, 0x46, 0x52, 0x31, 0x9a, - 0x15, 0x24, 0xe2, 0x66, 0x0a, 0x4c, 0x92, 0x8e, 0x07, 0xbf, 0xf4, 0xc3, 0xee, 0xc0, 0x99, 0xe1, - 0x21, 0x3a, 0xe2, 0x6b, 0xf5, 0xb3, 0x2a, 0xd2, 0x56, 0xda, 0x34, 0x14, 0x16, 0x06, 0x10, 0x42, - 0xdf, 0x3c, 0x1e, 0x66, 0x28, 0x53, 0x45, 0x14, 0x02, 0x50, 0xb3, 0xd9, 0x1c, 0xfc, 0xe8, 0xa3, - 0x10, 0xed, 0x41, 0x78, 0x75, 0xaf, 0xff, 0x24, 0x6d, 0x89, 0x17, 0xc4, 0x0b, 0x90, 0x80, 0xef, - 0xfa, 0xb7, 0x38, 0x9b, 0x9a, 0x37, 0xb2, 0x9c, 0x17, 0xda, 0x1d, 0x60, 0x57, 0x02, 0xe6, 0x27, - 0x17, 0x20, 0x63, 0xb0, 0x5e, 0x58, 0x44, 0x31, 0x90, 0xf7, 0x0d, 0x3e, 0xd3, 0x6e, 0x93, 0xf0, - 0xbd, 0xef, 0xd7, 0x23, 0x18, 0x96, 0xd9, 0x85, 0x4c, 0x58, 0x5b, 0x46, 0xf4, 0xaf, 0x50, 0x99, - 0xa2, 0xc5, 0xb3, 0x3a, 0x45, 0x7e, 0x53, 0xf5, 0xe1, 0x9a, 0xcd, 0x36, 0xb8, 0x68, 0x65, 0x64, - 0x90, 0x89, 0x5d, 0xd4, 0xc1, 0xd8, 0x65, 0x01, 0xf0, 0xef, 0x0c, 0x20, 0x06, 0x4b, 0x1b, 0xea, - 0x1a, 0x30, 0xdb, 0x29, 0xbd, 0xd1, 0x18, 0xff, 0xb2, 0xbd, 0x23, 0xf6, 0x69, 0x6e, 0xf3, 0x07, - 0xb3, 0x24, 0xef, 0xf7, 0x2f, 0x59, 0x33, 0x82, 0xda, 0x36, 0xe6, 0x2a, 0x77, 0x5a, 0xb4, 0x4a, - 0x0d, 0x86, 0xba, 0x09, 0xb3, 0xb4, 0x4a, 0x6f, 0x5a, 0x8f, 0xf8, 0x92, 0xc4, 0x1d, 0x54, 0x10, - 0x02, 0xce, 0x8b, 0x84, 0x80, 0x8d, 0x93, 0xf8, 0xbd, 0x89, 0x4c, 0xbe, 0x13, 0xb6, 0x0d, 0x3c, - 0xdb, 0x00, 0xa6, 0xdd, 0x51, 0x41, 0xc8, 0x02, 0xae, 0xcd, 0xae, 0x00, 0x89, 0xe3, 0x87, 0x30, - 0x20, 0xc4, 0x0d, 0xb1, 0xf7, 0xfb, 0x57, 0x7c, 0xf8, 0xc6, 0xff, 0x94, 0x7f, 0xfb, 0x33, 0xfd, - 0x95, 0x62, 0x17, 0xb4, 0xb2, 0xcb, 0xa8, 0xe0, 0x4b, 0xc2, 0x96, 0x20, 0x2d, 0xf2, 0xa1, 0xbd, - 0x3f, 0x1e, 0x13, 0x47, 0x31, 0x44, 0xd0, 0x4a, 0x42, 0x54, 0xcc, 0xcd, 0x50, 0xe6, 0x3c, 0xea, - 0x73, 0x56, 0xbe, 0x5b, 0x08, 0x3f, 0xbb, 0xb3, 0x9a, 0x3d, 0x48, 0xf4, 0x92, 0x18, 0xbf, 0x7f, - 0x34, 0xe8, 0x1e, 0x71, 0x28, 0x4d, 0xea, 0x00, 0xc9, 0xf6, 0xdb, 0x3d, 0x38, 0x67, 0xf5, 0xf1, - 0xbd, 0x60, 0x35, 0x25, 0x75, 0x03, 0x19, 0x2f, 0x1e, 0x0b, 0xf4, 0xf9, 0xa1, 0x22, 0x7b, 0x91, - 0xb8, 0x4f, 0xc4, 0xaf, 0xd3, 0xb7, 0x77, 0x24, 0x7a, 0xd6, 0x79, 0xab, 0xb9, 0xd0, 0x89, 0x4f, - 0xce, 0x29, 0x52, 0xfa, 0x23, 0xe7, 0xca, 0xb0, 0x94, 0xcb, 0x97, 0xaa, 0x2a, 0xd2, 0x86, 0xcb, - 0x1f, 0x1c, 0x23, 0x81, 0xa9, 0x63, 0xe7, 0x01, 0xdd, 0x96, 0x63, 0x19, 0x06, 0xd4, 0x64, 0xdd, - 0xe1, 0xac, 0x9a, 0x36, 0xb5, 0x9e, 0x3a, 0xd4, 0x2d, 0xa7, 0x1a, 0x5c, 0x55, 0x42, 0xe6, 0x0d, - 0xbc, 0x92, 0x2b, 0x5c, 0x66, 0xfe, 0x06, 0xf9, 0x07, 0xc2, 0x1a, 0x68, 0x55, 0x72, 0x75, 0x44, - 0x72, 0x10, 0x99, 0x20, 0x42, 0xcc, 0x66, 0x62, 0xc8, 0x8e, 0x77, 0x62, 0x74, 0xcc, 0x87, 0xe7, - 0xf0, 0x7e, 0x23, 0x3c, 0x47, 0x2c, 0x22, 0xc7, 0x39, 0x48, 0x0f, 0xec, 0xa4, 0xa3, 0x40, 0x4e, - 0x00, 0x24, 0x05, 0xe5, 0x08, 0xc3, 0x71, 0x84, 0x27, 0xbf, 0x49, 0xf8, 0x84, 0x11, 0xc6, 0xd3, - 0xa8, 0x89, 0x85, 0xca, 0x9f, 0xe2, 0x07, 0x83, 0x73, 0x2c, 0x28, 0xf6, 0x5f, 0x10, 0xa9, 0x23, - 0x1b, 0x9e, 0x51, 0xe7, 0x40, 0xfe, 0xd8, 0x69, 0x70, 0xef, 0xdd, 0x60, 0x1c, 0x94, 0x02, 0x56, - 0x73, 0x01, 0x0d, 0x44, 0x83, 0x71, 0x68, 0x8b, 0x8e, 0x86, 0x7b, 0x8b, 0x8f, 0x86, 0x7b, 0xd1, - 0xa3, 0xe1, 0xbf, 0x03, 0xed, 0x7b, 0x71, 0x38, 0x4c, 0x1e, 0x36, 0xf3, 0xdf, 0x82, 0xed, 0x77, - 0xce, 0xad, 0x43, 0x05, 0x1b, 0xdc, 0xe9, 0xd8, 0x8d, 0xa4, 0x23, 0xc3, 0xbd, 0xb9, 0x43, 0xec, - 0xde, 0xbb, 0x87, 0xd8, 0xb9, 0x71, 0xfe, 0x37, 0xc3, 0x62, 0xfc, 0x76, 0x34, 0x0c, 0xef, 0xef, - 0x44, 0xc3, 0x50, 0x16, 0x44, 0x88, 0xf0, 0x96, 0x44, 0x88, 0xf0, 0xfe, 0x46, 0x08, 0x0c, 0xef, - 0x03, 0x21, 0x30, 0xfa, 0xbd, 0x48, 0x8c, 0x0b, 0xfa, 0xfa, 0x8f, 0xa0, 0x43, 0x1c, 0x7e, 0x0d, - 0xa2, 0x51, 0x2c, 0x8a, 0x31, 0x10, 0xa1, 0x63, 0x12, 0x60, 0xe0, 0x8f, 0x69, 0x30, 0xa7, 0xb4, - 0x19, 0xf1, 0x92, 0xe6, 0xe2, 0xcd, 0x71, 0x45, 0x5b, 0xe2, 0xe6, 0x07, 0xae, 0x3b, 0xe0, 0x88, - 0x4e, 0xdc, 0xdc, 0x41, 0x37, 0x07, 0x83, 0xa3, 0xa2, 0xd8, 0x11, 0x74, 0x76, 0xb8, 0x68, 0x63, - 0xe1, 0xb9, 0x71, 0x83, 0xdf, 0x65, 0x0f, 0x2a, 0x9e, 0x2e, 0x39, 0x67, 0x1e, 0xe3, 0xff, 0x3e, - 0x88, 0x6e, 0x70, 0x40, 0xb3, 0x69, 0x39, 0xc0, 0x89, 0x57, 0xf1, 0x10, 0xc1, 0xc0, 0xad, 0xe6, - 0x8b, 0xf6, 0x38, 0xb8, 0x2d, 0x43, 0xc1, 0x69, 0xb2, 0x38, 0x5c, 0xd8, 0xd2, 0x38, 0x09, 0xe4, - 0x98, 0xf7, 0x5c, 0x98, 0x30, 0x34, 0xd2, 0xd0, 0xb0, 0x80, 0xbf, 0x15, 0x11, 0x6d, 0x79, 0xb8, - 0xad, 0x60, 0xd1, 0x7f, 0x2f, 0x0e, 0x40, 0xae, 0xa2, 0x92, 0x69, 0xcc, 0x16, 0x1c, 0x8a, 0x6d, - 0xfa, 0xf7, 0x2b, 0x31, 0xcd, 0xd8, 0xf4, 0x16, 0x81, 0xa9, 0x52, 0x9d, 0xda, 0x6e, 0x15, 0x37, - 0x7a, 0xdb, 0x03, 0xa7, 0xfa, 0x1d, 0xc4, 0x92, 0x1f, 0x72, 0xa8, 0xfb, 0x57, 0xbf, 0xaf, 0xe6, - 0x7e, 0x80, 0xa8, 0x8c, 0xe1, 0x11, 0xaa, 0x8a, 0xec, 0x54, 0x51, 0x53, 0x02, 0x59, 0x5b, 0x01, - 0x21, 0x3b, 0x22, 0x89, 0x5c, 0x42, 0x97, 0x8d, 0x94, 0x46, 0x36, 0xce, 0x82, 0xa3, 0xb8, 0xf1, - 0x10, 0xe3, 0xc1, 0x55, 0x69, 0xc9, 0x11, 0xc6, 0x65, 0xba, 0x47, 0xe4, 0x46, 0x82, 0x5f, 0xd2, - 0x7d, 0x7c, 0xf7, 0xbb, 0xf9, 0x83, 0xf8, 0x09, 0x6d, 0x05, 0x4f, 0xd5, 0xf0, 0xd2, 0x1e, 0x92, - 0x06, 0xf5, 0x7f, 0xc2, 0xc0, 0x66, 0xec, 0x7b, 0x78, 0xd5, 0x4e, 0x3c, 0x25, 0x63, 0xa3, 0xb2, - 0x4d, 0xc2, 0xce, 0x59, 0x36, 0xe9, 0x40, 0xe8, 0xfb, 0x47, 0x2b, 0x9a, 0x91, 0x99, 0x01, 0x2b, - 0x1c, 0xfd, 0xbe, 0x19, 0x1c, 0x6f, 0x14, 0x22, 0xa7, 0x74, 0x3b, 0xd0, 0x7e, 0xef, 0xd2, 0xd8, - 0x8b, 0x5e, 0x87, 0x24, 0x82, 0x58, 0xe0, 0xdb, 0xf7, 0xbd, 0x30, 0x02, 0xbe, 0x1b, 0x25, 0xd0, - 0x8e, 0xee, 0xb8, 0xc0, 0x4b, 0xc4, 0x4d, 0x3f, 0x44, 0xb8, 0xc0, 0x70, 0xc1, 0xc6, 0x88, 0xe1, - 0x82, 0x8e, 0x12, 0xb9, 0x27, 0x28, 0x82, 0x16, 0x37, 0x5d, 0xa3, 0x58, 0x07, 0x6e, 0xe0, 0x4c, - 0x40, 0x63, 0xc6, 0xf8, 0xec, 0xe9, 0x68, 0x13, 0x3d, 0xe7, 0xcd, 0x3f, 0x78, 0xfc, 0x55, 0xf6, - 0xf8, 0x63, 0x54, 0xcc, 0x39, 0xc2, 0x5b, 0x78, 0x4a, 0x88, 0xcc, 0x6c, 0x63, 0x15, 0x03, 0x6a, - 0x48, 0x1b, 0xe1, 0xbe, 0x22, 0x9e, 0x47, 0x20, 0xb6, 0xe0, 0xa4, 0x30, 0x05, 0xbc, 0x3d, 0x8a, - 0x84, 0x10, 0x4d, 0x91, 0xb0, 0xde, 0xd2, 0x92, 0xd0, 0xac, 0xa4, 0xfa, 0x20, 0x06, 0x2a, 0xb9, - 0x16, 0x46, 0x32, 0x03, 0x57, 0x81, 0x21, 0x31, 0x97, 0x86, 0xe7, 0x55, 0xf9, 0x0f, 0x12, 0xe8, - 0xc6, 0x26, 0xdb, 0xf8, 0x8a, 0x7c, 0xa8, 0xf2, 0x18, 0xfb, 0x1e, 0x7e, 0x22, 0x56, 0xcf, 0x1f, - 0xdc, 0xe9, 0x57, 0xff, 0x40, 0x09, 0x67, 0x65, 0x00, 0x56, 0x70, 0x69, 0x50, 0xbf, 0xbc, 0x08, - 0xde, 0x71, 0x47, 0xb4, 0xa5, 0x01, 0xc5, 0xe4, 0x64, 0x45, 0xc6, 0x03, 0x5d, 0xc1, 0x47, 0x98, - 0x32, 0xd1, 0xaf, 0x91, 0x4f, 0xdf, 0xbd, 0x1f, 0x7c, 0xe6, 0x70, 0x56, 0x2d, 0x2a, 0x13, 0xe6, - 0x20, 0x45, 0x23, 0x14, 0xc6, 0xb9, 0x58, 0x6a, 0x46, 0x22, 0x98, 0xe1, 0xee, 0x6f, 0x2a, 0x11, - 0x7c, 0xdc, 0x7e, 0x4e, 0x06, 0x3d, 0xfa, 0x25, 0x01, 0x4e, 0xcc, 0xf0, 0xff, 0x15, 0x77, 0xfd, - 0xcf, 0x6d, 0xdb, 0xc8, 0xfe, 0xf7, 0xf7, 0x57, 0xc8, 0x6c, 0x6b, 0x8b, 0x67, 0xda, 0xa6, 0xec, - 0xa4, 0x4d, 0x24, 0x53, 0x9e, 0x9c, 0xd3, 0x7b, 0xe7, 0xb9, 0x36, 0xcf, 0x53, 0xe7, 0x9a, 0xeb, - 0x78, 0x3c, 0x67, 0x49, 0x86, 0x2c, 0x4e, 0x68, 0x92, 0x15, 0xe9, 0xd8, 0x7e, 0xb2, 0xfe, 0xf7, - 0xb7, 0x5f, 0xf0, 0x95, 0x5f, 0x24, 0x39, 0xed, 0xdc, 0x9b, 0x89, 0x23, 0x09, 0x04, 0x81, 0x05, - 0xb0, 0x58, 0x2c, 0x16, 0x8b, 0xcf, 0x3a, 0xd4, 0xd8, 0x48, 0xda, 0x89, 0x38, 0x2f, 0xf8, 0x92, - 0xae, 0x4b, 0x10, 0x5e, 0xfe, 0xd7, 0xfd, 0x5d, 0xd4, 0xee, 0x46, 0xc1, 0x7b, 0xef, 0xef, 0xe7, - 0xea, 0xc5, 0xa2, 0x66, 0xb9, 0xec, 0x56, 0xfb, 0xd2, 0xb6, 0x85, 0xf6, 0xc2, 0xbf, 0x14, 0x7a, - 0x04, 0xed, 0x22, 0x3f, 0x6e, 0x56, 0xa2, 0xd3, 0xd3, 0x9b, 0x14, 0xfc, 0x8b, 0x15, 0xe6, 0x4e, - 0x95, 0x32, 0x40, 0x57, 0x19, 0xbe, 0x7f, 0x92, 0xa0, 0x1e, 0x3a, 0x2f, 0x6f, 0x2d, 0x18, 0x90, - 0xc0, 0x7e, 0x92, 0x3b, 0x8f, 0x4e, 0xba, 0x68, 0x50, 0x47, 0x99, 0x0a, 0xbb, 0x36, 0x1d, 0x77, - 0x0b, 0xdd, 0xb6, 0xac, 0x77, 0xb2, 0xde, 0x75, 0x0b, 0x20, 0x48, 0xdf, 0xbc, 0xee, 0xee, 0xcf, - 0x54, 0x65, 0xe6, 0x7e, 0x12, 0x95, 0xda, 0x98, 0x0b, 0x26, 0xdf, 0x8f, 0xe9, 0x8d, 0xc9, 0xb9, - 0xa6, 0x66, 0xb6, 0x6a, 0x54, 0x3c, 0x32, 0xcf, 0xdd, 0xcb, 0xb7, 0x52, 0xe2, 0xc9, 0x80, 0xc7, - 0xba, 0xaf, 0x99, 0xd4, 0x93, 0x6a, 0x02, 0x2c, 0xb9, 0x85, 0x85, 0x1c, 0x0c, 0x63, 0xc7, 0xba, - 0xbc, 0x5c, 0xab, 0xad, 0x48, 0x58, 0xbd, 0x10, 0x03, 0x61, 0x49, 0x51, 0xb6, 0x12, 0xfa, 0xe8, - 0x62, 0x76, 0x3f, 0x9d, 0x26, 0x82, 0x70, 0x20, 0x5b, 0x17, 0x6c, 0x33, 0x58, 0xf6, 0xa2, 0x8d, - 0x43, 0xcc, 0x91, 0x1b, 0x30, 0x66, 0x9c, 0xa1, 0xf5, 0xf9, 0x39, 0x45, 0x4f, 0xe4, 0x2a, 0x5a, - 0xd1, 0x66, 0x58, 0x45, 0xe6, 0x4a, 0xf5, 0x1a, 0xcc, 0x58, 0x82, 0x1f, 0x42, 0x19, 0x35, 0x8d, - 0xd3, 0xb8, 0x14, 0xc9, 0xd3, 0x46, 0x4d, 0xc8, 0x57, 0xb5, 0x21, 0x45, 0xf3, 0x21, 0xd0, 0xab, - 0x28, 0xff, 0x3a, 0xb2, 0xcd, 0xf0, 0x30, 0x67, 0xe8, 0xf1, 0x51, 0xd0, 0x0d, 0xb2, 0x22, 0xd7, - 0xd3, 0xd9, 0x53, 0xaf, 0x1a, 0xfd, 0x51, 0xb6, 0xb1, 0x51, 0x89, 0xae, 0xea, 0xcb, 0x76, 0x13, - 0x2d, 0xcd, 0xd8, 0x6a, 0x1e, 0x6a, 0xd2, 0xbd, 0xc3, 0x1f, 0x48, 0xb3, 0x0e, 0xe5, 0xfa, 0xcd, - 0x94, 0xa4, 0xfd, 0xde, 0x72, 0xd8, 0xc1, 0xb3, 0x13, 0xad, 0xcb, 0xba, 0x2a, 0x15, 0xf4, 0x37, - 0x30, 0xbe, 0x74, 0x7f, 0xea, 0x73, 0x38, 0xaf, 0x63, 0x3e, 0xa2, 0xb3, 0x32, 0xd1, 0x09, 0x22, - 0xae, 0xe4, 0x16, 0x31, 0x3c, 0x65, 0x5a, 0x3a, 0x9c, 0x5c, 0xf6, 0x81, 0x90, 0xc8, 0xe6, 0x1e, - 0xbc, 0xd4, 0xe5, 0xfc, 0x02, 0xc5, 0x09, 0xab, 0x73, 0xf5, 0x8e, 0xd0, 0x1b, 0x7e, 0x80, 0x6e, - 0xd3, 0xea, 0x46, 0x2d, 0x03, 0xe2, 0xa1, 0x41, 0x07, 0x16, 0x65, 0x36, 0x57, 0x7e, 0x5b, 0x56, - 0xe6, 0x6f, 0x17, 0x46, 0x01, 0x43, 0xc3, 0x39, 0x8e, 0x1f, 0xb7, 0xa7, 0x12, 0x50, 0xa3, 0x36, - 0x26, 0x1b, 0xe8, 0xf4, 0x25, 0xd4, 0x7a, 0x9e, 0x50, 0x23, 0x83, 0x8e, 0x52, 0x67, 0x37, 0x0a, - 0x64, 0xf2, 0x11, 0xde, 0xac, 0xa8, 0xff, 0xd7, 0x4b, 0x05, 0x96, 0x51, 0xac, 0x01, 0x27, 0xae, - 0xb2, 0xaa, 0x03, 0x64, 0x70, 0xc6, 0xd1, 0x06, 0x3a, 0x63, 0x42, 0x93, 0x48, 0x45, 0x51, 0xd0, - 0xbe, 0x42, 0xc3, 0xea, 0xae, 0x98, 0x37, 0x14, 0xa9, 0x72, 0x4c, 0xd3, 0x46, 0xce, 0x8b, 0x3f, - 0x7d, 0x32, 0xaf, 0x24, 0xfd, 0x02, 0x3d, 0xef, 0x94, 0x11, 0x68, 0x8c, 0xc7, 0x42, 0x2f, 0xa3, - 0xbd, 0xf8, 0x7f, 0xa4, 0xfd, 0x94, 0x2b, 0x35, 0x68, 0x5d, 0x59, 0xca, 0x72, 0xea, 0x05, 0xd4, - 0x13, 0x55, 0x2f, 0xa6, 0xfa, 0xba, 0x82, 0x00, 0xa3, 0x4f, 0x65, 0xee, 0x46, 0x39, 0x99, 0x66, - 0xed, 0xdf, 0x56, 0xf4, 0xa9, 0xa2, 0x06, 0x2d, 0x0d, 0x6d, 0xfc, 0x49, 0xdc, 0x40, 0xb6, 0xfe, - 0x76, 0x3a, 0x2e, 0xf2, 0x41, 0xdb, 0xc4, 0xb7, 0x88, 0x4e, 0xee, 0x72, 0x20, 0xc9, 0x9d, 0x90, - 0x95, 0x09, 0x7b, 0x3d, 0xd0, 0xe1, 0x38, 0xf8, 0x2e, 0xac, 0x43, 0x10, 0x9d, 0xd0, 0x17, 0x4d, - 0xdb, 0x8d, 0x72, 0x89, 0xf6, 0x2b, 0x74, 0x25, 0xd0, 0x61, 0x32, 0x13, 0xa2, 0x4e, 0xa2, 0x98, - 0xd8, 0x80, 0xd7, 0x14, 0xf3, 0xd5, 0xaa, 0xb1, 0xa0, 0xa8, 0x81, 0xce, 0x3c, 0x57, 0xf8, 0x1a, - 0xd7, 0x9b, 0x81, 0x0e, 0x77, 0x08, 0x1c, 0x42, 0x9c, 0x70, 0xfc, 0x5f, 0x03, 0xa4, 0x4a, 0xad, - 0x2e, 0x1f, 0x5f, 0x02, 0x43, 0x0c, 0x6d, 0x38, 0x51, 0x11, 0x8b, 0x36, 0xc2, 0x22, 0xae, 0x08, - 0x22, 0x13, 0xe5, 0xab, 0x43, 0x23, 0xde, 0x5f, 0x61, 0x93, 0x2d, 0x1c, 0xdc, 0x64, 0x43, 0x8f, - 0x45, 0x8e, 0x0e, 0x51, 0x6a, 0xb7, 0xe8, 0xf7, 0xa4, 0xa9, 0x41, 0x07, 0xc3, 0x26, 0xd9, 0x38, - 0xf3, 0x86, 0xdd, 0x44, 0xe0, 0x5c, 0x15, 0x74, 0x6a, 0x09, 0xc3, 0x8b, 0x47, 0x50, 0x16, 0x99, - 0x2c, 0xd7, 0x7c, 0xe7, 0xe5, 0x6f, 0x31, 0x32, 0xb6, 0xec, 0x52, 0x5a, 0x24, 0x77, 0xd4, 0x22, - 0x89, 0xab, 0xe2, 0x8e, 0xd2, 0x1d, 0xbe, 0x7e, 0x06, 0x42, 0x05, 0x27, 0xde, 0x05, 0x8c, 0x56, - 0x27, 0xd7, 0xbb, 0x46, 0x50, 0x70, 0x31, 0x42, 0x36, 0x8e, 0x80, 0xf7, 0x3f, 0x3a, 0x0a, 0xe6, - 0x43, 0x5c, 0xce, 0x38, 0xa8, 0x25, 0xd4, 0xfa, 0x4f, 0x90, 0xb9, 0xd2, 0xf5, 0x5f, 0xa6, 0x2d, - 0x9d, 0x69, 0xbb, 0x1a, 0x07, 0x92, 0x3a, 0x6f, 0x52, 0x54, 0x54, 0x0d, 0xf8, 0x79, 0x5a, 0x18, - 0x65, 0x03, 0x5b, 0xfd, 0xfc, 0x5c, 0x36, 0xa1, 0x3a, 0x7e, 0x05, 0xac, 0x63, 0xd3, 0x90, 0xe4, - 0xd9, 0xa1, 0x1d, 0xcc, 0xeb, 0x50, 0x41, 0xda, 0xbc, 0x3b, 0x3f, 0xeb, 0x4c, 0x38, 0x08, 0xac, - 0x0e, 0xcd, 0xd9, 0x31, 0x21, 0x3c, 0xe5, 0xdb, 0xa3, 0x3c, 0x26, 0x8e, 0xd6, 0x05, 0x40, 0x82, - 0x13, 0xd6, 0xb3, 0xad, 0xd2, 0x9e, 0x5d, 0x69, 0x4f, 0x8e, 0x42, 0xb1, 0x6c, 0x5d, 0x52, 0x49, - 0xc0, 0x97, 0x19, 0xc6, 0x30, 0x6e, 0x51, 0x75, 0xcc, 0x3a, 0x74, 0x53, 0xd5, 0x7b, 0xb4, 0xa6, - 0x63, 0x22, 0x2d, 0x5b, 0xfa, 0x0e, 0xc6, 0x42, 0x46, 0x7d, 0xa7, 0xa7, 0xf5, 0x1d, 0x1c, 0x74, - 0xd1, 0xaf, 0xc7, 0x7b, 0x5e, 0x0e, 0x5b, 0xa8, 0xc3, 0x61, 0x5f, 0xbf, 0xe6, 0xa3, 0x7b, 0xf8, - 0x39, 0x2f, 0xf9, 0xca, 0x1c, 0xbd, 0xd2, 0xd6, 0xa4, 0x4c, 0xc6, 0xd8, 0x76, 0x1b, 0x77, 0x92, - 0x09, 0xdc, 0x69, 0xaf, 0x91, 0xba, 0x62, 0x67, 0x57, 0xec, 0xee, 0xdc, 0x88, 0xc4, 0x05, 0xbc, - 0x3c, 0xef, 0x52, 0xfa, 0xc6, 0x78, 0x97, 0x0c, 0x9a, 0xb9, 0xd3, 0xdf, 0xd9, 0xd4, 0x4e, 0x79, - 0xee, 0x1a, 0x2a, 0x77, 0x96, 0x16, 0xe5, 0x8d, 0xac, 0x80, 0xf1, 0xa6, 0x65, 0x93, 0xbc, 0x71, - 0xce, 0x41, 0x08, 0x26, 0xd6, 0x70, 0xe2, 0x73, 0x03, 0xd9, 0xaa, 0xda, 0xee, 0x0a, 0x15, 0xe0, - 0x0a, 0x6c, 0x96, 0x0a, 0xf7, 0x8a, 0x65, 0x5c, 0x57, 0xb6, 0x54, 0xd2, 0xcc, 0xc9, 0x9e, 0xa5, - 0x6c, 0x4f, 0x62, 0x53, 0xe7, 0xa0, 0xc9, 0x1d, 0x0b, 0xa6, 0xf3, 0xd3, 0x38, 0x2b, 0x39, 0xc8, - 0x92, 0xeb, 0xc4, 0xc5, 0x08, 0x0f, 0x81, 0xb0, 0xaf, 0x39, 0x36, 0x44, 0x64, 0x33, 0x07, 0x64, - 0x52, 0x8f, 0xec, 0x86, 0xbe, 0x0a, 0x7f, 0x87, 0xbe, 0x10, 0x9b, 0x9e, 0xdb, 0x4d, 0x44, 0x4a, - 0xde, 0x08, 0xf2, 0x70, 0x34, 0x2f, 0xfe, 0xc6, 0x6e, 0x30, 0xcd, 0x34, 0xc3, 0xb6, 0xae, 0xb6, - 0x99, 0xd4, 0xb6, 0xac, 0xb2, 0x11, 0xe0, 0x0b, 0x84, 0x36, 0x3e, 0xf7, 0xea, 0x21, 0x53, 0x2c, - 0x43, 0x17, 0x32, 0xb8, 0xb6, 0x7e, 0x1f, 0x6b, 0x08, 0x65, 0x7d, 0x0e, 0xf6, 0x26, 0xfc, 0x0e, - 0x16, 0x92, 0x2c, 0x41, 0xa1, 0x13, 0x1d, 0x2a, 0xc4, 0xac, 0x16, 0xe5, 0xdf, 0xd5, 0xf4, 0xd1, - 0xca, 0xa1, 0xe7, 0x44, 0x20, 0x03, 0xbe, 0x68, 0xad, 0xdf, 0xfb, 0xb6, 0x6a, 0xfb, 0xd0, 0xc8, - 0x63, 0x68, 0x79, 0x92, 0xab, 0xbd, 0x3a, 0x3d, 0x31, 0x0a, 0xbb, 0xaf, 0xf1, 0xb8, 0x78, 0x25, - 0x97, 0x06, 0xfc, 0x1b, 0x4d, 0xf8, 0x7a, 0x6d, 0x3d, 0xd9, 0x83, 0xf1, 0xb6, 0xd8, 0x9b, 0xcd, - 0x58, 0x9b, 0x4f, 0x5f, 0x65, 0x2a, 0xae, 0x9d, 0xf8, 0xa8, 0xf3, 0x1e, 0xbb, 0x1f, 0x0d, 0x39, - 0xef, 0xef, 0xe7, 0xe4, 0x9f, 0xd5, 0x42, 0xed, 0x47, 0x6d, 0x61, 0x69, 0xc9, 0xf0, 0x0d, 0x10, - 0xb7, 0xdb, 0x5b, 0x6e, 0x54, 0x99, 0x1a, 0xbe, 0x57, 0x30, 0x7c, 0x2b, 0xcf, 0x61, 0x5c, 0x79, - 0xea, 0x28, 0x21, 0x8a, 0x5e, 0x16, 0xa6, 0xdf, 0xbf, 0x7e, 0x7d, 0xb4, 0xcf, 0xf2, 0x34, 0xdc, - 0x3f, 0x84, 0x65, 0x51, 0xe4, 0xf0, 0xa5, 0x67, 0x6f, 0x36, 0xc9, 0x3c, 0x55, 0x1b, 0x71, 0xad, - 0x64, 0x54, 0xcd, 0x53, 0x07, 0x3d, 0x0c, 0x61, 0x58, 0x34, 0xb7, 0xf6, 0xcf, 0x68, 0x80, 0xe9, - 0x51, 0xd5, 0x04, 0xdd, 0x80, 0xb0, 0xb9, 0x01, 0x1f, 0x37, 0xa3, 0xdf, 0x31, 0x86, 0xad, 0x6c, - 0xc6, 0x0a, 0x1e, 0xac, 0x4b, 0xf0, 0x97, 0xf0, 0x60, 0x0d, 0xb6, 0x58, 0x1d, 0x58, 0x54, 0x98, - 0x43, 0x1f, 0x6d, 0xd5, 0xb0, 0xe9, 0x78, 0x4a, 0x49, 0xe9, 0x89, 0x81, 0x21, 0xd1, 0x5c, 0x6d, - 0xb9, 0x9f, 0x61, 0xf0, 0xf3, 0x54, 0xc0, 0xf6, 0x65, 0x54, 0x76, 0x40, 0xb5, 0x03, 0xd5, 0xe9, - 0x50, 0x07, 0x41, 0x87, 0xf5, 0x1a, 0x5f, 0xc7, 0x08, 0xe3, 0x52, 0xaf, 0xda, 0xf2, 0xb4, 0x45, - 0x34, 0x74, 0x3a, 0x28, 0xbc, 0x3a, 0x0e, 0x8d, 0x25, 0xb1, 0xfa, 0x2c, 0x2a, 0xe7, 0xfe, 0xe0, - 0x2b, 0x44, 0xf7, 0x0a, 0x11, 0xed, 0x0d, 0x6b, 0x5e, 0x0b, 0x46, 0x66, 0xab, 0x03, 0xbd, 0x5e, - 0x18, 0x5a, 0xf2, 0x9b, 0xdc, 0xe7, 0xec, 0x13, 0x9f, 0x6b, 0xdb, 0x78, 0x4b, 0xd0, 0x65, 0xff, - 0x19, 0xb1, 0x6e, 0x2f, 0xb4, 0x8b, 0xb6, 0xf7, 0x19, 0xc0, 0x40, 0xbd, 0xbc, 0xae, 0xf7, 0x74, - 0xee, 0xfa, 0xaa, 0xa7, 0x08, 0x69, 0x58, 0xf8, 0xda, 0xb4, 0x82, 0xa2, 0x72, 0xb4, 0xa6, 0x94, - 0x02, 0x65, 0xe4, 0x9a, 0x82, 0xae, 0x5f, 0xf6, 0x13, 0x31, 0x2d, 0x07, 0x9b, 0x4a, 0x51, 0x65, - 0x9e, 0x51, 0x7c, 0xbc, 0x61, 0xc5, 0x49, 0x63, 0xcd, 0x64, 0xe0, 0xd8, 0xbc, 0x6a, 0xc9, 0xbc, - 0x26, 0xb8, 0xbc, 0xe5, 0xf4, 0x44, 0xfa, 0xba, 0xa8, 0x22, 0x2e, 0x49, 0xcd, 0xde, 0x98, 0xa6, - 0x07, 0xe6, 0x49, 0x83, 0x19, 0xb8, 0x6c, 0x02, 0x4c, 0x91, 0xb9, 0x0f, 0x9b, 0x72, 0xf3, 0xb5, - 0x0f, 0xf9, 0x92, 0x43, 0x0d, 0x05, 0xf3, 0x11, 0x2a, 0x14, 0x1f, 0x96, 0x23, 0x8e, 0x81, 0x8d, - 0x4f, 0x14, 0xac, 0x55, 0x79, 0xdd, 0xa7, 0x82, 0xf7, 0x30, 0x34, 0x2c, 0xe8, 0xee, 0x75, 0x30, - 0x28, 0x8d, 0x80, 0x46, 0xa8, 0x67, 0x41, 0x33, 0x16, 0xa7, 0x4c, 0xc6, 0x20, 0x12, 0x88, 0x60, - 0x37, 0xba, 0xa5, 0x35, 0xc0, 0xbd, 0x07, 0xa8, 0x4e, 0x6b, 0x75, 0xef, 0xd0, 0xad, 0xb7, 0xcb, - 0xab, 0x65, 0x05, 0x4b, 0x98, 0xa1, 0xc4, 0x09, 0x48, 0x98, 0x7d, 0xf8, 0x11, 0x14, 0x15, 0xbd, - 0x44, 0x0b, 0xbc, 0x80, 0x88, 0xee, 0xf2, 0xdc, 0x87, 0xe4, 0x7f, 0x61, 0xdc, 0xdd, 0xca, 0x5a, - 0x65, 0x3f, 0x3e, 0x62, 0x5d, 0x6d, 0x20, 0xe1, 0x83, 0x3f, 0x42, 0x44, 0x01, 0x1b, 0x31, 0xa8, - 0xbf, 0x54, 0xf7, 0xa5, 0x23, 0x11, 0xac, 0xa6, 0x65, 0x15, 0x25, 0xae, 0xc3, 0x28, 0x5d, 0x05, - 0x44, 0x30, 0x67, 0xaa, 0xc8, 0x81, 0x3b, 0xb3, 0xe1, 0xcf, 0x1d, 0x6f, 0x52, 0x89, 0x9e, 0xef, - 0xf2, 0x9d, 0x1e, 0x61, 0xe5, 0x44, 0x56, 0xac, 0x85, 0xa0, 0x4b, 0xd7, 0x41, 0xd0, 0xe1, 0xd9, - 0x43, 0xb8, 0x15, 0xa5, 0xea, 0xc0, 0xd8, 0xce, 0x05, 0x2c, 0x61, 0x1d, 0xcb, 0x8c, 0x9c, 0x67, - 0x77, 0xb1, 0xf5, 0x28, 0x8b, 0x5a, 0x5b, 0x15, 0xc4, 0xce, 0xb3, 0xfc, 0x61, 0xee, 0x20, 0xd4, - 0x98, 0xc0, 0x88, 0x18, 0xc4, 0xd0, 0xdc, 0x9c, 0xa4, 0xee, 0x4a, 0xfb, 0x65, 0xc0, 0xb1, 0x74, - 0x60, 0x8c, 0xf0, 0x40, 0xa3, 0xe6, 0x1d, 0x53, 0x20, 0x3a, 0x7b, 0x0a, 0xdd, 0xfd, 0xa5, 0x9f, - 0x04, 0x77, 0x71, 0x7f, 0x14, 0xa0, 0x73, 0x73, 0x30, 0x9e, 0xc7, 0xfd, 0xc6, 0x76, 0x13, 0x4a, - 0xbd, 0x86, 0xe7, 0x83, 0xd1, 0xc8, 0x96, 0xcb, 0x41, 0x05, 0xe0, 0xcf, 0x42, 0xb2, 0x9b, 0x6c, - 0x80, 0x64, 0x77, 0xb3, 0x1e, 0xc9, 0x2e, 0xc8, 0x9b, 0xf3, 0x64, 0x53, 0x33, 0x0c, 0x7c, 0xbb, - 0x05, 0x4a, 0x8e, 0x26, 0xea, 0xce, 0x63, 0x3e, 0x89, 0x6e, 0xe4, 0xf7, 0x6c, 0x1a, 0xe5, 0x4b, - 0xfe, 0x0a, 0x9c, 0x41, 0xd7, 0x1c, 0x38, 0xf8, 0x96, 0x70, 0xfd, 0x71, 0xe7, 0xf6, 0xb1, 0xac, - 0x74, 0x6c, 0xfa, 0xcf, 0xf0, 0x50, 0x65, 0x64, 0xc8, 0x9e, 0x93, 0x3e, 0x3f, 0x6f, 0xd5, 0xd2, - 0xd3, 0xe3, 0xa8, 0xf0, 0x6f, 0xd4, 0x14, 0x62, 0xe8, 0x66, 0x66, 0xbd, 0xaf, 0x18, 0x79, 0x1e, - 0xbd, 0xb8, 0xf8, 0x79, 0x25, 0xf2, 0xa0, 0x0d, 0x97, 0x98, 0xad, 0x85, 0x4a, 0x1c, 0x24, 0xdc, - 0xfd, 0x14, 0x25, 0x27, 0x1a, 0x05, 0xea, 0x67, 0x96, 0xff, 0x16, 0xd5, 0xc8, 0x18, 0x21, 0x19, - 0xd9, 0xb2, 0x9d, 0x85, 0xe2, 0x0d, 0x58, 0x68, 0xbe, 0x01, 0x0b, 0x4d, 0xd6, 0xb3, 0x50, 0xa2, - 0x59, 0x28, 0x56, 0x44, 0x03, 0x0b, 0xcd, 0xe5, 0x77, 0x60, 0xa1, 0xc9, 0xd2, 0xe6, 0x95, 0xc4, - 0xe6, 0x15, 0x3d, 0x20, 0x0b, 0x13, 0x68, 0xe1, 0xa4, 0x49, 0x0b, 0x04, 0x95, 0x6f, 0x86, 0xa6, - 0x9a, 0x3b, 0x58, 0x25, 0x62, 0x50, 0x95, 0x8d, 0x55, 0x1b, 0x9e, 0xc8, 0x23, 0x59, 0x58, 0xbb, - 0xb6, 0xf0, 0xb4, 0x55, 0x15, 0xb5, 0xb7, 0xd7, 0x2a, 0x10, 0x71, 0x6c, 0x43, 0x90, 0x7c, 0xee, - 0xfd, 0x72, 0x0c, 0x98, 0x49, 0xc8, 0xc6, 0x8d, 0x2f, 0xe1, 0x6c, 0x6f, 0x15, 0x53, 0x8e, 0x14, - 0x55, 0xc1, 0x21, 0x57, 0x94, 0xf5, 0x9b, 0x5b, 0xd4, 0x6f, 0xed, 0x25, 0xfd, 0x1c, 0xaf, 0x28, - 0x07, 0x64, 0x4f, 0x9b, 0x74, 0xac, 0x97, 0xb3, 0x8a, 0xa0, 0x3b, 0x97, 0xa0, 0xbb, 0x15, 0x04, - 0x7d, 0xcc, 0x57, 0x94, 0x53, 0xe6, 0x4e, 0x39, 0x65, 0xde, 0x5e, 0x8e, 0x0c, 0x0c, 0xdb, 0x5e, - 0x16, 0xc8, 0xd4, 0xad, 0x17, 0x08, 0xf1, 0x86, 0xf2, 0x31, 0x0c, 0x6c, 0x7b, 0xf9, 0x1b, 0x89, - 0x6b, 0xf7, 0xb2, 0x85, 0x0e, 0xd5, 0xa8, 0xee, 0xc1, 0x59, 0x6b, 0xff, 0x02, 0xef, 0x9a, 0x78, - 0xa5, 0x07, 0xc2, 0x81, 0x51, 0x30, 0x22, 0x8a, 0xe4, 0xce, 0x57, 0xc2, 0x6f, 0x60, 0x61, 0x37, - 0x77, 0x5d, 0x44, 0x14, 0x55, 0x6f, 0xaa, 0xd4, 0x2e, 0xc0, 0x74, 0xa1, 0xd8, 0x04, 0x34, 0xfc, - 0xde, 0xd2, 0xf7, 0x57, 0xe8, 0x04, 0xe5, 0xbf, 0x34, 0x2d, 0x7c, 0x77, 0x2c, 0x12, 0x27, 0xc2, - 0x4c, 0xda, 0xea, 0x8d, 0xd3, 0x1d, 0x75, 0x8f, 0xba, 0x0a, 0xa8, 0xd6, 0x97, 0xa3, 0xb4, 0xa3, - 0x03, 0x90, 0xd4, 0x2f, 0xab, 0xb6, 0xbc, 0x7a, 0x69, 0xfb, 0xf6, 0x5e, 0x5d, 0x5b, 0x1a, 0x49, - 0x28, 0x75, 0xa3, 0x8d, 0x6e, 0x73, 0x4b, 0xe0, 0xb6, 0x55, 0x48, 0x76, 0xa5, 0x7b, 0xd9, 0x9b, - 0x9a, 0x1d, 0xb4, 0xd2, 0x59, 0xc3, 0x66, 0x13, 0x6b, 0x80, 0xea, 0x1a, 0xc4, 0xc5, 0xf4, 0xd1, - 0xb0, 0x88, 0xa8, 0xb1, 0x98, 0x82, 0x04, 0x7c, 0xd9, 0x08, 0xac, 0xbc, 0xf3, 0xbb, 0xc9, 0x38, - 0x6c, 0x78, 0x69, 0x78, 0xf3, 0xd1, 0xd0, 0x61, 0x29, 0xdc, 0xe1, 0x58, 0x33, 0x1a, 0xed, 0x84, - 0xfd, 0x19, 0x3d, 0x0f, 0x65, 0xf5, 0x45, 0xb5, 0xc3, 0x71, 0x42, 0x57, 0xe6, 0x73, 0x6d, 0x16, - 0xd7, 0x41, 0x9b, 0xfc, 0xaa, 0x64, 0x40, 0x18, 0x84, 0x6e, 0x93, 0x5c, 0x28, 0x1e, 0x1b, 0xcb, - 0x72, 0xe0, 0x21, 0x6a, 0x5c, 0xa0, 0xa1, 0x20, 0x1a, 0x8b, 0x8c, 0x9b, 0x8b, 0xac, 0xe1, 0x47, - 0xd4, 0x8a, 0x65, 0x30, 0x06, 0xe0, 0x2d, 0x85, 0x6d, 0x02, 0x1b, 0xae, 0xe7, 0x67, 0x31, 0x3c, - 0xf2, 0x5d, 0xb1, 0xb3, 0x5c, 0x56, 0x95, 0x29, 0x83, 0x38, 0x21, 0xf4, 0x2a, 0x7d, 0x44, 0x7c, - 0xc9, 0xd2, 0x68, 0x72, 0x14, 0x15, 0xfd, 0x43, 0x3b, 0xe1, 0x10, 0x12, 0xe4, 0xd7, 0x5e, 0x54, - 0x54, 0xc5, 0x8d, 0x43, 0xd6, 0x4f, 0x59, 0x5d, 0x66, 0xa3, 0x9c, 0x12, 0xd5, 0xb9, 0x41, 0x1b, - 0x6b, 0x6b, 0x93, 0x86, 0xb0, 0x55, 0xcb, 0x81, 0xbc, 0xdc, 0xa8, 0x0e, 0x50, 0x61, 0xce, 0x6f, - 0xe9, 0xc3, 0xd4, 0x87, 0x18, 0x54, 0x37, 0xfb, 0x97, 0xb9, 0xfc, 0x7c, 0x8e, 0x36, 0x20, 0xe1, - 0xf9, 0xc7, 0x11, 0xc1, 0x2c, 0x4b, 0x7f, 0x54, 0x89, 0xbb, 0x5f, 0x06, 0xea, 0x25, 0xdf, 0xb8, - 0x67, 0xfd, 0x9e, 0x98, 0xef, 0x29, 0xde, 0xc8, 0x54, 0x9e, 0x9b, 0x40, 0x12, 0x49, 0x9a, 0x2c, - 0xc5, 0x2b, 0x8f, 0x81, 0xa5, 0x6d, 0xfc, 0x94, 0x8d, 0xd0, 0xb9, 0x58, 0xda, 0x99, 0x3a, 0xde, - 0xae, 0x3a, 0x23, 0x95, 0x71, 0xef, 0x29, 0xe4, 0x7d, 0xbb, 0x2c, 0xa6, 0x63, 0x18, 0x05, 0x13, - 0x08, 0xe3, 0x95, 0x9f, 0x55, 0x3d, 0xb9, 0xf8, 0x18, 0xc9, 0xa0, 0x63, 0x43, 0x6b, 0xcf, 0x8e, - 0x7b, 0x48, 0x0e, 0xe4, 0x6d, 0x3b, 0x1d, 0x02, 0x3d, 0xfe, 0x6c, 0x78, 0xf8, 0x3a, 0xf4, 0x61, - 0x86, 0xcf, 0x81, 0x4a, 0xe9, 0x46, 0x7b, 0xf6, 0x1e, 0x94, 0x21, 0x98, 0x6b, 0x63, 0xd1, 0xc1, - 0x93, 0xa6, 0x0c, 0x54, 0x59, 0x51, 0x14, 0x78, 0xd5, 0x8e, 0x74, 0x5b, 0xc4, 0x89, 0xe9, 0xe6, - 0x1f, 0x2c, 0xcb, 0x01, 0x6d, 0xca, 0x65, 0xcd, 0x58, 0xe3, 0x87, 0xa8, 0x0b, 0x3b, 0x7e, 0xed, - 0xcf, 0xea, 0x19, 0x07, 0x5d, 0x7f, 0x37, 0x3f, 0x53, 0x20, 0x61, 0x0b, 0xb3, 0x51, 0x69, 0xb2, - 0x3f, 0xf8, 0xe5, 0x49, 0xb7, 0xd0, 0xae, 0xba, 0xc6, 0x8b, 0x2c, 0x28, 0xb8, 0x7f, 0xf1, 0x93, - 0x6e, 0x96, 0x42, 0xae, 0x78, 0x6c, 0x51, 0x43, 0x5e, 0x1d, 0xd6, 0x7e, 0xad, 0xd8, 0x2f, 0xec, - 0xc7, 0x45, 0xfd, 0xf1, 0xc4, 0x79, 0x3c, 0x99, 0x7d, 0xb6, 0x1e, 0x7b, 0x84, 0x84, 0xaf, 0x1f, - 0x27, 0x77, 0x5a, 0xcd, 0x45, 0x8c, 0x31, 0x75, 0x4a, 0xdf, 0x30, 0x1a, 0x56, 0x4e, 0x84, 0x69, - 0xd0, 0xdb, 0x82, 0xd4, 0x2a, 0x6d, 0x94, 0x6b, 0x75, 0x60, 0x50, 0xce, 0x9f, 0x16, 0x85, 0x8d, - 0xfb, 0x97, 0xfa, 0x4b, 0xbe, 0x13, 0xcb, 0xc3, 0x5e, 0x20, 0xdb, 0x46, 0x69, 0x90, 0x6a, 0xf7, - 0x4e, 0x85, 0x0b, 0x86, 0xd0, 0x5f, 0x56, 0xc5, 0x78, 0xfc, 0xe4, 0xe0, 0x80, 0x7b, 0xdb, 0xdf, - 0xbc, 0x7d, 0xf3, 0xe6, 0xcd, 0xa0, 0xc3, 0xac, 0xde, 0x21, 0x43, 0x5e, 0xe7, 0x09, 0xef, 0x9b, - 0x5a, 0x67, 0xa6, 0x1d, 0x72, 0x44, 0xe6, 0xdb, 0xe3, 0xd6, 0xf4, 0x58, 0x78, 0xfe, 0x70, 0xaf, - 0xf7, 0xe2, 0xaa, 0x2e, 0x9e, 0x40, 0x83, 0x7a, 0x94, 0x60, 0x4f, 0x71, 0xda, 0x99, 0x90, 0xc8, - 0xe9, 0x60, 0xf3, 0xec, 0x4a, 0xb9, 0x3a, 0xdc, 0x59, 0xd5, 0x27, 0xe4, 0xd7, 0x36, 0x4f, 0x5a, - 0x38, 0xe9, 0xea, 0x68, 0x3e, 0xba, 0x15, 0xc0, 0xc7, 0x53, 0x74, 0x97, 0xba, 0xcb, 0x6e, 0xe2, - 0xe9, 0x13, 0xce, 0x42, 0xba, 0x7f, 0xca, 0x53, 0x11, 0x94, 0x3b, 0xe6, 0x23, 0xf8, 0xc8, 0x71, - 0x9e, 0x45, 0xf9, 0x19, 0xb0, 0x04, 0xec, 0x10, 0x3f, 0x0c, 0x2c, 0xfb, 0x81, 0xf4, 0x1b, 0xd0, - 0x83, 0x95, 0x58, 0xe0, 0x0f, 0x30, 0x32, 0xbf, 0x27, 0x51, 0xe2, 0xcc, 0xf7, 0x8b, 0x11, 0x41, - 0x87, 0xe2, 0x3c, 0xe7, 0x19, 0x9e, 0x9f, 0xd5, 0xa7, 0x38, 0xe2, 0x24, 0xee, 0x67, 0x27, 0xec, - 0xf3, 0x7e, 0x99, 0x9f, 0x5d, 0x81, 0x7c, 0x74, 0x1c, 0xe5, 0x21, 0x89, 0x89, 0xaa, 0x27, 0x67, - 0xf5, 0xa4, 0x2f, 0xf5, 0x24, 0x74, 0x7e, 0x83, 0x09, 0x62, 0x2a, 0x58, 0xa4, 0xfd, 0xfc, 0x43, - 0x00, 0x8c, 0xd4, 0xf7, 0xda, 0x7a, 0x0b, 0x51, 0xc1, 0x84, 0xe0, 0x3e, 0x4a, 0xc5, 0x43, 0xf2, - 0x44, 0xe2, 0xe7, 0x46, 0x8d, 0xd8, 0xbe, 0x07, 0x8b, 0x02, 0xb2, 0x22, 0x4e, 0x74, 0x5d, 0x11, - 0xb2, 0x26, 0xa5, 0x62, 0x93, 0x7e, 0x4f, 0x9c, 0x67, 0xd0, 0x39, 0x98, 0xe6, 0x9b, 0xf8, 0x17, - 0xea, 0x6a, 0x39, 0x76, 0x87, 0xb1, 0x0b, 0xdb, 0xb7, 0xbc, 0xd9, 0xd7, 0x4c, 0x49, 0x3c, 0x8a, - 0x06, 0xa5, 0xfc, 0xb7, 0xf1, 0x99, 0x62, 0x0d, 0x37, 0x15, 0x2f, 0x3e, 0xda, 0x7c, 0xb1, 0xb9, - 0x77, 0x9a, 0xc7, 0xf0, 0x79, 0x64, 0x1b, 0xc4, 0x8b, 0x52, 0x95, 0x72, 0x7b, 0x2f, 0x29, 0xf7, - 0xe8, 0xcd, 0x94, 0xcf, 0xc0, 0xd1, 0x8a, 0x6d, 0x44, 0xdd, 0x4a, 0x51, 0xe6, 0x72, 0x85, 0x25, - 0xf8, 0x25, 0x41, 0xee, 0x9a, 0xa8, 0x0a, 0xc2, 0x05, 0xba, 0xe2, 0x0d, 0xde, 0x64, 0xd7, 0xbd, - 0x41, 0xeb, 0xd5, 0xc0, 0xe9, 0xc3, 0x49, 0x3a, 0x3d, 0xe9, 0xba, 0x65, 0xde, 0xa0, 0xdd, 0x72, - 0xe9, 0xbb, 0x3c, 0x04, 0x24, 0xd6, 0xc6, 0x8c, 0x9c, 0x8e, 0x59, 0x59, 0x9e, 0xd4, 0xd1, 0x34, - 0x5f, 0xd0, 0x51, 0xee, 0x81, 0xfd, 0x16, 0xbe, 0x6b, 0xd1, 0x07, 0xba, 0x89, 0x63, 0xa0, 0x34, - 0xc0, 0x3f, 0x0b, 0xc4, 0x03, 0x8c, 0xc4, 0xc0, 0xba, 0x68, 0xd1, 0x86, 0x70, 0x88, 0x1e, 0x58, - 0xa5, 0xdf, 0x74, 0x34, 0xf0, 0xf8, 0x48, 0xd0, 0xde, 0x03, 0x8c, 0xff, 0x55, 0x55, 0x1e, 0xe5, - 0x33, 0x84, 0x24, 0x3c, 0x27, 0x04, 0xf3, 0xee, 0xfc, 0x76, 0x7c, 0x51, 0xce, 0xbb, 0xa5, 0x85, - 0x5f, 0x08, 0xec, 0x0c, 0x62, 0x6b, 0x82, 0x10, 0xe7, 0xdc, 0x0f, 0x6a, 0x51, 0xa8, 0x82, 0x7e, - 0x07, 0x2e, 0xb6, 0xbc, 0xbc, 0xaa, 0xa0, 0x17, 0x8c, 0xd2, 0xc1, 0x44, 0x6c, 0x05, 0xaf, 0x27, - 0x54, 0xfa, 0x0a, 0x98, 0x1d, 0xdd, 0xde, 0xc1, 0xbd, 0xdd, 0x0c, 0x41, 0xa8, 0xb4, 0x87, 0xfa, - 0xa9, 0x8c, 0xf1, 0xe1, 0xcd, 0x41, 0xbe, 0x62, 0x6c, 0x98, 0x05, 0x68, 0x7a, 0x8b, 0x59, 0x1f, - 0x56, 0x4c, 0xf8, 0xfb, 0xd2, 0x47, 0x33, 0xba, 0xbf, 0x5f, 0xd8, 0xbe, 0xee, 0xaf, 0x43, 0x37, - 0xfe, 0xd8, 0x2e, 0xe8, 0x04, 0x83, 0x9b, 0x6c, 0x21, 0xf6, 0x67, 0x76, 0xb6, 0xa3, 0xef, 0x2b, - 0xf9, 0xfc, 0xe5, 0x03, 0xf4, 0xb9, 0xe8, 0x52, 0xe2, 0x68, 0x5c, 0x74, 0xe1, 0x85, 0x3d, 0xa2, - 0xc8, 0x3f, 0xc6, 0x22, 0x98, 0x38, 0x48, 0x5c, 0x9a, 0xbe, 0x14, 0x8c, 0xf5, 0x88, 0x5d, 0x86, - 0x0e, 0x06, 0xd5, 0x08, 0x15, 0xba, 0xdf, 0xe4, 0x65, 0x66, 0xbb, 0x87, 0x61, 0x18, 0x06, 0x6e, - 0x20, 0x00, 0x0d, 0x9d, 0x3a, 0x0f, 0xdc, 0x28, 0x00, 0xfa, 0xc1, 0x6d, 0xe0, 0x86, 0x00, 0x30, - 0x60, 0xab, 0xcc, 0x40, 0xa0, 0xe1, 0xda, 0x55, 0xcc, 0xc4, 0xe3, 0x05, 0x21, 0x9b, 0x58, 0x30, - 0x47, 0xbd, 0x9a, 0xc5, 0xb0, 0xc2, 0x70, 0x97, 0xc8, 0x91, 0xf6, 0x28, 0x0e, 0x52, 0x5e, 0x18, - 0x76, 0x61, 0x5d, 0x2b, 0xb3, 0x0b, 0x59, 0xcc, 0xf7, 0x2a, 0xb0, 0x00, 0x54, 0x32, 0xd1, 0x94, - 0x14, 0x26, 0x2d, 0x9d, 0xae, 0x47, 0x0b, 0x39, 0xf2, 0x3d, 0x3a, 0x19, 0x4b, 0x5c, 0xb2, 0xef, - 0x45, 0x30, 0x72, 0x52, 0x8a, 0x51, 0x29, 0x8f, 0xb9, 0x83, 0xac, 0xce, 0xa6, 0x76, 0x37, 0xfe, - 0x5d, 0x93, 0x92, 0x38, 0x80, 0x99, 0x06, 0xab, 0xd2, 0x4e, 0xfe, 0x55, 0x27, 0x67, 0x41, 0x19, - 0xc5, 0xf3, 0x6c, 0xff, 0x94, 0x29, 0x28, 0xbe, 0x7c, 0xcc, 0x7e, 0xb9, 0x1d, 0x77, 0x81, 0xd3, - 0x12, 0xe0, 0x34, 0x8c, 0x92, 0x27, 0x79, 0xad, 0x5a, 0x6a, 0x2a, 0x1e, 0xd5, 0x35, 0xa0, 0x8b, - 0x78, 0x9c, 0x50, 0x67, 0x37, 0x06, 0xe6, 0xf1, 0x5a, 0x82, 0xfd, 0x7c, 0x33, 0x1a, 0x8d, 0x3a, - 0x7b, 0xbd, 0xd7, 0xdf, 0x05, 0x1d, 0x0c, 0x44, 0xe7, 0xed, 0xc2, 0xbc, 0xde, 0xf5, 0x02, 0xfc, - 0xbc, 0x95, 0x9f, 0x63, 0x58, 0x6e, 0x51, 0x1c, 0xad, 0xa0, 0x70, 0xd4, 0x44, 0xdf, 0xaf, 0x7f, - 0x0a, 0x7d, 0x61, 0x18, 0x6e, 0x46, 0x9f, 0x55, 0xf3, 0x3f, 0x74, 0xc7, 0xda, 0xa3, 0xf5, 0x59, - 0x24, 0xa0, 0x49, 0x98, 0x59, 0x02, 0x6c, 0xc2, 0xd7, 0x3e, 0xfd, 0x45, 0x0f, 0x36, 0x5e, 0x7c, - 0xa6, 0xf5, 0x59, 0x3c, 0x21, 0xf0, 0xf7, 0xf6, 0x36, 0x62, 0x9b, 0x13, 0xb4, 0x95, 0x2d, 0x3a, - 0xe5, 0x3d, 0x51, 0xd1, 0xf8, 0x86, 0x36, 0xa9, 0x9b, 0x37, 0x74, 0x21, 0x36, 0x82, 0xbe, 0xcd, - 0xb2, 0x32, 0xca, 0x94, 0xb1, 0x5e, 0x58, 0x73, 0xe5, 0x7b, 0x3f, 0x00, 0x3e, 0x67, 0x65, 0x56, - 0x4f, 0x79, 0xef, 0x1b, 0xc4, 0xf3, 0xb4, 0x71, 0xc3, 0x60, 0x2a, 0x48, 0xe5, 0x96, 0x0c, 0xb4, - 0x26, 0xe3, 0x74, 0x3a, 0x1a, 0x85, 0xa1, 0x67, 0x80, 0xdd, 0x56, 0x4c, 0xb3, 0x88, 0xb1, 0xb6, - 0x4a, 0x1f, 0x23, 0xff, 0x18, 0xa1, 0x72, 0x58, 0xd9, 0x2d, 0x2a, 0xb1, 0x23, 0x17, 0x46, 0x84, - 0xee, 0xd1, 0x4c, 0x81, 0x06, 0xfb, 0x92, 0x5b, 0x05, 0x7b, 0x24, 0x67, 0xfe, 0xc0, 0x0e, 0xb3, - 0xf4, 0xfb, 0x95, 0xa4, 0xd3, 0xd9, 0x08, 0x96, 0xb7, 0x04, 0xfa, 0xa3, 0xf8, 0x02, 0x03, 0x09, - 0x7f, 0x61, 0xab, 0xc8, 0xfe, 0x23, 0x71, 0x4a, 0x2a, 0xa3, 0x01, 0x63, 0xb1, 0x9a, 0x90, 0x99, - 0xc3, 0x4a, 0x7f, 0x37, 0x3b, 0x7f, 0xa7, 0x9c, 0x8b, 0xb5, 0xe5, 0x14, 0x5e, 0xa3, 0x08, 0xa8, - 0x94, 0xf3, 0xeb, 0xda, 0x72, 0xbe, 0x78, 0x8d, 0x32, 0xa3, 0x52, 0xce, 0x3f, 0xea, 0xe5, 0x74, - 0x17, 0xcc, 0xf1, 0xfd, 0xa6, 0x99, 0xb1, 0xac, 0xbc, 0x8f, 0x93, 0xd9, 0xe1, 0xd2, 0xca, 0xba, - 0x10, 0x94, 0x51, 0xd3, 0xaa, 0x00, 0x22, 0xbf, 0x69, 0x4d, 0x18, 0x18, 0x66, 0x91, 0xf1, 0x2d, - 0x95, 0xc3, 0x0c, 0xfa, 0x79, 0xfa, 0xd7, 0xec, 0x91, 0xd0, 0x1c, 0x83, 0xb3, 0xca, 0x9b, 0xf3, - 0x48, 0x04, 0xd5, 0xb4, 0x5b, 0x44, 0xab, 0xae, 0xa4, 0x8d, 0xa3, 0x42, 0x21, 0x1f, 0xcb, 0x47, - 0x95, 0x26, 0x7e, 0x72, 0x3d, 0x00, 0xb5, 0x32, 0x10, 0x34, 0x6b, 0x3e, 0x65, 0x6d, 0x8e, 0x08, - 0xd5, 0x66, 0xae, 0x45, 0x66, 0x70, 0x99, 0x4f, 0x54, 0xcc, 0x43, 0x72, 0x66, 0x2c, 0xda, 0x35, - 0x2c, 0x3a, 0x85, 0xc6, 0x48, 0x9c, 0xb0, 0xea, 0x54, 0xea, 0x84, 0xe5, 0x26, 0x44, 0x6d, 0x53, - 0x20, 0x86, 0x22, 0x8c, 0xd0, 0x5f, 0x13, 0x90, 0x9a, 0x5d, 0x84, 0xca, 0x5d, 0xcb, 0x32, 0x14, - 0x24, 0xef, 0x70, 0x0b, 0x5f, 0xb5, 0x51, 0xa3, 0x1b, 0x4d, 0x50, 0x5a, 0x95, 0xf2, 0x55, 0x2c, - 0xad, 0xaa, 0xa6, 0x30, 0x82, 0x51, 0x28, 0x14, 0x4e, 0x63, 0xbc, 0x3f, 0xef, 0x67, 0xc1, 0x08, - 0x06, 0x21, 0x35, 0x49, 0xb7, 0x94, 0x34, 0x8e, 0x12, 0x93, 0x34, 0xa6, 0xa4, 0x07, 0x58, 0xdc, - 0x2a, 0x1d, 0x46, 0x95, 0xa8, 0xc3, 0x5c, 0xa8, 0xa4, 0x7f, 0x79, 0x79, 0x15, 0xd0, 0xbf, 0xab, - 0xe5, 0x52, 0x1e, 0x76, 0x22, 0x9c, 0x35, 0xe5, 0x8e, 0x2e, 0xb9, 0x73, 0xb2, 0xab, 0xea, 0x61, - 0xa6, 0x63, 0x72, 0x1c, 0x25, 0xe8, 0x71, 0xda, 0x7c, 0x8e, 0x30, 0x99, 0x94, 0x55, 0xfb, 0x30, - 0x52, 0x30, 0x9b, 0xd8, 0xba, 0x1e, 0xa2, 0xd2, 0xff, 0x37, 0x4a, 0x07, 0x19, 0xa5, 0x00, 0x7f, - 0xab, 0x88, 0x07, 0x07, 0x07, 0xb7, 0x71, 0x39, 0xbb, 0x1f, 0xe3, 0xe9, 0xde, 0xc1, 0xbb, 0x78, - 0x3e, 0xc9, 0xb2, 0xec, 0x73, 0x2c, 0x0e, 0x30, 0xc0, 0xc5, 0xc1, 0x43, 0xfc, 0x39, 0xc6, 0xad, - 0x2f, 0x9b, 0x18, 0xe7, 0xd0, 0x91, 0x8c, 0xf3, 0xa5, 0x30, 0x70, 0xba, 0xdd, 0xd9, 0x64, 0x37, - 0xea, 0xbd, 0xf1, 0x87, 0x47, 0x21, 0x6a, 0x32, 0x58, 0xad, 0x1f, 0xcc, 0x26, 0xc3, 0x43, 0xf5, - 0xf3, 0x28, 0x44, 0x51, 0xff, 0xea, 0x55, 0x14, 0xcd, 0x26, 0x94, 0xb2, 0x1b, 0x1d, 0x61, 0x4a, - 0xf8, 0xc6, 0x4a, 0x81, 0x02, 0x94, 0x76, 0x83, 0x58, 0x2e, 0xbe, 0xb3, 0x6f, 0xb8, 0x9e, 0x15, - 0xe8, 0x18, 0x36, 0x9b, 0x2c, 0x83, 0x0e, 0x62, 0xe0, 0x04, 0x9d, 0xd7, 0xe1, 0x77, 0x18, 0xd3, - 0x2c, 0x78, 0xdb, 0x93, 0xb1, 0x55, 0x40, 0x23, 0x9a, 0x3b, 0x80, 0x81, 0x90, 0xf0, 0x0b, 0x19, - 0xff, 0xd8, 0x70, 0x89, 0xcf, 0x1d, 0x01, 0x40, 0x9b, 0x14, 0x0c, 0xad, 0xe9, 0x0f, 0x54, 0x14, - 0x8d, 0xf6, 0xbd, 0x8a, 0xed, 0x17, 0x84, 0xb0, 0x73, 0xd3, 0x78, 0x7e, 0xd7, 0xf9, 0x45, 0x8c, - 0xb3, 0x4c, 0x6e, 0x08, 0xbb, 0x5c, 0x3f, 0x68, 0xa9, 0xb5, 0x28, 0x10, 0xb0, 0x6d, 0x8e, 0xbc, - 0x03, 0x36, 0x21, 0x2c, 0x15, 0xa9, 0x17, 0x2e, 0xb8, 0x21, 0x46, 0x68, 0x77, 0xe5, 0xd3, 0xbc, - 0x60, 0xda, 0x14, 0xed, 0x17, 0xfe, 0x57, 0x52, 0xc9, 0x15, 0x1b, 0x22, 0x2f, 0x28, 0x1c, 0x8d, - 0xa2, 0x21, 0x68, 0x29, 0x6e, 0x5a, 0x2d, 0x8e, 0xfa, 0x52, 0x1f, 0x78, 0x7a, 0x8e, 0xbf, 0xc9, - 0x82, 0x8f, 0xab, 0x43, 0x3e, 0xd2, 0x54, 0xe8, 0x10, 0xe4, 0x63, 0xb0, 0x15, 0x2e, 0x2d, 0x6f, - 0x14, 0x11, 0xf5, 0x06, 0x42, 0x7a, 0xa3, 0x88, 0x8a, 0x37, 0x8a, 0x3c, 0x0e, 0x6d, 0x77, 0x83, - 0x21, 0xa4, 0x39, 0x2b, 0x30, 0xb4, 0x0d, 0x03, 0xe9, 0x04, 0x91, 0xb6, 0x60, 0xb5, 0x11, 0xdd, - 0x68, 0x32, 0x4a, 0x60, 0x83, 0x3d, 0x07, 0x2d, 0x0c, 0x2f, 0x95, 0x63, 0x84, 0xe0, 0xae, 0xf7, - 0x90, 0x10, 0xb2, 0xe6, 0xa3, 0x27, 0x6f, 0xdc, 0xa3, 0x12, 0xc2, 0xfb, 0x6f, 0xcb, 0xaa, 0x56, - 0x32, 0xba, 0x3c, 0x46, 0xe5, 0xf9, 0x82, 0xf1, 0x04, 0xe8, 0x43, 0x0d, 0x83, 0x5d, 0x23, 0x3c, - 0xc9, 0xb9, 0x83, 0x41, 0x08, 0x89, 0xae, 0xad, 0xb0, 0x2c, 0x9d, 0x7c, 0x8b, 0x65, 0x70, 0xab, - 0x0f, 0x6c, 0xb8, 0x11, 0x61, 0x20, 0x61, 0xf4, 0x2c, 0x32, 0x8b, 0x1a, 0x99, 0x41, 0x05, 0x48, - 0x71, 0x91, 0xf7, 0xed, 0x82, 0x83, 0x2f, 0x36, 0xec, 0x1c, 0x06, 0x6b, 0xad, 0x6f, 0x01, 0x03, - 0x56, 0xe1, 0x14, 0x78, 0x9f, 0x08, 0xde, 0xbe, 0x75, 0x8e, 0x24, 0xaa, 0x84, 0x91, 0x45, 0x65, - 0xb3, 0x28, 0xa9, 0x40, 0xca, 0xe3, 0x49, 0x4e, 0x6a, 0xee, 0xae, 0x70, 0x83, 0xa5, 0xfe, 0x01, - 0xb4, 0xc6, 0xe6, 0x38, 0xab, 0x2b, 0xb1, 0x17, 0x0b, 0xe8, 0x49, 0xa7, 0xc3, 0x5d, 0x13, 0x3d, - 0x74, 0xbf, 0xd3, 0x6b, 0x30, 0x6c, 0x50, 0xc6, 0x71, 0xb1, 0x7f, 0x77, 0x52, 0x85, 0x35, 0xac, - 0xf5, 0xc6, 0x6e, 0x0f, 0xfa, 0x63, 0x19, 0xc0, 0x56, 0xb5, 0x8f, 0x20, 0x9f, 0x1b, 0x46, 0x61, - 0x45, 0xe4, 0xd3, 0x9f, 0x39, 0xe2, 0x30, 0xa3, 0x3a, 0xe8, 0xc8, 0x87, 0x4e, 0xb0, 0xa9, 0x35, - 0x48, 0xad, 0xe5, 0xcb, 0x40, 0x5a, 0x85, 0x4f, 0x38, 0x85, 0x65, 0x0b, 0x32, 0xb6, 0xb5, 0xae, - 0x8c, 0xe6, 0xd8, 0x84, 0xa0, 0x34, 0x13, 0x49, 0xb4, 0x6f, 0x69, 0xf4, 0xb5, 0x6e, 0x34, 0x73, - 0x4b, 0x5d, 0xa1, 0xea, 0xda, 0xa7, 0x2f, 0x76, 0x63, 0xf3, 0xca, 0x15, 0xed, 0x22, 0x91, 0x10, - 0x47, 0x5e, 0x8e, 0xe7, 0xe7, 0x5e, 0x84, 0x77, 0xd7, 0xc2, 0x7e, 0x6f, 0x10, 0x1b, 0x20, 0x8f, - 0x58, 0x01, 0x79, 0xa4, 0x51, 0x71, 0x19, 0x5f, 0x05, 0x09, 0x6c, 0x90, 0x37, 0xea, 0x86, 0x32, - 0xfb, 0x67, 0x9e, 0x8b, 0xf9, 0xe9, 0x08, 0x61, 0x5a, 0x07, 0x69, 0x85, 0xfa, 0xc4, 0x74, 0x13, - 0x37, 0xc1, 0xcd, 0xef, 0x63, 0x70, 0xa0, 0x2d, 0x0a, 0x40, 0xaa, 0x46, 0x07, 0x89, 0xdb, 0xde, - 0x36, 0xef, 0x79, 0x87, 0xef, 0x19, 0x02, 0x57, 0x39, 0x2a, 0x02, 0xab, 0x5a, 0x61, 0x9a, 0x12, - 0x31, 0x4a, 0x19, 0x92, 0xb5, 0xe9, 0x1e, 0xbe, 0x94, 0x4a, 0x82, 0x7c, 0x0e, 0xe3, 0xec, 0xbe, - 0x70, 0xbb, 0x5a, 0xed, 0x30, 0x10, 0x2f, 0xbc, 0xdc, 0x9f, 0x66, 0x93, 0x7b, 0x34, 0x0b, 0x95, - 0x54, 0x08, 0xf2, 0xdb, 0x8f, 0xb8, 0x25, 0xeb, 0xe2, 0xbe, 0x84, 0xbf, 0x79, 0x74, 0xfa, 0xea, - 0xee, 0x02, 0xb2, 0xf9, 0xdd, 0xa8, 0x7c, 0x37, 0x37, 0x6a, 0x59, 0x80, 0x91, 0xae, 0x0c, 0x14, - 0x08, 0xae, 0x28, 0xee, 0xd5, 0x48, 0x81, 0xde, 0xe8, 0xbe, 0xea, 0x6d, 0xfa, 0x35, 0xe0, 0x0d, - 0x53, 0xea, 0x13, 0x46, 0x2b, 0x69, 0x5b, 0x94, 0x1e, 0x5d, 0xa6, 0x57, 0xe8, 0xf1, 0xd3, 0x2d, - 0x39, 0x9f, 0xc2, 0xec, 0x3f, 0x2e, 0x7c, 0x85, 0xc9, 0x81, 0x81, 0xb4, 0x93, 0xe3, 0x62, 0xaf, - 0x1c, 0x24, 0x30, 0x84, 0x9c, 0x8b, 0x44, 0xbc, 0x60, 0xa7, 0xf7, 0xbd, 0x1e, 0x87, 0xed, 0xa8, - 0x11, 0x61, 0xc1, 0xcd, 0xfa, 0x8b, 0xd4, 0xc1, 0x9f, 0x75, 0xc9, 0x29, 0xe7, 0x48, 0x8d, 0x05, - 0x36, 0x6b, 0x13, 0x65, 0x21, 0x51, 0xb8, 0xb4, 0x55, 0xe9, 0xb2, 0x32, 0x4a, 0xf2, 0x6c, 0x9f, - 0x76, 0xa4, 0xd2, 0x74, 0xaa, 0xf6, 0x38, 0xb3, 0x14, 0x5d, 0x76, 0x3d, 0x65, 0xd8, 0x12, 0x61, - 0xf9, 0x9d, 0x66, 0x52, 0xfd, 0x97, 0x5b, 0x07, 0xe6, 0x70, 0x4b, 0x21, 0xc6, 0x59, 0x36, 0xc4, - 0x1e, 0x75, 0x6c, 0x8f, 0x45, 0xa3, 0xed, 0xd1, 0x0e, 0xa0, 0xb7, 0x45, 0x7c, 0xd8, 0x94, 0x4b, - 0xbb, 0x76, 0xf3, 0x6a, 0xd6, 0xe0, 0xee, 0x6a, 0x72, 0x04, 0x62, 0x48, 0xc3, 0xa9, 0x06, 0x1b, - 0x49, 0xae, 0xbe, 0x65, 0x7c, 0x5a, 0xcc, 0x7b, 0x08, 0x7a, 0xa8, 0x0f, 0x2f, 0x53, 0xff, 0x44, - 0x79, 0xb3, 0xa7, 0x57, 0x51, 0x2e, 0xbf, 0x68, 0xb3, 0x75, 0x60, 0x78, 0x50, 0xe7, 0xc2, 0xc3, - 0x4f, 0x1c, 0x42, 0x9d, 0x20, 0x11, 0x1d, 0x7c, 0xe3, 0x18, 0xaf, 0xd3, 0x22, 0x83, 0x97, 0x92, - 0x12, 0x9a, 0x82, 0x9d, 0x03, 0xd1, 0x82, 0x6a, 0x65, 0x21, 0x38, 0xa7, 0x53, 0x10, 0x22, 0x58, - 0x84, 0xca, 0x5c, 0x43, 0x23, 0xe4, 0x00, 0xbe, 0x93, 0xcf, 0x7b, 0x4a, 0xd1, 0x70, 0x2c, 0x2f, - 0x77, 0xe0, 0xbb, 0xfe, 0xea, 0x37, 0x54, 0xcc, 0xe0, 0x7c, 0x94, 0xc7, 0xbf, 0x82, 0x26, 0x0c, - 0x09, 0xca, 0x7a, 0x9e, 0xda, 0x47, 0x74, 0x51, 0x12, 0x50, 0x10, 0x8e, 0xda, 0x49, 0x95, 0x0c, - 0xc7, 0xc0, 0x2f, 0x54, 0x8e, 0x31, 0xa9, 0x65, 0xec, 0x73, 0x9d, 0x2a, 0xd7, 0x79, 0x89, 0x58, - 0xb5, 0xe2, 0x26, 0x00, 0x5f, 0x8f, 0xb7, 0x42, 0x49, 0xb6, 0xb4, 0x40, 0xc5, 0x93, 0xad, 0x17, - 0xe9, 0xba, 0xc7, 0x2f, 0xcb, 0xaf, 0x70, 0xf4, 0xb7, 0x6c, 0xb3, 0x29, 0x49, 0x2d, 0x63, 0x9b, - 0xad, 0x79, 0x43, 0x8c, 0x93, 0xfb, 0x79, 0xb7, 0x31, 0xe0, 0x4e, 0xfd, 0x89, 0xed, 0xa0, 0xc0, - 0x4f, 0x97, 0x7c, 0x63, 0xfa, 0xdf, 0xa7, 0x75, 0x0f, 0x12, 0xc5, 0xb7, 0x18, 0x34, 0x30, 0xf8, - 0x10, 0xbd, 0xa2, 0x59, 0x18, 0x13, 0x25, 0x51, 0x18, 0x3c, 0x86, 0x12, 0x8c, 0x9b, 0x1a, 0x77, - 0x01, 0x29, 0xd8, 0x06, 0x76, 0x9e, 0xb6, 0xa8, 0x67, 0x98, 0xea, 0x85, 0x56, 0xb6, 0xf9, 0x2e, - 0xd7, 0xcd, 0xc7, 0xec, 0x1e, 0x46, 0xa9, 0x38, 0xa9, 0x26, 0x20, 0x5e, 0xbd, 0xb0, 0xd6, 0xfb, - 0x51, 0x71, 0x36, 0xcf, 0x08, 0xae, 0x48, 0xad, 0xf8, 0x2c, 0x30, 0x30, 0x78, 0x95, 0xb0, 0x43, - 0x56, 0xd1, 0x62, 0x4b, 0x71, 0xa8, 0x50, 0x77, 0x2e, 0x3e, 0xc1, 0x06, 0xac, 0xeb, 0xc1, 0xbb, - 0xfa, 0x30, 0x13, 0x34, 0x67, 0x15, 0x10, 0xcc, 0xd6, 0x81, 0x61, 0x83, 0xcc, 0x36, 0xfb, 0xad, - 0x7c, 0x82, 0x9a, 0x85, 0x92, 0x48, 0x3a, 0x4a, 0xb8, 0x1e, 0x57, 0x12, 0xfb, 0x4e, 0xe8, 0x70, - 0xb9, 0xd6, 0x98, 0x2c, 0x03, 0x7b, 0xae, 0xab, 0xcb, 0xa6, 0xa0, 0x73, 0xd8, 0xcd, 0x28, 0x2b, - 0xbf, 0x0b, 0xf8, 0xdd, 0x85, 0xce, 0x54, 0x5d, 0x05, 0xa5, 0xa1, 0x41, 0xf3, 0x5f, 0xba, 0x63, - 0x65, 0xb8, 0xe7, 0x72, 0x34, 0x9e, 0xb0, 0xc6, 0xe7, 0xf9, 0x97, 0x3c, 0x0a, 0x57, 0x92, 0xb3, - 0x3e, 0x66, 0x79, 0xf0, 0xef, 0xd3, 0x26, 0xaf, 0x7c, 0xc9, 0x5e, 0x5b, 0x5d, 0x35, 0x36, 0xa1, - 0xef, 0xa0, 0x2d, 0x11, 0xef, 0x73, 0xfb, 0x39, 0xc7, 0xf6, 0x76, 0xa5, 0x1f, 0xea, 0x64, 0x45, - 0xe5, 0xde, 0x63, 0xa8, 0x82, 0xc7, 0x93, 0x1e, 0x58, 0x20, 0xf4, 0xe7, 0x6e, 0x37, 0xfd, 0x4b, - 0x71, 0xf0, 0xf0, 0x09, 0x54, 0xc7, 0xec, 0x6f, 0xf1, 0xa3, 0xb8, 0xe9, 0x1e, 0xfa, 0x83, 0x70, - 0x0b, 0x65, 0x6c, 0x97, 0xc9, 0x1d, 0x86, 0x84, 0xe3, 0xe2, 0xeb, 0x84, 0x63, 0x0a, 0x68, 0x88, - 0x09, 0xc9, 0x70, 0xbf, 0x77, 0xb8, 0xbd, 0xbd, 0x51, 0x53, 0x61, 0xe3, 0xc0, 0x3d, 0x03, 0xe5, - 0x40, 0xab, 0x59, 0x2b, 0x20, 0xdf, 0x14, 0xd8, 0x83, 0xcf, 0xcb, 0xa7, 0xae, 0xb7, 0xb7, 0x17, - 0x7b, 0x01, 0xbf, 0xb7, 0x17, 0xa5, 0x48, 0x5c, 0x6f, 0x2f, 0x51, 0x66, 0x97, 0x11, 0x2a, 0x06, - 0x9f, 0x0b, 0x49, 0x02, 0xe8, 0xf5, 0x6d, 0x65, 0x4c, 0xbd, 0x20, 0xf1, 0x37, 0xed, 0xd7, 0x1e, - 0x14, 0x24, 0x67, 0x84, 0xed, 0x59, 0x63, 0x62, 0xf1, 0x2d, 0x1a, 0x40, 0x66, 0x2b, 0x9a, 0x94, - 0xda, 0x6f, 0xa4, 0x37, 0x13, 0x3a, 0xc3, 0x78, 0xf8, 0x34, 0xfc, 0xe1, 0xed, 0x0f, 0xcf, 0xcf, - 0xf0, 0xf9, 0xfa, 0xe8, 0xed, 0xf6, 0xf6, 0xc3, 0xa7, 0xe3, 0x1f, 0x0e, 0x43, 0xbf, 0x35, 0xa2, - 0x25, 0x83, 0x04, 0x2f, 0x1e, 0x3e, 0xa9, 0x78, 0x8b, 0x24, 0xac, 0x08, 0x59, 0xd4, 0x8e, 0x0a, - 0x38, 0xb0, 0x76, 0xc5, 0x74, 0xdd, 0x47, 0x0e, 0x2d, 0x83, 0x43, 0x0e, 0x8a, 0xd3, 0x2c, 0xc1, - 0xe6, 0x63, 0xfb, 0x04, 0x07, 0x5e, 0x09, 0x54, 0xda, 0x58, 0x19, 0x3b, 0x49, 0xb2, 0x39, 0xef, - 0xc9, 0x9c, 0x0c, 0x75, 0xdc, 0x85, 0x7e, 0x7f, 0x65, 0x5e, 0x2b, 0x73, 0x53, 0x94, 0x44, 0x11, - 0x27, 0x1e, 0xab, 0x23, 0x1a, 0xcb, 0x74, 0x86, 0xb0, 0x43, 0x0b, 0x14, 0x33, 0xe3, 0xbb, 0x48, - 0x72, 0xe5, 0xbb, 0xa0, 0x79, 0x63, 0x97, 0x4f, 0xee, 0xbc, 0x40, 0x66, 0xf1, 0xe5, 0x97, 0x48, - 0xff, 0x86, 0x8e, 0xeb, 0x1d, 0xbe, 0x0e, 0x35, 0x6f, 0x83, 0x46, 0x2a, 0xa8, 0x7f, 0x65, 0x32, - 0xf6, 0xfc, 0x03, 0x7d, 0xa7, 0xce, 0x8e, 0xac, 0x54, 0xfe, 0x81, 0x53, 0x14, 0x0d, 0x3c, 0xc0, - 0x3c, 0x7c, 0xb3, 0x4b, 0x15, 0x79, 0x22, 0xab, 0xda, 0xea, 0xf5, 0x65, 0x6d, 0x18, 0x7d, 0x59, - 0xd3, 0x6d, 0x48, 0xa8, 0x30, 0x9f, 0x5a, 0x4a, 0x65, 0x90, 0x73, 0xa0, 0xde, 0x86, 0x1c, 0xe6, - 0xb7, 0x1a, 0x42, 0x97, 0x67, 0xc6, 0x90, 0xc3, 0xf1, 0x75, 0x64, 0x56, 0xa8, 0x54, 0x3b, 0x93, - 0x43, 0x57, 0x40, 0xbe, 0x13, 0x2f, 0xc4, 0x3d, 0xe1, 0x7d, 0x99, 0x79, 0x2f, 0x18, 0x3d, 0x3d, - 0x15, 0xf8, 0xa6, 0xa4, 0xa2, 0x03, 0x4d, 0x44, 0x50, 0xda, 0x2b, 0xfc, 0x20, 0x87, 0xd7, 0x87, - 0x08, 0xe6, 0xb9, 0x25, 0x45, 0x04, 0x08, 0xc5, 0xf7, 0x42, 0xe4, 0xb0, 0xf7, 0xd9, 0xdf, 0xdf, - 0x97, 0x21, 0x55, 0x4b, 0xa5, 0x2f, 0x2a, 0xd9, 0xaf, 0x83, 0xa9, 0xc2, 0x8a, 0x38, 0x8b, 0xa7, - 0xb0, 0xed, 0x63, 0x87, 0x7b, 0xd8, 0x54, 0x92, 0xfb, 0x16, 0x7f, 0x2b, 0x7c, 0xdf, 0x06, 0xf2, - 0x88, 0x81, 0xaf, 0x7d, 0xf9, 0x04, 0x01, 0xd9, 0x4e, 0x48, 0xca, 0x3f, 0x3f, 0xbb, 0x3b, 0x51, - 0xd8, 0x25, 0x43, 0x2a, 0x9d, 0xca, 0x07, 0x16, 0x35, 0x90, 0x16, 0xd0, 0x5b, 0x7e, 0xbf, 0x31, - 0x3f, 0x5d, 0x11, 0xd6, 0xf6, 0xaa, 0x5a, 0x33, 0x96, 0x3c, 0xa3, 0x5a, 0x25, 0x44, 0xea, 0x05, - 0xc0, 0xe5, 0x72, 0xb2, 0xc1, 0xaa, 0x4f, 0x7b, 0x08, 0x14, 0x14, 0x22, 0xc5, 0x13, 0x15, 0xbc, - 0xdb, 0xfd, 0xbf, 0xb0, 0x89, 0xc3, 0xff, 0x03, 0xd4, 0x45, 0xa0, 0x9c, 0x7a, 0xae, 0xbb, 0x0c, - 0x5d, 0xc2, 0xb2, 0x07, 0x28, 0x0c, 0xa7, 0x75, 0x7b, 0xc6, 0x12, 0x57, 0x48, 0x46, 0x66, 0x5e, - 0x93, 0x93, 0x8a, 0x84, 0xad, 0xb7, 0x17, 0xa0, 0x7c, 0x5f, 0x93, 0xef, 0x3e, 0x5f, 0x97, 0x8d, - 0x2a, 0x06, 0x05, 0xd0, 0xe4, 0xfb, 0xaf, 0xe3, 0x03, 0x90, 0xc1, 0x71, 0x5e, 0x0e, 0x3b, 0xc7, - 0x07, 0x18, 0x04, 0x02, 0x3f, 0x67, 0xe5, 0x5d, 0x32, 0xec, 0xfc, 0x1f, 0xab, 0xff, 0x94, 0x96, - 0x05, 0x5c, 0x01, 0x00 + 0xb8, 0x56, 0x52, 0x74, 0x25, 0xb9, 0x5e, 0xbf, 0x96, 0xaf, 0x23, 0x10, 0xe4, 0xad, 0x51, 0x06, + 0xa4, 0x08, 0xe2, 0xa0, 0x90, 0xa1, 0x91, 0xa2, 0xb3, 0xae, 0xe6, 0x61, 0xf0, 0x0d, 0x57, 0xfc, + 0x8a, 0x15, 0xaf, 0x24, 0xd0, 0xef, 0x32, 0x6a, 0xda, 0xb1, 0xcc, 0x8e, 0xde, 0x4d, 0xae, 0x99, + 0x9f, 0x43, 0xad, 0xfe, 0xfc, 0x0c, 0x6a, 0x9d, 0x41, 0xb3, 0x53, 0x9f, 0x94, 0x85, 0x5d, 0x2e, + 0x04, 0x5d, 0x5e, 0x49, 0x98, 0x38, 0x3b, 0x02, 0x96, 0x8f, 0x55, 0xcd, 0x71, 0x04, 0x52, 0x3b, + 0x65, 0xc2, 0x38, 0xb1, 0x83, 0xd6, 0xf7, 0xda, 0x30, 0x90, 0xdb, 0x8e, 0x1f, 0x2f, 0x19, 0x01, + 0x44, 0x98, 0x81, 0x6e, 0x60, 0xf6, 0x68, 0x83, 0x04, 0x2e, 0x68, 0x43, 0x64, 0xe4, 0xba, 0xc6, + 0x0d, 0x46, 0xf9, 0xc6, 0x61, 0xa3, 0x33, 0x8f, 0xd2, 0x46, 0x04, 0x60, 0x28, 0x2f, 0x08, 0x0c, + 0x36, 0x4a, 0x7f, 0x14, 0x3d, 0xf4, 0x1b, 0xb4, 0x86, 0xa0, 0x87, 0x44, 0x49, 0x86, 0x44, 0xcd, + 0x83, 0x14, 0x64, 0x2e, 0x96, 0x49, 0xf2, 0xd6, 0x44, 0x1a, 0x33, 0xf9, 0xc6, 0x51, 0x75, 0x23, + 0xe5, 0xf5, 0x74, 0x17, 0xbe, 0x01, 0xa7, 0xaf, 0x89, 0xf9, 0x52, 0x09, 0xda, 0x03, 0x8b, 0x5f, + 0x4d, 0xcc, 0x89, 0x02, 0x1f, 0xac, 0x18, 0xe4, 0x65, 0x63, 0x00, 0x6f, 0xb9, 0x7c, 0x45, 0x4c, + 0x6a, 0x0f, 0x5b, 0x0b, 0x42, 0x2e, 0xea, 0x73, 0x71, 0x2a, 0xcd, 0x44, 0x33, 0x53, 0x39, 0x04, + 0xf3, 0xd2, 0xaf, 0x21, 0xa6, 0xd9, 0x8f, 0x4e, 0xce, 0x36, 0x10, 0x9c, 0xfb, 0x31, 0x15, 0xa0, + 0x5d, 0x24, 0x1a, 0xb3, 0xda, 0xc4, 0x83, 0x28, 0x4d, 0x43, 0x35, 0x5f, 0x10, 0x00, 0xcd, 0x39, + 0x07, 0x80, 0x6b, 0x5f, 0x70, 0x40, 0xde, 0x6f, 0x37, 0xc1, 0x14, 0xf5, 0xd6, 0x14, 0x39, 0x1a, + 0x64, 0xe2, 0xbd, 0xc8, 0x8d, 0x37, 0x8b, 0x8e, 0xed, 0x67, 0x82, 0x75, 0x03, 0x9b, 0x1f, 0x5b, + 0x29, 0x30, 0x63, 0xcf, 0x27, 0x8b, 0xf7, 0xc7, 0x29, 0x1c, 0xa6, 0xc3, 0x39, 0xc0, 0x48, 0x0a, + 0x6c, 0x84, 0xf0, 0x38, 0xc7, 0x21, 0x1d, 0x33, 0x6e, 0x1c, 0x69, 0x4c, 0x6c, 0xc5, 0x1f, 0xae, + 0x42, 0x69, 0x1d, 0x9e, 0x70, 0xb4, 0x94, 0xd8, 0x68, 0xad, 0xb0, 0xe1, 0x52, 0x70, 0xa1, 0xd4, + 0x6c, 0x40, 0x9b, 0x39, 0x59, 0x3a, 0x6e, 0x80, 0x5d, 0xba, 0xa0, 0xbe, 0xeb, 0xea, 0x0f, 0x52, + 0xbe, 0x90, 0x27, 0x67, 0x08, 0x14, 0x21, 0xb7, 0x4e, 0x8f, 0x3b, 0x08, 0x05, 0x7a, 0xee, 0xa1, + 0x23, 0x94, 0xf2, 0xf4, 0xbc, 0x82, 0x50, 0xae, 0x60, 0x1e, 0x78, 0xa8, 0xb0, 0x23, 0x16, 0x22, + 0x2e, 0x11, 0xdc, 0x20, 0x7d, 0x6b, 0x3a, 0xf3, 0x33, 0xcc, 0xfd, 0x38, 0x22, 0x39, 0x82, 0x6f, + 0xcc, 0x63, 0x32, 0x82, 0xc8, 0xc6, 0x7b, 0x88, 0x04, 0x25, 0xdb, 0xa7, 0x7b, 0x65, 0x01, 0xdd, + 0x2b, 0xff, 0x06, 0x54, 0x7e, 0x56, 0x55, 0x55, 0x50, 0x18, 0x76, 0x16, 0x22, 0x67, 0x25, 0xc0, + 0xce, 0xf0, 0xef, 0x90, 0xd9, 0x9d, 0x18, 0xf0, 0xbb, 0x64, 0xec, 0xdc, 0x7d, 0x08, 0x3b, 0x3e, + 0x72, 0x56, 0xfe, 0x45, 0xec, 0x44, 0xfb, 0xb9, 0x92, 0x48, 0x05, 0x2f, 0x7f, 0xa7, 0x9f, 0x27, + 0xef, 0xf5, 0xf3, 0xe4, 0x03, 0xfd, 0x5c, 0xcf, 0xb1, 0x9e, 0xe6, 0xd6, 0x95, 0x45, 0x9d, 0x2d, + 0x83, 0x5e, 0xf4, 0x3b, 0x3c, 0x70, 0x8e, 0x5b, 0x30, 0xaf, 0xec, 0xc8, 0x32, 0x42, 0x4f, 0xd0, + 0x0b, 0xb8, 0x9a, 0x5c, 0x1f, 0x6c, 0x0b, 0x44, 0x41, 0x0e, 0xd7, 0x12, 0x52, 0x8a, 0x94, 0x89, + 0x2c, 0x2b, 0x2b, 0xbf, 0x85, 0xa0, 0xeb, 0xf7, 0xf8, 0xcd, 0x75, 0xb7, 0xf9, 0x1e, 0x8a, 0xc8, + 0x02, 0xb1, 0x94, 0xe3, 0xfc, 0xe6, 0x02, 0x11, 0x1f, 0xfa, 0x2e, 0xed, 0xe5, 0x4a, 0x64, 0xf5, + 0xfc, 0x9d, 0x5e, 0x1e, 0xfc, 0xaf, 0xd0, 0xcb, 0xe6, 0xbf, 0xda, 0xcb, 0xed, 0xff, 0x99, 0x7b, + 0x19, 0xa7, 0xf7, 0xd1, 0x32, 0x6a, 0xbf, 0x47, 0x9b, 0xb5, 0x80, 0xad, 0x34, 0x35, 0x23, 0x4a, + 0xf1, 0xa3, 0x9e, 0xde, 0x44, 0x51, 0x66, 0xe5, 0xa3, 0x58, 0xb9, 0x7f, 0x67, 0x1d, 0xb8, 0x47, + 0x94, 0xac, 0xfc, 0x3d, 0x9c, 0xcc, 0xa3, 0x64, 0xe5, 0xef, 0x8c, 0x3c, 0x9e, 0xc0, 0x58, 0x84, + 0x8a, 0x15, 0x8a, 0x0b, 0xc8, 0x81, 0x5e, 0x77, 0x73, 0x92, 0xe4, 0xbb, 0xdd, 0xaf, 0x27, 0x72, + 0x40, 0x5e, 0x0c, 0xa4, 0x90, 0x89, 0xc8, 0x97, 0x21, 0x1d, 0x4a, 0xec, 0xf7, 0xca, 0x3f, 0x20, + 0xf8, 0xcd, 0x11, 0x01, 0xf1, 0x1d, 0x8f, 0x41, 0x80, 0xb4, 0x50, 0x8e, 0xff, 0x6a, 0xef, 0xa4, + 0x44, 0x94, 0x2a, 0xe0, 0x3f, 0x51, 0xfa, 0x2a, 0x90, 0xab, 0x57, 0x6a, 0xe2, 0xb5, 0xd6, 0x4e, + 0x5a, 0x51, 0x57, 0x03, 0x93, 0x63, 0x54, 0x1c, 0x5b, 0x06, 0x59, 0x65, 0x90, 0x57, 0x18, 0xe8, + 0x0b, 0xd6, 0xc3, 0x45, 0xc0, 0xfd, 0x22, 0x0b, 0x2b, 0x58, 0x89, 0xd7, 0xd0, 0xaa, 0x44, 0xda, + 0xfe, 0xa8, 0x19, 0x86, 0x35, 0x5a, 0x5a, 0x01, 0x29, 0xb1, 0x19, 0x59, 0xe9, 0x97, 0x75, 0x01, + 0xd4, 0x27, 0xbe, 0x82, 0x7b, 0xd5, 0xe9, 0x0b, 0x84, 0x6a, 0x96, 0xe0, 0xc8, 0x2f, 0xf6, 0xf1, + 0x6e, 0xe0, 0x7f, 0x7c, 0x2d, 0xb4, 0x82, 0x25, 0xf0, 0x3b, 0xc9, 0xd6, 0x13, 0x80, 0x2e, 0xa0, + 0xf3, 0x7e, 0xbc, 0x1f, 0x8a, 0x12, 0x1b, 0xe4, 0x6d, 0x03, 0x80, 0x2e, 0xeb, 0x02, 0x37, 0x0c, + 0x54, 0x62, 0x78, 0xb7, 0x0f, 0x20, 0x83, 0xf2, 0x7d, 0xb8, 0xd4, 0x41, 0x5f, 0x58, 0xd2, 0x05, + 0x65, 0x71, 0x17, 0x92, 0x5a, 0x1f, 0x81, 0xbd, 0x0d, 0x13, 0x64, 0x09, 0x6c, 0x05, 0x61, 0xaf, + 0x7c, 0x8c, 0x48, 0x11, 0x72, 0xab, 0xc2, 0xc1, 0xde, 0x99, 0xa8, 0xe6, 0x72, 0xc4, 0x90, 0x02, + 0x1f, 0x1d, 0x5b, 0xa5, 0x82, 0x98, 0xe1, 0xe0, 0x1f, 0x38, 0x9a, 0x66, 0x2e, 0x6b, 0x3c, 0x2d, + 0xf0, 0x41, 0x0a, 0x75, 0xcc, 0x36, 0x3f, 0x75, 0x55, 0xb3, 0x6d, 0xf5, 0x3f, 0x24, 0x0f, 0x7b, + 0x96, 0x40, 0x54, 0x68, 0x94, 0x85, 0x65, 0x8b, 0xcc, 0x4b, 0xa2, 0x61, 0xc8, 0x5d, 0x6c, 0x1f, + 0xd1, 0x28, 0x64, 0x7b, 0xe0, 0xd8, 0x86, 0xb6, 0xe0, 0xf4, 0xe1, 0x6a, 0x0e, 0xcd, 0xb4, 0x80, + 0xe7, 0xeb, 0x05, 0x8c, 0xb7, 0xe5, 0x1a, 0x62, 0xd4, 0x7c, 0x02, 0x29, 0x8a, 0xc8, 0xd9, 0xec, + 0x84, 0xf1, 0xd8, 0x85, 0x57, 0x5e, 0x21, 0xa7, 0x9b, 0xb7, 0x0d, 0xc3, 0xf2, 0xc8, 0x12, 0x81, + 0xf7, 0xd8, 0xac, 0x3a, 0x84, 0x47, 0x92, 0xc7, 0x6e, 0xf8, 0xd8, 0x0c, 0x1f, 0x47, 0xf8, 0xb8, + 0x99, 0x0b, 0xcd, 0x08, 0x2b, 0xb1, 0x5a, 0x73, 0x89, 0xb5, 0x26, 0x55, 0x9a, 0x8b, 0x56, 0xba, + 0xf2, 0x6e, 0xad, 0xf9, 0x64, 0x4b, 0x11, 0x54, 0x9a, 0x0f, 0x17, 0x87, 0xf7, 0x6a, 0xcd, 0x7f, + 0xa4, 0xab, 0x2b, 0x5c, 0xad, 0x85, 0x79, 0x93, 0xc9, 0xdc, 0xfa, 0x26, 0xfa, 0x0d, 0x39, 0xa5, + 0x06, 0x97, 0x70, 0x79, 0xa3, 0x1a, 0xb4, 0x36, 0x1e, 0x25, 0x19, 0x4a, 0x58, 0x9c, 0x4b, 0xde, + 0xdc, 0xd3, 0x35, 0xa8, 0x70, 0x13, 0x31, 0x64, 0x45, 0xb4, 0x42, 0x00, 0xd6, 0xf2, 0x97, 0x6f, + 0xdc, 0xd4, 0x4a, 0x12, 0x0b, 0x5e, 0xb4, 0x49, 0xdb, 0x1a, 0x99, 0x24, 0xf3, 0x1e, 0x6e, 0x76, + 0xa1, 0x6c, 0x80, 0x5b, 0x56, 0xfe, 0xbd, 0x4b, 0x35, 0xd1, 0x82, 0x59, 0x0e, 0x5a, 0xa1, 0x3a, + 0x36, 0x34, 0xb3, 0xeb, 0xf5, 0x6a, 0x62, 0x25, 0x46, 0x41, 0x58, 0x8f, 0xd9, 0x89, 0x8c, 0x26, + 0x3d, 0x14, 0xc6, 0x35, 0x97, 0x28, 0xf2, 0xda, 0x98, 0x59, 0xe2, 0x22, 0x06, 0x31, 0xc1, 0x3f, + 0x50, 0x47, 0xbb, 0x52, 0x58, 0x67, 0xb6, 0xc7, 0xf7, 0x90, 0x49, 0x51, 0x89, 0x5e, 0x04, 0xc8, + 0x57, 0x3e, 0x84, 0x31, 0xd6, 0x02, 0x82, 0xb1, 0x66, 0x81, 0x62, 0x8c, 0x88, 0x3e, 0x02, 0x80, + 0xd1, 0x3c, 0x2f, 0x94, 0x36, 0x56, 0x7c, 0xe0, 0xa3, 0xa8, 0xae, 0x11, 0x59, 0xf9, 0x69, 0xcc, + 0x32, 0xa1, 0x03, 0xd3, 0x3d, 0xc0, 0x3c, 0x8f, 0xee, 0x15, 0x6e, 0x03, 0xb9, 0x26, 0x36, 0x48, + 0xd4, 0xd1, 0x50, 0x16, 0xfb, 0x4a, 0xc3, 0x90, 0x12, 0x31, 0x44, 0x16, 0x99, 0x37, 0x04, 0x59, + 0x98, 0x2d, 0x93, 0x6c, 0x69, 0x2f, 0xcc, 0x31, 0x4f, 0x20, 0x61, 0x24, 0x52, 0x7e, 0xde, 0x62, + 0xaa, 0xc9, 0x2c, 0x5b, 0x14, 0xb7, 0x95, 0x8e, 0x4f, 0x26, 0x71, 0x74, 0x05, 0x11, 0x51, 0x7d, + 0xfb, 0x64, 0x8e, 0xe6, 0x5c, 0x89, 0x73, 0x10, 0xbf, 0x19, 0xc1, 0x60, 0xe0, 0x4b, 0x14, 0x31, + 0xb8, 0x4d, 0x4c, 0x2e, 0xd4, 0xc3, 0x71, 0x0a, 0x06, 0x9b, 0x6e, 0xd2, 0x12, 0x87, 0x33, 0x6e, + 0x54, 0xf0, 0xce, 0xb0, 0x4b, 0x8a, 0x7c, 0x62, 0xa7, 0x9d, 0x03, 0xc4, 0x19, 0xa4, 0x5c, 0x5b, + 0x35, 0x03, 0x70, 0xbe, 0xbb, 0x07, 0x7c, 0x60, 0xbb, 0x27, 0x99, 0x4c, 0x06, 0x68, 0x05, 0x33, + 0x71, 0xf2, 0x17, 0x69, 0xc3, 0x22, 0xd9, 0x9c, 0x2a, 0xdf, 0x61, 0xdf, 0x58, 0x84, 0xc3, 0x77, + 0xec, 0x61, 0x9d, 0xf1, 0x02, 0xd1, 0x95, 0x4e, 0x3b, 0x0c, 0xb8, 0xcc, 0x66, 0x37, 0x85, 0x27, + 0xf4, 0x99, 0x49, 0x75, 0x21, 0xf5, 0x30, 0xb0, 0xfb, 0x3a, 0x4f, 0x49, 0x2b, 0x3c, 0x29, 0xfd, + 0x06, 0x25, 0x51, 0xb7, 0x9c, 0x25, 0x84, 0x14, 0x64, 0xf8, 0xf7, 0xd2, 0x11, 0xb7, 0xe8, 0x76, + 0x8f, 0xda, 0x29, 0x91, 0xfa, 0x74, 0xb8, 0xa2, 0x94, 0x21, 0x45, 0xf0, 0xda, 0xb8, 0x0c, 0x35, + 0x5a, 0xa7, 0x44, 0x8c, 0xe2, 0x85, 0x2d, 0x66, 0x4b, 0x64, 0xd4, 0xb3, 0xcd, 0xdf, 0x22, 0xf0, + 0x49, 0x32, 0x4e, 0x91, 0xac, 0x3f, 0xff, 0x20, 0x41, 0xee, 0x3f, 0xfc, 0x77, 0x27, 0xc5, 0x60, + 0x09, 0x60, 0xd1, 0x04, 0x23, 0x04, 0xc7, 0x30, 0xe7, 0xb7, 0x85, 0xbe, 0x87, 0x1d, 0x0a, 0xf3, + 0xc0, 0x4c, 0x0a, 0x17, 0x38, 0xea, 0x8c, 0x41, 0xfc, 0x35, 0x71, 0xd8, 0x72, 0xf9, 0xb5, 0xf5, + 0x5c, 0x7e, 0x23, 0xca, 0xa8, 0x48, 0x9e, 0xa6, 0x35, 0x66, 0x8b, 0x5a, 0xc7, 0x00, 0x1d, 0x31, + 0xc8, 0x1a, 0xd1, 0x12, 0x69, 0x05, 0xfb, 0x63, 0x9f, 0x0e, 0x18, 0x0e, 0xf8, 0xba, 0xd0, 0xd9, + 0x02, 0x97, 0x34, 0xbf, 0xdf, 0x7e, 0x87, 0x19, 0xda, 0xc3, 0x66, 0xe6, 0x76, 0x45, 0x21, 0xa9, + 0x91, 0xb9, 0xdd, 0xf7, 0x5b, 0xf7, 0xd7, 0xbf, 0xad, 0x55, 0xf9, 0x05, 0xad, 0xca, 0x7f, 0xa0, + 0x55, 0x58, 0xf6, 0xdf, 0xd4, 0xac, 0x3b, 0xcb, 0x48, 0x6e, 0xd7, 0x97, 0xcf, 0xeb, 0x95, 0x42, + 0x71, 0xe1, 0x80, 0xae, 0xf0, 0x23, 0x4a, 0x72, 0xf2, 0x7a, 0xf0, 0x6f, 0xb7, 0x70, 0x25, 0xde, + 0xc4, 0xb0, 0x85, 0xfb, 0x8e, 0xf6, 0xba, 0xa4, 0x89, 0xa5, 0x8d, 0x18, 0x4b, 0x4b, 0x26, 0x3a, + 0x92, 0xf3, 0x03, 0x4d, 0x5c, 0xf9, 0x08, 0x16, 0xe3, 0x06, 0x75, 0x32, 0xa9, 0x42, 0x39, 0x97, + 0xbe, 0x53, 0x49, 0x6b, 0x65, 0xf1, 0x9e, 0x54, 0x32, 0x3b, 0x8a, 0x88, 0x14, 0xd0, 0x77, 0xed, + 0x2d, 0xd8, 0xaa, 0x2a, 0xe4, 0x4b, 0x74, 0x5b, 0xfa, 0xf7, 0x4c, 0x16, 0x0d, 0x5b, 0x43, 0xfd, + 0x3e, 0xc1, 0x96, 0xc5, 0x99, 0x2d, 0x48, 0xa6, 0x8f, 0xef, 0x5f, 0xfd, 0xa3, 0x66, 0x0c, 0xb6, + 0x7d, 0xb5, 0xf2, 0xde, 0xfe, 0x15, 0x19, 0xa0, 0xb0, 0x5f, 0x64, 0x19, 0x0c, 0xb1, 0xce, 0x85, + 0x7c, 0x04, 0x9e, 0xce, 0x16, 0x47, 0x17, 0xbb, 0x15, 0xe7, 0x95, 0xd1, 0x71, 0xcb, 0xfd, 0x1b, + 0xc6, 0x8d, 0x34, 0xcd, 0xf5, 0xc7, 0xad, 0xa8, 0xac, 0xff, 0x9d, 0x71, 0xc3, 0x5b, 0x47, 0xd1, + 0xe3, 0x7b, 0xf2, 0xde, 0xd8, 0x05, 0x19, 0xff, 0x57, 0x18, 0xbf, 0x84, 0xd1, 0x8a, 0x8f, 0x69, + 0x2e, 0x1c, 0x3f, 0xdd, 0xef, 0xda, 0xf2, 0x31, 0xcc, 0xc7, 0xc6, 0x50, 0x20, 0x4b, 0xfe, 0x3b, + 0x03, 0x19, 0x71, 0x46, 0xf8, 0xcd, 0xdd, 0xb0, 0x9d, 0x5c, 0x92, 0xbe, 0xc3, 0xdb, 0x3c, 0x07, + 0xae, 0x67, 0xf5, 0x89, 0x72, 0xb9, 0xf2, 0x7b, 0x43, 0x92, 0xb8, 0x1d, 0xf2, 0x7b, 0xf6, 0xd0, + 0x0f, 0xee, 0x07, 0x23, 0x46, 0x57, 0x3e, 0x32, 0x20, 0x79, 0x71, 0x93, 0xf6, 0x47, 0xc8, 0x2d, + 0x1f, 0x87, 0x42, 0xdc, 0x90, 0xcc, 0x0d, 0xc4, 0xf2, 0x71, 0xf0, 0x5d, 0x16, 0x92, 0xba, 0xb9, + 0x64, 0x8e, 0xec, 0xe4, 0xdf, 0x9b, 0x1c, 0x6c, 0x20, 0xf2, 0xff, 0xcc, 0xd4, 0x28, 0xff, 0x0f, + 0x9d, 0x18, 0x05, 0x98, 0x18, 0x6c, 0x20, 0xf2, 0xcb, 0x07, 0xa2, 0xf8, 0xb7, 0x27, 0x84, 0xa2, + 0x55, 0xfe, 0xd6, 0x84, 0x28, 0x7c, 0x6c, 0x42, 0x14, 0xfe, 0xb7, 0x98, 0x10, 0xc5, 0x60, 0x42, + 0x14, 0xe6, 0x04, 0xf1, 0xb8, 0xe0, 0x4d, 0x95, 0xfd, 0x86, 0xd6, 0x25, 0xb7, 0x95, 0xbf, 0xa3, + 0xfd, 0xb1, 0xb3, 0x29, 0x71, 0x59, 0x3f, 0x2e, 0xc5, 0xd3, 0xd3, 0x2f, 0x22, 0xaf, 0xed, 0x35, + 0x2d, 0x02, 0x28, 0x4e, 0x0d, 0x2c, 0x94, 0x0d, 0xef, 0x27, 0x17, 0xb3, 0xa4, 0x30, 0x53, 0x87, + 0xe3, 0xc2, 0x0b, 0xb7, 0x8a, 0x39, 0xd0, 0x62, 0xb2, 0x82, 0x5d, 0x6b, 0x30, 0x7a, 0xa0, 0x7b, + 0xd1, 0xf6, 0xcf, 0x19, 0x4e, 0x56, 0xbe, 0xd9, 0x9b, 0x37, 0xe1, 0xd1, 0x24, 0x7e, 0x8a, 0x7a, + 0x09, 0x46, 0x21, 0x3a, 0x98, 0xf4, 0x80, 0x4b, 0x38, 0xc4, 0x64, 0xd0, 0xcb, 0xa5, 0x4c, 0x89, + 0x18, 0x32, 0x71, 0x8b, 0x5b, 0xc9, 0xe4, 0x82, 0xc1, 0x56, 0x32, 0x6b, 0x40, 0x9b, 0x66, 0xd3, + 0xb5, 0x37, 0x98, 0xef, 0x4f, 0xac, 0x97, 0x97, 0x0e, 0xb6, 0x71, 0x01, 0x6e, 0xc3, 0xad, 0x7d, + 0xfb, 0xd5, 0x10, 0x97, 0x58, 0xcf, 0x40, 0x3b, 0x66, 0x80, 0x96, 0xab, 0xd3, 0x64, 0x08, 0x6c, + 0x37, 0xaa, 0x4f, 0xbf, 0xab, 0x4e, 0xaf, 0x2c, 0xb0, 0xcc, 0x90, 0xe1, 0x06, 0xe5, 0x74, 0x81, + 0x59, 0x86, 0x7d, 0x4e, 0x98, 0xb9, 0xbc, 0x36, 0xfd, 0x31, 0x65, 0x7a, 0xe5, 0x83, 0x56, 0x99, + 0x39, 0xa3, 0x0c, 0x69, 0x44, 0x4c, 0x03, 0x5e, 0xa1, 0x5c, 0x2b, 0x6a, 0x6a, 0xa1, 0xe8, 0x43, + 0xaa, 0x09, 0xc9, 0x77, 0x11, 0xa3, 0xb2, 0x29, 0x09, 0xaf, 0x2c, 0xa4, 0xe1, 0x85, 0xde, 0x46, + 0xe4, 0x66, 0x10, 0x8b, 0xcd, 0x4a, 0x56, 0x26, 0x46, 0xdc, 0xe8, 0x21, 0xad, 0x9b, 0x2f, 0xbc, + 0x91, 0xd0, 0xb2, 0x35, 0xf3, 0x46, 0x6d, 0xa6, 0x16, 0x3b, 0xaf, 0x31, 0xa3, 0x5d, 0xb2, 0xf3, + 0x1a, 0x75, 0x66, 0x4a, 0x76, 0x9b, 0x9b, 0xab, 0x74, 0x65, 0xae, 0xd6, 0xdc, 0x07, 0x5c, 0xe6, + 0xe6, 0x2b, 0x65, 0x26, 0xa3, 0x95, 0x0f, 0x56, 0x3b, 0x57, 0x6b, 0x7e, 0xa1, 0x4b, 0x64, 0xa1, + 0xd8, 0x5c, 0xe2, 0xfa, 0x19, 0x4c, 0xf6, 0xbf, 0xd9, 0xdb, 0xc2, 0xa2, 0xde, 0x2a, 0xc5, 0xd6, + 0xe2, 0x6a, 0x19, 0xf9, 0xac, 0x2c, 0x77, 0x10, 0x64, 0x21, 0xa2, 0xa3, 0xdb, 0x31, 0xd4, 0x75, + 0x58, 0x45, 0x43, 0x4d, 0xd4, 0xb2, 0xe4, 0xec, 0x61, 0x30, 0xf0, 0x1b, 0xfc, 0x84, 0xc7, 0x7c, + 0xa4, 0xf9, 0x62, 0x41, 0x10, 0x86, 0x65, 0xfe, 0x9d, 0xb1, 0x32, 0xe8, 0x3d, 0x1f, 0x4c, 0x08, + 0x72, 0x32, 0x66, 0x09, 0x83, 0x25, 0xbb, 0x00, 0x96, 0xab, 0x7d, 0xd4, 0x69, 0x55, 0x20, 0x87, + 0xab, 0x29, 0xbe, 0x72, 0x15, 0x95, 0x79, 0x22, 0x87, 0xf8, 0x08, 0x1a, 0xd1, 0xef, 0x52, 0x73, + 0x7e, 0xbf, 0xeb, 0x97, 0x1f, 0xe9, 0xa2, 0xa0, 0x1a, 0x1e, 0x73, 0xe3, 0x43, 0xfd, 0xb7, 0x4a, + 0xa2, 0x1d, 0x67, 0x6d, 0xb3, 0xbb, 0xd1, 0x54, 0x5d, 0xad, 0x5c, 0x94, 0xf5, 0xbb, 0xed, 0x8b, + 0xeb, 0x91, 0x72, 0x72, 0xd0, 0xb5, 0xf0, 0xde, 0xcb, 0xf3, 0xc6, 0x6d, 0x6f, 0xef, 0xb6, 0x0b, + 0x4f, 0xdb, 0xe4, 0x1e, 0xcc, 0xfd, 0x9d, 0xfa, 0x23, 0xfc, 0xec, 0x94, 0xf6, 0x07, 0x9d, 0x12, + 0x26, 0xd4, 0x1f, 0xce, 0x1b, 0xd7, 0xca, 0x51, 0xdd, 0x71, 0x8b, 0xad, 0xf2, 0x15, 0x26, 0x5c, + 0x9b, 0x57, 0xb7, 0xb9, 0x6d, 0xc8, 0x33, 0x7e, 0x1e, 0x0d, 0x2b, 0x8f, 0x57, 0xb7, 0x98, 0x78, + 0xdc, 0xda, 0xeb, 0x3d, 0xb5, 0x46, 0xf5, 0xfa, 0xae, 0x7b, 0x06, 0xaf, 0x6b, 0xbb, 0xf5, 0x56, + 0x7b, 0xf8, 0x7a, 0x80, 0x05, 0xb6, 0x9b, 0x8d, 0xdb, 0xeb, 0xed, 0xbb, 0x9d, 0xde, 0x8d, 0xf1, + 0xb8, 0xde, 0xdc, 0xb5, 0xea, 0xa3, 0xdd, 0xb3, 0xf3, 0xfb, 0x35, 0x73, 0xdd, 0x1c, 0xed, 0xe8, + 0xf6, 0xc4, 0xbb, 0x3a, 0x2f, 0x3e, 0x55, 0xbc, 0xa6, 0x73, 0x73, 0xd8, 0xdf, 0xed, 0xef, 0x17, + 0xad, 0xcb, 0xb7, 0x89, 0xd1, 0x1e, 0x5d, 0xbf, 0xda, 0xb9, 0x46, 0xa3, 0x6d, 0xde, 0x65, 0xcf, + 0x07, 0x4f, 0x83, 0xb7, 0x57, 0xcd, 0xa9, 0x6f, 0x4f, 0xc6, 0x0f, 0x6f, 0xe6, 0xf6, 0xa8, 0xa0, + 0x77, 0x5f, 0xb4, 0xfd, 0xbd, 0xce, 0xc3, 0xe4, 0x76, 0xd0, 0x3b, 0xc9, 0x4e, 0xf6, 0xcf, 0x94, + 0x9d, 0xf1, 0x71, 0x67, 0xf2, 0xfa, 0xf0, 0xb4, 0x77, 0xd1, 0x2a, 0x67, 0x1b, 0xce, 0x7a, 0xb6, + 0xd9, 0x59, 0x1b, 0x1c, 0xed, 0x94, 0xce, 0x47, 0xed, 0x35, 0xcb, 0x39, 0x1b, 0xd6, 0x2f, 0x49, + 0x5f, 0xf6, 0x8c, 0xfd, 0x9b, 0x97, 0xc6, 0xe0, 0xaa, 0xbf, 0xb3, 0x23, 0xa2, 0x6d, 0x36, 0xee, + 0x14, 0x35, 0x8c, 0x72, 0xae, 0xc8, 0x5e, 0xe8, 0xdc, 0x0c, 0xc0, 0x01, 0x66, 0x87, 0x2b, 0x78, + 0xda, 0x71, 0xb4, 0xd7, 0x81, 0xe6, 0x7a, 0xc7, 0xae, 0x65, 0xd2, 0xf5, 0xb3, 0x03, 0x74, 0xdd, + 0x5b, 0x38, 0x8f, 0x16, 0x40, 0x89, 0x51, 0xe0, 0x91, 0x09, 0x0c, 0xd2, 0x6c, 0x69, 0x02, 0x5a, + 0x36, 0x7f, 0x13, 0x96, 0xef, 0x47, 0x8c, 0xb3, 0x33, 0x25, 0x66, 0xa9, 0xd0, 0x25, 0xca, 0xe2, + 0x7f, 0xba, 0x9a, 0x81, 0x7b, 0xac, 0x9b, 0xb7, 0x24, 0x85, 0x38, 0xf5, 0x27, 0xf8, 0x04, 0x27, + 0xc1, 0x26, 0x12, 0x03, 0xce, 0xd6, 0xa8, 0xd0, 0xd0, 0x32, 0x3b, 0x44, 0x5c, 0xa0, 0xfd, 0x6e, + 0x5a, 0x96, 0x17, 0x03, 0x1a, 0x18, 0xfc, 0x09, 0x52, 0x79, 0xb9, 0xb7, 0x27, 0x6e, 0x9e, 0xa9, + 0x6d, 0x4d, 0x18, 0xe9, 0x5e, 0x8f, 0x53, 0xf5, 0x49, 0x84, 0x70, 0x62, 0x60, 0x54, 0x94, 0x4a, + 0x71, 0x03, 0xe6, 0xc4, 0xfe, 0x9e, 0xb2, 0xb7, 0xc1, 0x16, 0x95, 0x15, 0xa1, 0x39, 0x11, 0xea, + 0xba, 0xd3, 0xb2, 0x2c, 0xeb, 0x45, 0xd7, 0xc8, 0x79, 0x0a, 0xaf, 0xa7, 0x09, 0xdf, 0x54, 0x81, + 0xfa, 0x4a, 0xf7, 0x3c, 0xcf, 0x76, 0xab, 0xd9, 0xec, 0xc8, 0xd0, 0xda, 0x19, 0x90, 0x0e, 0x5b, + 0x16, 0x68, 0xed, 0x5a, 0x06, 0x77, 0x48, 0xed, 0x2c, 0x48, 0x23, 0xaa, 0xd3, 0xd5, 0x40, 0x0e, + 0xfd, 0x4f, 0xe6, 0xeb, 0xba, 0x42, 0xce, 0x35, 0xb4, 0xac, 0x7e, 0x7f, 0x60, 0x12, 0xa5, 0x53, + 0xdd, 0x5c, 0xb4, 0x7c, 0x99, 0xd4, 0x25, 0xfc, 0x5f, 0xe5, 0x01, 0x8b, 0x5c, 0xc8, 0x3f, 0xca, + 0x04, 0x30, 0x3a, 0xbf, 0xb8, 0x49, 0x9a, 0xad, 0x33, 0x12, 0x71, 0xe7, 0xa8, 0xda, 0x9c, 0xa7, + 0x6a, 0x26, 0x16, 0x31, 0x5b, 0xc6, 0xa2, 0xeb, 0x67, 0xc4, 0x8f, 0x52, 0x2b, 0xae, 0xfe, 0x41, + 0x57, 0xe6, 0x29, 0x3e, 0x79, 0xbb, 0x98, 0xdc, 0x22, 0x10, 0x4a, 0x00, 0x01, 0x0e, 0x63, 0x98, + 0xc0, 0x4b, 0x10, 0x63, 0x27, 0x07, 0x02, 0xf7, 0x04, 0xe2, 0xbd, 0x0c, 0x93, 0x76, 0x2b, 0x9c, + 0xab, 0xd4, 0xdd, 0xf1, 0xc6, 0x12, 0x06, 0xae, 0x26, 0x34, 0x07, 0xba, 0x81, 0xe1, 0xba, 0x04, + 0x8d, 0xae, 0xa4, 0x32, 0x49, 0x45, 0xb9, 0x05, 0xaa, 0x76, 0x40, 0x22, 0x65, 0x27, 0x8b, 0x04, + 0xe0, 0xff, 0x30, 0x43, 0x48, 0x79, 0xe1, 0xd1, 0x1a, 0x08, 0x2d, 0xc8, 0xe3, 0x68, 0xde, 0xc0, + 0x31, 0x05, 0xdc, 0x37, 0xd7, 0x80, 0xab, 0xea, 0x7d, 0x8d, 0x6c, 0xb6, 0x20, 0xcd, 0xe1, 0xd9, + 0x41, 0x17, 0xcf, 0xd4, 0x20, 0xb5, 0xe1, 0x45, 0x08, 0x80, 0x14, 0xf2, 0x8c, 0x52, 0x22, 0x1e, + 0x64, 0x05, 0x22, 0x72, 0x4c, 0xcd, 0xc9, 0x30, 0xe7, 0xcb, 0x39, 0x24, 0x46, 0x76, 0x85, 0xbd, + 0x53, 0xcb, 0x21, 0x12, 0xc2, 0x85, 0xdf, 0x2a, 0x8b, 0x38, 0x27, 0x2d, 0x99, 0x8a, 0xf3, 0xe5, + 0xf3, 0x7c, 0xf9, 0x81, 0x89, 0xa7, 0xe3, 0x1d, 0x32, 0x05, 0x03, 0x38, 0xdc, 0xa4, 0x5b, 0x09, + 0x67, 0xdd, 0xca, 0xbe, 0xe5, 0x40, 0xf7, 0x5d, 0x4f, 0xb0, 0x35, 0x87, 0x5c, 0x81, 0x0c, 0x75, + 0xcb, 0x82, 0x0e, 0x32, 0x3c, 0xde, 0xac, 0x81, 0x93, 0x41, 0x23, 0xe7, 0x21, 0x01, 0x0f, 0x04, + 0x1f, 0x56, 0xa7, 0xc3, 0xba, 0x0d, 0x68, 0xe9, 0x23, 0x12, 0x5c, 0x98, 0x55, 0xc0, 0x9a, 0x46, + 0x3d, 0xcd, 0x24, 0x87, 0xf0, 0x00, 0x17, 0x80, 0xe6, 0xcc, 0x4a, 0x7c, 0xee, 0xe8, 0xe1, 0xb0, + 0x23, 0xce, 0xc4, 0x84, 0x71, 0x9e, 0xeb, 0x96, 0x22, 0x85, 0x63, 0xbf, 0x12, 0x0e, 0x3e, 0x3b, + 0x5d, 0xb4, 0x32, 0x04, 0xd4, 0x1b, 0x56, 0x4b, 0xb7, 0xe5, 0xd1, 0xbd, 0xcc, 0xf6, 0x59, 0xdd, + 0x5d, 0x58, 0xf8, 0xe4, 0x91, 0x2b, 0xb7, 0xd0, 0xb9, 0x5c, 0x26, 0x9a, 0xa3, 0x2b, 0xe3, 0xf8, + 0x81, 0xa6, 0x27, 0x43, 0xee, 0xda, 0xa7, 0x9c, 0x6c, 0x5a, 0xe7, 0xda, 0x08, 0x75, 0x1c, 0x7c, + 0xd1, 0xdd, 0x0b, 0x93, 0x24, 0x1a, 0x75, 0xfa, 0x7a, 0x3a, 0xa4, 0xbf, 0xb8, 0x44, 0xd3, 0x27, + 0x42, 0xdd, 0xf8, 0xe8, 0x4e, 0xcc, 0x56, 0x03, 0x30, 0xe2, 0x3f, 0xdf, 0x74, 0x8d, 0x6b, 0xad, + 0x05, 0xf9, 0x15, 0xb9, 0xa7, 0xba, 0xc4, 0x8f, 0x07, 0x3f, 0xc1, 0xf3, 0xf5, 0xc1, 0x36, 0x7b, + 0xda, 0xd9, 0xb9, 0xa1, 0xe0, 0x77, 0x07, 0x4e, 0xad, 0xac, 0xc0, 0xc3, 0x8d, 0xea, 0xd4, 0xf0, + 0x17, 0x0f, 0x44, 0x10, 0x48, 0xec, 0x08, 0xfb, 0xfe, 0x18, 0x92, 0xfd, 0x97, 0x4b, 0xd5, 0x80, + 0xb7, 0x16, 0xbc, 0xe2, 0xcf, 0xc0, 0xc1, 0x28, 0x36, 0x54, 0x48, 0xaa, 0xad, 0xe6, 0x64, 0xc0, + 0x9d, 0x47, 0x39, 0x37, 0x29, 0xd2, 0xdd, 0xb1, 0x60, 0xd4, 0xe1, 0x11, 0x58, 0x5d, 0xf0, 0x68, + 0x8d, 0x60, 0x60, 0x6f, 0x4d, 0x18, 0x8d, 0x36, 0xbc, 0x82, 0x9a, 0x05, 0x3d, 0xc6, 0x74, 0xfa, + 0x63, 0xb7, 0xfc, 0xea, 0xe9, 0x13, 0xe9, 0x3c, 0x82, 0x1d, 0xc1, 0x47, 0xcf, 0xa9, 0xad, 0xc9, + 0xed, 0x5a, 0x1b, 0xb4, 0x12, 0x14, 0x06, 0xe5, 0xce, 0x18, 0xe5, 0x89, 0xda, 0xf7, 0x1f, 0xb2, + 0x8d, 0x4b, 0x5b, 0x6d, 0x3a, 0x93, 0x35, 0xff, 0xc1, 0xf0, 0x1f, 0xec, 0xf3, 0x9a, 0x28, 0xca, + 0xf6, 0x11, 0x02, 0x3f, 0x1f, 0xf4, 0xf1, 0xa7, 0xef, 0xd5, 0x72, 0xf8, 0xf7, 0xb4, 0x41, 0xdf, + 0x4e, 0x01, 0x3e, 0x36, 0x01, 0x7e, 0x90, 0x91, 0x60, 0x29, 0xdd, 0x3d, 0xc3, 0x9a, 0xfb, 0x58, + 0x6d, 0xbf, 0x87, 0x7d, 0xed, 0x74, 0x6b, 0x53, 0x0f, 0x8f, 0x69, 0x54, 0xa7, 0x28, 0xb6, 0x54, + 0x41, 0x96, 0x71, 0x5e, 0x44, 0xb9, 0xd9, 0xad, 0x4e, 0x07, 0x8e, 0x51, 0x15, 0xc5, 0x99, 0xac, + 0x1a, 0x76, 0x4f, 0x85, 0xcf, 0xdd, 0x6a, 0xa6, 0x2c, 0x83, 0x14, 0x59, 0xcd, 0x54, 0x66, 0x32, + 0xf5, 0xa8, 0xc1, 0x44, 0xc8, 0x82, 0xaf, 0x7d, 0xbb, 0x4a, 0x4f, 0xce, 0xba, 0xd5, 0x29, 0x3d, + 0x6a, 0x50, 0x85, 0x81, 0x72, 0xba, 0xcd, 0x2a, 0x54, 0xf8, 0x3a, 0x80, 0x14, 0x7c, 0xef, 0x69, + 0x63, 0x78, 0x87, 0x7e, 0x10, 0x55, 0x10, 0x53, 0xec, 0x56, 0x1f, 0x98, 0x20, 0x66, 0xb2, 0xf5, + 0x36, 0x26, 0x00, 0x82, 0x0d, 0xcd, 0xac, 0x92, 0xa1, 0xea, 0xda, 0x23, 0x87, 0x3d, 0x69, 0x63, + 0x1b, 0x9f, 0x5a, 0x2e, 0x29, 0xd5, 0x6b, 0xab, 0x13, 0x17, 0x21, 0xcd, 0x64, 0xd0, 0xff, 0x6a, + 0xdf, 0xbf, 0x2b, 0x72, 0x2e, 0x27, 0xe7, 0x8b, 0x72, 0x51, 0x0e, 0x96, 0x22, 0x35, 0x58, 0xae, + 0x32, 0x5d, 0x58, 0xeb, 0x06, 0xcd, 0x8c, 0x6e, 0x65, 0xc7, 0x7d, 0xd5, 0xcd, 0x80, 0x90, 0x26, + 0xfe, 0x90, 0xa1, 0x4c, 0x5e, 0xce, 0xad, 0xc9, 0xb9, 0xb0, 0x08, 0x91, 0xe1, 0xdc, 0x0c, 0xe9, + 0x71, 0xcb, 0xc2, 0x0d, 0xbc, 0x0c, 0xf4, 0x2c, 0x5b, 0x5c, 0xcf, 0xe1, 0xbf, 0x5c, 0xbe, 0x90, + 0x79, 0xb6, 0x49, 0xd1, 0xbc, 0x92, 0x2f, 0xc9, 0x05, 0x39, 0x8f, 0x20, 0x96, 0x57, 0xa8, 0x01, + 0xfa, 0x81, 0x3d, 0xb1, 0x2a, 0xa1, 0x5c, 0x01, 0xca, 0xad, 0xff, 0x7e, 0xb1, 0x22, 0x14, 0x29, + 0xe4, 0x7e, 0xb3, 0x9c, 0x22, 0x97, 0x01, 0x23, 0x7c, 0x07, 0x61, 0xb5, 0xd5, 0x81, 0x90, 0xe7, + 0xba, 0x88, 0xee, 0x23, 0xb8, 0xb6, 0x64, 0x47, 0xaa, 0x61, 0xd8, 0x2a, 0x70, 0xa8, 0x6c, 0x29, + 0x57, 0x5e, 0x5b, 0xcf, 0x33, 0x9c, 0x64, 0xa1, 0xe3, 0x90, 0xa2, 0xac, 0xe7, 0x73, 0x85, 0x72, + 0x21, 0xbf, 0x9e, 0x2f, 0x15, 0xca, 0xb4, 0x06, 0xc0, 0xfc, 0xdf, 0xad, 0x21, 0x97, 0x5b, 0xaf, + 0x54, 0x14, 0x85, 0xaf, 0x22, 0x5f, 0xca, 0xe7, 0x2b, 0xca, 0x5a, 0xb1, 0x92, 0x2b, 0x55, 0x4a, + 0x65, 0x45, 0x11, 0x7f, 0xfc, 0xd8, 0xe8, 0x0c, 0x4c, 0x12, 0x94, 0x50, 0xe8, 0x81, 0xd8, 0x61, + 0x68, 0x77, 0xc1, 0xf1, 0xe1, 0x1d, 0x62, 0xf5, 0x4a, 0x49, 0xd3, 0x4f, 0xed, 0x0c, 0x0d, 0x89, + 0xf2, 0xe5, 0x8b, 0xa9, 0x8d, 0x04, 0x60, 0x4b, 0x78, 0xcb, 0x8b, 0x3f, 0x6b, 0x37, 0x0b, 0x5a, + 0xe1, 0xcb, 0x97, 0x88, 0xb4, 0x38, 0x0b, 0x60, 0xba, 0xa0, 0x6f, 0xa6, 0x34, 0xd9, 0x93, 0xa6, + 0x20, 0xb7, 0xb0, 0x29, 0xb8, 0x67, 0x68, 0xf8, 0x93, 0x21, 0x8b, 0x76, 0x06, 0xb8, 0xc0, 0xa5, + 0x03, 0x22, 0x9d, 0xe3, 0x4d, 0x48, 0xc6, 0xb0, 0x2c, 0x6e, 0x88, 0x6b, 0xd2, 0x94, 0x2d, 0x5f, + 0xed, 0x0c, 0x88, 0x38, 0xac, 0xe8, 0xf6, 0x84, 0x7c, 0xe2, 0xb2, 0xee, 0x6d, 0xef, 0x9c, 0x2f, + 0xc8, 0xec, 0x6e, 0x4f, 0x76, 0x90, 0x3f, 0x9f, 0x83, 0x82, 0x14, 0x29, 0xa4, 0xbb, 0x7b, 0x7d, + 0x1b, 0x6b, 0x0d, 0x8a, 0x29, 0xb5, 0x5a, 0xed, 0xa2, 0xf9, 0x8c, 0x41, 0x52, 0x5f, 0xb4, 0x89, + 0x0b, 0x5f, 0x32, 0xd4, 0x9f, 0x87, 0x2f, 0x04, 0x19, 0xb8, 0x22, 0xda, 0x97, 0x2f, 0xa2, 0x45, + 0x8a, 0x88, 0xb5, 0x1a, 0x5a, 0x4f, 0xac, 0x0e, 0xa6, 0x7d, 0xaa, 0x3b, 0x8e, 0x3a, 0xc9, 0xe8, + 0x2e, 0xf9, 0x8d, 0x55, 0x7b, 0xdd, 0x6d, 0x12, 0x2f, 0xc6, 0x68, 0xcd, 0xb6, 0x0a, 0x22, 0xdd, + 0x91, 0xe9, 0xa5, 0xb4, 0x8c, 0x23, 0x7d, 0xf9, 0x12, 0x4d, 0xe9, 0xce, 0xa5, 0x34, 0x39, 0x90, + 0xc0, 0x07, 0x1a, 0x9e, 0x13, 0x82, 0xc3, 0x63, 0x03, 0x29, 0x31, 0x0d, 0x80, 0xd2, 0x20, 0x1f, + 0xc3, 0x6f, 0x97, 0xfd, 0x36, 0xd3, 0xa2, 0x24, 0x46, 0xca, 0xe1, 0x71, 0xaf, 0xa0, 0x5c, 0x26, + 0x9f, 0xcb, 0x97, 0xff, 0x8a, 0x34, 0x24, 0x9d, 0x59, 0xcb, 0x95, 0xf2, 0x7f, 0x45, 0x9a, 0x92, + 0xce, 0x28, 0x6b, 0xf9, 0x48, 0x1a, 0xdf, 0x18, 0x34, 0x92, 0x36, 0x4e, 0x11, 0x28, 0xac, 0x62, + 0x82, 0x57, 0xd3, 0x32, 0xc8, 0x70, 0x21, 0x35, 0x33, 0xda, 0xe2, 0x8a, 0x04, 0x89, 0x52, 0x15, + 0xb8, 0x12, 0x0a, 0xa2, 0xa6, 0x26, 0x7e, 0xaa, 0xd5, 0xba, 0xe8, 0x68, 0xdd, 0xb7, 0x07, 0xb0, + 0x6e, 0x34, 0x90, 0x40, 0x70, 0x10, 0xd0, 0x1e, 0xd5, 0x20, 0x51, 0x5c, 0x36, 0xe8, 0x7a, 0x04, + 0x08, 0xe6, 0xd1, 0xe8, 0x03, 0x93, 0xb6, 0xe0, 0x99, 0x92, 0x55, 0xe8, 0x40, 0x48, 0x2c, 0x1e, + 0x35, 0x1f, 0x45, 0x41, 0x56, 0xd9, 0xfd, 0xf5, 0x2b, 0xc8, 0xdd, 0xf2, 0xf3, 0x10, 0x74, 0x04, + 0x79, 0x36, 0x73, 0xf9, 0xb5, 0x2d, 0xe2, 0xc5, 0x29, 0x56, 0x89, 0xb3, 0xab, 0x28, 0x05, 0x8b, + 0xe3, 0x97, 0x2f, 0xde, 0xa6, 0xf2, 0xe5, 0x4b, 0x42, 0x85, 0xb5, 0x9f, 0x71, 0x97, 0x45, 0x7a, + 0x49, 0xb0, 0x2c, 0xfc, 0x31, 0x9d, 0x6b, 0xc6, 0x4c, 0x28, 0x28, 0x7f, 0xca, 0x38, 0x12, 0xa9, + 0x3f, 0xa6, 0xde, 0x4c, 0x0e, 0xfe, 0x48, 0xd2, 0x4f, 0x49, 0xaa, 0xa6, 0xfc, 0xea, 0xa0, 0xb1, + 0xb0, 0xdc, 0x48, 0x72, 0x52, 0x75, 0x09, 0x85, 0x7f, 0x26, 0x74, 0xcf, 0x4b, 0xe8, 0x0e, 0x37, + 0x6e, 0xaa, 0x6d, 0x1b, 0x93, 0x9d, 0x4e, 0x17, 0x26, 0x7c, 0x8b, 0x1e, 0x2d, 0x14, 0x0d, 0xf4, + 0xb3, 0x04, 0xba, 0xae, 0xc1, 0x42, 0x96, 0x21, 0xeb, 0x58, 0x06, 0x97, 0x31, 0x69, 0x03, 0xc5, + 0x15, 0x8d, 0x4b, 0x25, 0x15, 0x64, 0x9a, 0xdd, 0x0d, 0x40, 0x0b, 0x99, 0xf2, 0x22, 0x09, 0xae, + 0x23, 0xca, 0x2c, 0xaf, 0x47, 0xf2, 0xe2, 0x32, 0xc6, 0xee, 0x7f, 0xdc, 0xf0, 0x73, 0x79, 0x4d, + 0x5b, 0x94, 0xbd, 0x2d, 0x31, 0x47, 0x2e, 0x21, 0x0c, 0x6e, 0x22, 0xc4, 0x27, 0x68, 0x24, 0x79, + 0xc6, 0x18, 0x79, 0xf4, 0x72, 0x15, 0x78, 0x80, 0x11, 0xf0, 0x8b, 0x36, 0x59, 0xd1, 0x20, 0xe0, + 0x8d, 0xa0, 0xf8, 0x45, 0xd8, 0x41, 0x7a, 0x3e, 0x73, 0xaf, 0x4d, 0x32, 0x93, 0x58, 0x16, 0x90, + 0x8d, 0x90, 0x1b, 0xf7, 0xb9, 0xef, 0x91, 0xcf, 0x0a, 0xa9, 0xb6, 0x14, 0xa9, 0xc7, 0x5b, 0x6d, + 0x8a, 0x72, 0xd8, 0x57, 0xc2, 0x79, 0xf1, 0xbe, 0xd2, 0x30, 0x87, 0xdb, 0xb5, 0x69, 0x0e, 0xd2, + 0x43, 0xba, 0xb0, 0x6e, 0xd1, 0x2a, 0xaa, 0xac, 0x46, 0xc8, 0xac, 0xe3, 0x16, 0x38, 0xca, 0x6d, + 0xaa, 0xd1, 0xf0, 0x2c, 0x07, 0x98, 0x32, 0x32, 0xbf, 0x23, 0x4f, 0xeb, 0xa7, 0x44, 0x54, 0xec, + 0x6e, 0x75, 0xc0, 0xbe, 0x28, 0x1f, 0x37, 0x2e, 0xce, 0x61, 0xdc, 0xf0, 0x4e, 0x27, 0xbd, 0x33, + 0x49, 0x01, 0x58, 0x49, 0x0a, 0xc4, 0x0c, 0xe0, 0x47, 0x6d, 0xf7, 0xcb, 0x17, 0xaa, 0xfb, 0xde, + 0x1e, 0xf1, 0xac, 0xd6, 0x77, 0xdd, 0x9b, 0x06, 0x0d, 0xa1, 0x02, 0x43, 0x06, 0xa4, 0x82, 0xda, + 0xa7, 0x84, 0x44, 0x39, 0x1c, 0xf1, 0x08, 0x14, 0x76, 0xae, 0x74, 0x1a, 0x1d, 0xf4, 0xda, 0x22, + 0x6a, 0xd8, 0xa2, 0x42, 0x4d, 0x95, 0x7d, 0x5f, 0x04, 0xd5, 0xdf, 0x4b, 0x9e, 0xc6, 0x28, 0x81, + 0x6b, 0x1a, 0x4d, 0x58, 0x04, 0x80, 0x78, 0x72, 0xce, 0x75, 0x0e, 0x68, 0x7f, 0xbe, 0x73, 0x90, + 0x98, 0x08, 0x85, 0xd1, 0x35, 0xb0, 0x26, 0x6d, 0x2b, 0x15, 0xa1, 0x53, 0xf1, 0xb3, 0xa6, 0xf1, + 0xf4, 0xd0, 0x5a, 0xed, 0x60, 0x22, 0x71, 0x3d, 0xe7, 0x12, 0xf3, 0x98, 0xd8, 0x6e, 0xb7, 0x23, + 0x89, 0x05, 0x4c, 0x6c, 0x36, 0x9b, 0x91, 0xc4, 0x22, 0x26, 0xaa, 0xaa, 0x1a, 0x49, 0x2c, 0x61, + 0xe2, 0xfa, 0xfa, 0x7a, 0x24, 0xb1, 0x9c, 0x94, 0x58, 0xc1, 0xc4, 0x4a, 0xa5, 0x12, 0x49, 0x6c, + 0x62, 0x62, 0xb1, 0x58, 0x8c, 0x24, 0xb6, 0x30, 0xb1, 0x50, 0x28, 0x44, 0x12, 0xd1, 0x2c, 0xf2, + 0x39, 0x97, 0xcb, 0x45, 0x12, 0xdb, 0x98, 0x98, 0xcf, 0xe7, 0x23, 0x89, 0x0e, 0x69, 0x67, 0x3e, + 0x9a, 0xb3, 0x4b, 0x72, 0xaa, 0xd1, 0x44, 0x83, 0x24, 0x96, 0x5b, 0x91, 0x44, 0x0b, 0x12, 0xc9, + 0x75, 0x33, 0x79, 0xa5, 0x28, 0x0b, 0xe1, 0x1f, 0x25, 0xb3, 0x2e, 0x45, 0x32, 0xba, 0x4d, 0x86, + 0xcf, 0x42, 0x2c, 0xb9, 0xc7, 0xd2, 0xcb, 0x91, 0x74, 0xaf, 0xb9, 0x00, 0x30, 0xbb, 0x90, 0x6f, + 0xb5, 0x29, 0x49, 0xb1, 0x02, 0xaa, 0x5f, 0x22, 0xb7, 0xa6, 0xc8, 0x42, 0xf8, 0x67, 0x71, 0x89, + 0xde, 0x87, 0xea, 0x20, 0x7e, 0x79, 0xc4, 0x48, 0x29, 0x31, 0x76, 0x4a, 0x7d, 0x6e, 0xd0, 0x7c, + 0x8a, 0x31, 0xf8, 0x52, 0x4a, 0xa6, 0x02, 0xf9, 0xaa, 0x71, 0x82, 0x8a, 0xa3, 0x9f, 0x10, 0x14, + 0x5d, 0x43, 0x62, 0x04, 0x15, 0x1f, 0x93, 0x42, 0xd2, 0x90, 0x16, 0x93, 0x06, 0x9f, 0x10, 0x54, + 0xa9, 0x54, 0x9a, 0x27, 0xa8, 0x72, 0xb9, 0xfc, 0x41, 0x82, 0x8a, 0x53, 0x2e, 0x21, 0xa8, 0x56, + 0xab, 0x35, 0x4f, 0x50, 0xf1, 0x29, 0xd2, 0x4e, 0x9a, 0x0d, 0x84, 0xa0, 0xb4, 0x62, 0x7e, 0x9e, + 0xa0, 0x8a, 0x5a, 0x7e, 0x9e, 0xa0, 0x8a, 0x15, 0x35, 0x99, 0xa0, 0x0a, 0x30, 0x10, 0xfe, 0xbf, + 0x05, 0xd4, 0x04, 0xc8, 0x4c, 0xa4, 0x26, 0x48, 0x2f, 0x2d, 0xa0, 0x26, 0x1e, 0xea, 0x47, 0x48, + 0x49, 0xc9, 0x03, 0x15, 0x05, 0x7f, 0x3e, 0x40, 0x4a, 0xa5, 0x9c, 0x2c, 0xf8, 0xff, 0x3e, 0x4a, + 0x47, 0x03, 0x13, 0xd6, 0x01, 0x91, 0xe3, 0x53, 0x28, 0xc8, 0x6f, 0x77, 0x43, 0x11, 0x8a, 0x14, + 0x6d, 0x76, 0xb1, 0xce, 0x5a, 0x3b, 0xd3, 0x72, 0x34, 0x60, 0xfe, 0x4c, 0xba, 0x25, 0x20, 0x45, + 0x69, 0x43, 0xef, 0xa4, 0xdc, 0x0c, 0x9a, 0xcb, 0x35, 0x59, 0x04, 0x1e, 0x0d, 0xf2, 0x42, 0xa0, + 0x33, 0x80, 0xbe, 0xe8, 0x0e, 0xfa, 0x19, 0xbb, 0x67, 0x79, 0x96, 0x9b, 0xcd, 0xad, 0xe7, 0x95, + 0x6c, 0x4e, 0xa9, 0x28, 0xc8, 0xc9, 0xa1, 0x06, 0x5c, 0x9e, 0xcd, 0x9a, 0x2f, 0xd7, 0x6f, 0x74, + 0x2c, 0x27, 0x45, 0x8c, 0x11, 0x02, 0x08, 0xb2, 0xa0, 0xfc, 0xfd, 0xfa, 0xf5, 0xfd, 0x07, 0xcd, + 0xa4, 0xd6, 0x40, 0x00, 0x35, 0xbe, 0x2b, 0x3f, 0xb6, 0x4c, 0x94, 0xae, 0xf7, 0x07, 0x86, 0xf1, + 0x08, 0x52, 0x4e, 0x4a, 0xaa, 0x62, 0xa2, 0x6c, 0x05, 0x30, 0x52, 0xaa, 0x6c, 0x7c, 0xcf, 0xfd, + 0x80, 0x3f, 0xf9, 0x1f, 0x92, 0xac, 0x87, 0xe9, 0x16, 0x34, 0x13, 0x97, 0x3c, 0xf2, 0xa2, 0x23, + 0x10, 0xf2, 0x24, 0xa5, 0x8d, 0xef, 0x05, 0xc8, 0x69, 0x6e, 0xd6, 0x2c, 0xd0, 0x30, 0xbe, 0xd5, + 0x74, 0x10, 0xab, 0x68, 0x67, 0x8c, 0xef, 0xc5, 0x1f, 0xd2, 0x6c, 0x06, 0x3a, 0x63, 0xbb, 0xbd, + 0x87, 0xb7, 0xfd, 0xa1, 0xd9, 0x58, 0x33, 0x35, 0x27, 0x45, 0x4c, 0x75, 0x20, 0x5f, 0xd4, 0x36, + 0x59, 0x0f, 0x88, 0x68, 0xb9, 0x8f, 0xb1, 0x6d, 0x52, 0xf1, 0xb5, 0xba, 0xd9, 0x85, 0x8a, 0x41, + 0xfe, 0x3f, 0x4f, 0x99, 0x20, 0x46, 0xa7, 0xcc, 0x5a, 0xa6, 0x2c, 0xc9, 0xbe, 0xfe, 0xc1, 0xa2, + 0xc2, 0xd4, 0xcc, 0x20, 0x25, 0x14, 0xad, 0x8e, 0x50, 0x73, 0xaa, 0xfd, 0x04, 0x55, 0x1d, 0xe4, + 0x2b, 0xd2, 0x22, 0x22, 0x59, 0xd5, 0x4c, 0xe8, 0xfb, 0x2c, 0x36, 0x5e, 0x8d, 0x17, 0xdd, 0xdc, + 0x69, 0x34, 0x70, 0xd0, 0x60, 0x2c, 0x3e, 0x51, 0xe5, 0x85, 0x62, 0xce, 0xab, 0xc5, 0xf4, 0x91, + 0x1b, 0xb5, 0x4b, 0xb4, 0x11, 0x34, 0x0b, 0xc3, 0xec, 0x41, 0xf4, 0x25, 0x0c, 0x2c, 0x6e, 0x4b, + 0xc1, 0xc8, 0xba, 0x19, 0xbd, 0x0d, 0xa3, 0x0a, 0xab, 0x9a, 0x66, 0xe0, 0xfe, 0xe2, 0x04, 0xef, + 0x79, 0xd3, 0x80, 0x60, 0x20, 0x29, 0xdc, 0xae, 0xcd, 0x82, 0xea, 0x8e, 0x29, 0xc4, 0x5e, 0x9c, + 0x02, 0x21, 0x63, 0x8b, 0x8c, 0x3f, 0x0c, 0xbf, 0x98, 0x26, 0x86, 0xa5, 0xaa, 0x98, 0x11, 0xa5, + 0xb4, 0x98, 0x75, 0xa1, 0x9d, 0x19, 0x96, 0x99, 0x44, 0xf0, 0xa9, 0x89, 0x78, 0x3a, 0x00, 0x7a, + 0x8f, 0xe1, 0x6b, 0x40, 0x5c, 0xee, 0xe9, 0x46, 0x3b, 0xe5, 0x02, 0xd6, 0x83, 0xee, 0x59, 0x26, + 0x9a, 0x5d, 0x61, 0xf1, 0x45, 0x6f, 0x43, 0xad, 0x0a, 0x84, 0x13, 0x8f, 0xe8, 0x61, 0x3b, 0x16, + 0x9e, 0x86, 0x30, 0x00, 0xbb, 0xc4, 0x2e, 0xa5, 0xc8, 0x29, 0x52, 0x69, 0x2d, 0x22, 0xed, 0x74, + 0x7d, 0x69, 0x07, 0x52, 0x8f, 0x6c, 0x10, 0x3e, 0x41, 0x44, 0xa5, 0xd9, 0xa0, 0x3c, 0xa8, 0x62, + 0x29, 0x71, 0x1f, 0xe0, 0x93, 0xe0, 0x1a, 0x19, 0xe1, 0xd2, 0xc0, 0x1b, 0xf0, 0x04, 0x12, 0x5c, + 0x8c, 0xc6, 0xe9, 0x39, 0xba, 0xfc, 0x24, 0x2e, 0x92, 0x9f, 0x28, 0x44, 0x99, 0x40, 0x93, 0x24, + 0x5f, 0x40, 0x4d, 0xae, 0x3d, 0x94, 0xb5, 0x24, 0x94, 0x57, 0x91, 0x5c, 0x6a, 0x7d, 0xcd, 0xe9, + 0x6a, 0xbb, 0x9a, 0x66, 0xe3, 0x1b, 0x15, 0xc1, 0x08, 0x41, 0xe1, 0x18, 0x4a, 0x32, 0xb1, 0x55, + 0x5d, 0xde, 0x7a, 0xba, 0x01, 0x02, 0x5c, 0x28, 0x58, 0x84, 0x22, 0x1f, 0x31, 0x98, 0x6c, 0x75, + 0x34, 0xaf, 0xd5, 0x4b, 0x2d, 0x43, 0x7e, 0x0f, 0xe3, 0xc9, 0x41, 0xd6, 0xcc, 0x33, 0xe8, 0xc9, + 0xa2, 0x3c, 0xed, 0x6b, 0x5e, 0xcf, 0x6a, 0x57, 0x45, 0x68, 0x9b, 0x38, 0x93, 0x90, 0x68, 0xcd, + 0x14, 0x90, 0xb4, 0x46, 0xbe, 0xa7, 0xa4, 0x30, 0x65, 0x1a, 0xd7, 0x27, 0xa1, 0xdd, 0x68, 0x9a, + 0x01, 0xc5, 0x52, 0xca, 0xc0, 0x20, 0x40, 0xbd, 0x98, 0x0b, 0x0d, 0x90, 0x16, 0x90, 0xb0, 0x61, + 0x75, 0x53, 0xe2, 0xb9, 0x25, 0xa8, 0x98, 0x9b, 0xcd, 0x64, 0x52, 0x31, 0xda, 0x34, 0x23, 0x8d, + 0xc8, 0x08, 0xbb, 0x34, 0x06, 0xbd, 0x4b, 0xa8, 0x58, 0x6b, 0x43, 0x43, 0x01, 0x64, 0x47, 0x37, + 0x81, 0x2a, 0x26, 0xa9, 0x94, 0x04, 0x50, 0x19, 0x3b, 0xe2, 0xc4, 0xbe, 0x6e, 0x06, 0xe6, 0x04, + 0xe4, 0xab, 0x2e, 0xfa, 0x14, 0xa2, 0x06, 0x48, 0xed, 0xcb, 0x17, 0x7e, 0x82, 0x88, 0x48, 0x81, + 0x3b, 0x40, 0x80, 0x92, 0x1c, 0x39, 0x33, 0x25, 0x33, 0x2f, 0x1a, 0xb6, 0x1f, 0x8b, 0x29, 0xd4, + 0xdc, 0xb6, 0x78, 0x14, 0x2f, 0x41, 0x6a, 0x47, 0x8a, 0xe0, 0x4e, 0x47, 0x04, 0x0d, 0xde, 0x7f, + 0x40, 0xf3, 0x29, 0xff, 0x4e, 0x9f, 0x61, 0x24, 0x6f, 0xa8, 0x09, 0x35, 0xfc, 0x76, 0xc9, 0x19, + 0x5c, 0x69, 0x6a, 0xd4, 0x9c, 0x21, 0xcd, 0x64, 0xdc, 0x74, 0x9d, 0x91, 0xff, 0x51, 0x6a, 0x60, + 0xc4, 0xd0, 0x4e, 0xe0, 0x4c, 0x61, 0x00, 0x36, 0xea, 0x37, 0x24, 0xca, 0xc9, 0x96, 0x15, 0xf9, + 0x53, 0x2e, 0xd0, 0x0a, 0x08, 0x87, 0x6f, 0x0d, 0x83, 0xa5, 0xc1, 0xe7, 0x4a, 0x8a, 0x2c, 0x7a, + 0xce, 0x40, 0x83, 0x29, 0x97, 0x8c, 0x05, 0xbb, 0xd5, 0x17, 0x81, 0x16, 0xe2, 0x71, 0x6d, 0x36, + 0x7c, 0xb6, 0x03, 0xbd, 0x70, 0x26, 0x0d, 0x82, 0x66, 0xcb, 0xa9, 0x1b, 0x46, 0xea, 0x2b, 0x17, + 0xc5, 0x91, 0x39, 0x23, 0xfd, 0xf8, 0x2a, 0x05, 0x6c, 0xdf, 0x45, 0x62, 0xf1, 0xa4, 0x24, 0x86, + 0xeb, 0x59, 0x83, 0x56, 0x0f, 0xed, 0xdd, 0xa8, 0x29, 0x91, 0xfa, 0xb6, 0x89, 0xeb, 0x11, 0xf4, + 0x61, 0x51, 0x6e, 0x60, 0x27, 0xb1, 0xbc, 0x21, 0x53, 0x89, 0x8d, 0xb6, 0xe6, 0xb3, 0x4a, 0x6a, + 0xca, 0x09, 0xb7, 0xe5, 0x13, 0xda, 0x16, 0x1e, 0x8d, 0x70, 0xb4, 0xbe, 0x35, 0x04, 0x3e, 0xaa, + 0xb6, 0x30, 0x5e, 0x24, 0xe4, 0xa5, 0x06, 0xe0, 0x5f, 0xbf, 0xbc, 0xef, 0xda, 0x0f, 0x2e, 0x1f, + 0xb4, 0x2f, 0xcc, 0xc4, 0x31, 0x36, 0xb6, 0xcf, 0xaf, 0xc9, 0x5e, 0x0d, 0x06, 0x63, 0x4a, 0x4b, + 0x7f, 0xf9, 0xf2, 0xc9, 0x03, 0xce, 0xa4, 0x37, 0xd0, 0xd5, 0x07, 0x38, 0xef, 0x7f, 0xee, 0x24, + 0x1c, 0xc6, 0x70, 0xfb, 0x96, 0xe5, 0xc1, 0xaa, 0x8f, 0x63, 0x08, 0x19, 0xe6, 0x6d, 0x59, 0x20, + 0x18, 0xe8, 0xa2, 0x4c, 0x81, 0xcc, 0xd1, 0xb6, 0xc6, 0x2b, 0xde, 0x18, 0x72, 0x91, 0xee, 0xec, + 0xfb, 0xed, 0xf0, 0x60, 0x76, 0x53, 0x8a, 0x60, 0x4e, 0x02, 0xd2, 0x02, 0xab, 0x86, 0xe8, 0xc7, + 0x0f, 0x74, 0x40, 0xc2, 0x20, 0x83, 0xee, 0x52, 0x61, 0x81, 0x3a, 0x11, 0x90, 0xc5, 0x03, 0xef, + 0x78, 0x39, 0xbc, 0x39, 0x3b, 0x25, 0x6b, 0x48, 0x14, 0x25, 0xa0, 0xf0, 0x92, 0x4b, 0xc6, 0x41, + 0x79, 0xc3, 0x46, 0xc0, 0x5c, 0x22, 0xbe, 0x06, 0xfe, 0xfc, 0x60, 0x5b, 0x0d, 0x38, 0xc0, 0xb4, + 0xfa, 0xe0, 0xae, 0x71, 0x66, 0xae, 0xf1, 0x37, 0x23, 0x6a, 0xf1, 0x49, 0x95, 0x34, 0x46, 0xb4, + 0x86, 0x99, 0x9c, 0x5f, 0x87, 0xa9, 0x24, 0x43, 0x17, 0x79, 0x66, 0xa5, 0xc5, 0xf0, 0xc1, 0xb9, + 0x3b, 0x48, 0xd3, 0x10, 0x41, 0xe2, 0x0e, 0x20, 0x44, 0x63, 0x2a, 0xa1, 0x25, 0x10, 0x8d, 0x53, + 0xe8, 0xa8, 0xb0, 0x6a, 0xb4, 0x3f, 0xc1, 0x58, 0x28, 0xbc, 0xae, 0x17, 0xf3, 0x9a, 0xd0, 0x6a, + 0x25, 0xad, 0x10, 0x10, 0x19, 0x8f, 0x23, 0x8f, 0x6b, 0x2c, 0x8b, 0x00, 0xe4, 0xa6, 0x18, 0x62, + 0x90, 0xcf, 0x26, 0xe3, 0x64, 0x51, 0xd7, 0xbd, 0x85, 0x5d, 0x97, 0x93, 0x3e, 0xb1, 0x6a, 0x66, + 0x72, 0x84, 0x24, 0x60, 0x7e, 0x5f, 0xe3, 0xde, 0x57, 0x5f, 0x63, 0x76, 0x3d, 0xda, 0xec, 0xd0, + 0x7c, 0x86, 0x92, 0xe0, 0x99, 0xea, 0xf5, 0x32, 0x1d, 0xc3, 0x82, 0xe9, 0xe1, 0x65, 0x2b, 0xe5, + 0x22, 0xa2, 0xd5, 0xe4, 0x53, 0x53, 0xde, 0x2a, 0x49, 0xfe, 0xcb, 0x95, 0xb2, 0x85, 0x32, 0x7e, + 0x36, 0x92, 0x3f, 0xaf, 0xe2, 0xd7, 0xbf, 0x4c, 0x29, 0x5b, 0x86, 0x3c, 0x6a, 0xcd, 0xdd, 0x72, + 0xd3, 0xa2, 0x20, 0xa6, 0x53, 0xb9, 0x1a, 0x3c, 0x83, 0x7a, 0x3f, 0x11, 0x71, 0xe7, 0x62, 0xe2, + 0xe2, 0x1a, 0x26, 0x0b, 0x22, 0x46, 0xf8, 0x67, 0x76, 0x4b, 0x35, 0x5d, 0x33, 0x7f, 0xfd, 0x72, + 0xb7, 0xcc, 0xa0, 0x80, 0x09, 0x6b, 0x9f, 0x35, 0x40, 0x92, 0xc2, 0x1f, 0x28, 0x02, 0xb9, 0xe5, + 0x4f, 0xb0, 0x06, 0x98, 0x80, 0x4a, 0xc8, 0x8e, 0x00, 0x00, 0x15, 0x9b, 0xa5, 0x75, 0x98, 0x67, + 0x2e, 0x4d, 0x33, 0xd2, 0xc4, 0x87, 0x0e, 0xd3, 0xbf, 0x61, 0x53, 0xd0, 0xb6, 0x86, 0xdf, 0xb9, + 0xfc, 0x2c, 0x1d, 0x53, 0xbc, 0xd5, 0xb2, 0xf2, 0x17, 0x16, 0x71, 0x35, 0x54, 0x52, 0x54, 0xce, + 0xb4, 0x6a, 0x02, 0xaf, 0xb0, 0x46, 0x38, 0x8f, 0xd0, 0xa4, 0x28, 0xfa, 0x76, 0xcd, 0x9f, 0xdf, + 0x3c, 0x67, 0xf3, 0x9b, 0xd7, 0xf6, 0x37, 0xea, 0x5e, 0xb4, 0x89, 0xd7, 0x16, 0x37, 0xff, 0x98, + 0x6a, 0xb3, 0x6f, 0x59, 0xaf, 0xcd, 0x7f, 0x1a, 0xaa, 0x06, 0xfd, 0xe4, 0xcd, 0x40, 0xe4, 0x63, + 0x9f, 0xb3, 0x50, 0xfc, 0x67, 0x64, 0x74, 0x4e, 0xb9, 0x1d, 0xa9, 0xcb, 0x14, 0x1d, 0x1f, 0xad, + 0x96, 0x0b, 0x78, 0x15, 0xd9, 0x3c, 0x24, 0x1b, 0x4c, 0x92, 0x07, 0x62, 0xf6, 0x97, 0x2f, 0x5a, + 0x3a, 0xed, 0xe3, 0x4c, 0xdb, 0xcc, 0x97, 0x88, 0xe5, 0xb0, 0x06, 0xbf, 0x92, 0xac, 0x71, 0x34, + 0x8b, 0xa7, 0x35, 0x6e, 0x01, 0x24, 0xc7, 0x0e, 0x81, 0x52, 0x7f, 0xda, 0xd8, 0x52, 0xbd, 0xfd, + 0x53, 0xa2, 0x91, 0x18, 0x36, 0x3e, 0x11, 0xc8, 0xdf, 0xbd, 0x1f, 0xbf, 0x7e, 0x29, 0x9f, 0x10, + 0x3a, 0xd6, 0xb1, 0x15, 0x66, 0xc5, 0x40, 0xab, 0x90, 0x39, 0x9c, 0xfa, 0x1e, 0x56, 0xb9, 0x45, + 0xce, 0x8f, 0x54, 0x2a, 0x1b, 0xc2, 0xd1, 0xae, 0xd0, 0x1f, 0xb8, 0x9e, 0xd0, 0xd4, 0x04, 0x48, + 0x17, 0x2c, 0x10, 0xf7, 0x35, 0xd7, 0xcd, 0xe0, 0xc0, 0x56, 0x97, 0x40, 0xf9, 0xe9, 0x97, 0xc7, + 0xfd, 0xd9, 0x91, 0xa3, 0x63, 0xf4, 0x36, 0xe1, 0x8f, 0xa9, 0x4d, 0x64, 0x59, 0x4f, 0x9a, 0x7d, + 0xe2, 0x70, 0x64, 0x33, 0x73, 0x3b, 0xeb, 0x06, 0xf3, 0x6d, 0x04, 0x1a, 0xd1, 0x7c, 0x34, 0x90, + 0x3e, 0x7c, 0xf9, 0x42, 0xbb, 0xa2, 0xfd, 0x08, 0x9f, 0x32, 0x48, 0x29, 0x40, 0xec, 0xc1, 0x2b, + 0x0c, 0x3f, 0x6f, 0x3e, 0xbf, 0x34, 0xd4, 0x09, 0x7a, 0xef, 0x71, 0xe6, 0xf3, 0x20, 0xaf, 0xcd, + 0xbe, 0x71, 0xd0, 0xfc, 0xa4, 0x8c, 0xed, 0x72, 0xcd, 0x53, 0x6d, 0xfd, 0x4e, 0x35, 0x7c, 0x69, + 0x9d, 0x64, 0xfe, 0xf5, 0xeb, 0x93, 0x5f, 0x48, 0x62, 0x76, 0x74, 0x91, 0x2d, 0xa4, 0x6c, 0x53, + 0x00, 0x28, 0x44, 0xef, 0x9a, 0x29, 0xdc, 0x20, 0xf4, 0x33, 0xfa, 0xbd, 0xf1, 0x32, 0x20, 0x13, + 0x6f, 0x91, 0xbf, 0xd5, 0x54, 0x5b, 0xc3, 0x53, 0xc1, 0x90, 0x66, 0xca, 0xc1, 0xa3, 0x1d, 0x3e, + 0xbe, 0x1a, 0x71, 0x23, 0x9f, 0xc7, 0x4f, 0xfe, 0x57, 0xc3, 0xc7, 0xdd, 0xbb, 0x98, 0x7a, 0x35, + 0xb6, 0xb8, 0x67, 0xdc, 0x2c, 0x0c, 0x69, 0xc9, 0xde, 0x6e, 0xbd, 0x04, 0x94, 0x49, 0x35, 0x48, + 0xb4, 0x43, 0x6e, 0x68, 0x2c, 0xce, 0x78, 0x8a, 0x18, 0x93, 0x35, 0xaf, 0xe1, 0xdf, 0x4a, 0x75, + 0x4d, 0xb6, 0x7b, 0x14, 0x79, 0x9d, 0xfc, 0x87, 0xb2, 0x8d, 0x36, 0xd6, 0x5a, 0x3b, 0x56, 0xbf, + 0x0f, 0xe2, 0x0b, 0xae, 0x45, 0xf6, 0x04, 0x65, 0x36, 0x9e, 0x19, 0xdb, 0x3a, 0xdd, 0x50, 0xc7, + 0x3b, 0xa2, 0x9a, 0x96, 0xea, 0x00, 0x17, 0xe6, 0x3a, 0x62, 0x93, 0x31, 0x27, 0x3c, 0x38, 0xa4, + 0x04, 0xdc, 0x6f, 0x84, 0xa9, 0xb9, 0xe1, 0x39, 0x93, 0x69, 0xca, 0x5d, 0x26, 0xdc, 0x81, 0x82, + 0xc0, 0xb6, 0x5f, 0x36, 0x73, 0x0a, 0x21, 0x09, 0x64, 0xf0, 0x4c, 0xd8, 0x95, 0xa6, 0x33, 0xaa, + 0xf7, 0xfd, 0xe4, 0x5d, 0x2a, 0x49, 0x04, 0xe6, 0x96, 0x08, 0x44, 0xa9, 0x6d, 0x7d, 0xf5, 0x9d, + 0x42, 0xf8, 0x00, 0xab, 0x7c, 0x50, 0x62, 0x21, 0x87, 0x17, 0x8b, 0x88, 0x5f, 0xab, 0x5f, 0x17, + 0x78, 0x7f, 0x26, 0x1f, 0x91, 0x89, 0x46, 0x6c, 0x85, 0xf2, 0xb3, 0xcd, 0x9f, 0x1b, 0x66, 0x1a, + 0x26, 0xa0, 0x88, 0x1e, 0x17, 0x3d, 0x75, 0xa8, 0x09, 0xa6, 0xc5, 0x3a, 0xef, 0x0a, 0x13, 0xcd, + 0xfb, 0x04, 0x13, 0x8b, 0x05, 0x1c, 0x05, 0x21, 0xd9, 0xd1, 0x84, 0x91, 0xea, 0xa2, 0xf3, 0x86, + 0xee, 0xba, 0x03, 0x8d, 0x88, 0xdd, 0x38, 0x91, 0x26, 0xc0, 0x2e, 0xfd, 0x52, 0xb0, 0x98, 0xa1, + 0x0c, 0x00, 0x50, 0x45, 0xf4, 0x13, 0xc0, 0x7f, 0xa2, 0x4c, 0xeb, 0x38, 0x04, 0xce, 0x83, 0x71, + 0xab, 0x19, 0x28, 0xdd, 0x15, 0x50, 0x28, 0x18, 0xd8, 0xac, 0x28, 0x39, 0x2d, 0x86, 0x82, 0x92, + 0x8a, 0x09, 0x43, 0xdd, 0x1a, 0xb8, 0xd4, 0xa3, 0xc6, 0x30, 0x54, 0x6a, 0xe6, 0x1f, 0xc2, 0x72, + 0x89, 0x81, 0x77, 0x89, 0x97, 0xc8, 0x7f, 0x31, 0x05, 0x41, 0x48, 0x35, 0xd4, 0x21, 0xb6, 0x40, + 0xf5, 0x61, 0x8c, 0x74, 0xc3, 0x20, 0xae, 0xf6, 0x02, 0xba, 0xe0, 0x12, 0x77, 0x24, 0x8b, 0x4d, + 0x79, 0x8d, 0xf8, 0x4c, 0xd0, 0x2a, 0x25, 0xe8, 0xd7, 0x21, 0x6b, 0x84, 0xea, 0x37, 0xc3, 0xa2, + 0x5e, 0x15, 0x68, 0xb0, 0x16, 0x5e, 0x4c, 0x6b, 0x04, 0xec, 0xd2, 0xb2, 0xda, 0xe8, 0x5c, 0xe2, + 0x81, 0xea, 0x88, 0x9d, 0xf8, 0xfa, 0xcd, 0xbf, 0xd0, 0x8d, 0x7a, 0xbe, 0xb6, 0xc8, 0xe1, 0x34, + 0x3f, 0x6d, 0x33, 0x68, 0x56, 0x82, 0xcb, 0x0e, 0xb9, 0x7d, 0x94, 0x77, 0xd4, 0xa2, 0x44, 0x8e, + 0x6e, 0xad, 0xf6, 0x24, 0x42, 0x88, 0x81, 0xb7, 0xc8, 0x57, 0x49, 0x26, 0x68, 0x24, 0xbe, 0x1b, + 0x22, 0x15, 0xb4, 0x99, 0x3b, 0x32, 0xc7, 0xda, 0x4c, 0x39, 0x90, 0xb9, 0xc8, 0x2c, 0xa1, 0x8c, + 0xb6, 0xe6, 0xc6, 0x94, 0x7c, 0x9f, 0x36, 0x34, 0x62, 0x02, 0x20, 0xbc, 0x03, 0xb8, 0x2f, 0xfa, + 0x06, 0xd4, 0x88, 0xae, 0x42, 0x9e, 0x37, 0x15, 0xc9, 0x9f, 0xb8, 0x96, 0x3d, 0xc0, 0x98, 0x13, + 0x7e, 0xb1, 0x4f, 0x4c, 0xa7, 0x41, 0xd7, 0x01, 0xf8, 0x95, 0x87, 0x96, 0xde, 0x16, 0x40, 0xfc, + 0xdf, 0x48, 0x81, 0xc8, 0x0a, 0x09, 0x9f, 0x6a, 0xec, 0x2b, 0x88, 0x1d, 0xcb, 0x94, 0x49, 0xa2, + 0x4b, 0x32, 0x52, 0x79, 0x47, 0x95, 0x4c, 0x81, 0x2e, 0xf1, 0x02, 0x2b, 0x74, 0x4c, 0xa6, 0x92, + 0x03, 0x15, 0x93, 0xd3, 0x31, 0xa9, 0x43, 0x84, 0x16, 0x69, 0x62, 0xbc, 0x0b, 0x51, 0x7d, 0x93, + 0x17, 0x5d, 0x49, 0xe7, 0xb8, 0x19, 0x0f, 0x82, 0x6c, 0x5c, 0x91, 0xc4, 0xdd, 0xa1, 0x50, 0x5c, + 0xd2, 0x80, 0xd3, 0x48, 0x71, 0x33, 0x4a, 0xa0, 0xc8, 0xf9, 0x28, 0x7e, 0x17, 0x0f, 0xd8, 0x8f, + 0xac, 0xef, 0x32, 0xf3, 0xcf, 0x20, 0x82, 0xfa, 0x81, 0x30, 0xa6, 0x0f, 0x6a, 0x8d, 0xa3, 0x63, + 0x83, 0xa4, 0x10, 0x19, 0xc1, 0x59, 0xfc, 0x65, 0xd8, 0x48, 0xe8, 0x3d, 0xaa, 0x7a, 0xdc, 0xde, + 0x4d, 0xac, 0xef, 0xa0, 0xa2, 0xfe, 0x5e, 0xaf, 0x99, 0x37, 0xd8, 0x3f, 0xd3, 0x69, 0xed, 0x9d, + 0x4e, 0x33, 0x27, 0xee, 0x7f, 0xbc, 0xcf, 0x44, 0xe9, 0xfe, 0xbd, 0x7e, 0x53, 0x1f, 0x9e, 0x7f, + 0xa6, 0xdb, 0x29, 0xe6, 0x10, 0xa4, 0x11, 0x4b, 0x67, 0xc6, 0xed, 0xe9, 0x1d, 0xcc, 0x4a, 0x53, + 0x33, 0x03, 0x93, 0x26, 0x88, 0xff, 0xb1, 0xf1, 0x69, 0x43, 0x11, 0xa3, 0x7d, 0x0f, 0x5d, 0x89, + 0xfe, 0x06, 0x16, 0x70, 0xf5, 0xc2, 0xd6, 0xb0, 0xd9, 0x20, 0xdb, 0x57, 0xa7, 0x00, 0x29, 0xf4, + 0xc6, 0xf0, 0xd1, 0x7e, 0x75, 0x1a, 0x2c, 0xe2, 0xb0, 0x6a, 0x02, 0xc3, 0x81, 0x8c, 0xfe, 0xb2, + 0xa8, 0x00, 0xc2, 0x02, 0x81, 0xd3, 0xa2, 0x9f, 0x60, 0xa5, 0x02, 0x4d, 0x04, 0x3d, 0x29, 0x6a, + 0x9b, 0xda, 0x77, 0xe5, 0xc7, 0xa6, 0x07, 0x7f, 0xa0, 0xeb, 0xc8, 0x77, 0x93, 0xce, 0x8a, 0x5c, + 0xa1, 0xf3, 0x10, 0x19, 0x0a, 0xf4, 0x57, 0xff, 0x8a, 0xed, 0x20, 0x98, 0x90, 0xa0, 0xc4, 0xcf, + 0x05, 0x2c, 0x78, 0xec, 0x0a, 0x78, 0xff, 0x1e, 0x0b, 0x2e, 0x02, 0xb2, 0x32, 0x54, 0x31, 0x7b, + 0x35, 0x9a, 0xa2, 0x1f, 0xce, 0x07, 0x93, 0xf2, 0x3f, 0xb6, 0xf0, 0x0f, 0x0a, 0x25, 0x51, 0x77, + 0x38, 0xca, 0x4a, 0x52, 0xac, 0x98, 0xb4, 0x41, 0xa4, 0xed, 0xef, 0xb9, 0x1f, 0xb3, 0x80, 0x67, + 0xff, 0xdc, 0xa0, 0x6c, 0xfa, 0xd5, 0x88, 0x04, 0x42, 0x20, 0x5a, 0xbc, 0x7f, 0xaf, 0x01, 0x8c, + 0x05, 0x74, 0x41, 0x13, 0x12, 0x73, 0x06, 0xda, 0x55, 0x90, 0x99, 0x87, 0xc8, 0xa9, 0xc4, 0xb3, + 0x39, 0x7c, 0x07, 0x2c, 0xde, 0xe7, 0xee, 0x29, 0xca, 0x16, 0x39, 0x9b, 0xe0, 0x72, 0x99, 0x45, + 0xa2, 0xc2, 0xa1, 0x34, 0x65, 0xf2, 0x1e, 0x15, 0xd0, 0x94, 0x1f, 0x4c, 0x94, 0x04, 0x6d, 0xc8, + 0x8d, 0xcf, 0x32, 0x5a, 0x00, 0x94, 0x75, 0x32, 0x78, 0xad, 0xbe, 0x7d, 0x29, 0xf9, 0xf4, 0x40, + 0x85, 0x1c, 0x24, 0x0c, 0xce, 0x30, 0x9f, 0x62, 0x4e, 0x69, 0x2e, 0x1d, 0x29, 0x22, 0xc2, 0x52, + 0xc7, 0x14, 0x34, 0xbc, 0x4b, 0x12, 0x2e, 0x6f, 0xba, 0x09, 0x8a, 0x02, 0x6e, 0x1f, 0x68, 0xa1, + 0xda, 0x88, 0x86, 0x7a, 0x6a, 0x26, 0x50, 0x6b, 0x98, 0x13, 0x64, 0xc6, 0x0d, 0x15, 0xd6, 0x2c, + 0x20, 0x1b, 0x7b, 0xe0, 0xf6, 0x52, 0xdf, 0x35, 0x59, 0x95, 0x7d, 0xc9, 0x1d, 0x2d, 0xf2, 0x34, + 0x19, 0x98, 0x80, 0x97, 0x4e, 0x10, 0xb4, 0x48, 0xc4, 0x08, 0x9f, 0x06, 0xb4, 0x99, 0x25, 0x6e, + 0xfe, 0x0c, 0xed, 0x7e, 0xb6, 0xde, 0x46, 0x99, 0x2d, 0x5e, 0x4e, 0x0f, 0xf4, 0x2e, 0x5c, 0x8f, + 0x7f, 0x26, 0x40, 0x26, 0x37, 0x7e, 0x06, 0xd1, 0x22, 0x92, 0x29, 0x47, 0x9b, 0x49, 0x08, 0x26, + 0xa2, 0x0b, 0x6c, 0x89, 0x81, 0xc7, 0xed, 0xd7, 0x68, 0xcc, 0x9c, 0xaf, 0xd4, 0xfd, 0xb8, 0xb0, + 0x4e, 0xbc, 0x6e, 0x51, 0xcb, 0x99, 0xf9, 0x5a, 0x8b, 0x26, 0xcd, 0x40, 0xd6, 0x88, 0xbb, 0xea, + 0x06, 0xf7, 0x6c, 0x08, 0x1d, 0xc3, 0xe1, 0x7a, 0x68, 0xe2, 0x87, 0xe8, 0x11, 0xe9, 0x86, 0x06, + 0x0a, 0x01, 0x7c, 0x4b, 0xe7, 0x14, 0x65, 0xe6, 0x87, 0xcd, 0x69, 0xb1, 0x38, 0xdd, 0xa4, 0x8f, + 0x49, 0xf0, 0x63, 0xc0, 0xd1, 0x01, 0xcf, 0x87, 0xc1, 0x81, 0xa7, 0xd4, 0x1b, 0x87, 0x5e, 0x58, + 0x2f, 0x11, 0xe8, 0x08, 0x37, 0x36, 0x22, 0xa0, 0x73, 0xf2, 0x21, 0x38, 0x7c, 0xd8, 0x01, 0xe8, + 0xa0, 0x45, 0x0c, 0xfb, 0xc4, 0xb9, 0x31, 0x9d, 0x9e, 0x2d, 0x10, 0x8a, 0x3c, 0xf2, 0x7d, 0x53, + 0xd9, 0x4a, 0x11, 0xe1, 0x86, 0x48, 0x27, 0x5f, 0xbe, 0x28, 0xec, 0x37, 0xb5, 0xd8, 0x93, 0x01, + 0xed, 0xb2, 0x28, 0x45, 0xb0, 0xa9, 0x00, 0x54, 0x47, 0xbc, 0x2b, 0x17, 0xe7, 0x9f, 0xf3, 0x7a, + 0xa0, 0x33, 0x42, 0xf2, 0x4d, 0xc0, 0x08, 0xab, 0x1a, 0x11, 0x2e, 0x02, 0x7b, 0xf1, 0x65, 0x3d, + 0x15, 0xae, 0x51, 0xc8, 0x2c, 0x29, 0x5b, 0xe0, 0xe4, 0x0c, 0x4e, 0x70, 0x93, 0x51, 0xe3, 0xe6, + 0xb5, 0x40, 0x32, 0x31, 0x3a, 0x16, 0xd9, 0x6a, 0xf3, 0x3d, 0x39, 0x35, 0x36, 0x53, 0xb5, 0x0c, + 0x52, 0x20, 0x65, 0x1c, 0xe1, 0xe9, 0x9a, 0x28, 0x82, 0xb4, 0x0c, 0x06, 0x9d, 0x26, 0xca, 0x89, + 0x98, 0xc2, 0x90, 0xf1, 0x12, 0xa8, 0xb8, 0x1e, 0xd9, 0xa5, 0xf0, 0x13, 0x59, 0x4a, 0x3b, 0x43, + 0x79, 0xa3, 0x17, 0x3a, 0xb6, 0x6a, 0xc4, 0x9b, 0x03, 0xa6, 0x0b, 0xbc, 0x44, 0x7c, 0x70, 0xd1, + 0x6f, 0xc7, 0xf1, 0xdd, 0x5c, 0x59, 0x2e, 0x78, 0x83, 0xa1, 0x24, 0x7e, 0xa8, 0x5a, 0xa6, 0xe3, + 0x66, 0x50, 0x38, 0xeb, 0x8f, 0xc2, 0xaf, 0x80, 0xba, 0xf1, 0x56, 0xe4, 0x2d, 0x33, 0xaa, 0x12, + 0x3f, 0xd4, 0x65, 0x59, 0x7a, 0x90, 0x25, 0x85, 0x7e, 0xab, 0xfd, 0x11, 0x7a, 0x33, 0xf5, 0x71, + 0x4d, 0xf9, 0xf5, 0x0b, 0x45, 0xff, 0x33, 0xe2, 0x06, 0x2f, 0xe6, 0x77, 0x85, 0x88, 0x4a, 0xc7, + 0x10, 0xed, 0x23, 0x8d, 0xe3, 0x69, 0xd0, 0x2a, 0x47, 0xd3, 0x7a, 0x9a, 0x6a, 0x67, 0x73, 0x5a, + 0x61, 0xc3, 0xad, 0xb9, 0x19, 0xcf, 0xda, 0xd7, 0xc7, 0x5a, 0x3b, 0x95, 0x93, 0x18, 0x1f, 0x63, + 0x95, 0xdb, 0x23, 0x47, 0x36, 0x6a, 0xe2, 0xb9, 0xe5, 0x09, 0x78, 0x4b, 0x33, 0x81, 0xd8, 0x16, + 0x37, 0xcc, 0x4d, 0x28, 0xb8, 0x65, 0xd4, 0x52, 0x26, 0xfc, 0x3f, 0x5b, 0x83, 0x17, 0x29, 0x00, + 0x01, 0xdf, 0x94, 0x2d, 0xa5, 0x9a, 0x93, 0x40, 0x08, 0x10, 0xea, 0x62, 0xd5, 0x24, 0xce, 0x57, + 0x24, 0x6f, 0x49, 0xf9, 0x8b, 0x58, 0xb5, 0x88, 0x5d, 0x14, 0x0a, 0xc2, 0x10, 0x63, 0xa6, 0x7e, + 0x5d, 0xf4, 0x79, 0x1d, 0x5d, 0x38, 0xb5, 0xcc, 0x40, 0x42, 0x2e, 0x8a, 0x53, 0xd0, 0xfb, 0x0e, + 0x18, 0xff, 0x01, 0xba, 0x4a, 0x5c, 0xde, 0x81, 0x3c, 0x92, 0x0b, 0xac, 0x71, 0x4b, 0x4d, 0xd7, + 0x7c, 0x73, 0x12, 0x64, 0x25, 0x5b, 0x74, 0xc8, 0x5b, 0xab, 0xd1, 0x74, 0x5a, 0x83, 0x55, 0x13, + 0x4f, 0x06, 0x83, 0x9e, 0xfa, 0x32, 0x10, 0x41, 0xbd, 0x06, 0x4d, 0x29, 0x43, 0xec, 0xe4, 0xee, + 0xbd, 0xee, 0xf5, 0x52, 0x78, 0x06, 0xb4, 0x90, 0x21, 0x96, 0x44, 0xc8, 0x77, 0x63, 0xbd, 0xe8, + 0x22, 0x4a, 0x22, 0x98, 0x4b, 0x87, 0x99, 0x3e, 0x20, 0x68, 0x5e, 0x6d, 0x1a, 0x7e, 0x8e, 0xeb, + 0xc9, 0xe0, 0x99, 0xd8, 0xc2, 0xb4, 0x4c, 0xcb, 0x24, 0x49, 0xf8, 0x40, 0x19, 0xe5, 0x10, 0xa6, + 0x32, 0x96, 0x9c, 0x09, 0xb0, 0xc4, 0x5a, 0xb3, 0x40, 0x39, 0xfc, 0x46, 0xae, 0x52, 0x81, 0x89, + 0xfd, 0xc7, 0x54, 0x9d, 0xe1, 0x5f, 0xbf, 0x89, 0xe2, 0xf6, 0x40, 0x37, 0x70, 0x9f, 0x34, 0x33, + 0xd4, 0xdb, 0x52, 0xf4, 0x53, 0x43, 0xef, 0x82, 0x8c, 0x42, 0xfc, 0xdf, 0x51, 0x9a, 0xc0, 0x4c, + 0x23, 0xbd, 0xa3, 0x67, 0x5c, 0x92, 0x9e, 0x16, 0xff, 0x14, 0x88, 0x0f, 0x21, 0x49, 0x73, 0x5c, + 0x57, 0x97, 0x45, 0xa1, 0xbd, 0xdd, 0x97, 0xc4, 0x18, 0x98, 0x5b, 0x1b, 0xed, 0x94, 0xa0, 0x59, + 0x45, 0x6d, 0x96, 0x99, 0x01, 0x49, 0x97, 0x62, 0xb9, 0x31, 0x14, 0x88, 0x80, 0x44, 0x02, 0x24, + 0x03, 0x00, 0x5f, 0xb6, 0x19, 0x38, 0x2d, 0x63, 0xbb, 0x8e, 0xda, 0xdf, 0x8a, 0x66, 0xbc, 0x6c, + 0x5c, 0xd7, 0xcf, 0x44, 0x39, 0xc5, 0xbe, 0x66, 0x73, 0x4a, 0xbe, 0x28, 0x71, 0x64, 0xc5, 0x20, + 0x20, 0x47, 0x8f, 0xd4, 0xb2, 0x07, 0x53, 0xb9, 0x8f, 0x44, 0x25, 0x30, 0x77, 0x73, 0x51, 0x36, + 0x62, 0x0d, 0xa9, 0x03, 0x1a, 0x81, 0x11, 0x09, 0xfb, 0x97, 0x0d, 0xec, 0x39, 0xa1, 0xcb, 0x8e, + 0xed, 0xc6, 0x72, 0x9d, 0xd5, 0x77, 0x04, 0x10, 0x3b, 0xf0, 0x98, 0x04, 0xe6, 0xea, 0xab, 0xad, + 0x78, 0x7f, 0x74, 0x43, 0x73, 0x27, 0x2e, 0xb0, 0x32, 0xfc, 0x0e, 0xf3, 0x72, 0x00, 0x42, 0x2a, + 0xa2, 0x0d, 0x1e, 0xbd, 0x34, 0x36, 0x0f, 0xb1, 0xc8, 0xd1, 0x27, 0x30, 0xe2, 0xbf, 0x68, 0xc6, + 0x2c, 0xcd, 0x04, 0xb4, 0xfa, 0xe7, 0x1c, 0x52, 0xf7, 0xcc, 0xa1, 0xee, 0x58, 0x66, 0x9f, 0x34, + 0x5d, 0xcb, 0xe0, 0x11, 0x57, 0x62, 0x61, 0x45, 0x57, 0x3b, 0x47, 0x83, 0x47, 0x32, 0x34, 0xc6, + 0x48, 0xb7, 0xd1, 0xa3, 0x13, 0x0b, 0x83, 0x06, 0x4d, 0x68, 0xe0, 0x27, 0x55, 0x71, 0x5f, 0x86, + 0x51, 0x4e, 0x45, 0xe4, 0x07, 0x22, 0x0e, 0xa0, 0x86, 0x1e, 0x66, 0x59, 0xe0, 0x27, 0x1b, 0x3b, + 0x88, 0x2e, 0x51, 0x37, 0x00, 0xdf, 0xa1, 0xd3, 0xb7, 0x2c, 0xb0, 0x92, 0x0d, 0x1d, 0xb7, 0x35, + 0xba, 0x1b, 0x9e, 0xef, 0x98, 0xc6, 0x4e, 0xc2, 0xf3, 0x7b, 0xc8, 0x3e, 0xe3, 0xf0, 0xcf, 0x64, + 0xf2, 0xcc, 0x83, 0x88, 0x29, 0x6e, 0xcd, 0x67, 0xc0, 0x81, 0xa8, 0x83, 0x67, 0x34, 0x52, 0xfc, + 0x89, 0x80, 0xe8, 0x31, 0x00, 0xe6, 0xfd, 0x8f, 0x6b, 0x49, 0x97, 0x09, 0x42, 0x7e, 0xe6, 0x74, + 0x9a, 0xc0, 0x34, 0x42, 0xd1, 0xc7, 0xcc, 0x00, 0xfd, 0x6f, 0x18, 0xb8, 0x8f, 0x16, 0x02, 0x21, + 0x8b, 0x18, 0x07, 0xd3, 0x48, 0x03, 0x49, 0x19, 0x9b, 0x08, 0x18, 0x3f, 0x21, 0x7c, 0x43, 0x22, + 0x90, 0x54, 0x6a, 0x41, 0x03, 0xf8, 0xa0, 0x8e, 0x48, 0xb2, 0x55, 0xfb, 0xf4, 0x49, 0x45, 0x6b, + 0x74, 0xf2, 0xd6, 0x41, 0x20, 0x75, 0xfe, 0xfa, 0x85, 0x2e, 0xc5, 0xc6, 0x97, 0x2f, 0xbc, 0x73, + 0x20, 0x7c, 0x46, 0xb7, 0x88, 0x9f, 0xfc, 0xe9, 0x76, 0x10, 0x2f, 0x8c, 0x59, 0x78, 0x10, 0xbe, + 0xe9, 0x8a, 0xc4, 0x06, 0xb2, 0x40, 0x70, 0x00, 0xfe, 0x29, 0xfc, 0x31, 0x35, 0x33, 0x96, 0xb9, + 0x85, 0xbb, 0x5a, 0x22, 0x95, 0xb1, 0x83, 0xd5, 0xde, 0x98, 0x41, 0x86, 0xa8, 0xe4, 0x04, 0x5d, + 0xb9, 0x1c, 0x39, 0x29, 0xfc, 0x26, 0x85, 0x97, 0xc3, 0x30, 0x31, 0x62, 0x59, 0x8c, 0x04, 0x6a, + 0x89, 0xe1, 0xe2, 0x55, 0xd0, 0x0a, 0x48, 0xb0, 0xe5, 0xa5, 0x81, 0x12, 0xa0, 0x46, 0x74, 0xa6, + 0xa5, 0x35, 0xfe, 0x4e, 0xcc, 0x8a, 0x05, 0xb7, 0x49, 0x60, 0x7f, 0xa1, 0x56, 0xe8, 0x67, 0x96, + 0x35, 0xea, 0xbd, 0xf8, 0x15, 0xa4, 0x67, 0x81, 0x08, 0xc6, 0x24, 0x1e, 0x07, 0xf0, 0x4e, 0x43, + 0x33, 0x45, 0x42, 0x31, 0xb1, 0x0b, 0xac, 0xf1, 0xd0, 0x17, 0x9e, 0xea, 0xd1, 0x04, 0x14, 0x2e, + 0xcf, 0xb6, 0x44, 0xdc, 0xf8, 0xd0, 0x1d, 0x6a, 0x1f, 0x15, 0x67, 0x0b, 0x82, 0x48, 0x71, 0x78, + 0x01, 0x38, 0x31, 0x3c, 0x00, 0x40, 0x1f, 0x09, 0xd8, 0x05, 0xc8, 0xb0, 0x25, 0xb2, 0xeb, 0xd7, + 0xc8, 0xb8, 0x6d, 0xbe, 0x13, 0x53, 0xca, 0x0f, 0xd7, 0x04, 0xa2, 0xf5, 0x3b, 0x4d, 0x3f, 0xd3, + 0x51, 0x34, 0x7a, 0xbf, 0x8d, 0xfd, 0xf8, 0x95, 0x1f, 0x67, 0x3a, 0xdf, 0xc2, 0xbe, 0xfe, 0x77, + 0x1b, 0xd8, 0x26, 0x87, 0x66, 0xc8, 0x6a, 0xeb, 0x9e, 0xc1, 0xec, 0x68, 0x7f, 0x0c, 0xd7, 0x1f, + 0xc0, 0xea, 0xe3, 0x3c, 0x52, 0x1f, 0x23, 0x58, 0x7d, 0xfc, 0xbb, 0x6d, 0xb6, 0xff, 0x29, 0xa4, + 0x3e, 0xce, 0x21, 0x35, 0xd2, 0xc2, 0xfe, 0xdf, 0x6d, 0x21, 0xe5, 0x3f, 0xdd, 0x28, 0xbb, 0x20, + 0x35, 0xaa, 0x36, 0x06, 0x54, 0x23, 0xd1, 0xc1, 0xe0, 0xb9, 0x26, 0xb2, 0x04, 0x5f, 0xc5, 0xc7, + 0x1b, 0x7d, 0x59, 0xbc, 0x94, 0x3d, 0xc2, 0x90, 0x84, 0xdc, 0xae, 0xb0, 0xff, 0x10, 0x9a, 0x57, + 0xf9, 0xf9, 0xa3, 0x19, 0xab, 0x36, 0xd4, 0x4d, 0x77, 0x06, 0xa2, 0xa9, 0x91, 0x3a, 0xed, 0x5c, + 0x3e, 0xde, 0x4f, 0x48, 0xf2, 0xf9, 0x0a, 0x81, 0x2b, 0x7c, 0xb3, 0x6c, 0xc2, 0xf2, 0xc3, 0x7b, + 0x45, 0xfe, 0x98, 0x02, 0x1b, 0x04, 0x1c, 0x40, 0xd6, 0x2d, 0xdc, 0xb6, 0xa3, 0xc7, 0xc2, 0x28, + 0x1e, 0xce, 0x2d, 0x53, 0xfb, 0x96, 0xa5, 0x45, 0x92, 0x01, 0xe4, 0x10, 0x40, 0x6e, 0x21, 0x80, + 0x6d, 0xd5, 0x59, 0x5e, 0x3e, 0x8f, 0xe5, 0xf3, 0x0b, 0xcb, 0xd7, 0x9d, 0xd6, 0xf2, 0xf2, 0x05, + 0x2c, 0x5f, 0x58, 0x58, 0x7e, 0x87, 0x9c, 0x90, 0x8c, 0x82, 0x80, 0x41, 0x24, 0x79, 0xe6, 0x38, + 0xd1, 0x4f, 0x79, 0xc0, 0x46, 0x92, 0x8c, 0x9b, 0x6b, 0x22, 0x6e, 0x5d, 0xbd, 0x9f, 0x38, 0x6c, + 0x0d, 0x14, 0x18, 0x04, 0xf8, 0xfa, 0x2f, 0x8d, 0x19, 0x05, 0x1f, 0xe5, 0xcd, 0x0d, 0xbd, 0xff, + 0xc1, 0x31, 0xc3, 0xd2, 0xf3, 0x28, 0xd7, 0x54, 0x58, 0xf4, 0xcd, 0x8f, 0x0e, 0x5b, 0x22, 0x8c, + 0x7b, 0xed, 0x5e, 0x37, 0x8c, 0x6b, 0xab, 0xf5, 0xf2, 0x68, 0x0d, 0x3e, 0x3a, 0x80, 0x89, 0x90, + 0x6e, 0x73, 0xca, 0x7f, 0x16, 0x3e, 0x3a, 0x84, 0x0b, 0x20, 0x14, 0xe3, 0x10, 0x16, 0x8f, 0xe0, + 0x46, 0xdc, 0x62, 0x81, 0x77, 0x84, 0xa3, 0xda, 0x0d, 0x55, 0x80, 0x7c, 0x81, 0x42, 0x22, 0x48, + 0x01, 0x5a, 0x77, 0x4b, 0x8c, 0x54, 0x02, 0x5f, 0xad, 0xad, 0x50, 0x34, 0x98, 0x5b, 0xb2, 0xc9, + 0x48, 0x24, 0xb1, 0x22, 0x1a, 0x7b, 0x93, 0x89, 0x03, 0xef, 0xb1, 0x21, 0x57, 0x33, 0xa2, 0x63, + 0x8d, 0x42, 0x0c, 0xcf, 0x87, 0x20, 0x25, 0xc6, 0x88, 0x08, 0xe0, 0xe5, 0xcc, 0x88, 0xac, 0x9f, + 0x94, 0x1f, 0x2d, 0xb1, 0x66, 0x38, 0x6f, 0x91, 0xa6, 0x90, 0xf7, 0xd0, 0x96, 0x81, 0xee, 0x41, + 0x44, 0x70, 0x84, 0x5f, 0xe6, 0x72, 0x96, 0x92, 0x36, 0xc2, 0xe0, 0x80, 0xa4, 0x8d, 0x1b, 0x44, + 0x36, 0xc1, 0x76, 0x42, 0xe9, 0x2d, 0x97, 0x29, 0xd7, 0xf4, 0x17, 0xc0, 0x82, 0x28, 0x05, 0x28, + 0x2c, 0xe6, 0xf0, 0x9c, 0x07, 0x46, 0x78, 0xc2, 0x9f, 0x42, 0xbe, 0x24, 0xce, 0x92, 0x0c, 0x22, + 0x90, 0x7f, 0xce, 0x82, 0x84, 0xd8, 0xd8, 0x1b, 0xf3, 0xa4, 0x8f, 0x75, 0x99, 0x5b, 0xf0, 0xaf, + 0xea, 0xc7, 0x36, 0x02, 0x29, 0xdb, 0x98, 0x25, 0x0a, 0x5f, 0xf3, 0x56, 0x21, 0xd6, 0xd5, 0xc5, + 0x76, 0x21, 0x23, 0x6e, 0x13, 0x0a, 0x44, 0x91, 0x0f, 0x9b, 0x85, 0x8c, 0x44, 0x93, 0x90, 0x91, + 0x60, 0x0e, 0xfa, 0x63, 0x1a, 0x3f, 0x83, 0xa2, 0x53, 0xcd, 0x28, 0x8e, 0x17, 0xdd, 0x8c, 0x34, + 0x1f, 0x5e, 0xe7, 0xc9, 0x2b, 0x12, 0x0c, 0xdb, 0xf6, 0xc6, 0x9e, 0x10, 0xc8, 0x79, 0x5c, 0x51, + 0x2f, 0x31, 0x10, 0x76, 0x18, 0x07, 0xbb, 0x90, 0xe7, 0xe5, 0x37, 0x86, 0x68, 0xa4, 0xfc, 0x48, + 0x70, 0x21, 0x12, 0x54, 0x5b, 0xc0, 0xd1, 0xca, 0x64, 0x32, 0x22, 0x95, 0xef, 0xa8, 0x4a, 0x1b, + 0x20, 0x08, 0xf4, 0x02, 0x12, 0xbd, 0xc9, 0x63, 0x4d, 0xf5, 0x7c, 0x8e, 0xe8, 0xb5, 0x37, 0x99, + 0xac, 0xd6, 0x40, 0x9d, 0x5b, 0x78, 0xc0, 0xcd, 0x56, 0xf2, 0x74, 0xba, 0xb7, 0x2b, 0x52, 0x07, + 0x8e, 0x58, 0x4e, 0x1e, 0x4b, 0xd0, 0xce, 0x2d, 0xf1, 0x1e, 0xaf, 0xad, 0x24, 0xe5, 0x2c, 0x1b, + 0x01, 0xcc, 0x65, 0xa0, 0xe1, 0x14, 0x40, 0xb1, 0xf0, 0x33, 0x2d, 0x84, 0x8d, 0x12, 0xe3, 0x45, + 0xa7, 0x83, 0x0e, 0xdd, 0xe1, 0x77, 0xe2, 0x40, 0x32, 0xd7, 0x6c, 0x86, 0xee, 0xa8, 0x14, 0x8d, + 0x7d, 0x8c, 0x8e, 0x8e, 0xbb, 0x34, 0xda, 0xd4, 0x1f, 0x53, 0x34, 0xdf, 0x6c, 0xf5, 0x47, 0x55, + 0xdf, 0xac, 0x24, 0xad, 0xe6, 0x66, 0x11, 0xa9, 0x99, 0xd8, 0x22, 0x66, 0x73, 0x32, 0xf8, 0xa9, + 0x66, 0x86, 0xd2, 0x79, 0x10, 0xe2, 0x1c, 0x2a, 0xa5, 0x21, 0xce, 0x19, 0x89, 0x45, 0xfb, 0xf8, + 0xc1, 0x26, 0x6b, 0xbf, 0xdd, 0xe4, 0x54, 0x1c, 0xe5, 0xac, 0xd9, 0x55, 0x45, 0x8a, 0x77, 0xc6, + 0xb2, 0xdf, 0xc9, 0xfd, 0xaf, 0xf7, 0xd3, 0xdf, 0xf8, 0xe7, 0x6e, 0x39, 0x46, 0xc6, 0xe5, 0x78, + 0x1b, 0xa2, 0x4f, 0x42, 0x69, 0x62, 0x7b, 0x11, 0xd3, 0x0e, 0x92, 0xf3, 0x62, 0xb4, 0xf8, 0x7a, + 0x04, 0x59, 0xd0, 0xe7, 0x78, 0xbe, 0xd5, 0x89, 0x23, 0x8a, 0xeb, 0xa9, 0xd5, 0x59, 0xd6, 0x97, + 0xcd, 0x79, 0xe2, 0x62, 0x55, 0x31, 0x5f, 0xa7, 0x4d, 0x3a, 0x09, 0x1e, 0x7d, 0x07, 0x27, 0x68, + 0xeb, 0x1c, 0xda, 0xc4, 0x43, 0x72, 0xe5, 0xb2, 0x4f, 0xd4, 0x8f, 0xa2, 0x94, 0xfe, 0x1a, 0xe4, + 0x0f, 0x5d, 0x9f, 0x7c, 0x88, 0x1f, 0x18, 0xfd, 0xaf, 0x69, 0x23, 0xfd, 0xd5, 0x7d, 0x5c, 0x3a, + 0xfe, 0x5f, 0xd3, 0xa9, 0x7e, 0x6f, 0x35, 0x07, 0x75, 0x05, 0xfd, 0xfd, 0x9a, 0x66, 0x23, 0xf8, + 0x88, 0x89, 0x09, 0x9d, 0x26, 0x70, 0x17, 0x8c, 0x20, 0xfb, 0xb6, 0x19, 0xb6, 0xfc, 0x83, 0xed, + 0xd4, 0x3e, 0xd2, 0xce, 0x45, 0xb4, 0xf6, 0x58, 0x45, 0x33, 0x23, 0xdf, 0x85, 0x14, 0xa5, 0xce, + 0xc7, 0xf7, 0x8b, 0xfc, 0x8b, 0x1d, 0x5c, 0x46, 0x9e, 0x5f, 0xd3, 0xb6, 0x4f, 0x9a, 0x6d, 0x78, + 0x08, 0xc6, 0x50, 0x64, 0x2b, 0x41, 0x94, 0x05, 0x1d, 0x60, 0x00, 0x19, 0xdd, 0xec, 0x46, 0x67, + 0x79, 0x03, 0x9d, 0x8f, 0xe3, 0x89, 0xff, 0x65, 0x5c, 0x68, 0x7d, 0x5a, 0x5d, 0xad, 0xa3, 0xf7, + 0xfb, 0xea, 0x2a, 0xbc, 0x69, 0xff, 0x0c, 0x7b, 0xeb, 0x3a, 0x76, 0xe2, 0x28, 0xe4, 0x78, 0xc3, + 0x00, 0x37, 0x2d, 0x20, 0xff, 0x7f, 0x57, 0x5e, 0xe6, 0xda, 0xad, 0xa5, 0x54, 0x12, 0x6f, 0x1f, + 0xe4, 0xff, 0x87, 0xda, 0xb7, 0x68, 0xef, 0x75, 0xce, 0xb2, 0x13, 0x94, 0x8f, 0xc9, 0x13, 0xc1, + 0x9d, 0x11, 0x41, 0x4c, 0x46, 0x2a, 0x68, 0x26, 0xde, 0x20, 0x91, 0x30, 0x9a, 0x59, 0xdf, 0xaa, + 0x1c, 0x55, 0x3c, 0x7a, 0x42, 0x33, 0xaa, 0x61, 0x00, 0x89, 0xf3, 0x36, 0x97, 0x60, 0x21, 0x74, + 0x66, 0xf4, 0xb5, 0xcb, 0x7e, 0xb5, 0x4c, 0x7d, 0xd0, 0xd6, 0xad, 0x6b, 0x8d, 0x7a, 0x62, 0x7f, + 0xf9, 0x12, 0x4b, 0x20, 0xf6, 0x2c, 0xb1, 0x3a, 0xa0, 0x74, 0xba, 0x4c, 0x2b, 0x27, 0x48, 0x62, + 0xf5, 0x90, 0xa8, 0x8d, 0x36, 0x06, 0x25, 0xaa, 0x8a, 0x54, 0x5b, 0x67, 0x51, 0x72, 0x28, 0xbd, + 0x7f, 0x40, 0x68, 0x66, 0x80, 0x3c, 0x1b, 0x20, 0xf4, 0x75, 0xb6, 0x5d, 0xcd, 0x24, 0x68, 0xb6, + 0x58, 0x21, 0xa6, 0x6f, 0xec, 0x14, 0x3a, 0x4a, 0x13, 0x7b, 0x09, 0x70, 0x4a, 0x26, 0x52, 0xe3, + 0x57, 0x33, 0xe3, 0xd9, 0x11, 0xa9, 0xba, 0x9a, 0x60, 0x46, 0xa1, 0x8d, 0x79, 0x57, 0xd0, 0xe6, + 0x25, 0xed, 0x08, 0xda, 0xdb, 0x5a, 0x60, 0x8e, 0x5b, 0x4c, 0x19, 0xac, 0x57, 0x0e, 0x15, 0x1b, + 0x83, 0x7b, 0xb1, 0x6c, 0x50, 0xd8, 0x58, 0x30, 0x1d, 0xf4, 0xc9, 0xe7, 0xc2, 0x63, 0xda, 0x1f, + 0x22, 0xa0, 0xe8, 0x45, 0xc0, 0x3e, 0xc9, 0x7c, 0xb0, 0x31, 0xed, 0x48, 0x63, 0x76, 0xc9, 0xae, + 0x38, 0xd7, 0x84, 0x36, 0xaf, 0xa3, 0xbc, 0xd3, 0x04, 0xa5, 0xb0, 0x36, 0xdf, 0x84, 0x98, 0x8d, + 0x2f, 0x51, 0x10, 0x86, 0x21, 0xd1, 0x67, 0xc1, 0xbe, 0xe7, 0xcc, 0x37, 0xe6, 0x26, 0x6c, 0x79, + 0xf2, 0x06, 0xe1, 0xcd, 0x1a, 0xdd, 0x83, 0xdb, 0x4a, 0xf9, 0x05, 0x48, 0xb0, 0x47, 0xbe, 0xc0, + 0xd7, 0xf9, 0xe8, 0x5f, 0x63, 0xbd, 0x3f, 0xe8, 0x0b, 0x94, 0x59, 0xa0, 0xb1, 0xdd, 0x8f, 0x39, + 0x8a, 0xe1, 0x97, 0x60, 0xc8, 0xdb, 0x7e, 0x28, 0xc9, 0xaf, 0x7c, 0xf0, 0x1e, 0x45, 0xaa, 0x06, + 0x6f, 0x5f, 0xbe, 0xa4, 0xf8, 0x33, 0x26, 0x7c, 0x88, 0x9f, 0xf0, 0x34, 0x84, 0x51, 0x53, 0x36, + 0x8c, 0x6f, 0x35, 0xc4, 0xdd, 0x86, 0x91, 0x4e, 0x4b, 0x21, 0xa3, 0x31, 0x82, 0xe3, 0x06, 0xc4, + 0xca, 0x4a, 0x1c, 0x7a, 0x43, 0xb3, 0xed, 0x4f, 0x89, 0x9d, 0x36, 0x41, 0x32, 0x41, 0x63, 0x36, + 0xf3, 0xed, 0x67, 0xc6, 0x53, 0xdf, 0xb3, 0x9f, 0x2f, 0x05, 0x7a, 0xd3, 0x4f, 0x29, 0xc3, 0x88, + 0xf9, 0xd7, 0x2f, 0x1f, 0x19, 0x06, 0x9e, 0x1b, 0x0b, 0xd2, 0x49, 0xe3, 0x7c, 0xfb, 0xfb, 0xb7, + 0xbc, 0xef, 0x4d, 0x87, 0xe3, 0x0f, 0xb5, 0x40, 0x2b, 0x93, 0x2b, 0x92, 0xe4, 0x4f, 0xc4, 0x58, + 0xf8, 0x89, 0xef, 0x7d, 0x7c, 0xfd, 0x0c, 0xac, 0xf8, 0x5c, 0xab, 0x20, 0xeb, 0xcc, 0xf5, 0x3d, + 0xa2, 0x25, 0x58, 0x59, 0xd3, 0x8b, 0x72, 0x69, 0x41, 0xae, 0x6f, 0xbe, 0xc0, 0xc9, 0xb5, 0xce, + 0x59, 0xd0, 0x3a, 0xdd, 0xc4, 0x28, 0x0e, 0x62, 0x88, 0x2c, 0x1a, 0x80, 0x36, 0x9e, 0xcf, 0xef, + 0xf1, 0x66, 0x2e, 0x16, 0x5b, 0x60, 0x7e, 0xeb, 0x23, 0x70, 0xa0, 0x62, 0xee, 0x3c, 0xc4, 0xe1, + 0x4a, 0x26, 0x1b, 0x20, 0x9a, 0xef, 0x77, 0x14, 0x6c, 0xd3, 0x78, 0x30, 0xbc, 0xde, 0x37, 0x8d, + 0x79, 0xfa, 0x6c, 0x78, 0x30, 0xc2, 0xda, 0x77, 0xef, 0x47, 0x6d, 0xaa, 0xb7, 0xab, 0xf8, 0x80, + 0x1b, 0x92, 0xa8, 0x30, 0xd1, 0x97, 0xdc, 0x8f, 0x19, 0xc2, 0xe0, 0x5d, 0x7f, 0xc8, 0xe6, 0x35, + 0x39, 0xa1, 0x67, 0x68, 0x18, 0x50, 0x43, 0x75, 0xb4, 0x94, 0x47, 0x12, 0x25, 0xdc, 0x5a, 0xf4, + 0x1d, 0x9b, 0x10, 0x9e, 0x42, 0x21, 0x89, 0x0d, 0x3c, 0x18, 0x26, 0xce, 0xc2, 0x46, 0x10, 0x47, + 0x52, 0x76, 0x0a, 0x55, 0xab, 0xa9, 0x19, 0xbd, 0x2d, 0x5b, 0xf0, 0x83, 0xb9, 0x65, 0x9d, 0xed, + 0xaa, 0xd2, 0x57, 0x98, 0x11, 0x6d, 0x6d, 0x7c, 0xd1, 0x49, 0x89, 0x18, 0x38, 0xcf, 0x19, 0xe2, + 0xe6, 0xc7, 0x37, 0x85, 0x78, 0xa6, 0x44, 0x4f, 0xae, 0x51, 0x9f, 0x29, 0xf4, 0x6f, 0xa4, 0x0e, + 0x56, 0xcc, 0x93, 0x09, 0xbd, 0x6d, 0x6a, 0x34, 0x09, 0x7d, 0x99, 0xdd, 0x41, 0xd3, 0xf5, 0x1c, + 0x7f, 0xdf, 0x18, 0xfd, 0x85, 0x6b, 0x35, 0x7d, 0xeb, 0xfb, 0x8f, 0xaa, 0x0e, 0xeb, 0xab, 0xa1, + 0x7b, 0x29, 0x71, 0x43, 0xc4, 0xc3, 0x0e, 0x2e, 0x2b, 0xff, 0xad, 0xf0, 0xeb, 0x17, 0xe6, 0xa9, + 0xb9, 0xe8, 0x76, 0x04, 0xf9, 0xf0, 0xd7, 0xcf, 0x2a, 0xe3, 0x19, 0xb1, 0x30, 0x6b, 0x31, 0xc8, + 0x5a, 0x60, 0x59, 0x0b, 0x7c, 0x56, 0xec, 0x13, 0xa1, 0x48, 0x23, 0xf4, 0xb2, 0x8a, 0xec, 0x9d, + 0x19, 0x92, 0x48, 0xcc, 0xa0, 0x68, 0xea, 0xa1, 0xed, 0x04, 0x59, 0x29, 0xa5, 0xc8, 0x45, 0xb2, + 0x7f, 0x9b, 0xae, 0x89, 0xc2, 0x5f, 0x00, 0xc5, 0x0c, 0x4a, 0x7f, 0xf9, 0x22, 0x7e, 0xc2, 0xfa, + 0xd0, 0x0d, 0x22, 0x52, 0x20, 0x17, 0x14, 0xf8, 0xff, 0xfe, 0xcf, 0xff, 0xf6, 0x7f, 0x89, 0xd2, + 0xcc, 0x4b, 0xd7, 0xba, 0x78, 0x7a, 0x0a, 0xe7, 0xb1, 0xee, 0x12, 0xff, 0x88, 0x43, 0xaf, 0x6f, + 0xa4, 0xf0, 0x32, 0x1d, 0x59, 0x93, 0x2d, 0x19, 0x17, 0x9f, 0x07, 0x68, 0xa4, 0x28, 0xeb, 0xd2, + 0x8c, 0x32, 0x31, 0xff, 0x9e, 0x1a, 0x9e, 0x87, 0x25, 0x38, 0x35, 0x05, 0x0e, 0x8b, 0x8c, 0xf6, + 0x88, 0x87, 0xe3, 0xff, 0x24, 0x64, 0xc7, 0xac, 0x41, 0x48, 0x78, 0xc1, 0x8e, 0xa0, 0xdf, 0x1e, + 0x97, 0x52, 0xe0, 0x42, 0xcc, 0x30, 0xbf, 0x4f, 0x3c, 0xcc, 0x0a, 0xc4, 0xe9, 0x52, 0xd2, 0x24, + 0xae, 0x42, 0xfe, 0x87, 0x9f, 0xf1, 0x0b, 0x6a, 0x6c, 0xb2, 0x47, 0xc3, 0x44, 0x68, 0x10, 0x4e, + 0x34, 0x13, 0xf2, 0x5e, 0x42, 0xe2, 0x8e, 0xeb, 0xa6, 0x10, 0x8c, 0x14, 0x38, 0xca, 0xfc, 0xf4, + 0xdd, 0xc6, 0xfc, 0x5b, 0xa5, 0x92, 0xb1, 0xec, 0x68, 0x6d, 0x47, 0x1d, 0x31, 0x28, 0x29, 0x7f, + 0xba, 0x24, 0x1c, 0xbe, 0x13, 0x3f, 0x33, 0x48, 0x42, 0x86, 0xf8, 0x4e, 0x49, 0x1b, 0xbc, 0xfb, + 0x9e, 0xa0, 0x85, 0xbb, 0xac, 0x5a, 0xcd, 0x8b, 0x16, 0x4f, 0x89, 0x99, 0xa0, 0xf1, 0xf4, 0xd8, + 0x2a, 0x0b, 0xee, 0x52, 0x8b, 0x76, 0xc0, 0x0b, 0x02, 0xeb, 0x40, 0x47, 0xf8, 0x0d, 0xd8, 0x68, + 0x36, 0xea, 0xdd, 0xc6, 0x07, 0x9a, 0x0b, 0xcf, 0x18, 0x85, 0x69, 0x30, 0x15, 0x71, 0x3a, 0x7c, + 0xf2, 0xfc, 0xf3, 0x10, 0x8c, 0xeb, 0x55, 0x05, 0xc2, 0xe2, 0x36, 0x72, 0x35, 0x68, 0x26, 0x25, + 0x15, 0xf4, 0x76, 0x01, 0x7a, 0xa8, 0xa1, 0x4f, 0x9f, 0x1c, 0x9d, 0xf2, 0x98, 0x2e, 0xb1, 0xef, + 0xe8, 0x0a, 0x04, 0x12, 0xb3, 0xe4, 0x4f, 0x6c, 0xe6, 0xd8, 0x46, 0xbb, 0xac, 0x6c, 0x68, 0xdf, + 0x7c, 0x78, 0x1b, 0x1a, 0x90, 0x1e, 0x39, 0xcf, 0x8a, 0xdb, 0xb8, 0x78, 0x9c, 0x8f, 0xee, 0xc3, + 0xc2, 0x2c, 0xd0, 0x65, 0x07, 0x16, 0x9b, 0x8d, 0x39, 0xd6, 0x62, 0x48, 0x92, 0x43, 0x0e, 0xa8, + 0x67, 0xa1, 0x86, 0xbf, 0x72, 0x8a, 0x22, 0x53, 0x2f, 0x37, 0xe0, 0x59, 0x78, 0x14, 0x1d, 0x38, + 0x16, 0x9e, 0x33, 0xdf, 0x20, 0xee, 0x41, 0x50, 0x58, 0x74, 0xf0, 0x54, 0xa5, 0xa4, 0x62, 0x7b, + 0x98, 0x03, 0x09, 0xb9, 0x84, 0x30, 0x85, 0xdb, 0xbb, 0xf3, 0x69, 0xfa, 0x7c, 0x1a, 0x01, 0xc5, + 0x86, 0x0b, 0x2b, 0x5a, 0xcd, 0x31, 0x37, 0x17, 0x7a, 0x76, 0xcf, 0xa5, 0xab, 0xa3, 0x6e, 0xb4, + 0x1d, 0xcd, 0xdc, 0x50, 0xb9, 0xbd, 0x68, 0x64, 0x71, 0xfe, 0x30, 0x39, 0x58, 0x5d, 0xf2, 0xa7, + 0x2e, 0xd6, 0x9a, 0xfc, 0xa9, 0x29, 0xcd, 0x3e, 0x01, 0xf6, 0x6b, 0x0e, 0xca, 0x0a, 0x35, 0x2d, + 0xeb, 0xa3, 0x0d, 0xbb, 0x8d, 0xe7, 0xf5, 0x88, 0xdf, 0x1e, 0x0b, 0x0c, 0xa4, 0x62, 0x4c, 0x20, + 0x0b, 0xff, 0xe8, 0x33, 0x09, 0x63, 0x10, 0xcd, 0xfe, 0xfc, 0x29, 0xcd, 0xd8, 0xc9, 0x28, 0xee, + 0xa2, 0x45, 0x61, 0xe1, 0x4d, 0x8b, 0x78, 0xf8, 0xfd, 0xd9, 0xd2, 0xc9, 0x51, 0xd8, 0x8d, 0x9f, + 0x51, 0xa2, 0x9a, 0x9f, 0x94, 0xe4, 0xf4, 0x95, 0x6c, 0xa2, 0x87, 0x8f, 0x28, 0xab, 0x91, 0x63, + 0x58, 0xb1, 0xa9, 0x48, 0xf6, 0x18, 0x3c, 0x34, 0xc7, 0x93, 0x78, 0x9d, 0xcc, 0x40, 0x42, 0x76, + 0x46, 0x50, 0x76, 0xc4, 0x43, 0x58, 0xec, 0xd5, 0xb2, 0x3d, 0x7c, 0x57, 0x89, 0x6c, 0xbe, 0x43, + 0x05, 0x47, 0xd0, 0xb6, 0x66, 0x24, 0xee, 0x91, 0x94, 0x60, 0x3b, 0x4f, 0xbe, 0xb7, 0x2a, 0xd9, + 0x0a, 0x9d, 0x60, 0xfd, 0x24, 0xc5, 0x39, 0xbd, 0x0e, 0x1b, 0x82, 0xbc, 0x05, 0x9f, 0xb5, 0x99, + 0x38, 0x6f, 0x34, 0x27, 0x05, 0xe6, 0x65, 0xf9, 0x45, 0x97, 0x63, 0xcd, 0x2b, 0x03, 0xe1, 0xfd, + 0x58, 0x74, 0x07, 0x03, 0x4f, 0x9f, 0xf9, 0x3b, 0x11, 0xa1, 0x6a, 0x10, 0x48, 0xba, 0x81, 0x8e, + 0x80, 0x02, 0x5a, 0x28, 0xd8, 0x06, 0x23, 0xd3, 0xc4, 0x7e, 0xe0, 0x34, 0x77, 0x47, 0x3a, 0x3b, + 0x30, 0xd3, 0xc2, 0xf3, 0xf4, 0x85, 0x7c, 0x95, 0xcd, 0xe5, 0xbd, 0xc6, 0x65, 0x21, 0x2f, 0x6e, + 0x90, 0xd4, 0x0a, 0x9f, 0x5a, 0xc9, 0x97, 0xcb, 0x22, 0xa3, 0x0f, 0x71, 0x8b, 0x13, 0x64, 0x9a, + 0x66, 0xe4, 0x5c, 0x92, 0x88, 0xa7, 0xf2, 0xc9, 0x32, 0x88, 0xe9, 0x5b, 0x20, 0x03, 0xd8, 0x55, + 0xfa, 0x3c, 0xbf, 0x00, 0xd1, 0xa0, 0xaa, 0x24, 0x10, 0x9c, 0xbf, 0xa2, 0xc3, 0xf2, 0x0d, 0x7f, + 0x50, 0x8c, 0x85, 0xc9, 0x08, 0x4b, 0x04, 0xe6, 0x90, 0x7c, 0x7e, 0x88, 0x92, 0x87, 0x9f, 0xf8, + 0x1b, 0x0b, 0x8c, 0x0f, 0x86, 0x70, 0x37, 0x2a, 0x99, 0x48, 0x66, 0xe8, 0xb0, 0xf5, 0x33, 0x29, + 0x80, 0x69, 0xe0, 0xb2, 0x0c, 0xf2, 0x8d, 0x3d, 0x8b, 0x5c, 0x72, 0xc6, 0xa2, 0x1b, 0xb0, 0x63, + 0x5f, 0x5f, 0x99, 0x43, 0x3a, 0xcb, 0xf9, 0x95, 0x7a, 0x2e, 0x53, 0xa4, 0xa8, 0x12, 0xe7, 0xbd, + 0x2c, 0xff, 0x84, 0x64, 0x82, 0x7f, 0x95, 0x44, 0x68, 0x80, 0x6f, 0xe8, 0xa3, 0xa5, 0x6f, 0x12, + 0x7a, 0x57, 0xd1, 0x15, 0x6b, 0x4b, 0x3c, 0xcf, 0xd6, 0xc5, 0x2a, 0x79, 0x9e, 0xa1, 0x46, 0xf3, + 0x13, 0x64, 0x94, 0x74, 0x7a, 0x06, 0xdd, 0x6b, 0xb7, 0xbe, 0x29, 0x5b, 0x2e, 0x88, 0x05, 0x91, + 0x58, 0xc9, 0x78, 0xc6, 0x06, 0xb8, 0x2f, 0x2a, 0xe4, 0xed, 0x8c, 0x58, 0x55, 0x88, 0x57, 0x49, + 0x0a, 0xb3, 0x9d, 0x5b, 0x82, 0x85, 0x67, 0x81, 0xc2, 0xc0, 0xb9, 0x42, 0x07, 0xe7, 0x73, 0x06, + 0x0f, 0x6b, 0xe1, 0x56, 0x55, 0xa0, 0xc5, 0x73, 0xfe, 0x45, 0x3b, 0xd4, 0x2d, 0x2a, 0x28, 0x53, + 0x45, 0x2f, 0x23, 0x82, 0xae, 0x19, 0xc9, 0x68, 0x92, 0x5d, 0x83, 0x98, 0x4b, 0x91, 0x19, 0x59, + 0x00, 0xdd, 0xa8, 0x23, 0x3f, 0x0b, 0x9b, 0xfb, 0x41, 0x0f, 0x7e, 0x1a, 0x76, 0xf8, 0x23, 0x0e, + 0xfc, 0xc1, 0x59, 0xb3, 0x81, 0xd1, 0x26, 0x51, 0x59, 0xb1, 0x32, 0x01, 0x6b, 0x13, 0x70, 0x25, + 0xa5, 0xc7, 0x7e, 0x13, 0x3d, 0xfb, 0x93, 0xe2, 0xa6, 0xcb, 0x51, 0x82, 0xf4, 0x5d, 0x8e, 0x64, + 0xed, 0x9d, 0x53, 0x0d, 0x73, 0xe7, 0xd6, 0x89, 0x6a, 0x45, 0x57, 0x51, 0x3c, 0xb9, 0x80, 0xa1, + 0x54, 0xe8, 0xac, 0xd8, 0x08, 0x9c, 0xa4, 0x54, 0xc4, 0x30, 0xd6, 0xf3, 0x51, 0x27, 0x2b, 0x74, + 0x12, 0xc7, 0xb9, 0x00, 0x12, 0xe3, 0xc2, 0x68, 0x78, 0x1e, 0x71, 0xd9, 0xf2, 0x4f, 0x99, 0xdf, + 0x21, 0x7f, 0x22, 0xf1, 0xcb, 0xba, 0xa2, 0xe4, 0x4f, 0x2d, 0x2d, 0xd3, 0x53, 0xdd, 0xba, 0x07, + 0x62, 0x26, 0x10, 0x24, 0x7c, 0x05, 0x1d, 0x56, 0x94, 0x60, 0x7a, 0xaa, 0x7e, 0x12, 0x71, 0x26, + 0xa5, 0x2a, 0x51, 0x15, 0x16, 0x35, 0xff, 0xd0, 0x30, 0xef, 0x9f, 0x46, 0x3e, 0x66, 0x5d, 0x90, + 0x63, 0xbf, 0x91, 0xb3, 0xaa, 0x30, 0x89, 0xf2, 0x74, 0xcd, 0x36, 0xe6, 0xc3, 0xdb, 0xad, 0xd3, + 0xe8, 0x76, 0xf4, 0x2c, 0x7a, 0xb3, 0x2b, 0x11, 0xfa, 0xf9, 0xd3, 0x4f, 0x68, 0xad, 0x96, 0x59, + 0x8a, 0xf4, 0x73, 0x63, 0x51, 0x8c, 0x15, 0x63, 0x46, 0x3d, 0x35, 0x23, 0x68, 0x5b, 0x84, 0xc1, + 0x20, 0x7c, 0x0a, 0xbd, 0xf1, 0x84, 0x22, 0x8e, 0xba, 0x63, 0x71, 0xae, 0xfd, 0x4c, 0xe7, 0xe3, + 0x62, 0x88, 0x71, 0x81, 0x08, 0x48, 0x0c, 0xb0, 0x0c, 0x8d, 0x9b, 0xfd, 0x77, 0xab, 0x4c, 0x8a, + 0x0a, 0xc0, 0x5d, 0xc9, 0xc2, 0xce, 0xbb, 0xc7, 0x08, 0x07, 0x15, 0x74, 0x4a, 0x36, 0xa1, 0x96, + 0xaa, 0xa1, 0x22, 0x3b, 0x77, 0xc6, 0x3b, 0xf6, 0x9d, 0x75, 0x47, 0x76, 0x93, 0x73, 0x84, 0x4a, + 0x2e, 0xaa, 0x45, 0xf3, 0x26, 0x68, 0xa5, 0xea, 0x49, 0xcc, 0x2d, 0x67, 0x51, 0x1d, 0x8f, 0x1c, + 0x88, 0xbf, 0x6a, 0xa9, 0x45, 0x15, 0x85, 0xd9, 0xa4, 0xe4, 0x6a, 0x64, 0x77, 0x15, 0xd5, 0x61, + 0xbe, 0x10, 0x71, 0x4d, 0xf9, 0x99, 0x74, 0x42, 0x83, 0x5e, 0x6a, 0x59, 0x5d, 0x9e, 0x99, 0x1c, + 0xfc, 0xa0, 0x39, 0x7d, 0x22, 0x14, 0xd9, 0x21, 0x5b, 0x89, 0x28, 0xa1, 0x26, 0xd4, 0x67, 0xd4, + 0xf0, 0x10, 0x3a, 0x2c, 0x49, 0xae, 0x58, 0x45, 0xb7, 0x03, 0xe2, 0x1e, 0x2c, 0xe6, 0xc8, 0x56, + 0x1d, 0xf4, 0x08, 0x26, 0xe9, 0xa7, 0x1a, 0x5f, 0x4d, 0xd7, 0xb1, 0x7d, 0xac, 0xab, 0xc9, 0x5d, + 0x25, 0x39, 0x7c, 0x94, 0x58, 0x0b, 0xb0, 0x66, 0xb7, 0x82, 0x3c, 0x1b, 0xc8, 0xdd, 0x91, 0x0c, + 0x6b, 0x4c, 0x71, 0xd5, 0xe9, 0xc4, 0x6a, 0x69, 0xc0, 0x2b, 0xcc, 0x6c, 0x4a, 0x4d, 0x5b, 0xd0, + 0xfe, 0x4f, 0x34, 0x14, 0x91, 0x8e, 0x22, 0xb1, 0xba, 0x99, 0xfb, 0xf5, 0xcb, 0x02, 0x0d, 0x13, + 0x1b, 0x0b, 0xbc, 0x5a, 0x48, 0xa1, 0x90, 0x26, 0x0c, 0x75, 0xc7, 0x1b, 0xa8, 0x86, 0x04, 0x62, + 0x1a, 0x5f, 0x17, 0x20, 0x38, 0x72, 0x1e, 0xdb, 0x98, 0xc5, 0xa9, 0x0b, 0x9d, 0xe1, 0xa9, 0x40, + 0xba, 0xa1, 0xf9, 0x91, 0x34, 0xd0, 0x6d, 0x5e, 0xe4, 0x34, 0x3c, 0xa6, 0x51, 0x25, 0x85, 0x29, + 0xf0, 0xfd, 0x15, 0x24, 0xae, 0x34, 0x9e, 0xf3, 0xf9, 0xdd, 0xd2, 0x30, 0x22, 0x91, 0x30, 0xcf, + 0x78, 0x50, 0x29, 0x7a, 0x9c, 0x3d, 0xf2, 0x79, 0x66, 0x81, 0xa2, 0x05, 0x5c, 0xcf, 0x8b, 0x0f, + 0x79, 0x08, 0x52, 0x4e, 0x2d, 0x2a, 0xfb, 0x6a, 0x34, 0x61, 0x18, 0x97, 0x16, 0x9e, 0x43, 0x13, + 0x1e, 0xc1, 0x9a, 0xd2, 0xc3, 0x9e, 0x64, 0xc9, 0xbe, 0xb4, 0x46, 0x9a, 0xe3, 0x1f, 0x20, 0xc2, + 0x79, 0x5e, 0xc3, 0x48, 0xda, 0x5b, 0x7e, 0xc4, 0x10, 0x8c, 0x60, 0xc0, 0xe5, 0x3e, 0x37, 0x22, + 0x59, 0x4d, 0xa3, 0xbe, 0x28, 0x67, 0x63, 0x62, 0xb6, 0x22, 0x79, 0xfd, 0xa0, 0xdb, 0x91, 0x02, + 0xc8, 0x28, 0xd8, 0xea, 0xc9, 0x0c, 0x77, 0x8d, 0x30, 0x70, 0x36, 0xea, 0x62, 0x73, 0xe9, 0xfb, + 0xe3, 0xd4, 0xbc, 0x8d, 0x8f, 0x31, 0x9f, 0x6d, 0x47, 0x87, 0x59, 0xb2, 0xe8, 0x2b, 0xbd, 0x44, + 0x71, 0xf1, 0xf7, 0xf0, 0xb2, 0xbe, 0xc5, 0x79, 0x76, 0x72, 0xcb, 0x3e, 0xe6, 0x97, 0x7d, 0x2c, + 0xe0, 0x47, 0x3f, 0x84, 0x6b, 0x6a, 0x41, 0xae, 0xeb, 0x25, 0x10, 0x0e, 0x96, 0x7c, 0xdb, 0x26, + 0x87, 0xaf, 0xc2, 0xf8, 0xac, 0x0b, 0xb2, 0xdd, 0x8b, 0xbe, 0x05, 0x74, 0x84, 0x5e, 0xae, 0x73, + 0x16, 0x3d, 0x1f, 0x40, 0xcc, 0x9e, 0xc7, 0x8a, 0x34, 0x55, 0x23, 0xa9, 0xc4, 0xce, 0xce, 0x4d, + 0x2c, 0x3f, 0x17, 0x23, 0x95, 0x0b, 0x4d, 0x49, 0xed, 0x09, 0xe4, 0x06, 0xf3, 0x38, 0x14, 0x0d, + 0x63, 0x72, 0x26, 0x56, 0x4a, 0x03, 0x7e, 0x27, 0x55, 0x4b, 0xf0, 0x08, 0xab, 0x16, 0xc9, 0x90, + 0x58, 0xb6, 0xb7, 0xa8, 0x8f, 0x34, 0x8a, 0xee, 0xd2, 0xb2, 0xee, 0xbf, 0x50, 0x76, 0xb8, 0xa4, + 0x6c, 0x62, 0x81, 0x97, 0xe5, 0x95, 0x25, 0xe2, 0x98, 0x96, 0x04, 0x2d, 0x77, 0x69, 0x59, 0x0d, + 0xe3, 0x81, 0x26, 0x96, 0x7c, 0x6d, 0xb9, 0xab, 0xa3, 0x25, 0xe5, 0x48, 0x60, 0xf5, 0x78, 0x49, + 0xee, 0xd8, 0x11, 0x7b, 0x6c, 0xd0, 0xdb, 0x88, 0x53, 0x73, 0x8b, 0xfd, 0xdc, 0x3c, 0xe6, 0xa3, + 0x31, 0x04, 0x46, 0x25, 0x19, 0xa5, 0xc5, 0xa8, 0xb1, 0xe7, 0x27, 0x8d, 0xd2, 0x44, 0x35, 0x4e, + 0xdf, 0xc6, 0xf5, 0xe3, 0x7b, 0xa0, 0x8e, 0x72, 0x91, 0xf5, 0x67, 0xe2, 0x0f, 0xca, 0x3d, 0x41, + 0x0b, 0x0a, 0x4c, 0xf1, 0x8a, 0x6f, 0x5f, 0xd1, 0xe6, 0xac, 0x48, 0x1c, 0x9b, 0x76, 0xd1, 0xb5, + 0x6a, 0x19, 0x23, 0x97, 0xe7, 0xda, 0x45, 0x8c, 0x50, 0xdf, 0x39, 0x0d, 0x3d, 0xde, 0x12, 0x8a, + 0xb6, 0xdf, 0x2b, 0xb3, 0x84, 0x73, 0x2f, 0x40, 0x28, 0x32, 0x40, 0x1e, 0x97, 0xbe, 0x15, 0xf4, + 0x3d, 0x54, 0x76, 0xc6, 0x49, 0x58, 0xdc, 0x1f, 0xff, 0x6b, 0x48, 0x4c, 0xbd, 0x83, 0x45, 0x3f, + 0x7c, 0x12, 0xbd, 0x8e, 0x84, 0x9e, 0x74, 0x0e, 0x0e, 0x44, 0x7d, 0x14, 0x59, 0x7e, 0x23, 0x51, + 0xda, 0x91, 0xa6, 0xe6, 0x92, 0xa5, 0x12, 0x0f, 0xc9, 0x91, 0xad, 0x86, 0x4b, 0xd5, 0x81, 0x5e, + 0xe3, 0xad, 0xd8, 0xa9, 0x10, 0x8a, 0x2f, 0x40, 0x99, 0x89, 0xf6, 0x45, 0x62, 0x81, 0x60, 0x32, + 0xc6, 0x8d, 0x36, 0xf6, 0xe4, 0xf0, 0xe0, 0x03, 0xdb, 0x2b, 0x9b, 0x8f, 0x28, 0xd6, 0xd6, 0x87, + 0xdf, 0xe3, 0x5e, 0xc8, 0x7e, 0x4c, 0x31, 0x6a, 0xc0, 0x23, 0x76, 0x73, 0x55, 0x32, 0xc2, 0x5d, + 0x02, 0x72, 0xac, 0x0c, 0xf4, 0x5c, 0x6d, 0xb1, 0x48, 0xa8, 0x25, 0x0b, 0x80, 0x1b, 0xbf, 0xd3, + 0xa2, 0xd0, 0xbf, 0xf6, 0xbd, 0x06, 0x09, 0xff, 0xef, 0xff, 0xf1, 0x7f, 0x63, 0x8b, 0xd0, 0xee, + 0xcf, 0x27, 0xfe, 0x3f, 0x73, 0xcd, 0xe4, 0xda, 0x52, 0x5d, 0xdc, 0x7c, 0x4e, 0xe6, 0x60, 0x7c, + 0xe5, 0x1a, 0x43, 0x68, 0x50, 0x13, 0x08, 0x65, 0x5b, 0xe4, 0xda, 0x18, 0x9f, 0xf9, 0x78, 0xb8, + 0x8b, 0x8d, 0xd7, 0x96, 0xd4, 0xfc, 0x23, 0x85, 0x0a, 0x31, 0xae, 0x5a, 0x0e, 0xce, 0x28, 0xe6, + 0xff, 0x08, 0x2d, 0x11, 0x49, 0x46, 0xd4, 0x60, 0x1f, 0x53, 0x8a, 0x3d, 0xc6, 0x10, 0x1c, 0x5c, + 0x0a, 0x28, 0x6f, 0x7f, 0x4a, 0x62, 0x40, 0xb6, 0x86, 0x6e, 0x6f, 0x91, 0xbf, 0x18, 0xb1, 0xc9, + 0xdf, 0x00, 0xd9, 0xc4, 0xbd, 0x39, 0xb7, 0x26, 0x0a, 0x1d, 0xc7, 0xea, 0x0b, 0x62, 0xda, 0x65, + 0xab, 0xa1, 0x11, 0x3d, 0x31, 0xf4, 0x93, 0x5e, 0xc6, 0x43, 0xee, 0x4e, 0xd1, 0x74, 0x12, 0x1f, + 0x04, 0x5b, 0x41, 0xb6, 0xf1, 0x8d, 0xfe, 0x8c, 0x98, 0xe5, 0xd0, 0x46, 0xc5, 0x8c, 0x03, 0xe1, + 0x6d, 0x28, 0xf3, 0xeb, 0x1a, 0xed, 0x0f, 0xe9, 0xcc, 0xc2, 0x4d, 0x32, 0x3c, 0xf4, 0x4c, 0x91, + 0x83, 0x06, 0x67, 0x0d, 0x0f, 0x27, 0x9b, 0x7e, 0x18, 0x8d, 0xe0, 0x18, 0xfb, 0x06, 0x1d, 0x3d, + 0xe8, 0x1a, 0xf9, 0x0e, 0x53, 0x55, 0x75, 0x76, 0xf0, 0xc2, 0x0f, 0x12, 0x3f, 0xd0, 0xac, 0x79, + 0x09, 0xc9, 0x1b, 0xe3, 0x9a, 0xbb, 0x59, 0x5c, 0x03, 0x56, 0xf7, 0xad, 0x54, 0xf9, 0xf5, 0xcb, + 0xdd, 0x2c, 0x17, 0xf1, 0x79, 0x3d, 0x87, 0xcf, 0xeb, 0x65, 0x7c, 0xce, 0xe5, 0x0b, 0xf8, 0x02, + 0xaa, 0xf0, 0x96, 0x58, 0x83, 0xa6, 0x6d, 0x8a, 0xf2, 0xa4, 0x66, 0x92, 0x42, 0x26, 0x29, 0x64, + 0x92, 0x42, 0x26, 0x29, 0x64, 0x92, 0x42, 0x26, 0x2d, 0x64, 0xf2, 0x85, 0x58, 0x28, 0xa0, 0x54, + 0x8a, 0xb4, 0xce, 0x0f, 0x3b, 0xb4, 0x25, 0x7e, 0x13, 0xab, 0x63, 0x29, 0xcd, 0xba, 0x14, 0xb3, + 0x5c, 0x11, 0xa3, 0x78, 0x34, 0xef, 0x44, 0x4a, 0xd3, 0x7e, 0xd0, 0xf0, 0x20, 0x8a, 0x3c, 0x35, + 0x07, 0x7d, 0xcd, 0xd1, 0x5b, 0xd5, 0x4f, 0x0a, 0x6f, 0x88, 0xe8, 0xab, 0x2f, 0xda, 0x7d, 0x03, + 0xf8, 0xe0, 0xc8, 0xfd, 0xf5, 0x2b, 0x88, 0x0f, 0x3e, 0x72, 0xbf, 0x29, 0xbf, 0x7e, 0xa5, 0x52, + 0x23, 0x97, 0xc4, 0x5d, 0xbd, 0xd7, 0x9a, 0x0d, 0xc0, 0xb7, 0xe6, 0xa5, 0x52, 0x2c, 0x1e, 0xec, + 0x92, 0xe8, 0x9d, 0x5b, 0xe2, 0xc8, 0x05, 0xe5, 0x09, 0xfe, 0xa2, 0xa1, 0x86, 0x18, 0x6e, 0x88, + 0x1d, 0x87, 0x5a, 0x6f, 0xe2, 0xa5, 0x7a, 0x96, 0xeb, 0x11, 0x8b, 0x51, 0x5a, 0xcc, 0x62, 0x09, + 0x29, 0xd3, 0xd4, 0x4d, 0xd5, 0x99, 0xdc, 0x10, 0x03, 0x2a, 0x89, 0x3c, 0xd9, 0x1c, 0x00, 0x1f, + 0x72, 0x44, 0x79, 0xe4, 0x66, 0xf0, 0x2c, 0x9b, 0xeb, 0xa2, 0xaa, 0x8f, 0xf6, 0x15, 0x1c, 0x63, + 0x16, 0x04, 0x3f, 0x30, 0x41, 0xc1, 0x8c, 0x24, 0x76, 0xfc, 0x6d, 0x52, 0x28, 0xd0, 0x87, 0xf9, + 0x58, 0x9c, 0xa4, 0x80, 0x44, 0xb7, 0x24, 0xc8, 0x89, 0x3d, 0x69, 0x1a, 0x09, 0xce, 0xc6, 0xc5, + 0x53, 0x90, 0x64, 0xee, 0x85, 0xb0, 0x5c, 0xfe, 0xa2, 0x19, 0x3f, 0x24, 0xad, 0x1c, 0xb7, 0x11, + 0xf9, 0x91, 0x18, 0x3f, 0x1a, 0x77, 0xcf, 0x08, 0x66, 0x9b, 0x97, 0x21, 0x67, 0xd7, 0xdc, 0xad, + 0x54, 0x78, 0xaa, 0xd8, 0x95, 0x22, 0xc2, 0x3d, 0xbd, 0x87, 0xe7, 0xcb, 0x97, 0xc8, 0x21, 0x5a, + 0x57, 0x92, 0xaa, 0xdc, 0xd9, 0x37, 0xba, 0x2c, 0xa0, 0x99, 0x04, 0x32, 0x6c, 0xb1, 0xdf, 0xaa, + 0xb7, 0x11, 0x61, 0x22, 0xae, 0x6c, 0x62, 0x18, 0x4a, 0xb5, 0xdd, 0xc0, 0xaf, 0xb0, 0x1e, 0xcc, + 0x66, 0x33, 0x8a, 0x64, 0x72, 0x3b, 0x17, 0x41, 0xf1, 0x6f, 0xc7, 0x0f, 0x94, 0xb9, 0x23, 0xd3, + 0x94, 0xb6, 0xe4, 0x5c, 0x09, 0x4d, 0x66, 0x23, 0x16, 0xf0, 0x96, 0xd6, 0x80, 0x31, 0x13, 0x49, + 0x05, 0x8e, 0xf6, 0xea, 0x9e, 0x6a, 0x5d, 0xd5, 0xa8, 0x45, 0xe9, 0x32, 0x6c, 0x97, 0x1f, 0xce, + 0x90, 0xcc, 0x68, 0x36, 0x99, 0xe9, 0xc6, 0x0d, 0xee, 0x9c, 0xb6, 0x5a, 0x40, 0x10, 0x7e, 0xaa, + 0xb2, 0x41, 0xee, 0x2e, 0x42, 0x17, 0x20, 0x39, 0xae, 0xcc, 0xb0, 0x58, 0x3c, 0x1a, 0x1e, 0xff, + 0x22, 0x57, 0x1b, 0x69, 0x19, 0xd3, 0xc0, 0x8c, 0xf4, 0x1e, 0x22, 0xf2, 0xd6, 0x1e, 0x38, 0xec, + 0x36, 0x22, 0xf2, 0xea, 0xd1, 0xac, 0xfb, 0x2a, 0x06, 0x70, 0xc4, 0x84, 0x0e, 0x3c, 0x85, 0x57, + 0x1e, 0x69, 0x99, 0x41, 0xdb, 0x46, 0x5f, 0x78, 0xb3, 0x1d, 0xbb, 0x8f, 0x08, 0x64, 0x5a, 0x83, + 0xf0, 0x7b, 0x98, 0x29, 0xf8, 0x8c, 0xd7, 0x07, 0x31, 0xe6, 0x4c, 0x6e, 0x16, 0xa3, 0x8d, 0xf3, + 0xbc, 0xa0, 0x55, 0x9e, 0x93, 0xcd, 0x29, 0x72, 0xc2, 0xe9, 0x46, 0x46, 0x16, 0x0a, 0xb0, 0x25, + 0x85, 0xdd, 0x5a, 0x11, 0xa8, 0x16, 0xb5, 0xe0, 0x2e, 0xa5, 0xd8, 0xc6, 0x6b, 0x2a, 0x3c, 0xcc, + 0xc8, 0x6f, 0xc1, 0x02, 0xc6, 0x14, 0x62, 0xd1, 0x20, 0x9f, 0xbf, 0x7b, 0x3f, 0x30, 0x24, 0x70, + 0x78, 0xd2, 0x80, 0xf0, 0x73, 0x0f, 0x2a, 0xca, 0xd1, 0x90, 0x5e, 0x24, 0x07, 0xac, 0xf8, 0x20, + 0x26, 0x7c, 0xa3, 0xcc, 0xde, 0x43, 0xee, 0x98, 0x67, 0x2b, 0x7f, 0xe4, 0x2e, 0x01, 0x62, 0xb8, + 0x69, 0x7d, 0xe7, 0x00, 0xff, 0x60, 0xad, 0xfd, 0x55, 0xfb, 0xf4, 0x29, 0x95, 0xfb, 0x62, 0x84, + 0x2a, 0x15, 0x49, 0xa9, 0xb0, 0x14, 0x68, 0x3f, 0x79, 0x2f, 0xc2, 0x7b, 0x60, 0xbc, 0x43, 0x20, + 0x2e, 0x31, 0x62, 0xa2, 0x05, 0x46, 0x9a, 0x26, 0x57, 0xa6, 0x72, 0xb5, 0xcc, 0x55, 0x12, 0xab, + 0x23, 0xa8, 0x02, 0x89, 0x48, 0xf5, 0x57, 0x04, 0xce, 0x30, 0x7c, 0x6e, 0x09, 0x3e, 0xd6, 0x99, + 0x2d, 0x38, 0xd4, 0xf1, 0xe1, 0x95, 0x9d, 0xcf, 0x4e, 0xda, 0x91, 0x0b, 0x37, 0x1e, 0x2d, 0x86, + 0xec, 0xd5, 0xdc, 0x86, 0xb6, 0x89, 0xdb, 0x90, 0xab, 0xab, 0x92, 0x15, 0xd9, 0xa4, 0xab, 0xa9, + 0xa8, 0xc0, 0x41, 0x12, 0x09, 0x75, 0x1d, 0xd9, 0xa4, 0x0b, 0x3f, 0xe5, 0x62, 0x9f, 0x9a, 0xe1, + 0xa7, 0xfc, 0x0f, 0x4e, 0x31, 0x4d, 0x45, 0x72, 0x8d, 0xc2, 0x5c, 0x18, 0x05, 0x9b, 0x5d, 0x9f, + 0x62, 0x91, 0xe0, 0x72, 0x18, 0xd5, 0x3b, 0x8c, 0x91, 0x8b, 0x37, 0x68, 0xf9, 0x96, 0x2c, 0x28, + 0xd3, 0x02, 0x79, 0x95, 0xfc, 0x40, 0x93, 0x03, 0x87, 0x16, 0x32, 0x6d, 0xea, 0x01, 0x79, 0x92, + 0xef, 0x92, 0x3c, 0x6f, 0x01, 0x08, 0xbe, 0xbb, 0x63, 0x39, 0x59, 0xff, 0x0f, 0x72, 0xe8, 0x91, + 0x1c, 0xa8, 0xfd, 0x87, 0xc0, 0x73, 0x5b, 0xf8, 0xa7, 0xaa, 0xc8, 0x31, 0x13, 0x40, 0x98, 0x23, + 0x8f, 0x39, 0xf2, 0xb1, 0x1c, 0x05, 0x3e, 0x47, 0x01, 0x73, 0x14, 0xaa, 0x78, 0x92, 0x97, 0x44, + 0xc3, 0x24, 0x21, 0x26, 0xd8, 0x33, 0x5d, 0x05, 0x88, 0xaf, 0x89, 0xbf, 0x91, 0xe5, 0x7f, 0x20, + 0x1b, 0x57, 0x39, 0xa5, 0x0a, 0x1f, 0xc3, 0xcd, 0x81, 0x3e, 0xfa, 0xe2, 0x08, 0x9d, 0xe0, 0x50, + 0xf6, 0x27, 0x71, 0xa3, 0x09, 0x0c, 0xe9, 0x85, 0x6e, 0x73, 0xe5, 0x72, 0x98, 0x1b, 0xc3, 0x0e, + 0x68, 0xa6, 0x35, 0xe8, 0xf6, 0x04, 0xd7, 0x56, 0x5b, 0x78, 0xd9, 0x9d, 0xe0, 0x62, 0xd4, 0x36, + 0x1a, 0x60, 0x22, 0x56, 0x24, 0x8f, 0x45, 0x58, 0xf4, 0x42, 0xac, 0x81, 0xed, 0xad, 0x44, 0xf2, + 0x14, 0x30, 0xcf, 0x99, 0x4e, 0xaf, 0xd2, 0xd3, 0x1d, 0x1a, 0x58, 0x39, 0x9a, 0x65, 0x1d, 0xb3, + 0xd4, 0xb9, 0x96, 0x09, 0xa4, 0x1b, 0x02, 0x50, 0x85, 0x60, 0xb5, 0x80, 0x09, 0xe1, 0xb6, 0xce, + 0x8c, 0xa3, 0x6b, 0xb2, 0x28, 0x91, 0x13, 0xdf, 0x24, 0x23, 0xac, 0xc7, 0xf0, 0xa2, 0x93, 0xdd, + 0x08, 0x7f, 0x12, 0x70, 0xd7, 0xab, 0xa9, 0xb0, 0x44, 0x1a, 0xfc, 0xed, 0x6b, 0x6a, 0xa6, 0x33, + 0x96, 0x63, 0x8e, 0x09, 0xd1, 0x99, 0x11, 0xb9, 0xb1, 0x67, 0x4e, 0x61, 0x60, 0x81, 0x11, 0x3f, + 0xea, 0xbd, 0xe3, 0x6f, 0x7e, 0x30, 0x07, 0x8e, 0xff, 0x00, 0x29, 0x63, 0xce, 0x9b, 0x07, 0x3d, + 0x5e, 0x64, 0x37, 0xc9, 0xcb, 0x87, 0x6c, 0x05, 0x62, 0xac, 0x51, 0x74, 0xc7, 0xe1, 0x3d, 0x7c, + 0x8c, 0x1a, 0x39, 0x84, 0x46, 0xab, 0xa1, 0x7e, 0x3b, 0xe8, 0x46, 0x83, 0xf9, 0xa8, 0x3b, 0x4d, + 0xe8, 0xe1, 0xa3, 0x06, 0xf9, 0xbe, 0xe5, 0xfd, 0x9c, 0x39, 0x96, 0x33, 0x17, 0xc9, 0x69, 0x85, + 0x39, 0x0b, 0x7e, 0xce, 0x3c, 0xcb, 0x19, 0xf5, 0x1a, 0x62, 0xf6, 0xdb, 0xbe, 0x6e, 0xa6, 0x4a, + 0x32, 0x17, 0x39, 0x95, 0x23, 0x65, 0x97, 0xe3, 0x28, 0x0c, 0xaa, 0x14, 0x9a, 0x4b, 0x81, 0xff, + 0x6f, 0xb8, 0xdf, 0xf4, 0x0d, 0x17, 0x9d, 0x19, 0x10, 0x37, 0x4e, 0x8d, 0x2b, 0x4b, 0x64, 0xef, + 0x16, 0x9f, 0x42, 0x2e, 0x49, 0xc1, 0x64, 0x2a, 0xe3, 0xa0, 0x70, 0x9a, 0xd2, 0x40, 0xd4, 0xac, + 0x6c, 0x01, 0x19, 0x4a, 0x20, 0xe6, 0xf9, 0x18, 0x07, 0xad, 0x53, 0x14, 0x3f, 0xd5, 0x0c, 0xe0, + 0xb6, 0x64, 0xa0, 0xf8, 0x0f, 0x98, 0x18, 0xea, 0x30, 0x35, 0x51, 0xf2, 0xcd, 0xaf, 0x76, 0x6d, + 0xee, 0xd3, 0x06, 0xa6, 0xd0, 0x64, 0xde, 0x35, 0xc9, 0x96, 0x66, 0x91, 0xaa, 0x3e, 0xb1, 0xba, + 0xb6, 0x5a, 0xbc, 0xf9, 0x19, 0x12, 0xaa, 0x7c, 0x82, 0x42, 0xc2, 0xc5, 0x52, 0x52, 0x82, 0xa9, + 0x85, 0x7c, 0xa6, 0x9a, 0xe3, 0xd3, 0xf4, 0x80, 0xbb, 0x54, 0x45, 0x7a, 0xf1, 0x3c, 0x48, 0x98, + 0xee, 0x2a, 0x10, 0x80, 0xb3, 0x58, 0x91, 0x22, 0xfe, 0x1a, 0x4e, 0xb2, 0x02, 0x36, 0xa3, 0x67, + 0x63, 0x43, 0xcb, 0x7c, 0x7c, 0xbb, 0x2c, 0x3a, 0x52, 0x52, 0xa6, 0x47, 0x0e, 0x3c, 0xc0, 0x4c, + 0x88, 0xbb, 0xe7, 0xa4, 0xc4, 0xcf, 0xd4, 0x88, 0x20, 0xf0, 0xca, 0xfd, 0x00, 0xad, 0x94, 0x51, + 0xed, 0xbd, 0x9b, 0x16, 0xf1, 0x76, 0x20, 0x42, 0xe9, 0x1d, 0xdc, 0xc1, 0x1e, 0xe2, 0x1f, 0xbc, + 0xed, 0xaf, 0x5f, 0x43, 0x06, 0x1d, 0xf3, 0x67, 0x49, 0x58, 0x78, 0x22, 0x1e, 0x2e, 0x08, 0xa6, + 0x19, 0x2e, 0x4f, 0x69, 0x4d, 0xa2, 0x4e, 0x75, 0xfe, 0xcc, 0xa2, 0xe3, 0x8c, 0xd3, 0x85, 0x8c, + 0x73, 0x73, 0x81, 0x9b, 0xa2, 0x1c, 0x29, 0xf1, 0x29, 0x28, 0x82, 0xe0, 0x8f, 0x6a, 0xd1, 0x59, + 0x98, 0x97, 0x36, 0x9a, 0xdc, 0xa8, 0x1d, 0xc9, 0x47, 0x34, 0x37, 0xf4, 0xb5, 0x93, 0xae, 0x0d, + 0xd3, 0x47, 0x69, 0xa0, 0x8c, 0x34, 0xa6, 0x60, 0xdf, 0x30, 0xfc, 0x2e, 0x1d, 0x83, 0x66, 0x74, + 0xa8, 0xb5, 0x2d, 0x71, 0x7f, 0x4c, 0x06, 0x18, 0x9e, 0xb6, 0xbb, 0x38, 0xa4, 0xae, 0xb8, 0x81, + 0x17, 0x45, 0x7e, 0xf9, 0xd2, 0xff, 0x84, 0xf1, 0xd4, 0xb8, 0xa5, 0x4b, 0x83, 0xf5, 0x1c, 0xb7, + 0xb7, 0x11, 0x8e, 0xb7, 0xd5, 0x4c, 0x74, 0x05, 0xad, 0x2e, 0xee, 0x1d, 0x5f, 0xb5, 0x08, 0x34, + 0xa3, 0x61, 0xa0, 0x86, 0xa5, 0x55, 0xd1, 0x9d, 0x13, 0xc4, 0xe9, 0xe9, 0x5c, 0xd8, 0x9e, 0x0e, + 0x19, 0xbc, 0x49, 0x60, 0x86, 0xc3, 0xd8, 0xcc, 0x7f, 0x84, 0x46, 0x39, 0x91, 0xcd, 0xbe, 0x5f, + 0xbf, 0x2c, 0xde, 0x89, 0x0f, 0x70, 0x6a, 0x01, 0xcf, 0xf9, 0xf2, 0x85, 0xee, 0xdf, 0xe0, 0x33, + 0xf5, 0x33, 0x98, 0x2c, 0x30, 0x72, 0xd2, 0xc6, 0xaf, 0x46, 0xad, 0x87, 0x3c, 0x48, 0x04, 0x31, + 0x37, 0x51, 0xed, 0xda, 0x5c, 0x32, 0x65, 0x3d, 0x7d, 0x75, 0x0c, 0x83, 0x17, 0x30, 0x24, 0xdc, + 0xb8, 0x0d, 0xe8, 0xde, 0x0a, 0x7d, 0x0b, 0x53, 0x36, 0xe0, 0x06, 0xaf, 0x40, 0xc0, 0xb4, 0x9a, + 0x15, 0x77, 0x3a, 0x84, 0x99, 0x6d, 0x45, 0x5d, 0x13, 0x69, 0xb7, 0xb6, 0xfe, 0xe0, 0x10, 0x84, + 0x09, 0xd5, 0x3f, 0x22, 0x5e, 0xce, 0x31, 0xb7, 0x6c, 0x3c, 0x66, 0x4c, 0x8f, 0x16, 0xf0, 0x87, + 0x1e, 0xc9, 0xfd, 0x53, 0xd1, 0x5b, 0xe8, 0x05, 0xa2, 0x68, 0x08, 0xcc, 0x86, 0xf9, 0x95, 0x52, + 0xc0, 0xbf, 0x03, 0x34, 0x59, 0x9c, 0xd1, 0x69, 0xfb, 0xab, 0x3c, 0x49, 0x24, 0xaf, 0x84, 0x08, + 0x28, 0xa1, 0x5f, 0xdf, 0xbc, 0xab, 0x1e, 0xf3, 0xd0, 0x23, 0xb2, 0x38, 0x2c, 0x14, 0xf3, 0x76, + 0xcd, 0x64, 0x83, 0x59, 0x38, 0x70, 0x7f, 0x09, 0x3b, 0x30, 0xa2, 0xb5, 0xbf, 0x65, 0x3c, 0x22, + 0x4b, 0x45, 0xa8, 0x5f, 0xe5, 0x36, 0x38, 0xed, 0x2a, 0xbc, 0x98, 0x80, 0x8b, 0x42, 0xfa, 0x7b, + 0xda, 0xde, 0x04, 0xb4, 0xbd, 0x4f, 0x30, 0x6b, 0x82, 0x2a, 0xa4, 0x29, 0xa7, 0x2d, 0xff, 0xfa, + 0xc5, 0x2b, 0xd2, 0x73, 0x01, 0xce, 0x47, 0xb0, 0x20, 0x8c, 0xd0, 0xe2, 0x09, 0x9a, 0x66, 0x2a, + 0xd0, 0x0e, 0xe5, 0x78, 0xb0, 0xc5, 0x99, 0x5c, 0xd0, 0x0a, 0x92, 0xef, 0xd2, 0x49, 0xb3, 0xd4, + 0xde, 0x73, 0x0b, 0x71, 0x75, 0x74, 0x0b, 0x62, 0x35, 0xa0, 0x22, 0x39, 0x21, 0x9a, 0x64, 0xad, + 0x56, 0x0b, 0x0c, 0x19, 0x99, 0x8b, 0xcb, 0xbd, 0x73, 0x10, 0x0c, 0x80, 0xe9, 0xd8, 0x96, 0x8b, + 0x67, 0xd7, 0xd0, 0x77, 0x84, 0x28, 0x95, 0xb8, 0xa5, 0x4f, 0x2e, 0xb0, 0x05, 0x8d, 0x0d, 0x5a, + 0xcc, 0xc7, 0x3a, 0x47, 0x65, 0x3f, 0x63, 0x5a, 0xa3, 0x94, 0x84, 0xc1, 0xa9, 0xfc, 0xb8, 0x50, + 0x81, 0x32, 0x47, 0x79, 0x2e, 0x48, 0xa4, 0x7a, 0x1b, 0x56, 0x27, 0xfa, 0xf0, 0xe5, 0x0b, 0x73, + 0xec, 0xe0, 0xd4, 0x3f, 0xca, 0x50, 0xb9, 0xad, 0xe0, 0x9c, 0xf2, 0x97, 0xea, 0xef, 0xfe, 0x5a, + 0x9f, 0x40, 0x1b, 0x24, 0x8e, 0x99, 0x61, 0x81, 0x9a, 0x25, 0xcd, 0x52, 0xcc, 0x88, 0x11, 0x46, + 0x37, 0xd3, 0xb8, 0xc8, 0xc6, 0xc5, 0x02, 0xf1, 0xaf, 0x40, 0x45, 0x79, 0x66, 0x6e, 0x8d, 0x5c, + 0xa2, 0x95, 0xa6, 0x60, 0x10, 0xbe, 0x4e, 0xc5, 0xa1, 0x58, 0xc5, 0xdb, 0x1f, 0x66, 0x5f, 0xa5, + 0x2a, 0x75, 0xab, 0x71, 0x03, 0x8f, 0x19, 0x43, 0xc6, 0xbb, 0x63, 0x34, 0xbc, 0x0f, 0x16, 0x83, + 0xe2, 0xa3, 0x57, 0xd9, 0x2a, 0xfa, 0x1a, 0x01, 0x3e, 0xf0, 0x82, 0x12, 0x9d, 0x1a, 0x69, 0x08, + 0x56, 0x37, 0x04, 0x34, 0x88, 0xa1, 0x76, 0x7b, 0x7b, 0xb3, 0xbf, 0x5a, 0x11, 0x67, 0x72, 0xd3, + 0x6a, 0x4f, 0xaa, 0x1e, 0xef, 0x6f, 0xf3, 0x1b, 0x66, 0x94, 0xdf, 0x89, 0xad, 0xf9, 0x11, 0x93, + 0x0b, 0x92, 0xc9, 0x6f, 0x5a, 0x5d, 0xba, 0x12, 0xde, 0x2c, 0xb8, 0x15, 0x58, 0x11, 0xc8, 0x55, + 0x87, 0x3a, 0xb1, 0xad, 0x70, 0xd6, 0x17, 0x9a, 0xb4, 0xc0, 0xec, 0xe2, 0xeb, 0xa5, 0x12, 0x6f, + 0x48, 0xd1, 0x98, 0xd9, 0x85, 0xfd, 0x56, 0x35, 0x16, 0xc0, 0x8e, 0x5c, 0x37, 0x49, 0x2f, 0x0b, + 0xa5, 0x81, 0xe9, 0x70, 0xc1, 0x49, 0xb8, 0x46, 0x84, 0x85, 0x8e, 0xe4, 0xa7, 0xc9, 0x12, 0x22, + 0xfe, 0xf5, 0xcb, 0x37, 0xe1, 0xe1, 0x05, 0x23, 0xf9, 0x12, 0xb6, 0x24, 0x34, 0xa9, 0x48, 0x55, + 0x5e, 0x19, 0xc0, 0xba, 0x61, 0xee, 0xbb, 0x36, 0x70, 0x48, 0x4d, 0x64, 0x31, 0x46, 0x97, 0xf9, + 0x2b, 0xc5, 0xdd, 0x5e, 0xc8, 0x16, 0x77, 0xb0, 0x69, 0x32, 0xb5, 0xcc, 0x2a, 0xbd, 0x2c, 0x1a, + 0xff, 0xce, 0x88, 0xf1, 0x05, 0x04, 0x47, 0x86, 0x93, 0xf0, 0x89, 0x99, 0x6e, 0x23, 0xaf, 0xa0, + 0xc3, 0x53, 0x85, 0x93, 0x1a, 0x76, 0x31, 0xa0, 0x37, 0x51, 0xfc, 0x31, 0x0e, 0x2a, 0xb5, 0x00, + 0x28, 0xd4, 0x5f, 0x3c, 0x5e, 0x4a, 0xee, 0x38, 0x6f, 0x78, 0xa9, 0x30, 0xe9, 0x67, 0xc8, 0xc4, + 0xe6, 0x3c, 0x74, 0xce, 0x8d, 0xc8, 0x9d, 0x0f, 0x29, 0x72, 0x9b, 0x35, 0xfc, 0x91, 0xb6, 0x7e, + 0x22, 0xca, 0x61, 0xe2, 0xd2, 0xd3, 0x62, 0x78, 0xc1, 0xb9, 0xc3, 0xee, 0x80, 0x20, 0x11, 0xab, + 0x89, 0x56, 0xf4, 0xc7, 0x94, 0xd8, 0x81, 0x36, 0x95, 0x2d, 0x11, 0xd6, 0x90, 0x2a, 0x39, 0x90, + 0x3e, 0x23, 0xa9, 0x18, 0xd1, 0x0e, 0x12, 0xd1, 0xea, 0x0e, 0x93, 0xa4, 0x03, 0x6a, 0x0e, 0xfb, + 0xb0, 0x3b, 0x70, 0x66, 0x78, 0xa8, 0x8f, 0xb8, 0x46, 0xfd, 0xac, 0x8a, 0xb4, 0x96, 0x36, 0x3d, + 0x95, 0x86, 0x51, 0xc4, 0xd0, 0x95, 0x8e, 0x6f, 0x33, 0x94, 0xa9, 0x22, 0x0a, 0xa1, 0x51, 0xb3, + 0xd9, 0x5c, 0xfb, 0x71, 0xd7, 0x3f, 0xda, 0x83, 0xf0, 0xae, 0x6d, 0xff, 0x49, 0xda, 0x12, 0x2f, + 0x88, 0xd3, 0x1e, 0x69, 0xbe, 0xeb, 0x5f, 0xbb, 0x6e, 0x6a, 0xde, 0xc8, 0x72, 0x5e, 0x68, 0x77, + 0x80, 0x5d, 0x09, 0x98, 0x9f, 0xdc, 0x58, 0x8e, 0x71, 0xb8, 0x61, 0x15, 0xc3, 0x18, 0xfd, 0x37, + 0xf8, 0x4c, 0xbb, 0x4d, 0x22, 0x73, 0xbf, 0x0f, 0x47, 0x30, 0x2c, 0xb3, 0x0b, 0x99, 0x10, 0x5a, + 0x46, 0xf4, 0x6f, 0x47, 0x9a, 0xa2, 0x11, 0xac, 0x3a, 0x45, 0x7e, 0x53, 0xf5, 0xdb, 0x35, 0x9b, + 0x6d, 0x70, 0x81, 0x08, 0xc9, 0x20, 0x13, 0x53, 0x99, 0x83, 0x61, 0x09, 0x83, 0xc6, 0xbf, 0x33, + 0x80, 0x18, 0x07, 0x71, 0xa8, 0x6b, 0xc0, 0x6c, 0xa7, 0xf4, 0x0a, 0x72, 0xfc, 0xcb, 0x36, 0x19, + 0xd8, 0xa7, 0xb9, 0x5d, 0x02, 0xcc, 0x92, 0xbc, 0x83, 0xbe, 0x64, 0xcd, 0x08, 0xa0, 0x6d, 0xcc, + 0x01, 0x77, 0x5a, 0x14, 0xa4, 0x06, 0x43, 0xdd, 0x84, 0x59, 0x5a, 0x6d, 0x1a, 0xaa, 0xf9, 0x12, + 0xf5, 0xce, 0x88, 0xbb, 0x7c, 0x60, 0x0b, 0x38, 0xbf, 0x0c, 0xd2, 0x6c, 0x9c, 0xc4, 0xef, 0x4d, + 0x64, 0xf2, 0x9d, 0xb0, 0x6d, 0xe0, 0xd9, 0x06, 0x30, 0xed, 0x8e, 0x0a, 0x52, 0x0e, 0x70, 0x6d, + 0x76, 0xbb, 0x4f, 0x1c, 0x3f, 0x84, 0x01, 0x21, 0x6e, 0x88, 0x61, 0xd8, 0xbf, 0xbd, 0xc7, 0xb7, + 0x12, 0xa7, 0xfc, 0xeb, 0xda, 0xe9, 0xaf, 0x14, 0xbb, 0x5b, 0x99, 0xdd, 0x23, 0x07, 0x5f, 0x12, + 0xf6, 0x8e, 0x68, 0x91, 0x0f, 0x6d, 0x12, 0xf1, 0x98, 0x38, 0x8a, 0x21, 0x82, 0x02, 0x09, 0x51, + 0x31, 0x37, 0x43, 0x99, 0xaf, 0xa7, 0xcf, 0x59, 0xf9, 0x6e, 0x61, 0xfb, 0xd9, 0x25, 0xf3, 0xec, + 0x41, 0xa2, 0xf7, 0x3f, 0xf9, 0xfd, 0xa3, 0xf1, 0x34, 0x89, 0xff, 0x67, 0x52, 0x07, 0x48, 0xb6, + 0xdf, 0xee, 0xc1, 0x39, 0x83, 0xc7, 0xf7, 0x82, 0x41, 0x4a, 0xea, 0x06, 0x32, 0x5e, 0x3c, 0x74, + 0xe8, 0xf3, 0x43, 0x45, 0xf6, 0x22, 0x81, 0xe1, 0x88, 0x1b, 0xa6, 0xaf, 0x36, 0x27, 0x3a, 0xc2, + 0x79, 0xab, 0xb9, 0xd0, 0xe7, 0x4e, 0xce, 0x29, 0x52, 0xfa, 0x23, 0xa7, 0xd6, 0xb0, 0x94, 0xcb, + 0x97, 0xaa, 0x2a, 0xd2, 0x86, 0xcb, 0x1f, 0x4b, 0x23, 0x31, 0xe7, 0x63, 0xa7, 0x0d, 0xdd, 0x96, + 0x63, 0x19, 0x06, 0x40, 0xb2, 0xee, 0x70, 0x56, 0x4d, 0x9b, 0x5a, 0x4f, 0x1d, 0xea, 0x96, 0x53, + 0x0d, 0x6e, 0x21, 0xfa, 0xff, 0x8b, 0xbb, 0xfe, 0xe7, 0xb6, 0x6d, 0x64, 0xff, 0xfb, 0xfb, 0x2b, + 0x64, 0xb6, 0x8d, 0xc5, 0x33, 0x6d, 0x53, 0x76, 0xd2, 0x26, 0x94, 0x29, 0x4f, 0x5e, 0xda, 0xbe, + 0xf3, 0x5c, 0x9b, 0xf3, 0xd4, 0xb9, 0xa6, 0x1d, 0x8f, 0xe7, 0x2c, 0xc9, 0x90, 0xa5, 0x0b, 0x4d, + 0x32, 0x22, 0x1c, 0x3b, 0x27, 0xeb, 0x7f, 0x7f, 0xbb, 0x8b, 0xef, 0x20, 0xa9, 0x2f, 0x69, 0xdf, + 0xbd, 0x99, 0xa6, 0x16, 0x41, 0x10, 0x58, 0x00, 0x0b, 0x60, 0xb1, 0xd8, 0xfd, 0x2c, 0xcd, 0x1b, + 0x78, 0xa4, 0xe8, 0x4c, 0x4b, 0x75, 0xb9, 0xbc, 0x01, 0xcc, 0x02, 0x4b, 0x28, 0x2a, 0x4c, 0x33, + 0x9e, 0x8d, 0x06, 0xab, 0x19, 0x34, 0x42, 0x88, 0xac, 0xc1, 0x0c, 0xa9, 0xc3, 0x85, 0xf0, 0x2d, + 0xe0, 0x42, 0x3c, 0x84, 0x90, 0xb7, 0x20, 0x3d, 0x48, 0x3f, 0xca, 0x0e, 0x59, 0xe3, 0x37, 0x81, + 0x84, 0x18, 0x78, 0x10, 0xe3, 0x89, 0x4e, 0x70, 0x0e, 0x0f, 0x88, 0xef, 0x91, 0x06, 0xc7, 0x2f, + 0xbf, 0x09, 0x36, 0x04, 0x0b, 0x69, 0xf9, 0xec, 0xff, 0x00, 0x39, 0xe4, 0xd0, 0xf8, 0xcc, 0x5b, + 0x24, 0x6f, 0xe6, 0x9d, 0xce, 0xd7, 0x82, 0x83, 0x08, 0x0e, 0xd8, 0xef, 0x69, 0x1e, 0x70, 0xc1, + 0x41, 0x58, 0x9b, 0xab, 0x3a, 0x6f, 0x77, 0x55, 0xe7, 0xae, 0xab, 0xfa, 0x36, 0xd4, 0xae, 0xc3, + 0x05, 0xc9, 0x1d, 0xac, 0x8f, 0x3f, 0x8b, 0xb6, 0x6d, 0xfc, 0xe8, 0xa1, 0x80, 0xbe, 0xe5, 0x7b, + 0xdb, 0x6f, 0x72, 0x48, 0x9e, 0xd6, 0x9c, 0xea, 0xf9, 0x5a, 0xa7, 0x7a, 0x6b, 0x9c, 0xff, 0x4c, + 0x98, 0x8e, 0xad, 0xd1, 0x39, 0xf8, 0x97, 0xa0, 0x73, 0xc4, 0x2d, 0x88, 0x15, 0x7c, 0x05, 0x62, + 0x05, 0xff, 0x02, 0x48, 0x0e, 0xbe, 0x01, 0x24, 0xc7, 0xdd, 0xd4, 0xc1, 0xdc, 0x10, 0x8f, 0x7f, + 0x88, 0x3a, 0xec, 0xc3, 0x5d, 0x8d, 0x8e, 0xd1, 0x86, 0x79, 0xe0, 0xf0, 0x31, 0x01, 0x1e, 0x7c, + 0xbd, 0xd0, 0x73, 0x8a, 0x2d, 0xc9, 0xee, 0xd8, 0x82, 0x0a, 0xb3, 0x3e, 0x1d, 0x07, 0x83, 0x0d, + 0x22, 0x99, 0x58, 0x4c, 0x17, 0x0c, 0xde, 0xe0, 0x7d, 0x78, 0x66, 0x71, 0x91, 0xe7, 0xe0, 0xae, + 0x90, 0xc8, 0x5a, 0xbd, 0xd2, 0x33, 0xfb, 0x3a, 0x56, 0x17, 0xbc, 0x58, 0xe1, 0xc5, 0xee, 0xad, + 0xff, 0x8a, 0xc4, 0x4a, 0x7b, 0x4a, 0x8e, 0x8a, 0x39, 0xac, 0xc4, 0xfb, 0x68, 0xf3, 0x7f, 0x5f, + 0x25, 0x47, 0xcf, 0xcb, 0x47, 0x1d, 0x08, 0x27, 0xc6, 0x69, 0xd2, 0x8e, 0x5c, 0xb6, 0x12, 0x80, + 0x81, 0x9c, 0xc8, 0x6b, 0x88, 0x65, 0xa8, 0x81, 0x11, 0xe8, 0xa0, 0x9b, 0xe2, 0x24, 0xae, 0x46, + 0xfe, 0xd2, 0xfb, 0xfd, 0x3a, 0x80, 0x81, 0xde, 0xcb, 0x21, 0xcd, 0x60, 0xb9, 0xd7, 0x88, 0x8e, + 0x16, 0xff, 0xdf, 0x25, 0xad, 0x4c, 0x29, 0x62, 0x83, 0x2c, 0xe2, 0x64, 0x51, 0x56, 0x09, 0xde, + 0x06, 0xde, 0xdc, 0xcf, 0x93, 0x4b, 0x90, 0x48, 0xae, 0x22, 0x73, 0xec, 0x4f, 0x2e, 0xf7, 0x7b, + 0x57, 0x20, 0x25, 0x23, 0xee, 0x42, 0x12, 0x47, 0xf3, 0x04, 0x0f, 0x49, 0x20, 0x66, 0xc7, 0x20, + 0x5f, 0x3b, 0x42, 0xc8, 0x39, 0xb4, 0x36, 0xd3, 0x17, 0xe5, 0xca, 0x35, 0xaa, 0xdf, 0x14, 0x3a, + 0x20, 0x6f, 0x89, 0x1a, 0xe0, 0x44, 0xec, 0xcd, 0x95, 0x41, 0x3b, 0xc1, 0xfb, 0xe7, 0xa7, 0xe2, + 0x4f, 0x62, 0xc2, 0x6f, 0xa1, 0x7f, 0x64, 0x1f, 0x6f, 0x16, 0x32, 0xdb, 0xf0, 0xc4, 0x7b, 0x3c, + 0x28, 0xf1, 0x48, 0x4d, 0xce, 0x43, 0x2e, 0x8e, 0x1e, 0xf0, 0x3c, 0xc6, 0x6c, 0x40, 0xdc, 0x0b, + 0xfc, 0x41, 0xaa, 0x5f, 0x17, 0x4a, 0x0f, 0x7d, 0xf4, 0x34, 0x92, 0xde, 0xb5, 0xb9, 0xab, 0xb2, + 0x19, 0x72, 0x02, 0xc4, 0x4c, 0xcf, 0xb3, 0x1f, 0xdc, 0x28, 0x67, 0x01, 0x88, 0x04, 0x4a, 0xff, + 0xcd, 0x4d, 0x60, 0x8b, 0xca, 0x65, 0xce, 0xc9, 0x6c, 0x5e, 0xc1, 0x3a, 0x12, 0x0c, 0x14, 0xf2, + 0x7f, 0x47, 0x76, 0x87, 0x1c, 0x24, 0xba, 0x6e, 0xcf, 0x4f, 0xc4, 0x30, 0x51, 0xf8, 0x2f, 0x65, + 0xf7, 0xd4, 0xcf, 0xf7, 0xf6, 0x42, 0x68, 0x93, 0xe8, 0x76, 0x58, 0x09, 0xe6, 0x9f, 0xa1, 0xe3, + 0x31, 0xec, 0xc2, 0x9e, 0x5b, 0xc5, 0x74, 0xfe, 0x6f, 0xe5, 0x00, 0xbc, 0x1b, 0x71, 0xdb, 0xe3, + 0x49, 0x5e, 0xa0, 0xf3, 0x56, 0x87, 0x1e, 0x9a, 0xd5, 0xd9, 0x3e, 0x42, 0x75, 0x84, 0xfd, 0x4c, + 0xdf, 0x47, 0xa1, 0x75, 0x3f, 0x29, 0x62, 0x9b, 0x00, 0x10, 0x6c, 0x5d, 0x14, 0xe1, 0x0b, 0x77, + 0x09, 0xad, 0x3f, 0x5c, 0x81, 0xcd, 0x4c, 0xc5, 0xdb, 0x28, 0xc9, 0x9d, 0x61, 0x98, 0xeb, 0x0b, + 0x65, 0x18, 0x2b, 0xa3, 0x07, 0x41, 0xe4, 0x63, 0xeb, 0x45, 0x08, 0xe7, 0xe2, 0x5c, 0x5e, 0xbd, + 0x3a, 0x2f, 0x12, 0xbb, 0xc7, 0x2e, 0xcd, 0x2b, 0x52, 0x67, 0x5e, 0xd9, 0x38, 0xca, 0xd2, 0xf7, + 0xc3, 0xd2, 0x30, 0xc0, 0x32, 0x70, 0x9e, 0x09, 0xe3, 0x2d, 0xa7, 0xdf, 0xf1, 0x26, 0x6d, 0xcc, + 0xba, 0x7c, 0xaf, 0x17, 0xc5, 0x11, 0xfa, 0x5e, 0xe9, 0x97, 0x30, 0x67, 0xdc, 0xb7, 0xce, 0xab, + 0x4b, 0x7e, 0x65, 0x67, 0x36, 0xd3, 0xaa, 0xed, 0x1b, 0x93, 0x83, 0x3e, 0x75, 0x38, 0xcc, 0xb2, + 0xc3, 0x63, 0x59, 0x23, 0x99, 0xe6, 0xd6, 0xb0, 0xdb, 0x48, 0x3e, 0x5e, 0x5b, 0x36, 0x93, 0xee, + 0xbe, 0x69, 0xa0, 0x13, 0x33, 0x38, 0xd4, 0xd8, 0x50, 0xfa, 0x19, 0x3b, 0xaf, 0x84, 0xb3, 0xac, + 0x4b, 0x10, 0xfa, 0xdb, 0xeb, 0xfe, 0xae, 0x6a, 0x6e, 0x4c, 0xf0, 0xdd, 0xf7, 0xf7, 0x73, 0xf5, + 0x61, 0x55, 0xd3, 0x5a, 0x76, 0xfd, 0xbe, 0xb4, 0xf5, 0xa0, 0xbd, 0xf8, 0x2f, 0x95, 0x1e, 0x41, + 0xbb, 0xc8, 0x77, 0x9b, 0x95, 0xe8, 0xf4, 0xf4, 0x26, 0x05, 0xff, 0x62, 0x45, 0xaf, 0x54, 0xa5, + 0xf4, 0xd1, 0xa0, 0x42, 0x78, 0x73, 0x64, 0x28, 0x83, 0xce, 0xf9, 0xad, 0x05, 0x30, 0x12, 0xd9, + 0x6f, 0x4a, 0xe7, 0xd5, 0x69, 0x17, 0x35, 0xe5, 0xb8, 0xa8, 0xc2, 0x89, 0x4d, 0x87, 0xd3, 0x43, + 0x2b, 0x1e, 0xeb, 0x9b, 0xa2, 0x77, 0xdd, 0x02, 0x35, 0x92, 0x98, 0xcf, 0xdd, 0xb3, 0x99, 0xaa, + 0xcc, 0x78, 0xfb, 0x50, 0xa9, 0x8d, 0xb9, 0x60, 0xf2, 0xfd, 0x90, 0xdf, 0x98, 0x9c, 0x6b, 0x6a, + 0x16, 0x1a, 0x0d, 0xcf, 0x6c, 0xef, 0xdc, 0xf5, 0x84, 0x95, 0x2b, 0x9e, 0x8c, 0x63, 0xae, 0xfb, + 0x5a, 0x90, 0x7a, 0xea, 0x27, 0xc0, 0x76, 0x5b, 0x59, 0x68, 0xc0, 0x30, 0x76, 0x42, 0x8e, 0x97, + 0xfb, 0xb4, 0x15, 0xe0, 0xae, 0x17, 0x63, 0x7c, 0x3b, 0xb9, 0x94, 0xad, 0xc4, 0x53, 0xba, 0x98, + 0xde, 0x4f, 0x26, 0x19, 0x23, 0x4c, 0xca, 0xd6, 0xcd, 0xda, 0x0c, 0x96, 0xbd, 0x61, 0xe3, 0x10, + 0x8b, 0x80, 0x2c, 0x18, 0x0a, 0xd2, 0xd0, 0xfa, 0xf4, 0x94, 0xa3, 0xb9, 0xaa, 0x0f, 0x81, 0xb4, + 0x16, 0x00, 0xc9, 0xb8, 0x36, 0xaf, 0xc1, 0x8e, 0x26, 0x4c, 0x23, 0x5c, 0x9e, 0x26, 0xb3, 0x7c, + 0xc6, 0x59, 0xf6, 0x79, 0x23, 0xea, 0xcb, 0x55, 0xe4, 0xe7, 0xa8, 0x35, 0x04, 0x52, 0x15, 0xd1, + 0x5b, 0x53, 0x6c, 0x06, 0x45, 0xf0, 0x83, 0x1e, 0x15, 0x05, 0x9c, 0x20, 0xeb, 0x70, 0x8d, 0x60, + 0x03, 0xf5, 0xa9, 0x91, 0x18, 0x65, 0xf3, 0x1a, 0xc5, 0x66, 0x5f, 0x42, 0xb6, 0x5b, 0x67, 0xc9, + 0xc2, 0x56, 0xcb, 0x50, 0x76, 0xee, 0x1d, 0x7d, 0x47, 0xb2, 0x74, 0x2c, 0xf7, 0x72, 0x41, 0x49, + 0x9e, 0xf4, 0x96, 0x83, 0x0e, 0xde, 0x96, 0x68, 0xe9, 0xd5, 0xc3, 0x18, 0x0e, 0x06, 0xc0, 0xee, + 0xd2, 0x34, 0x26, 0x11, 0x40, 0xc4, 0x1b, 0xa2, 0x10, 0x67, 0xcc, 0xa6, 0x4d, 0xcc, 0x9b, 0x96, + 0xae, 0x27, 0x63, 0x6d, 0xa0, 0x2b, 0xb5, 0x59, 0x08, 0xfd, 0xa4, 0x9c, 0x27, 0x10, 0x9f, 0xb0, + 0x76, 0x1f, 0xaa, 0xd8, 0x87, 0x90, 0xf6, 0xd1, 0x83, 0x5f, 0xbc, 0xc0, 0xfe, 0xac, 0x78, 0x31, + 0x57, 0x26, 0x3e, 0x56, 0xe6, 0xaf, 0x17, 0x46, 0x0c, 0x5b, 0x59, 0x35, 0xe9, 0xd5, 0x71, 0xb0, + 0x1d, 0x5c, 0x60, 0x57, 0x22, 0xaf, 0x0d, 0xe3, 0x06, 0x82, 0x3f, 0x07, 0xca, 0x60, 0x5b, 0xc2, + 0x8e, 0x88, 0x3a, 0x4a, 0xe6, 0xdd, 0x28, 0x90, 0xd1, 0x3b, 0xf8, 0xd2, 0x3b, 0x23, 0x5c, 0x2f, + 0x15, 0xba, 0x45, 0xb5, 0x06, 0xd7, 0xdc, 0x67, 0x6c, 0x07, 0x7e, 0xe0, 0x4c, 0xc4, 0x25, 0xe9, + 0x8c, 0x08, 0xfe, 0x21, 0x67, 0x55, 0x45, 0x87, 0x0f, 0x8d, 0x05, 0xbc, 0x62, 0x96, 0x51, 0xa4, + 0xda, 0x11, 0x4d, 0x32, 0x39, 0x8b, 0xfe, 0xcc, 0x59, 0xbf, 0x92, 0xea, 0x0b, 0xb4, 0xe1, 0x52, + 0x4a, 0xa2, 0x11, 0x5e, 0x1b, 0x6d, 0x47, 0x76, 0xf5, 0xff, 0x43, 0xf6, 0x1b, 0x51, 0x9f, 0x81, + 0x09, 0x2b, 0x72, 0xb1, 0x96, 0x6d, 0x41, 0x38, 0x54, 0x13, 0x6c, 0x45, 0xf0, 0xb5, 0x87, 0xd1, + 0xa2, 0xef, 0x6a, 0xee, 0x86, 0x25, 0x29, 0x6c, 0xed, 0x67, 0x2b, 0xdc, 0x5c, 0x55, 0xc3, 0xbe, + 0x86, 0xe6, 0xfd, 0xc4, 0x6e, 0x20, 0x5b, 0xf2, 0x2c, 0x1f, 0x55, 0x65, 0xbf, 0x1d, 0x8f, 0x9c, + 0x68, 0xcd, 0xee, 0x70, 0xb5, 0x70, 0x67, 0xa8, 0x37, 0x83, 0xaf, 0x2d, 0x47, 0x0d, 0xf2, 0x37, + 0x75, 0x88, 0xa1, 0x0b, 0xf9, 0xc6, 0xa3, 0x09, 0x5f, 0xa2, 0x46, 0x0b, 0xad, 0x1a, 0x74, 0x4c, + 0xdc, 0x8c, 0x28, 0x93, 0x18, 0x23, 0xde, 0x39, 0x85, 0x5b, 0xe7, 0x14, 0x3c, 0x03, 0x04, 0xde, + 0xd4, 0x56, 0x10, 0x18, 0xd7, 0x9b, 0xc1, 0x22, 0x0b, 0xc0, 0x74, 0x3c, 0x0f, 0xa1, 0xdf, 0xb7, + 0x81, 0x7a, 0xa5, 0x56, 0xf3, 0xc7, 0x6d, 0x80, 0x92, 0xa1, 0x0d, 0xa7, 0x2a, 0x3c, 0xd9, 0x46, + 0x68, 0xc9, 0xde, 0xaa, 0x63, 0x42, 0xfa, 0x75, 0x68, 0xb4, 0x93, 0x15, 0x5a, 0xda, 0xca, 0x41, + 0x76, 0x36, 0xf4, 0x58, 0xe4, 0xe8, 0x78, 0xc4, 0x76, 0x8b, 0x3e, 0x66, 0x4d, 0x0d, 0x3a, 0x1c, + 0x34, 0x2d, 0x84, 0xd3, 0x60, 0xd0, 0xcd, 0x18, 0xce, 0x4e, 0x46, 0xf7, 0x98, 0x30, 0xbc, 0x78, + 0x29, 0x65, 0x91, 0x29, 0x16, 0xb1, 0xd0, 0xf9, 0x18, 0x46, 0x88, 0x9c, 0x60, 0xb0, 0x4b, 0x69, + 0x13, 0xdd, 0x55, 0x9b, 0x28, 0xee, 0x9a, 0xbb, 0x4a, 0xa2, 0xf8, 0xf2, 0x89, 0x07, 0x15, 0x9c, + 0x06, 0x17, 0x30, 0x5a, 0x9d, 0x52, 0x9f, 0x25, 0x41, 0xec, 0x2d, 0xe6, 0x41, 0x82, 0x23, 0x10, + 0xfc, 0x5d, 0x87, 0xbc, 0x7d, 0x98, 0xf1, 0xa9, 0x88, 0x60, 0x0b, 0xb5, 0xfe, 0x03, 0x16, 0x58, + 0x69, 0x34, 0x2e, 0xd3, 0x96, 0xce, 0x6c, 0x5d, 0x0d, 0x39, 0x49, 0x9d, 0x37, 0xae, 0x3c, 0x29, + 0x04, 0x1e, 0xdf, 0x54, 0x46, 0x0e, 0xc1, 0x56, 0x3f, 0x3d, 0xf1, 0x26, 0x00, 0xc9, 0xed, 0x10, + 0x24, 0x9b, 0x46, 0xa3, 0x2c, 0x8e, 0xec, 0xa0, 0x7d, 0x47, 0x0a, 0x70, 0xe6, 0xf5, 0xf9, 0x59, + 0x67, 0x2c, 0x82, 0x3d, 0xeb, 0x78, 0x03, 0x1d, 0x13, 0xaa, 0x57, 0x7e, 0x3d, 0x2c, 0x67, 0xc4, + 0xcc, 0xba, 0x00, 0x48, 0x70, 0xc2, 0xf7, 0xb6, 0x55, 0xda, 0xb3, 0x2b, 0xed, 0xc9, 0x01, 0xa8, + 0x96, 0xad, 0x5b, 0x27, 0xad, 0xe6, 0xbc, 0xc0, 0x58, 0xe5, 0x2d, 0x52, 0x90, 0xd9, 0x6f, 0x6e, + 0x7c, 0x91, 0x48, 0x0b, 0x41, 0x26, 0xa2, 0xba, 0x25, 0x0a, 0x61, 0xcc, 0x73, 0x14, 0x85, 0x7a, + 0x5a, 0x14, 0xc2, 0xf1, 0x66, 0x49, 0x3d, 0xae, 0xfb, 0x72, 0xd0, 0x42, 0x1d, 0x8e, 0xf8, 0xfa, + 0xbd, 0x1d, 0xad, 0x8a, 0xcf, 0xc5, 0xd6, 0xae, 0x74, 0xd3, 0x2b, 0xb5, 0x4f, 0x4a, 0x7f, 0x8c, + 0x6d, 0xb7, 0x21, 0x2e, 0x05, 0x81, 0xbb, 0xed, 0x35, 0x52, 0x57, 0xec, 0xee, 0xb1, 0xbd, 0xdd, + 0x1b, 0x96, 0xb9, 0xd8, 0x9a, 0xe7, 0x5d, 0x4a, 0xdf, 0x18, 0x5a, 0x53, 0xe0, 0x73, 0xee, 0x26, + 0xbb, 0x9b, 0x2a, 0x2d, 0xcf, 0x5d, 0xad, 0xe5, 0xee, 0xd2, 0xa2, 0xbc, 0x91, 0x15, 0x30, 0xae, + 0xbc, 0x6c, 0x52, 0x30, 0x2a, 0x45, 0x70, 0x84, 0xb1, 0x35, 0x9c, 0xf8, 0xde, 0xe0, 0xc9, 0xaa, + 0xb6, 0xbb, 0xeb, 0x09, 0x70, 0x05, 0x36, 0x4b, 0x85, 0x75, 0xc6, 0x32, 0xae, 0xbd, 0x33, 0x96, + 0xd4, 0x79, 0x0a, 0x53, 0x4c, 0xa1, 0x60, 0x12, 0x7a, 0xcf, 0x7e, 0x93, 0xe1, 0x15, 0xcc, 0xe4, + 0xcf, 0xa3, 0x82, 0x8b, 0xb0, 0x6b, 0xae, 0xb9, 0x96, 0x00, 0x50, 0x88, 0x98, 0xed, 0x1c, 0xd7, + 0x10, 0x79, 0xd1, 0xdc, 0x96, 0x49, 0x99, 0xb2, 0x1b, 0x87, 0x2a, 0xcc, 0x25, 0x1a, 0x46, 0x6c, + 0x7a, 0x89, 0x37, 0x66, 0x39, 0x99, 0x26, 0xc8, 0x9b, 0xd2, 0xb2, 0xfa, 0x51, 0xd8, 0xc4, 0x34, + 0xd3, 0x0c, 0xe7, 0xbc, 0xda, 0xe9, 0x52, 0x2b, 0xb7, 0x78, 0x23, 0xf2, 0x16, 0xac, 0xd7, 0xf8, + 0x3e, 0xa8, 0x87, 0x14, 0xb1, 0x34, 0x5f, 0xc8, 0xe0, 0x5a, 0x15, 0x7e, 0xa2, 0xf1, 0x9d, 0xf5, + 0xa5, 0xd8, 0xcb, 0xf8, 0x1b, 0xd8, 0x43, 0x8a, 0x0c, 0x17, 0x9d, 0xf4, 0x68, 0xab, 0xe8, 0x24, + 0xde, 0xf9, 0x0b, 0xb5, 0x20, 0x7a, 0x8a, 0x44, 0x32, 0x26, 0x94, 0x3e, 0x10, 0x04, 0x5f, 0xfb, + 0xba, 0x11, 0x8d, 0x10, 0x86, 0x9a, 0x29, 0xb9, 0xef, 0xab, 0x9b, 0x95, 0x26, 0x59, 0x9e, 0x3e, + 0x0a, 0x97, 0xed, 0x51, 0x3d, 0x14, 0xee, 0x31, 0x34, 0x6e, 0xbd, 0xe4, 0x9e, 0xed, 0x03, 0x4f, + 0x58, 0x53, 0x40, 0xe8, 0xbe, 0x36, 0x9f, 0xe2, 0x4a, 0xc1, 0x5c, 0xbb, 0x22, 0x52, 0x17, 0x44, + 0x76, 0x5f, 0x1b, 0x72, 0xbe, 0xbf, 0x9f, 0x93, 0x41, 0x57, 0x0b, 0xb5, 0xef, 0xb4, 0x5a, 0xa6, + 0x25, 0xc3, 0x57, 0x40, 0xdc, 0x5e, 0x6f, 0xb9, 0x51, 0x65, 0x6a, 0x88, 0x9f, 0xc3, 0x10, 0xaf, + 0xbc, 0xb8, 0x71, 0xd7, 0x5c, 0x47, 0x46, 0x51, 0xf4, 0x8a, 0x05, 0xf7, 0xdb, 0x17, 0x2f, 0x8e, + 0x0f, 0xc4, 0x9a, 0x1b, 0x1f, 0x1c, 0xc1, 0xae, 0xc9, 0x4a, 0xf8, 0xd1, 0xb3, 0xcf, 0xaa, 0xa4, + 0xd3, 0xaa, 0xb1, 0x81, 0x96, 0x41, 0x7c, 0x9d, 0xd6, 0x61, 0x0f, 0xc3, 0x99, 0x56, 0xcd, 0xad, + 0xfd, 0x33, 0x1a, 0x60, 0x7a, 0x54, 0x35, 0x41, 0x37, 0x20, 0x6e, 0x6e, 0xc0, 0xbb, 0xcd, 0xe8, + 0x77, 0x34, 0x68, 0x2b, 0x9b, 0xb1, 0x82, 0x07, 0xeb, 0xab, 0xfc, 0x36, 0x3c, 0x58, 0x43, 0x51, + 0x56, 0x67, 0x59, 0x8f, 0x39, 0xf4, 0x5d, 0x58, 0x0d, 0x5d, 0x4e, 0xcc, 0x33, 0xb9, 0xc2, 0x62, + 0x90, 0x58, 0xd4, 0x71, 0x5b, 0xf6, 0x6a, 0xbf, 0x17, 0xf7, 0x9d, 0x9c, 0xc1, 0xa1, 0x66, 0xc8, + 0x3b, 0x20, 0xf9, 0x81, 0x64, 0x75, 0x24, 0x8f, 0xde, 0x15, 0xee, 0xe9, 0xf8, 0x79, 0x67, 0xa8, + 0xc5, 0xae, 0x9d, 0x40, 0xab, 0x51, 0x63, 0xa7, 0x83, 0xe2, 0x2b, 0x74, 0xc8, 0xee, 0xb6, 0xbc, + 0x4b, 0xf9, 0x3c, 0xec, 0x7f, 0xc1, 0xf2, 0xbe, 0x62, 0x19, 0x0f, 0x06, 0x35, 0x33, 0x07, 0xb3, + 0xae, 0xab, 0x1b, 0xc0, 0x5e, 0x1c, 0x5b, 0x6b, 0x3c, 0xe9, 0x05, 0x6c, 0x65, 0xc0, 0xb5, 0xad, + 0xf1, 0x25, 0x68, 0xb2, 0xff, 0xcc, 0xd2, 0x6f, 0x6f, 0xc6, 0x8b, 0xb6, 0xef, 0x05, 0x56, 0x80, + 0xfa, 0x78, 0x5d, 0xef, 0xe9, 0xdc, 0xf5, 0x9d, 0x51, 0x11, 0xd2, 0xb0, 0x39, 0xb6, 0x49, 0x0e, + 0x95, 0x77, 0x21, 0xa7, 0x04, 0x07, 0xa5, 0x23, 0x9b, 0xc0, 0x51, 0x80, 0x27, 0x19, 0x9b, 0xf0, + 0xfe, 0xa6, 0xab, 0xa8, 0x52, 0xe7, 0x28, 0x3e, 0xde, 0xb0, 0xe2, 0xac, 0xb1, 0x66, 0x52, 0x76, + 0x6c, 0x5e, 0xb5, 0x64, 0x5e, 0x5d, 0xf9, 0xae, 0x65, 0x25, 0x45, 0xe2, 0x3c, 0xf3, 0x41, 0x8f, + 0xa4, 0xe0, 0x6f, 0xf4, 0xd9, 0x7d, 0xf3, 0xa6, 0x41, 0x77, 0xcc, 0x9b, 0x30, 0x4b, 0x64, 0xee, + 0xa3, 0xa6, 0xdc, 0xc2, 0x8b, 0x42, 0x7e, 0xe4, 0x50, 0x43, 0xd1, 0x88, 0x98, 0x0a, 0xe0, 0x89, + 0xe5, 0xb0, 0x13, 0x60, 0xe3, 0x53, 0x85, 0x2c, 0xc5, 0xaf, 0x13, 0x2a, 0x78, 0x1f, 0xc3, 0x44, + 0x83, 0x7c, 0x5f, 0xc7, 0x63, 0xd2, 0x08, 0x67, 0x84, 0x6a, 0x16, 0x35, 0x03, 0x69, 0xca, 0x64, + 0x8c, 0x82, 0x81, 0x08, 0x75, 0xc3, 0x5b, 0xda, 0x03, 0x6c, 0x03, 0x38, 0x73, 0xbd, 0xab, 0x7b, + 0x07, 0x83, 0x76, 0x26, 0x97, 0x57, 0x4b, 0xcf, 0x69, 0x4a, 0x20, 0x9b, 0xa3, 0xe3, 0x14, 0x47, + 0x3b, 0x08, 0x81, 0x68, 0x8a, 0x66, 0xa5, 0x15, 0xba, 0xb9, 0xa1, 0xf1, 0xbc, 0xe8, 0x43, 0x32, + 0xd8, 0x30, 0xf6, 0x71, 0xbc, 0x56, 0xd9, 0x0f, 0x8f, 0x58, 0x57, 0x1b, 0x66, 0x79, 0xff, 0x8f, + 0x10, 0x51, 0xc1, 0x39, 0x0d, 0xea, 0xe7, 0xca, 0x11, 0x37, 0x65, 0xd1, 0x6a, 0x5a, 0x56, 0x51, + 0xe2, 0x5a, 0x98, 0x22, 0x3d, 0x04, 0xba, 0x4c, 0x15, 0x39, 0x88, 0x63, 0x36, 0x1a, 0xbb, 0x63, + 0x7e, 0x2a, 0xc1, 0xfc, 0x5d, 0xbe, 0xd3, 0x23, 0xac, 0xac, 0xce, 0xaa, 0xb5, 0x10, 0x73, 0xf9, + 0x3a, 0x88, 0x39, 0xbc, 0xb0, 0x88, 0x77, 0x52, 0x79, 0xd9, 0x9c, 0x39, 0x15, 0x01, 0x4b, 0x58, + 0x77, 0x39, 0x43, 0xe7, 0xdd, 0xdd, 0xcc, 0x7a, 0x55, 0xa4, 0xad, 0xad, 0x8a, 0x66, 0xce, 0xbb, + 0xf2, 0x61, 0xee, 0x80, 0xc4, 0x98, 0x48, 0xab, 0x18, 0xfc, 0x34, 0x8c, 0xe6, 0xa9, 0xd5, 0x5d, + 0x79, 0xc2, 0x23, 0x11, 0x0c, 0x08, 0xc6, 0x08, 0x6f, 0x41, 0x6a, 0xe6, 0x34, 0x15, 0x82, 0xc5, + 0xe7, 0xd0, 0xdd, 0x9f, 0x92, 0x2c, 0xba, 0x9b, 0x25, 0xc3, 0x08, 0xad, 0xa1, 0xa3, 0xd1, 0x7c, + 0x96, 0x34, 0xb6, 0x9b, 0x40, 0xf3, 0x35, 0xfc, 0x1e, 0x8c, 0x46, 0xb1, 0x5c, 0xf6, 0x3d, 0x00, + 0x3f, 0x0b, 0x4c, 0x6e, 0xbc, 0x01, 0x98, 0xdc, 0xcd, 0x7a, 0x30, 0xb9, 0xa8, 0x6c, 0xce, 0x53, + 0x4c, 0xcc, 0x30, 0xcc, 0x89, 0x29, 0xa1, 0xe4, 0x74, 0x1c, 0x89, 0xdf, 0x50, 0x42, 0x7a, 0x23, + 0x7f, 0x17, 0x93, 0xb4, 0x5c, 0x8a, 0x9f, 0xc0, 0x19, 0xe4, 0x17, 0x21, 0xa2, 0x87, 0x31, 0xd7, + 0x80, 0x77, 0x6e, 0xdf, 0xe5, 0x4a, 0x4b, 0xa8, 0xff, 0x0c, 0x0f, 0x79, 0x23, 0x43, 0xea, 0x9e, + 0xfc, 0xe9, 0x69, 0xa7, 0x96, 0x9e, 0x9f, 0xa4, 0x55, 0x78, 0xa3, 0xa6, 0x90, 0xc0, 0x5d, 0x16, + 0xac, 0xf7, 0x05, 0x23, 0x2f, 0x46, 0x6f, 0x56, 0xfd, 0xbc, 0x12, 0xfc, 0xcf, 0x86, 0x43, 0x2c, + 0xd6, 0x42, 0x21, 0xf6, 0x33, 0xd1, 0xfd, 0x14, 0xe6, 0x27, 0x1d, 0x46, 0xea, 0xb1, 0x28, 0x7f, + 0x4f, 0x6b, 0x64, 0x0c, 0x91, 0x8c, 0x62, 0xd9, 0xce, 0x42, 0xb3, 0x0d, 0x58, 0x68, 0xbe, 0x01, + 0x0b, 0x8d, 0xd7, 0xb3, 0x50, 0xa6, 0x59, 0x68, 0xa6, 0x88, 0x06, 0x16, 0x9a, 0xcb, 0xdf, 0xc0, + 0x42, 0xe3, 0xa5, 0xcd, 0x2b, 0x99, 0x03, 0x6c, 0xa3, 0xd7, 0x34, 0x13, 0xf7, 0xe1, 0xb4, 0x49, + 0x0a, 0x04, 0x91, 0x6f, 0x8a, 0xea, 0x9c, 0x3b, 0xd8, 0x25, 0x66, 0x20, 0x2a, 0x1b, 0x5d, 0x37, + 0xbc, 0x91, 0xf7, 0xb8, 0xb0, 0x77, 0xed, 0xe0, 0x15, 0xad, 0x2a, 0x6a, 0x7f, 0xbf, 0x75, 0x41, + 0xc4, 0xb1, 0x8d, 0x61, 0xe5, 0x73, 0x96, 0x57, 0x0a, 0xb4, 0x4b, 0xd8, 0xc4, 0x8d, 0x1f, 0xe1, + 0x6c, 0x6f, 0x5d, 0xa6, 0x9c, 0x55, 0x54, 0x85, 0x97, 0x5d, 0x51, 0xd6, 0xef, 0x6e, 0x51, 0xbf, + 0xb7, 0x97, 0xf4, 0xf3, 0x6c, 0x45, 0x39, 0xb0, 0xf6, 0xb4, 0xad, 0x8e, 0xf5, 0x72, 0x56, 0x11, + 0x74, 0xe7, 0x12, 0x74, 0xb7, 0x8a, 0x20, 0x0c, 0xd7, 0xba, 0xa2, 0x24, 0x78, 0xed, 0x96, 0x05, + 0x09, 0x28, 0x6b, 0x48, 0xe5, 0xf9, 0x19, 0x1e, 0xba, 0xfd, 0x32, 0x29, 0x9c, 0x68, 0x7b, 0x99, + 0x88, 0xbf, 0xe4, 0xee, 0x60, 0x90, 0xb0, 0xae, 0xcc, 0x77, 0xe5, 0x8a, 0x12, 0x79, 0xe9, 0x94, + 0xc7, 0xcb, 0xf6, 0xf6, 0xca, 0xc0, 0xd7, 0xed, 0x65, 0xc1, 0xda, 0xbf, 0xb3, 0xc5, 0x66, 0xd3, + 0x50, 0x3e, 0x86, 0xb9, 0x6e, 0x2f, 0x7f, 0xa3, 0x6d, 0xc5, 0xf5, 0x22, 0xd1, 0x31, 0x31, 0x95, + 0x83, 0x9f, 0x25, 0xa3, 0x2c, 0xd0, 0x89, 0x26, 0xe0, 0x01, 0x2c, 0x62, 0x02, 0x08, 0x22, 0x65, + 0x84, 0x5a, 0x86, 0xb3, 0x15, 0xce, 0x27, 0x2c, 0x32, 0x4e, 0x3c, 0x2c, 0x4d, 0x7d, 0x17, 0x9c, + 0x9a, 0x67, 0x4f, 0x17, 0x8a, 0xcd, 0xe0, 0x24, 0xd2, 0x5b, 0x86, 0xe1, 0x0a, 0xd9, 0x85, 0xff, + 0xa6, 0x69, 0x11, 0x4e, 0x71, 0x29, 0x3b, 0x65, 0x66, 0x71, 0xf1, 0x7d, 0xa9, 0x77, 0x95, 0x2f, + 0xb5, 0x8f, 0xbd, 0x96, 0xc8, 0x51, 0xda, 0xd5, 0x71, 0x5b, 0xfc, 0x4f, 0xaf, 0xdb, 0x3e, 0xbd, + 0xb4, 0x8d, 0x96, 0xaf, 0xae, 0x2d, 0xc9, 0x29, 0x6e, 0x58, 0x28, 0x26, 0x8f, 0xa6, 0xd3, 0x59, + 0x6d, 0xd0, 0x14, 0x1e, 0xdf, 0x76, 0x6d, 0x52, 0xb1, 0x1b, 0x1a, 0xb1, 0xf9, 0x36, 0x69, 0xd9, + 0xca, 0x02, 0xb6, 0x6b, 0x1f, 0x7c, 0x96, 0x30, 0xbf, 0x59, 0xc8, 0x88, 0x1e, 0x1f, 0xd6, 0xb8, + 0xaf, 0x0e, 0xac, 0x13, 0xfa, 0x1c, 0x8d, 0x8e, 0xfb, 0xdd, 0x26, 0x7e, 0xae, 0x1e, 0x1b, 0xcb, + 0x72, 0x10, 0x45, 0x6a, 0x7d, 0xad, 0x11, 0x45, 0x1a, 0x8b, 0x9c, 0x35, 0x17, 0x59, 0x83, 0x21, + 0xa9, 0x15, 0x2b, 0xe0, 0x03, 0x60, 0x04, 0x25, 0xbe, 0x10, 0x1e, 0x68, 0x9e, 0x9e, 0xd8, 0xe0, + 0x38, 0x74, 0xa7, 0xcb, 0x72, 0xe9, 0x0b, 0x2b, 0x0a, 0x83, 0x04, 0x6d, 0x0d, 0xd5, 0x2e, 0x78, + 0x4c, 0xa3, 0x2f, 0x66, 0xd1, 0xf8, 0x38, 0xad, 0x92, 0x23, 0x3b, 0xe1, 0x08, 0x12, 0xe4, 0xcf, + 0x5e, 0x5a, 0xf9, 0xd3, 0xc4, 0x21, 0xeb, 0xa7, 0xa2, 0xbe, 0xd6, 0xe0, 0xfc, 0x62, 0x3e, 0x07, + 0xd2, 0xc1, 0xd5, 0x3a, 0x04, 0x21, 0xde, 0xd0, 0xb2, 0x2f, 0xbd, 0x0d, 0xd5, 0xfd, 0x25, 0xcc, + 0xcf, 0x1d, 0x7d, 0x97, 0xf9, 0x30, 0x03, 0xd1, 0xc8, 0x7e, 0x32, 0xae, 0xc6, 0xe7, 0xa8, 0x63, + 0x61, 0x41, 0x78, 0x92, 0x12, 0x92, 0xb0, 0xb4, 0x13, 0x95, 0xb0, 0xf5, 0x3c, 0x52, 0x1f, 0x85, + 0xc6, 0x66, 0xea, 0x63, 0x66, 0x7e, 0xe7, 0xe8, 0x22, 0xa9, 0xcc, 0x29, 0x81, 0x24, 0x5a, 0x4f, + 0x8a, 0x1c, 0x7d, 0x10, 0x23, 0x6b, 0x37, 0xff, 0xa9, 0x18, 0xa2, 0xb5, 0xaf, 0xd4, 0xe3, 0x74, + 0x82, 0x3d, 0x75, 0x45, 0xb9, 0x17, 0x74, 0xba, 0x01, 0x2a, 0xe3, 0xc3, 0x60, 0xc5, 0x1a, 0x42, + 0x57, 0x21, 0x0a, 0xe0, 0x0d, 0xc6, 0xab, 0x3c, 0xf3, 0xcd, 0xab, 0xc4, 0x55, 0x8e, 0x41, 0x97, + 0x86, 0xd6, 0x9e, 0x9d, 0x50, 0x90, 0x1c, 0xc8, 0xdb, 0x76, 0x43, 0x03, 0x72, 0xf2, 0xd9, 0xe0, + 0xe8, 0x45, 0x1c, 0xc2, 0x3c, 0x9a, 0x03, 0x95, 0xd2, 0xd0, 0xf5, 0xec, 0x7b, 0x10, 0x36, 0x60, + 0xaa, 0x8d, 0x58, 0x07, 0x6f, 0x7b, 0x0a, 0x10, 0x15, 0x59, 0x55, 0xa1, 0xef, 0x1b, 0xc9, 0x8e, + 0x08, 0xfa, 0xd1, 0x2d, 0xdf, 0x5a, 0x27, 0x73, 0x3a, 0xf4, 0xca, 0x9a, 0xb1, 0xc6, 0xb7, 0x69, + 0x17, 0x4e, 0xd4, 0xda, 0xc8, 0x34, 0x30, 0x26, 0xb4, 0xe1, 0x5e, 0x79, 0xa6, 0xd0, 0x9d, 0x16, + 0xe6, 0x20, 0xd0, 0x74, 0xbe, 0x0f, 0xf9, 0x69, 0xb7, 0xd2, 0x56, 0xb5, 0xc6, 0xb4, 0x2b, 0xaa, + 0x44, 0xff, 0xe2, 0x5f, 0x72, 0xf5, 0xc4, 0xb8, 0x33, 0x23, 0x8b, 0x1a, 0xb2, 0xa0, 0xb0, 0xce, + 0x43, 0xd5, 0x41, 0x65, 0xbf, 0xae, 0xea, 0xaf, 0xc7, 0xce, 0xeb, 0xf1, 0xf4, 0x83, 0xf5, 0x3a, + 0x20, 0x24, 0x79, 0xfd, 0x3a, 0xbb, 0xd3, 0x62, 0x24, 0x61, 0x57, 0xca, 0x4b, 0xf2, 0x86, 0xd1, + 0xb0, 0x72, 0x22, 0xa2, 0x80, 0x16, 0xbb, 0x73, 0xab, 0xb4, 0x61, 0xa9, 0xb7, 0xb1, 0x3e, 0x9f, + 0x7f, 0x5e, 0x54, 0x36, 0x62, 0x5b, 0x1e, 0x2e, 0x85, 0x93, 0xaa, 0x18, 0xf6, 0x0a, 0xd9, 0x36, + 0xcd, 0x23, 0x83, 0xd4, 0xa2, 0x00, 0x9d, 0x10, 0xea, 0xce, 0xaa, 0x18, 0xaf, 0x80, 0x1c, 0xa8, + 0xeb, 0xe0, 0xd9, 0x57, 0xaf, 0x5e, 0xbe, 0x7c, 0xd9, 0xef, 0x08, 0x56, 0xef, 0x90, 0xa2, 0xac, + 0xf3, 0x19, 0x1d, 0x40, 0xad, 0x7b, 0xcb, 0x0e, 0x59, 0x07, 0x0b, 0x77, 0x6e, 0x6b, 0x7a, 0x2c, + 0x82, 0x70, 0xb0, 0xdf, 0xdb, 0xba, 0xaa, 0x8b, 0xcf, 0xb0, 0xf3, 0x3f, 0x4a, 0x9c, 0x9e, 0x59, + 0xde, 0x19, 0xd3, 0x92, 0xd3, 0xc1, 0xe6, 0xd9, 0x95, 0x8a, 0xea, 0x08, 0xa7, 0xa6, 0x36, 0x21, + 0xbf, 0xb4, 0x79, 0x52, 0x83, 0x48, 0xbe, 0x9c, 0xe5, 0xf0, 0x96, 0x01, 0x1f, 0x4f, 0xd0, 0x7c, + 0xe9, 0xae, 0xb8, 0x99, 0x4d, 0x3e, 0xe3, 0x2c, 0x24, 0x87, 0x50, 0x31, 0x15, 0x41, 0x28, 0x11, + 0x7c, 0x04, 0x7f, 0x4a, 0x9c, 0x67, 0x69, 0x79, 0x86, 0xa1, 0x90, 0xd2, 0xf2, 0x6d, 0xdf, 0x3a, + 0x9f, 0xcb, 0x6b, 0x7b, 0x3d, 0x58, 0x99, 0x05, 0x03, 0x01, 0x23, 0xf3, 0x31, 0x4b, 0x33, 0x67, + 0xbe, 0x5f, 0x0c, 0x09, 0xf4, 0x11, 0xe7, 0xb9, 0x98, 0xe1, 0xe5, 0x59, 0x7d, 0x8a, 0x23, 0xc2, + 0xdd, 0x41, 0x71, 0x2a, 0x6c, 0xd1, 0x2f, 0xcb, 0xb3, 0x2b, 0x58, 0x1f, 0x1d, 0xe3, 0x75, 0x48, + 0x12, 0x44, 0xd5, 0x93, 0x8b, 0x7a, 0xd2, 0xa7, 0x7a, 0x12, 0xda, 0xa6, 0xc1, 0x04, 0x31, 0x15, + 0x2c, 0xf2, 0xa4, 0x7c, 0x1b, 0x01, 0x23, 0x25, 0x41, 0x5b, 0x6f, 0x21, 0xa0, 0x13, 0x63, 0xa2, + 0x8f, 0x72, 0xf6, 0x90, 0x7d, 0xa6, 0xe5, 0xe7, 0x46, 0x8d, 0xd8, 0x41, 0x00, 0x9b, 0x02, 0xb2, + 0x22, 0x4e, 0x74, 0x5d, 0x11, 0xb2, 0x26, 0xa5, 0x62, 0x93, 0x3e, 0x66, 0xce, 0xbb, 0x8f, 0x18, + 0x3f, 0xec, 0x63, 0x16, 0x9a, 0xf8, 0x11, 0xca, 0xd7, 0x1b, 0xbb, 0xc3, 0xe8, 0x5d, 0x23, 0xdf, + 0x2d, 0xbc, 0xbc, 0xe3, 0x3f, 0x41, 0x6f, 0xa6, 0x71, 0x64, 0x3b, 0x88, 0x87, 0xcb, 0x08, 0x91, + 0xf5, 0x6c, 0x27, 0x6d, 0x61, 0x05, 0xa6, 0xd6, 0x47, 0x0a, 0xac, 0xa4, 0x4c, 0xb0, 0xf1, 0x9d, + 0x62, 0x24, 0x37, 0x15, 0xfd, 0x16, 0x6d, 0x2e, 0xda, 0xdc, 0x6e, 0x2c, 0x10, 0xe0, 0x92, 0xa4, + 0xa9, 0x43, 0x3f, 0x27, 0xaf, 0xdc, 0xde, 0x36, 0xe5, 0x1e, 0xbf, 0x9c, 0x88, 0x5b, 0x6b, 0xd4, + 0x29, 0x9b, 0x85, 0x71, 0xe5, 0xc2, 0xe7, 0xf2, 0x90, 0xb5, 0x4d, 0x48, 0x82, 0xdc, 0x1d, 0x54, + 0x15, 0x84, 0xdb, 0xb9, 0x67, 0xd0, 0xdd, 0xa4, 0x65, 0xbd, 0x41, 0x5d, 0x52, 0xdf, 0xe9, 0xc3, + 0x71, 0x3e, 0x39, 0xed, 0xba, 0x65, 0xde, 0xa0, 0x16, 0x71, 0x19, 0xba, 0x1c, 0x07, 0x24, 0xd6, + 0x46, 0x98, 0xec, 0x86, 0x85, 0xb2, 0x75, 0x5c, 0x47, 0x4d, 0xdc, 0xa2, 0xa3, 0xdc, 0x2b, 0xf6, + 0x1d, 0xfc, 0xd6, 0xa2, 0x0f, 0x24, 0x19, 0x47, 0x5d, 0x68, 0xf0, 0x6c, 0x16, 0x88, 0x2b, 0x94, + 0xb2, 0xbe, 0xe5, 0x2b, 0xd1, 0x06, 0x65, 0x87, 0xe6, 0x52, 0x3c, 0x6c, 0x52, 0xd4, 0x3f, 0x3e, + 0x12, 0xd6, 0x75, 0x1f, 0x43, 0x69, 0xf9, 0x2a, 0x7e, 0xf9, 0x0e, 0xb9, 0xf7, 0x9c, 0x20, 0xbd, + 0xbb, 0xf3, 0xdb, 0xd1, 0x05, 0x9f, 0x77, 0xb9, 0x05, 0x54, 0x07, 0xcc, 0x0f, 0x8b, 0xdc, 0x18, + 0x31, 0xbf, 0x45, 0x3f, 0xa8, 0x2d, 0xc4, 0x47, 0xc1, 0x8e, 0x5c, 0xb0, 0x75, 0xe9, 0x6d, 0xa0, + 0xb7, 0x17, 0xee, 0x80, 0xdf, 0xb5, 0xa2, 0xb9, 0x13, 0x4c, 0xbb, 0x07, 0x60, 0x46, 0x1e, 0x38, + 0x78, 0x82, 0x99, 0xa6, 0xb1, 0xf1, 0xa3, 0x29, 0xdf, 0x48, 0xb4, 0xb2, 0x60, 0x0e, 0xab, 0x31, + 0x46, 0x62, 0x59, 0x80, 0x5c, 0xb8, 0x98, 0x26, 0xb0, 0xbf, 0xc2, 0xbf, 0x4f, 0x09, 0x2a, 0xb5, + 0xe1, 0xb8, 0x69, 0x9b, 0xab, 0xbf, 0x88, 0xdd, 0x50, 0x5e, 0x7b, 0x20, 0x41, 0xf4, 0x6f, 0x8a, + 0x05, 0x3b, 0x98, 0xda, 0xd9, 0x8e, 0xbf, 0xf5, 0xf2, 0x85, 0xcb, 0x07, 0xe8, 0x73, 0xd6, 0xa5, + 0xc4, 0xe1, 0xa8, 0xea, 0xc2, 0x07, 0xfb, 0x44, 0x51, 0x78, 0x82, 0x45, 0x08, 0xe2, 0x20, 0x71, + 0x69, 0xfa, 0x92, 0x09, 0x50, 0x3f, 0xec, 0x32, 0x34, 0x09, 0xf0, 0x43, 0x36, 0xe8, 0x7e, 0x93, + 0xbe, 0xc8, 0x76, 0x0f, 0xc3, 0x30, 0xf4, 0x5d, 0x64, 0x7c, 0x0d, 0x86, 0x39, 0x8f, 0x5c, 0x58, + 0x7c, 0xfd, 0xe2, 0x36, 0x72, 0x31, 0xf1, 0x0d, 0x7c, 0xa6, 0x60, 0x20, 0x90, 0x87, 0xed, 0x2a, + 0xa6, 0xec, 0xf1, 0x82, 0x80, 0x49, 0x2c, 0x98, 0xa0, 0x5e, 0x4d, 0x7f, 0xe7, 0x31, 0xdc, 0x25, + 0x72, 0xa4, 0x3d, 0x8a, 0xfd, 0x5c, 0x6c, 0x23, 0x7b, 0xb0, 0x0b, 0xf2, 0xe2, 0x42, 0x16, 0xf3, + 0xad, 0x42, 0xda, 0x87, 0x4a, 0xc6, 0x9a, 0x92, 0xca, 0xa4, 0xe5, 0x93, 0xf5, 0x60, 0x1f, 0xc7, + 0x61, 0x40, 0xf7, 0x54, 0x99, 0x4b, 0xf6, 0x3d, 0x8b, 0x86, 0x4e, 0x4a, 0x35, 0xe4, 0xf2, 0xd2, + 0x39, 0x2a, 0xea, 0x6c, 0x6a, 0x77, 0xe3, 0x5f, 0x35, 0x29, 0x99, 0x83, 0x8c, 0x68, 0x40, 0x09, + 0xed, 0xe4, 0x5f, 0x75, 0x72, 0x11, 0xf1, 0x74, 0x36, 0x2f, 0x0e, 0xde, 0x08, 0x0a, 0xaa, 0x4f, + 0xef, 0x8a, 0x5f, 0x6e, 0x47, 0x5d, 0xe0, 0xb4, 0x0c, 0x38, 0x0d, 0x03, 0xce, 0x49, 0x5e, 0xf3, + 0x4b, 0xcd, 0xd9, 0xa3, 0xf2, 0xe4, 0xb9, 0x98, 0x8d, 0x32, 0xea, 0xec, 0xc6, 0x30, 0x38, 0x41, + 0x4b, 0x68, 0x9d, 0xaf, 0x86, 0xc3, 0x61, 0x67, 0xbf, 0xf7, 0xe2, 0x9b, 0xa8, 0x83, 0x31, 0xdd, + 0x82, 0x3d, 0x98, 0xd7, 0x7b, 0x41, 0x84, 0x7f, 0x6f, 0xe5, 0xdf, 0x11, 0x6c, 0xce, 0xb8, 0x1c, + 0xad, 0xa0, 0x70, 0xd8, 0x44, 0xdf, 0xaf, 0x7f, 0x0a, 0x7d, 0x71, 0x1c, 0x6f, 0x46, 0x9f, 0x55, + 0xf3, 0xdf, 0x74, 0xc7, 0xda, 0xa3, 0xf5, 0x81, 0x65, 0x20, 0x77, 0x98, 0x59, 0x02, 0x6c, 0x22, + 0xbc, 0x36, 0xc3, 0x45, 0x0f, 0x8e, 0x69, 0xe2, 0x86, 0xe9, 0x03, 0xfb, 0x8c, 0x00, 0xcf, 0xcf, + 0x9e, 0x21, 0x86, 0x35, 0x41, 0x43, 0xd9, 0x4b, 0xa7, 0x74, 0xf3, 0x64, 0x8d, 0x5f, 0x68, 0x05, + 0xb7, 0xf9, 0x42, 0x17, 0x62, 0x43, 0xca, 0xdb, 0x2c, 0x2b, 0x63, 0x3a, 0x19, 0x8d, 0x82, 0x35, + 0x57, 0xbe, 0x0d, 0x23, 0xe0, 0x73, 0x21, 0xfa, 0xea, 0x29, 0x1f, 0x7c, 0x85, 0xc0, 0x8d, 0x36, + 0xee, 0x16, 0x4c, 0x05, 0x29, 0x0a, 0x93, 0xba, 0xd4, 0x64, 0x9c, 0x4c, 0x86, 0xc3, 0x38, 0x0e, + 0x0c, 0x5e, 0xd9, 0x8a, 0x69, 0x96, 0x0a, 0xe8, 0x31, 0x1e, 0x62, 0x9c, 0x1d, 0xb3, 0xa8, 0x1c, + 0x79, 0x67, 0x4b, 0xb5, 0xec, 0xc8, 0x8d, 0x11, 0x91, 0x77, 0x34, 0x53, 0xa0, 0xfa, 0x9c, 0x8b, + 0x56, 0xc1, 0x89, 0xca, 0x99, 0x3f, 0x70, 0x1e, 0xe5, 0x61, 0xe2, 0x25, 0xbd, 0x99, 0x0e, 0x61, + 0x7b, 0xcb, 0xa0, 0x3f, 0xaa, 0x4f, 0x30, 0x90, 0xf0, 0x2f, 0x6e, 0x5d, 0xb2, 0xff, 0x48, 0xe0, + 0x0e, 0x6f, 0x34, 0x60, 0x2c, 0x56, 0x13, 0x32, 0x75, 0x58, 0xe9, 0xaf, 0x46, 0x4f, 0xe0, 0x94, + 0x73, 0xb1, 0xb6, 0x9c, 0x2a, 0x68, 0x5c, 0x02, 0xbc, 0x72, 0x7e, 0x5d, 0x5b, 0xce, 0xa7, 0xa0, + 0x71, 0xcd, 0xf0, 0xca, 0xf9, 0x5b, 0xbd, 0x9c, 0xee, 0x42, 0x70, 0x7c, 0xd2, 0x34, 0x33, 0x96, + 0xde, 0xf7, 0x38, 0x99, 0x1d, 0x2e, 0xf5, 0xf6, 0x85, 0x88, 0xa7, 0x4d, 0xbb, 0x02, 0x2c, 0xf9, + 0x4d, 0x7b, 0x42, 0xdf, 0x30, 0x8b, 0x0c, 0x15, 0xa9, 0xcc, 0x57, 0xd0, 0x32, 0x33, 0xbc, 0x16, + 0xf6, 0x01, 0xcd, 0xe1, 0x2c, 0x7d, 0xde, 0x9c, 0xa7, 0x2c, 0xf2, 0xd3, 0x6e, 0x11, 0x94, 0xd8, + 0x4b, 0x1b, 0xa5, 0x95, 0x82, 0xb8, 0x95, 0xaf, 0xbc, 0x26, 0xbe, 0x77, 0x6d, 0xf6, 0xb4, 0x30, + 0x10, 0x35, 0x4b, 0x3e, 0xbc, 0x36, 0x47, 0x98, 0x6a, 0xb3, 0xa8, 0x45, 0x66, 0x70, 0x99, 0x8f, + 0x79, 0xca, 0x24, 0x39, 0x33, 0x16, 0xed, 0x12, 0x16, 0xdd, 0x09, 0x63, 0x50, 0x4b, 0xd8, 0x75, + 0xbc, 0x3a, 0x61, 0xbb, 0x89, 0x51, 0xda, 0x64, 0x08, 0x0d, 0x08, 0x23, 0xf4, 0xdf, 0x19, 0xac, + 0x9a, 0x5d, 0x44, 0x49, 0x5d, 0xcb, 0x32, 0x14, 0x92, 0xee, 0x68, 0x07, 0x3f, 0xb5, 0xe1, 0x81, + 0x1b, 0x15, 0x56, 0x5a, 0x94, 0x0a, 0x55, 0x70, 0x29, 0x5f, 0x52, 0x18, 0xc2, 0x28, 0x54, 0x0a, + 0x7e, 0x70, 0x76, 0x30, 0x4f, 0x8a, 0x68, 0x08, 0x83, 0x90, 0x9b, 0xa4, 0x5b, 0x4a, 0x1a, 0xa5, + 0x99, 0x49, 0x1a, 0x51, 0xd2, 0x03, 0x6c, 0x6e, 0x5e, 0x87, 0xf5, 0x05, 0x5e, 0xa9, 0x50, 0xa3, + 0x41, 0x25, 0xc9, 0xe5, 0xe5, 0x55, 0x44, 0xff, 0x5d, 0x2d, 0x97, 0xf2, 0xea, 0x11, 0x71, 0x8b, + 0x29, 0x77, 0x7a, 0x29, 0x3a, 0xa7, 0xb8, 0xf2, 0xaf, 0x16, 0x1d, 0x05, 0xe5, 0x30, 0x43, 0x1b, + 0xd1, 0x66, 0x6d, 0xf9, 0x78, 0xcc, 0x7d, 0x9d, 0x2d, 0x52, 0x30, 0x1d, 0xdb, 0xb2, 0x1e, 0xa2, + 0x8f, 0xff, 0x0f, 0xae, 0x0e, 0x12, 0x8d, 0x1e, 0x9f, 0x15, 0xb2, 0xfd, 0xe1, 0xe1, 0xed, 0x8c, + 0x4f, 0xef, 0x47, 0x78, 0xd7, 0x76, 0xf8, 0x7a, 0x36, 0x1f, 0x17, 0x45, 0xf1, 0x61, 0xc6, 0x0e, + 0x31, 0x90, 0xc1, 0xe1, 0xc3, 0xec, 0xc3, 0x0c, 0x0f, 0xca, 0x42, 0x21, 0x39, 0x87, 0x8e, 0x14, + 0x07, 0x34, 0x05, 0x61, 0xd3, 0xed, 0x4e, 0xc7, 0x7b, 0x69, 0xef, 0x65, 0x38, 0x38, 0x8e, 0x51, + 0x92, 0xc1, 0x6a, 0xc3, 0x68, 0x3a, 0x1e, 0x1c, 0xa9, 0xc7, 0xe3, 0x18, 0x97, 0xfa, 0xe7, 0xcf, + 0xd3, 0x74, 0x3a, 0xa6, 0x94, 0xbd, 0xf4, 0x18, 0x53, 0xe2, 0x97, 0x56, 0x0a, 0x14, 0xa0, 0xa4, + 0x1b, 0x84, 0x62, 0x09, 0x9d, 0x73, 0xc3, 0xf5, 0xb4, 0x42, 0x33, 0xad, 0xe9, 0x78, 0x19, 0x75, + 0x10, 0xc2, 0x26, 0xea, 0xbc, 0x88, 0xbf, 0xc1, 0x20, 0x5f, 0xd1, 0xab, 0x9e, 0x0c, 0x36, 0x02, + 0x12, 0xd1, 0xdc, 0xc1, 0xfb, 0x83, 0x84, 0x5f, 0x48, 0x55, 0x28, 0xd4, 0x9c, 0xf8, 0xde, 0x59, + 0x00, 0xe8, 0x90, 0x82, 0x71, 0x2c, 0xc3, 0xbe, 0x8a, 0x96, 0xd0, 0x7e, 0x56, 0xb1, 0xad, 0x74, + 0x10, 0x35, 0x6e, 0x32, 0x9b, 0xdf, 0x75, 0x7e, 0x61, 0xa3, 0xa2, 0x90, 0x07, 0xc2, 0xae, 0xa8, + 0x1f, 0xa4, 0xd4, 0x1a, 0xda, 0x3f, 0x1c, 0xb2, 0xd3, 0xe0, 0x50, 0x28, 0x1c, 0x96, 0x8a, 0xd4, + 0x0b, 0x17, 0x9b, 0x10, 0xc3, 0xb7, 0xbb, 0xeb, 0xd3, 0xbc, 0x12, 0xb4, 0x29, 0xda, 0x2f, 0xc2, + 0x2f, 0xa4, 0x52, 0x54, 0x6c, 0x88, 0xbc, 0xa0, 0xf8, 0x2c, 0x8a, 0x86, 0xa8, 0xa5, 0xb8, 0x89, + 0x5f, 0x1c, 0xf5, 0xa5, 0xbe, 0x7e, 0x0c, 0x1c, 0xeb, 0x8f, 0x85, 0xb8, 0x3c, 0x8e, 0xc5, 0x05, + 0xa3, 0x02, 0x77, 0xa0, 0x1b, 0xff, 0x9d, 0x78, 0x79, 0xb5, 0x54, 0xe1, 0xf3, 0x24, 0xc6, 0x19, + 0xdd, 0xee, 0xa6, 0x77, 0x0f, 0x91, 0x95, 0x00, 0xdf, 0xff, 0x46, 0x87, 0x72, 0x2b, 0xcb, 0xef, + 0xe9, 0xdd, 0x34, 0xb4, 0x50, 0x61, 0x7b, 0x7d, 0x26, 0xed, 0x4a, 0x98, 0x67, 0x57, 0x22, 0x2f, + 0x36, 0xdb, 0x0d, 0x5a, 0x48, 0x87, 0x60, 0xc5, 0x67, 0xb6, 0x11, 0x20, 0x9d, 0x58, 0xce, 0x0e, + 0x1a, 0x33, 0x45, 0x9c, 0x80, 0xc3, 0xf9, 0x1c, 0x24, 0x38, 0xf4, 0x29, 0xc7, 0x40, 0xbd, 0xdd, + 0xe0, 0x21, 0x23, 0xe4, 0xe8, 0xc7, 0x40, 0x3a, 0xdc, 0xa3, 0x00, 0x23, 0xce, 0xee, 0x96, 0xfe, + 0x8e, 0x0b, 0x08, 0x72, 0x8c, 0x13, 0xf4, 0x09, 0x21, 0xe7, 0xe9, 0x8f, 0x1a, 0x42, 0xbb, 0x46, + 0x78, 0x53, 0x8a, 0xc1, 0x81, 0x05, 0x8c, 0x75, 0x6d, 0x61, 0x67, 0xe9, 0xe4, 0x5b, 0x2c, 0xa3, + 0x5b, 0x7d, 0x01, 0x23, 0x1a, 0x11, 0x47, 0x12, 0x41, 0xcf, 0x22, 0xb3, 0xaa, 0x91, 0x19, 0x79, + 0x18, 0x8a, 0x8b, 0x32, 0xb1, 0x0b, 0x8e, 0x3e, 0xd9, 0x88, 0x73, 0x18, 0x55, 0xb5, 0x7e, 0x7c, + 0x8c, 0x84, 0xf8, 0xa7, 0x14, 0x34, 0x2c, 0x7a, 0xf5, 0xca, 0xb9, 0xfc, 0xf0, 0x09, 0x23, 0x6d, + 0xcc, 0x66, 0xf1, 0x4c, 0x81, 0x94, 0xc7, 0xd3, 0x92, 0x44, 0xe4, 0x3d, 0xe6, 0x86, 0x35, 0xfd, + 0x03, 0x40, 0x8d, 0xcd, 0x11, 0x51, 0x57, 0xc2, 0x2e, 0x56, 0xa8, 0x74, 0xb2, 0x3b, 0xdc, 0xbd, + 0x0c, 0x80, 0xee, 0x77, 0x7a, 0x0d, 0x86, 0x0d, 0xca, 0x38, 0xa9, 0x0e, 0xee, 0x4e, 0x7d, 0xd5, + 0x55, 0xad, 0x37, 0xf6, 0x7a, 0xd0, 0x1f, 0xa8, 0xb9, 0x0a, 0x13, 0xc4, 0xf7, 0xdc, 0x30, 0x5e, + 0x2a, 0x22, 0x9a, 0xfe, 0x2c, 0xa2, 0xff, 0x0a, 0x50, 0x07, 0x1d, 0x46, 0xd0, 0x8d, 0x5f, 0xbf, + 0x1a, 0x81, 0x95, 0x6f, 0x07, 0xbe, 0xca, 0x42, 0x82, 0x28, 0xe4, 0x2d, 0x21, 0x84, 0x28, 0xfc, + 0x50, 0x2a, 0xae, 0x4e, 0x05, 0x15, 0xb3, 0x0c, 0x36, 0x85, 0xde, 0xf7, 0x41, 0x4b, 0xd4, 0xc9, + 0xc8, 0xca, 0x75, 0xd4, 0x9a, 0xcb, 0xd9, 0xec, 0x86, 0x73, 0xec, 0x9b, 0x88, 0x9b, 0x19, 0xca, + 0xda, 0xcf, 0x59, 0xda, 0x5d, 0x1c, 0x35, 0xf5, 0x52, 0x80, 0xf1, 0xad, 0xff, 0xb4, 0xc3, 0x38, + 0xd2, 0xc2, 0x57, 0x74, 0x18, 0xad, 0x35, 0xb3, 0x34, 0x28, 0x29, 0x3e, 0x52, 0x8a, 0xde, 0x6f, + 0x71, 0xd2, 0xeb, 0xcf, 0x4e, 0x34, 0x12, 0xc6, 0x4c, 0x21, 0x4f, 0xe7, 0x69, 0x75, 0x39, 0xbb, + 0x8a, 0x36, 0x8d, 0x06, 0x05, 0x47, 0xfb, 0x7f, 0x94, 0x25, 0x9b, 0xbf, 0x19, 0x22, 0xf4, 0x6b, + 0x3f, 0xf7, 0xa8, 0x37, 0x91, 0x93, 0x64, 0x13, 0xdc, 0xfc, 0x21, 0x46, 0xa6, 0xd9, 0xa1, 0x45, + 0x54, 0x0d, 0x3b, 0x12, 0xe7, 0x44, 0x5c, 0xc2, 0xce, 0x45, 0xcc, 0x5c, 0x65, 0xcb, 0x08, 0x73, + 0xc0, 0x8a, 0x11, 0x94, 0xb1, 0x61, 0x2e, 0x60, 0x5e, 0x1b, 0x01, 0x7e, 0xc5, 0x72, 0xc7, 0xc8, + 0x2c, 0x71, 0x56, 0xdc, 0x57, 0x6e, 0x57, 0xab, 0x63, 0x0f, 0xc2, 0x75, 0xf3, 0x83, 0x49, 0x31, + 0xbe, 0x47, 0x5d, 0x15, 0xa7, 0x42, 0x90, 0x91, 0x7f, 0xc0, 0x73, 0x62, 0x17, 0x0f, 0x4b, 0xe2, + 0x57, 0x40, 0xd7, 0xb4, 0x78, 0x6c, 0x01, 0x6a, 0xc9, 0x90, 0x16, 0x15, 0x8a, 0x22, 0x40, 0xac, + 0x2c, 0xf9, 0x00, 0xd1, 0x11, 0x2c, 0xd6, 0xa8, 0x1a, 0xf9, 0x58, 0x5c, 0xf7, 0x92, 0xad, 0xb9, + 0xf2, 0x05, 0xbb, 0x82, 0x8c, 0x30, 0x4a, 0x3f, 0x0c, 0xe5, 0xfc, 0x61, 0x96, 0x1d, 0xa0, 0x23, + 0xf3, 0x53, 0xb1, 0x3f, 0x3e, 0x2a, 0x38, 0x7e, 0x2f, 0xc8, 0xb0, 0x9c, 0x41, 0xca, 0xca, 0x57, + 0x9d, 0x1a, 0xe3, 0x2b, 0xdd, 0x56, 0x5d, 0xf0, 0x29, 0xd3, 0x22, 0xf2, 0x24, 0xe3, 0xc9, 0xd6, + 0x7d, 0xf0, 0x47, 0x5b, 0xc9, 0xa1, 0x95, 0x5c, 0x5b, 0x2b, 0x98, 0xd6, 0x3a, 0x6b, 0x05, 0x42, + 0x00, 0x0e, 0xf9, 0xeb, 0xb9, 0x91, 0xc5, 0x23, 0x0c, 0x63, 0x65, 0x20, 0x5c, 0xb0, 0x0f, 0x5c, + 0xc7, 0x55, 0x86, 0x0e, 0x01, 0xa1, 0xe2, 0x66, 0x7a, 0xea, 0x8b, 0x53, 0x72, 0x1e, 0x12, 0xae, + 0x2e, 0x89, 0xd8, 0x94, 0x9e, 0x5e, 0xe6, 0x57, 0x68, 0x74, 0xd5, 0xe5, 0x22, 0x9f, 0x82, 0xeb, + 0x3f, 0x31, 0x61, 0xc7, 0x31, 0x1a, 0x79, 0x76, 0x52, 0xed, 0xf3, 0x7e, 0x06, 0x53, 0x44, 0xe4, + 0xa2, 0xbd, 0x99, 0x09, 0xbf, 0x83, 0xfd, 0x9e, 0x08, 0xca, 0x51, 0x23, 0xc2, 0x82, 0x08, 0x0e, + 0x17, 0xb9, 0x83, 0x19, 0xec, 0x92, 0xc3, 0xe7, 0x48, 0x8d, 0x05, 0x10, 0x6c, 0x13, 0x65, 0x21, + 0x88, 0xb8, 0xb4, 0xf9, 0x74, 0x59, 0x19, 0x25, 0x79, 0xb6, 0x5b, 0x01, 0x52, 0x69, 0x3a, 0x55, + 0x1b, 0xfd, 0x59, 0xa7, 0x1b, 0x61, 0xfd, 0x2b, 0xe0, 0x66, 0x98, 0x65, 0xfa, 0x5b, 0xc8, 0x33, + 0x9f, 0x3c, 0x2f, 0x96, 0x32, 0xc2, 0x9a, 0x3e, 0x05, 0xe1, 0x2a, 0x36, 0xc0, 0x1e, 0x75, 0x14, + 0xce, 0x55, 0xa3, 0xc2, 0xd9, 0x0e, 0x23, 0xb8, 0x43, 0xf3, 0xbc, 0x29, 0x97, 0xb6, 0xae, 0x17, + 0x62, 0x48, 0x83, 0xc5, 0xb1, 0xc9, 0x11, 0xb1, 0x01, 0x0d, 0xa7, 0x1a, 0x6c, 0x24, 0xd9, 0xff, + 0xca, 0x98, 0xeb, 0x98, 0xef, 0x10, 0xa8, 0x52, 0xdf, 0x6f, 0xe7, 0xe1, 0xa9, 0x72, 0x28, 0xc8, + 0xaf, 0xd2, 0x52, 0xfe, 0xd0, 0x77, 0x15, 0x91, 0xe1, 0x41, 0x9d, 0x0b, 0xef, 0xc7, 0x71, 0x08, + 0x75, 0x82, 0x44, 0xe2, 0x08, 0x8d, 0x6f, 0x82, 0x4e, 0x4b, 0x0d, 0xce, 0x4d, 0x4e, 0x28, 0x18, + 0x76, 0x0e, 0xe4, 0xf7, 0x5a, 0x59, 0x08, 0xa8, 0xea, 0x14, 0x84, 0xc8, 0x23, 0xb1, 0xd2, 0xd1, + 0xd1, 0x08, 0xd9, 0x57, 0x85, 0xc2, 0xed, 0x20, 0xa7, 0x48, 0x37, 0x96, 0xa3, 0x01, 0xf0, 0x5d, + 0xb2, 0xfa, 0x0b, 0x15, 0xf8, 0xaf, 0x1c, 0x96, 0xb3, 0x5f, 0xe1, 0xf8, 0x03, 0x09, 0xea, 0xca, + 0x24, 0xb7, 0x6f, 0x71, 0xd3, 0x0c, 0xf5, 0xfc, 0x59, 0xfd, 0x32, 0x53, 0x6e, 0x96, 0xe2, 0x03, + 0xef, 0xa6, 0x9b, 0x5a, 0x26, 0xcc, 0xde, 0x73, 0xe5, 0xbd, 0x20, 0x51, 0xc6, 0x56, 0x38, 0x63, + 0x08, 0xb4, 0x02, 0x2b, 0xa0, 0x66, 0x4b, 0x0b, 0x54, 0x54, 0xdd, 0x7a, 0x91, 0xae, 0x87, 0xc2, + 0x92, 0x7f, 0x81, 0xaf, 0x85, 0xa5, 0x90, 0xcf, 0x69, 0x45, 0x34, 0x0a, 0xf9, 0x9a, 0xc1, 0xcc, + 0x28, 0xbb, 0x9f, 0x77, 0x1b, 0xc3, 0xe9, 0xd4, 0xdf, 0xd8, 0x36, 0x2c, 0xe2, 0xed, 0x52, 0xf8, + 0xb4, 0xff, 0xf3, 0x4d, 0x3d, 0xf8, 0x84, 0xe2, 0x5b, 0x8c, 0x08, 0x18, 0xbd, 0x4d, 0x9f, 0xd3, + 0x2c, 0x9c, 0x11, 0x25, 0x70, 0x9e, 0x78, 0x8c, 0x25, 0x80, 0x3a, 0x35, 0xee, 0x82, 0x6e, 0x13, + 0x95, 0xfd, 0xba, 0x45, 0xbd, 0x80, 0x16, 0x5f, 0xe8, 0x13, 0x96, 0xf0, 0xb1, 0xbb, 0x79, 0x57, + 0xdc, 0xc3, 0x28, 0x55, 0xa7, 0x7e, 0x02, 0x82, 0xfc, 0x33, 0x4b, 0x50, 0x1b, 0x56, 0x67, 0xf3, + 0x82, 0x60, 0xa6, 0x94, 0xa8, 0x26, 0x16, 0x0c, 0x0c, 0x4c, 0xc5, 0xec, 0x70, 0x54, 0x24, 0xcc, + 0x50, 0x8c, 0x29, 0x3c, 0xf0, 0x54, 0xef, 0xe1, 0xd4, 0xdd, 0x0d, 0xe0, 0x5b, 0x7d, 0xdf, 0x0d, + 0xc7, 0x25, 0x15, 0xed, 0xcb, 0x3e, 0xbc, 0x8c, 0x3f, 0xa8, 0x7d, 0xac, 0x1c, 0xa3, 0x48, 0xa8, + 0x56, 0x24, 0x1d, 0x88, 0x5d, 0x8f, 0x2b, 0x2d, 0xfb, 0x4e, 0x74, 0x76, 0xb5, 0xe3, 0xea, 0x2c, + 0x7d, 0x7b, 0xae, 0x2b, 0x9f, 0x60, 0x10, 0x16, 0xed, 0x66, 0x70, 0xef, 0xb9, 0x82, 0xe7, 0x2e, + 0x74, 0xa6, 0xea, 0x2a, 0x28, 0x0d, 0xb5, 0xd8, 0xbf, 0xe9, 0x8e, 0x95, 0x41, 0xaf, 0xf9, 0x70, + 0x34, 0x16, 0xa2, 0x7a, 0x10, 0x5e, 0x8a, 0x51, 0xb8, 0x92, 0x9c, 0xf5, 0xae, 0x28, 0xa3, 0x7f, + 0xbe, 0x69, 0x72, 0x8c, 0x90, 0xec, 0xb5, 0xd3, 0x55, 0x63, 0x13, 0x87, 0x0e, 0x4a, 0x16, 0xf1, + 0xbe, 0x68, 0xbf, 0xc8, 0xf1, 0xec, 0x99, 0xd7, 0x0f, 0x75, 0xb2, 0x52, 0xbe, 0xff, 0x88, 0x11, + 0xc4, 0xe8, 0xba, 0x89, 0x04, 0xf8, 0x0a, 0xe1, 0x5a, 0xf7, 0xba, 0xf9, 0x5f, 0xaa, 0xc3, 0x87, + 0xf7, 0x20, 0xf3, 0x17, 0x3f, 0xce, 0x1e, 0xd9, 0x4d, 0xf7, 0x28, 0xec, 0xc7, 0x3b, 0xb8, 0xc6, + 0x76, 0x05, 0xb9, 0x83, 0x98, 0xf0, 0x77, 0x42, 0x9d, 0x70, 0x42, 0xd1, 0x0a, 0x31, 0x21, 0x1b, + 0x1c, 0xf4, 0x8e, 0x40, 0x6c, 0xd9, 0xa4, 0xa9, 0x70, 0xe2, 0x13, 0x3d, 0x03, 0xe5, 0x40, 0xab, + 0x85, 0xd4, 0x45, 0xe6, 0x4b, 0x05, 0x88, 0x75, 0xfc, 0x73, 0x37, 0xd8, 0xdf, 0x9f, 0x05, 0x91, + 0xf8, 0x6e, 0x3f, 0xcd, 0x91, 0xb8, 0xde, 0x7e, 0xa6, 0x74, 0x6d, 0x43, 0x14, 0xbc, 0x3e, 0x54, + 0x92, 0x04, 0x90, 0x22, 0xda, 0xca, 0x98, 0x04, 0x51, 0x16, 0x6e, 0xda, 0xaf, 0x3d, 0x28, 0x48, + 0xce, 0x08, 0xdb, 0xf8, 0xca, 0x04, 0xda, 0x5b, 0x34, 0x00, 0x03, 0x7b, 0x92, 0xaa, 0x3a, 0x28, + 0xe6, 0x37, 0x63, 0xba, 0xb8, 0x7a, 0x78, 0x3f, 0xf8, 0xee, 0xd5, 0x77, 0x4f, 0x4f, 0xf0, 0xf7, + 0xc5, 0xf1, 0xab, 0x67, 0xcf, 0x1e, 0xde, 0x9f, 0x7c, 0x77, 0x14, 0x87, 0xad, 0xe1, 0x2a, 0x05, + 0xb0, 0xf3, 0xe2, 0xe1, 0xbd, 0x0a, 0xa6, 0x48, 0x8b, 0x15, 0xa1, 0xc1, 0xda, 0x21, 0xff, 0xfa, + 0x96, 0x2a, 0x84, 0x3c, 0xae, 0xe4, 0xd0, 0x0a, 0x40, 0xcf, 0x7e, 0xf5, 0xa6, 0xc8, 0xb0, 0xf9, + 0xd8, 0x3e, 0x26, 0xe2, 0xca, 0x44, 0x2a, 0x6d, 0xa4, 0x34, 0xdc, 0xb4, 0xb2, 0x39, 0xdf, 0xc9, + 0x9c, 0x02, 0x9e, 0xba, 0x0b, 0xfd, 0xfe, 0xdc, 0x7c, 0xc6, 0x4b, 0x53, 0x94, 0x44, 0x7e, 0x27, + 0x1e, 0xab, 0xa3, 0x50, 0xcb, 0x74, 0x46, 0xc8, 0x83, 0x28, 0x96, 0x09, 0x66, 0x7c, 0x9d, 0x4a, + 0xae, 0x7c, 0x1d, 0x35, 0x9f, 0xc8, 0xcb, 0xf1, 0x5d, 0x10, 0xc9, 0x2c, 0xa1, 0xfc, 0x91, 0xea, + 0x67, 0xe8, 0xb8, 0xde, 0xd1, 0x8b, 0x58, 0xf3, 0x36, 0x48, 0xfc, 0x8c, 0xfa, 0x57, 0x26, 0x63, + 0xcf, 0x3f, 0xd0, 0x6f, 0xea, 0xec, 0xd4, 0x4a, 0x15, 0x0f, 0x38, 0x45, 0x51, 0xab, 0x07, 0xcc, + 0x23, 0x9c, 0xeb, 0x54, 0x91, 0xa7, 0xb2, 0xaa, 0x9d, 0x5e, 0x22, 0x6b, 0xc3, 0x18, 0xd4, 0x9a, + 0x6e, 0x43, 0x82, 0xc7, 0x7c, 0x6a, 0x2b, 0x95, 0xa1, 0xde, 0x81, 0x7a, 0x1b, 0x26, 0x5a, 0x7c, + 0xd5, 0x10, 0xc0, 0xbd, 0x30, 0xda, 0x3b, 0x11, 0x34, 0x48, 0x66, 0x85, 0x4a, 0xb5, 0x3d, 0x3f, + 0x74, 0x05, 0xe4, 0x3b, 0x0d, 0x62, 0x3c, 0xcc, 0xdf, 0xf3, 0x22, 0xd8, 0x62, 0xf4, 0xf4, 0x54, + 0x10, 0xce, 0xaa, 0x8a, 0x0e, 0xd4, 0x0b, 0x42, 0x69, 0xcf, 0xf1, 0x0f, 0xd9, 0xf2, 0x3e, 0xa4, + 0x30, 0xcf, 0xad, 0x55, 0x84, 0xc1, 0xa2, 0xf8, 0x3d, 0x63, 0x25, 0x9c, 0x2d, 0x0f, 0x0e, 0x0e, + 0x64, 0xbc, 0x54, 0xae, 0xe4, 0x45, 0xb5, 0xf6, 0xeb, 0x48, 0xa9, 0xb0, 0x23, 0x4e, 0x67, 0x13, + 0x38, 0xaf, 0x0b, 0x9f, 0x87, 0xbf, 0x8f, 0xfe, 0x45, 0x16, 0x7e, 0xe2, 0x57, 0x15, 0x86, 0x36, + 0xd4, 0xca, 0x0c, 0xf8, 0x3a, 0x94, 0x6f, 0xd0, 0x67, 0xfa, 0x94, 0x56, 0xf9, 0xa7, 0x27, 0x57, + 0x85, 0xc0, 0xa2, 0x05, 0xa4, 0x92, 0x29, 0x46, 0x64, 0x51, 0x03, 0x69, 0x11, 0x7d, 0x15, 0x26, + 0x8d, 0xf9, 0xc9, 0x75, 0x5b, 0x2b, 0x29, 0x6b, 0xcd, 0x58, 0x8a, 0x19, 0xd5, 0xba, 0x42, 0xe4, + 0x41, 0x04, 0x5c, 0x2e, 0x27, 0x1b, 0xec, 0xfa, 0x74, 0x3e, 0xc1, 0x85, 0x82, 0xe5, 0x78, 0x8d, + 0x86, 0x2e, 0xf8, 0xff, 0x86, 0x43, 0x32, 0xfe, 0x3f, 0x42, 0x59, 0x04, 0xca, 0xa9, 0xe7, 0xba, + 0x2b, 0xd0, 0x6a, 0xb0, 0x78, 0x80, 0xc2, 0x70, 0x5a, 0xb7, 0x67, 0xe4, 0xb8, 0x43, 0x0a, 0x34, + 0xed, 0x35, 0x39, 0xa9, 0xc8, 0x02, 0xce, 0x48, 0x11, 0xae, 0xef, 0x6b, 0xf2, 0xdd, 0x97, 0xeb, + 0xb2, 0x51, 0xc5, 0x20, 0x00, 0x9a, 0x7c, 0xff, 0x75, 0x72, 0x08, 0x6b, 0xf0, 0xac, 0xe4, 0x83, + 0xce, 0xc9, 0x21, 0x06, 0xee, 0xc0, 0xbf, 0x53, 0x7e, 0x97, 0x0d, 0x3a, 0xff, 0x0b, 0x50, 0x7b, + 0x4e, 0x4a, 0x88, 0x68, 0x01, 0x00 }; diff --git a/wled00/ir.cpp b/wled00/ir.cpp index 7937bee21..3efb75452 100644 --- a/wled00/ir.cpp +++ b/wled00/ir.cpp @@ -89,8 +89,8 @@ byte relativeChange(byte property, int8_t amount, byte lowerBoundary, byte highe void changeEffect(uint8_t fx) { if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; strip.setMode(i, fx); } @@ -105,8 +105,8 @@ void changeEffect(uint8_t fx) void changePalette(uint8_t pal) { if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; seg.palette = pal; } @@ -124,8 +124,8 @@ void changeEffectSpeed(int8_t amount) int16_t new_val = (int16_t) effectSpeed + amount; effectSpeed = (byte)constrain(new_val,0,255); if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; seg.speed = effectSpeed; } @@ -135,7 +135,7 @@ void changeEffectSpeed(int8_t amount) setValuesFromMainSeg(); } } else { // if Effect == "solid Color", change the hue of the primary color - WS2812FX::Segment& sseg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); + Segment& sseg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); CRGB fastled_col; fastled_col.red = R(sseg.colors[0]); fastled_col.green = G(sseg.colors[0]); @@ -147,8 +147,8 @@ void changeEffectSpeed(int8_t amount) prim_hsv.h = (byte)new_val; hsv2rgb_rainbow(prim_hsv, fastled_col); if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; seg.colors[0] = RGBW32(fastled_col.red, fastled_col.green, fastled_col.blue, W(sseg.colors[0])); } @@ -171,8 +171,8 @@ void changeEffectIntensity(int8_t amount) int16_t new_val = (int16_t) effectIntensity + amount; effectIntensity = (byte)constrain(new_val,0,255); if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; seg.intensity = effectIntensity; } @@ -182,7 +182,7 @@ void changeEffectIntensity(int8_t amount) setValuesFromMainSeg(); } } else { // if Effect == "solid Color", change the saturation of the primary color - WS2812FX::Segment& sseg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); + Segment& sseg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); CRGB fastled_col; fastled_col.red = R(sseg.colors[0]); fastled_col.green = G(sseg.colors[0]); @@ -192,8 +192,8 @@ void changeEffectIntensity(int8_t amount) prim_hsv.s = (byte)constrain(new_val,0,255); // constrain to 0-255 hsv2rgb_rainbow(prim_hsv, fastled_col); if (irApplyToAllSelected) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; seg.colors[0] = RGBW32(fastled_col.red, fastled_col.green, fastled_col.blue, W(sseg.colors[0])); } @@ -214,8 +214,8 @@ void changeColor(uint32_t c, int16_t cct=-1) { if (irApplyToAllSelected) { // main segment may not be selected! - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (!seg.isActive() || !seg.isSelected()) continue; byte capabilities = seg.getLightCapabilities(); uint32_t mask = 0; @@ -226,14 +226,14 @@ void changeColor(uint32_t c, int16_t cct=-1) if (isRGB) mask |= 0x00FFFFFF; // RGB if (hasW) mask |= 0xFF000000; // white if (hasW && !wSlider && (c & 0xFF000000)) { // segment has white channel & white channel is auto calculated & white specified - seg.setColor(0, c | 0xFFFFFF, i); // for accurate/brighter mode we fake white (since button may not set white color to 0xFFFFFF) - } else if (c & mask) seg.setColor(0, c & mask, i); // only apply if not black - if (isCCT && cct >= 0) seg.setCCT(cct, i); + seg.setColor(0, c | 0xFFFFFF); // for accurate/brighter mode we fake white (since button may not set white color to 0xFFFFFF) + } else if (c & mask) seg.setColor(0, c & mask); // only apply if not black + if (isCCT && cct >= 0) seg.setCCT(cct); } setValuesFromFirstSelectedSeg(); } else { byte i = strip.getMainSegmentId(); - WS2812FX::Segment& seg = strip.getSegment(i); + Segment& seg = strip.getSegment(i); byte capabilities = seg.getLightCapabilities(); uint32_t mask = 0; bool isRGB = GET_BIT(capabilities, 0); // is segment RGB capable @@ -243,9 +243,9 @@ void changeColor(uint32_t c, int16_t cct=-1) if (isRGB) mask |= 0x00FFFFFF; // RGB if (hasW) mask |= 0xFF000000; // white if (hasW && !wSlider && (c & 0xFF000000)) { // segment has white channel & white channel is auto calculated & white specified - seg.setColor(0, c | 0xFFFFFF, i); // for accurate/brighter mode we fake white (since button may not set white color to 0xFFFFFF) - } else if (c & mask) seg.setColor(0, c & mask, i); // only apply if not black - if (isCCT && cct >= 0) seg.setCCT(cct, i); + seg.setColor(0, c | 0xFFFFFF); // for accurate/brighter mode we fake white (since button may not set white color to 0xFFFFFF) + } else if (c & mask) seg.setColor(0, c & mask); // only apply if not black + if (isCCT && cct >= 0) seg.setCCT(cct); setValuesFromMainSeg(); } stateChanged = true; @@ -253,7 +253,7 @@ void changeColor(uint32_t c, int16_t cct=-1) void changeWhite(int8_t amount, int16_t cct=-1) { - WS2812FX::Segment& seg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); + Segment& seg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); byte r = R(seg.colors[0]); byte g = G(seg.colors[0]); byte b = B(seg.colors[0]); @@ -424,7 +424,7 @@ void decodeIR24CT(uint32_t code) void decodeIR40(uint32_t code) { - WS2812FX::Segment& seg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); + Segment& seg = irApplyToAllSelected ? strip.getFirstSelectedSeg() : strip.getMainSegment(); byte r = R(seg.colors[0]); byte g = G(seg.colors[0]); byte b = B(seg.colors[0]); @@ -712,7 +712,7 @@ void initIR() void handleIR() { - if (irEnabled > 0 && millis() - irCheckedTime > 120) + if (irEnabled > 0 && millis() - irCheckedTime > 120 && !strip.isUpdating()) { irCheckedTime = millis(); if (irEnabled > 0) diff --git a/wled00/json.cpp b/wled00/json.cpp index 9ce83b389..c483ce7f1 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -11,11 +11,19 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) byte id = elem["id"] | it; if (id >= strip.getMaxSegments()) return; - WS2812FX::Segment& seg = strip.getSegment(id); - WS2812FX::Segment prev = seg; //make a backup so we can tell if something changed + int stop = elem["stop"] | -1; + + // if using vectors use this code to append segment + if (id >= strip.getSegmentsNum()) { + if (stop <= 0) return; // ignore empty/inactive segments + strip.appendSegment(Segment(0, strip.getLengthTotal())); + id = strip.getSegmentsNum()-1; // segments are added at the end of list + } + + Segment& seg = strip.getSegment(id); + Segment prev = seg; //make a backup so we can tell if something changed uint16_t start = elem["start"] | seg.start; - int stop = elem["stop"] | -1; if (stop < 0) { uint16_t len = elem["len"]; stop = (len > 0) ? start + len : seg.stop; @@ -31,7 +39,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) elem.remove("rpt"); // remove for recursive call elem.remove("n"); // remove for recursive call uint16_t len = stop - start; - for (byte i=id+1; i= strip.getLengthTotal()) break; //TODO: add support for 2D @@ -70,9 +78,14 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) uint16_t grp = elem["grp"] | seg.grouping; uint16_t spc = elem[F("spc")] | seg.spacing; - uint16_t of = seg.offset; + uint16_t of = seg.offset; + uint8_t soundSim = elem[F("ssim")] | seg.soundSim; + uint8_t map1D2D = elem[F("mp12")] | seg.map1D2D; - if (spc>0 && spc!=seg.spacing) strip.fill(BLACK, id); // clear spacing gaps + if ((spc>0 && spc!=seg.spacing) || seg.map1D2D!=map1D2D) seg.fill(BLACK); // clear spacing gaps + + seg.map1D2D = map1D2D & 0x03; + seg.soundSim = soundSim & 0x07; uint16_t len = 1; if (stop > start) len = stop - start; @@ -88,23 +101,23 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) byte segbri = seg.opacity; if (getVal(elem["bri"], &segbri)) { - if (segbri > 0) seg.setOpacity(segbri, id); - seg.setOption(SEG_OPTION_ON, segbri, id); + if (segbri > 0) seg.setOpacity(segbri); + seg.setOption(SEG_OPTION_ON, segbri); } bool on = elem["on"] | seg.getOption(SEG_OPTION_ON); if (elem["on"].is() && elem["on"].as()[0] == 't') on = !on; - seg.setOption(SEG_OPTION_ON, on, id); + seg.setOption(SEG_OPTION_ON, on); bool frz = elem["frz"] | seg.getOption(SEG_OPTION_FREEZE); if (elem["frz"].is() && elem["frz"].as()[0] == 't') frz = !seg.getOption(SEG_OPTION_FREEZE); - seg.setOption(SEG_OPTION_FREEZE, frz, id); + seg.setOption(SEG_OPTION_FREEZE, frz); - seg.setCCT(elem["cct"] | seg.cct, id); + seg.setCCT(elem["cct"] | seg.cct); JsonArray colarr = elem["col"]; if (!colarr.isNull()) { - for (uint8_t i = 0; i < 3; i++) + for (size_t i = 0; i < 3; i++) { int rgbw[] = {0,0,0,0}; bool colValid = false; @@ -115,13 +128,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) if (hexCol == nullptr) { //Kelvin color temperature (or invalid), e.g 2400 int kelvin = colarr[i] | -1; if (kelvin < 0) continue; - if (kelvin == 0) seg.setColor(i, 0, id); + if (kelvin == 0) seg.setColor(i, 0); if (kelvin > 0) colorKtoRGB(kelvin, brgbw); colValid = true; } else { //HEX string, e.g. "FFAA00" colValid = colorFromHexString(brgbw, hexCol); } - for (uint8_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; + for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; } else { //Array of ints (RGB or RGBW color), e.g. [255,160,0] byte sz = colX.size(); if (sz == 0) continue; //do nothing on empty array @@ -132,7 +145,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) if (!colValid) continue; - seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3]), id); + seg.setColor(i, RGBW32(rgbw[0],rgbw[1],rgbw[2],rgbw[3])); if (seg.mode == FX_MODE_STATIC) strip.trigger(); //instant refresh } } @@ -149,31 +162,74 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) } #endif - seg.setOption(SEG_OPTION_SELECTED, elem[F("sel")] | seg.getOption(SEG_OPTION_SELECTED)); - seg.setOption(SEG_OPTION_REVERSED, elem["rev"] | seg.getOption(SEG_OPTION_REVERSED)); - seg.setOption(SEG_OPTION_MIRROR , elem[F("mi")] | seg.getOption(SEG_OPTION_MIRROR )); - // 2D options + seg.setOption(SEG_OPTION_SELECTED, elem["sel"] | seg.getOption(SEG_OPTION_SELECTED)); + seg.setOption(SEG_OPTION_REVERSED, elem["rev"] | seg.getOption(SEG_OPTION_REVERSED)); + seg.setOption(SEG_OPTION_MIRROR , elem[F("mi")] | seg.getOption(SEG_OPTION_MIRROR )); + #ifndef WLED_DISABLE_2D seg.setOption(SEG_OPTION_REVERSED_Y, elem[F("rY")] | seg.getOption(SEG_OPTION_REVERSED_Y)); seg.setOption(SEG_OPTION_MIRROR_Y , elem[F("mY")] | seg.getOption(SEG_OPTION_MIRROR_Y )); seg.setOption(SEG_OPTION_TRANSPOSED, elem[F("tp")] | seg.getOption(SEG_OPTION_TRANSPOSED)); + #endif byte fx = seg.mode; - if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value) + if (getVal(elem["fx"], &fx, 0, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 0-255 exact value) if (!presetId && currentPlaylist>=0) unloadPlaylist(); - strip.setMode(id, fx); + if (fx != seg.mode) { + //seg.startTransition(strip.getTransition()); // set effect transitions + seg.markForReset(); + seg.mode = fx; + // load default values from effect string if effect is selected without + // any other effect parameter (i.e. effect clicked in UI) + if ( elem[F("sx")].isNull() + && elem[F("ix")].isNull() + && elem["pal"].isNull() + && elem[F("c1")].isNull() + && elem[F("c2")].isNull() + && elem[F("c3")].isNull() ) + { + // compatibility mode begin + char buf[5]; // dummy buffer + for (int i=0; i<5; i++) { + uint8_t *var; + switch (i) { + case 0: var = &seg.speed; break; + case 1: var = &seg.intensity; break; + case 2: var = &seg.custom1; break; + case 3: var = &seg.custom2; break; + case 4: var = &seg.custom3; break; + } + extractModeSlider(fx, i, buf, 4, var); + } + extractModeSlider(fx, 255, buf, 4, &seg.palette); + //end compatibility mode + int16_t sOpt; + sOpt = extractModeDefaults(fx, SET_F("sx")); if (sOpt >= 0) seg.speed = sOpt; + sOpt = extractModeDefaults(fx, SET_F("ix")); if (sOpt >= 0) seg.intensity = sOpt; + sOpt = extractModeDefaults(fx, SET_F("c1")); if (sOpt >= 0) seg.custom1 = sOpt; + sOpt = extractModeDefaults(fx, SET_F("c2")); if (sOpt >= 0) seg.custom2 = sOpt; + sOpt = extractModeDefaults(fx, SET_F("c3")); if (sOpt >= 0) seg.custom3 = sOpt; + sOpt = extractModeDefaults(fx, "pal"); if (sOpt >= 0 && sOpt < strip.getPaletteCount()) seg.palette = sOpt; + sOpt = extractModeDefaults(fx, SET_F("mp12")); if (sOpt >= 0) seg.map1D2D = sOpt & 0x03; + sOpt = extractModeDefaults(fx, SET_F("ssim")); if (sOpt >= 0) seg.soundSim = sOpt & 0x07; + sOpt = extractModeDefaults(fx, "rev"); if (sOpt >= 0) seg.reverse = (bool)sOpt; // setOption(SEG_OPTION_REVERSED, (bool)sOpt); // NOTE: setting this option is a risky business + sOpt = extractModeDefaults(fx, SET_F("mi")); if (sOpt >= 0) seg.mirror = (bool)sOpt; // setOption(SEG_OPTION_MIRROR, (bool)sOpt); // NOTE: setting this option is a risky business + sOpt = extractModeDefaults(fx, SET_F("rY")); if (sOpt >= 0) seg.reverse_y = (bool)sOpt; // setOption(SEG_OPTION_REVERSED_Y, (bool)sOpt); // NOTE: setting this option is a risky business + sOpt = extractModeDefaults(fx, SET_F("mY")); if (sOpt >= 0) seg.mirror_y = (bool)sOpt; // setOption(SEG_OPTION_MIRROR_Y, (bool)sOpt); // NOTE: setting this option is a risky business + } + } } //getVal also supports inc/decrementing and random getVal(elem[F("sx")], &seg.speed); getVal(elem[F("ix")], &seg.intensity); - getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount()); + getVal(elem["pal"], &seg.palette, 1, strip.getPaletteCount()); getVal(elem[F("c1")], &seg.custom1); getVal(elem[F("c2")], &seg.custom2); getVal(elem[F("c3")], &seg.custom3); - + JsonArray iarr = elem[F("i")]; //set individual LEDs if (!iarr.isNull()) { - uint8_t oldSegId = strip.setPixelSegment(id); + //uint8_t oldSegId = strip.setPixelSegment(id); // set brightness immediately and disable transition transitionDelayTemp = 0; @@ -183,13 +239,13 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) // freeze and init to black if (!seg.getOption(SEG_OPTION_FREEZE)) { seg.setOption(SEG_OPTION_FREEZE, true); - strip.fill(0); + seg.fill(BLACK); } uint16_t start = 0, stop = 0; byte set = 0; //0 nothing set, 1 start set, 2 range set - for (uint16_t i = 0; i < iarr.size(); i++) { + for (size_t i = 0; i < iarr.size(); i++) { if(iarr[i].is()) { if (!set) { start = iarr[i]; @@ -208,29 +264,28 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) byte brgbw[] = {0,0,0,0}; const char* hexCol = iarr[i]; if (colorFromHexString(brgbw, hexCol)) { - for (uint8_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; + for (size_t c = 0; c < 4; c++) rgbw[c] = brgbw[c]; } } if (set < 2) stop = start + 1; - for (uint16_t i = start; i < stop; i++) { + for (int i = start; i < stop; i++) { if (strip.gammaCorrectCol) { - strip.setPixelColor(i, strip.gamma8(rgbw[0]), strip.gamma8(rgbw[1]), strip.gamma8(rgbw[2]), strip.gamma8(rgbw[3])); + seg.setPixelColor(i, strip.gamma8(rgbw[0]), strip.gamma8(rgbw[1]), strip.gamma8(rgbw[2]), strip.gamma8(rgbw[3])); } else { - strip.setPixelColor(i, rgbw[0], rgbw[1], rgbw[2], rgbw[3]); + seg.setPixelColor(i, rgbw[0], rgbw[1], rgbw[2], rgbw[3]); } } if (!set) start++; set = 0; } } - strip.setPixelSegment(oldSegId); + //strip.setPixelSegment(oldSegId); strip.trigger(); } // send UDP if not in preset and something changed that is not just selection // send UDP if something changed that is not just selection or segment power/opacity if ((seg.differs(prev) & 0x7E) && seg.getOption(SEG_OPTION_ON)==prev.getOption(SEG_OPTION_ON)) stateChanged = true; - return; } // deserializes WLED state (fileDoc points to doc object if called from web server) @@ -248,11 +303,11 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) if (root["on"].is() && root["on"].as()[0] == 't') toggleOnOff(); if (bri && !onBefore) { // unfreeze all segments when turning on - for (uint8_t s=0; s < strip.getMaxSegments(); s++) { - strip.getSegment(s).setOption(SEG_OPTION_FREEZE, false, s); + for (size_t s=0; s < strip.getSegmentsNum(); s++) { + strip.getSegment(s).setOption(SEG_OPTION_FREEZE, false); } if (realtimeMode && !realtimeOverride && useMainSegmentOnly) { // keep live segment frozen if live - strip.getMainSegment().setOption(SEG_OPTION_FREEZE, true, strip.getMainSegmentId()); + strip.getMainSegment().setOption(SEG_OPTION_FREEZE, true); } } @@ -304,7 +359,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) realtimeOverride = root[F("lor")] | realtimeOverride; if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS; if (realtimeMode && useMainSegmentOnly) { - strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride, strip.getMainSegmentId()); + strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride); } if (root.containsKey("live")) { @@ -326,13 +381,11 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) if (id < 0) { //apply all selected segments //bool didSet = false; - for (byte s = 0; s < strip.getMaxSegments(); s++) { - WS2812FX::Segment &sg = strip.getSegment(s); - if (sg.isActive()) { - if (sg.isSelected()) { - deserializeSegment(segVar, s, presetId); - //didSet = true; - } + for (size_t s = 0; s < strip.getSegmentsNum(); s++) { + Segment &sg = strip.getSegment(s); + if (sg.isSelected()) { + deserializeSegment(segVar, s, presetId); + //didSet = true; } } //TODO: not sure if it is good idea to change first active but unselected segment @@ -342,8 +395,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) } } else { JsonArray segs = segVar.as(); - for (JsonObject elem : segs) - { + for (JsonObject elem : segs) { deserializeSegment(elem, it, presetId); it++; } @@ -396,7 +448,7 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) return stateResponse; } -void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool forPreset, bool segmentBounds) +void serializeSegment(JsonObject& root, Segment& seg, byte id, bool forPreset, bool segmentBounds) { root["id"] = id; if (segmentBounds) { @@ -423,7 +475,7 @@ void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool fo // this will reduce RAM footprint from ~300 bytes to 84 bytes per segment char colstr[70]; colstr[0] = '['; colstr[1] = '\0'; //max len 68 (5 chan, all 255) const char *format = strip.hasWhiteChannel() ? PSTR("[%u,%u,%u,%u]") : PSTR("[%u,%u,%u]"); - for (uint8_t i = 0; i < 3; i++) + for (size_t i = 0; i < 3; i++) { byte segcol[4]; byte* c = segcol; segcol[0] = R(seg.colors[i]); @@ -452,6 +504,8 @@ void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool fo root[F("mY")] = seg.getOption(SEG_OPTION_MIRROR_Y); root[F("tp")] = seg.getOption(SEG_OPTION_TRANSPOSED); } + root[F("ssim")] = seg.soundSim; + root[F("mp12")] = seg.map1D2D; } void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segmentBounds) @@ -493,9 +547,17 @@ void serializeState(JsonObject root, bool forPreset, bool includeBri, bool segme bool selectedSegmentsOnly = root[F("sc")] | false; JsonArray seg = root.createNestedArray("seg"); - for (byte s = 0; s < strip.getMaxSegments(); s++) { - WS2812FX::Segment &sg = strip.getSegment(s); - if (selectedSegmentsOnly && !sg.isSelected()) continue; + for (size_t s = 0; s < strip.getMaxSegments(); s++) { + if (s >= strip.getSegmentsNum()) { + if (forPreset && segmentBounds) { //disable segments not part of preset + JsonObject seg0 = seg.createNestedObject(); + seg0["stop"] = 0; + continue; + } else + break; + } + Segment &sg = strip.getSegment(s); + if (!forPreset && selectedSegmentsOnly && !sg.isSelected()) continue; if (sg.isActive()) { JsonObject seg0 = seg.createNestedObject(); serializeSegment(seg0, sg, s, forPreset, segmentBounds); @@ -518,18 +580,22 @@ void serializeInfo(JsonObject root) leds["fps"] = strip.getFps(); leds[F("maxpwr")] = (strip.currentMilliamps)? strip.ablMilliampsMax : 0; 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 + #ifndef WLED_DISABLE_2D if (strip.isMatrix) { JsonObject matrix = leds.createNestedObject("matrix"); matrix["w"] = strip.matrixWidth; matrix["h"] = strip.matrixHeight; } + #endif uint8_t totalLC = 0; JsonArray lcarr = leds.createNestedArray(F("seglc")); - uint8_t nSegs = strip.getLastActiveSegmentId(); - for (byte s = 0; s <= nSegs; s++) { + size_t nSegs = strip.getSegmentsNum(); + for (size_t s = 0; s < nSegs; s++) { + if (!strip.getSegment(s).isActive()) continue; uint8_t lc = strip.getSegment(s).getLightCapabilities(); totalLC |= lc; lcarr.add(lc); @@ -577,7 +643,7 @@ void serializeInfo(JsonObject root) root[F("palcount")] = strip.getPaletteCount(); JsonArray ledmaps = root.createNestedArray(F("maps")); - for (uint8_t i=0; i<10; i++) { + for (size_t i=0; i<10; i++) { char fileName[16]; strcpy_P(fileName, PSTR("/ledmap")); if (i) sprintf(fileName +7, "%d", i); @@ -956,7 +1022,7 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) obuf = buffer; olen = 9; - for (uint16_t i= 0; i < used; i += n) + for (size_t i= 0; i < used; i += n) { uint32_t c = strip.getPixelColor(i); uint8_t r = qadd8(W(c), R(c)); //add white channel to RGB channels as a simple RGBW -> RGB map diff --git a/wled00/led.cpp b/wled00/led.cpp index 9ad855322..028235fff 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -8,7 +8,7 @@ void setValuesFromMainSeg() { setValuesFromSegment(strip.getMainSegment void setValuesFromFirstSelectedSeg() { setValuesFromSegment(strip.getFirstSelectedSegId()); } void setValuesFromSegment(uint8_t s) { - WS2812FX::Segment& seg = strip.getSegment(s); + Segment& seg = strip.getSegment(s); col[0] = R(seg.colors[0]); col[1] = G(seg.colors[0]); col[2] = B(seg.colors[0]); @@ -30,9 +30,9 @@ void applyValuesToSelectedSegs() { // copy of first selected segment to tell if value was updated uint8_t firstSel = strip.getFirstSelectedSegId(); - WS2812FX::Segment selsegPrev = strip.getSegment(firstSel); - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + Segment selsegPrev = strip.getSegment(firstSel); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (i != firstSel && (!seg.isActive() || !seg.isSelected())) continue; if (effectSpeed != selsegPrev.speed) {seg.speed = effectSpeed; stateChanged = true;} @@ -41,8 +41,8 @@ void applyValuesToSelectedSegs() if (effectCurrent != selsegPrev.mode) {strip.setMode(i, effectCurrent); stateChanged = true;} uint32_t col0 = RGBW32( col[0], col[1], col[2], col[3]); uint32_t col1 = RGBW32(colSec[0], colSec[1], colSec[2], colSec[3]); - if (col0 != selsegPrev.colors[0]) {seg.setColor(0, col0, i); stateChanged = true;} - if (col1 != selsegPrev.colors[1]) {seg.setColor(1, col1, i); stateChanged = true;} + if (col0 != selsegPrev.colors[0]) {seg.setColor(0, col0); stateChanged = true;} + if (col1 != selsegPrev.colors[1]) {seg.setColor(1, col1); stateChanged = true;} } } diff --git a/wled00/lx_parser.cpp b/wled00/lx_parser.cpp index 8c5a9f91b..47674823b 100644 --- a/wled00/lx_parser.cpp +++ b/wled00/lx_parser.cpp @@ -69,7 +69,7 @@ void parseLxJson(int lxValue, byte segId, bool secondary) } else { DEBUG_PRINT(F("LX: segment ")); DEBUG_PRINTLN(segId); - strip.getSegment(segId).setColor(secondary, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3]), segId); + strip.getSegment(segId).setColor(secondary, RGBW32(rgbw[0], rgbw[1], rgbw[2], rgbw[3])); } } } diff --git a/wled00/palettes.h b/wled00/palettes.h index c9bdf3f69..5e524059d 100644 --- a/wled00/palettes.h +++ b/wled00/palettes.h @@ -13,8 +13,6 @@ #ifndef PalettesWLED_h #define PalettesWLED_h -#define GRADIENT_PALETTE_COUNT 58 - const byte ib_jul01_gp[] PROGMEM = { 0, 194, 1, 1, 94, 1, 29, 18, diff --git a/wled00/pin_manager.h b/wled00/pin_manager.h index 3a9bcf5a5..9b5005b24 100644 --- a/wled00/pin_manager.h +++ b/wled00/pin_manager.h @@ -56,7 +56,8 @@ enum struct PinOwner : uint8_t { // #define USERMOD_ID_SN_PHOTORESISTOR // 0x11 // Usermod "usermod_sn_photoresistor.h" -- Uses hard-coded pin (PHOTORESISTOR_PIN == A0), but could be easily updated to use pinManager UM_RGBRotaryEncoder = USERMOD_RGB_ROTARY_ENCODER, // 0x16 // Usermod "rgb-rotary-encoder.h" UM_QuinLEDAnPenta = USERMOD_ID_QUINLED_AN_PENTA, // 0x17 // Usermod "quinled-an-penta.h" - UM_Audioreactive = USERMOD_ID_AUDIOREACTIVE // 0x1E // Usermod: "audio_reactive.h" + UM_BME280 = USERMOD_ID_BME280, // 0x18 // Usermod "usermod_bme280.h -- Uses "standard" HW_I2C pins + UM_Audioreactive = USERMOD_ID_AUDIOREACTIVE // 0x1E // Usermod "audio_reactive.h" }; static_assert(0u == static_cast(PinOwner::None), "PinOwner::None must be zero, so default array initialization works as expected"); diff --git a/wled00/presets.cpp b/wled00/presets.cpp index bae34454f..4bcccea51 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -84,7 +84,7 @@ void handlePresets(bool force) presetToApply = 0; //clear request for preset callModeToApply = 0; - DEBUG_PRINTLN(F("Applying preset: ")); + DEBUG_PRINT(F("Applying preset: ")); DEBUG_PRINTLN(tmpPreset); #ifdef ARDUINO_ARCH_ESP32 diff --git a/wled00/set.cpp b/wled00/set.cpp index aa400194f..ee97de1b6 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -86,6 +86,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) Bus::setAutoWhiteMode(request->arg(F("AW")).toInt()); strip.setTargetFps(request->arg(F("FR")).toInt()); + bool busesChanged = false; for (uint8_t s = 0; s < WLED_MAX_BUSSES; s++) { char lp[4] = "L0"; lp[2] = 48+s; lp[3] = 0; //ascii 0-9 //strip data pin char lc[4] = "LC"; lc[2] = 48+s; lc[3] = 0; //strip length @@ -98,7 +99,9 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) char aw[4] = "AW"; aw[2] = 48+s; aw[3] = 0; //auto white mode char wo[4] = "WO"; wo[2] = 48+s; wo[3] = 0; //channel swap if (!request->hasArg(lp)) { - DEBUG_PRINTLN(F("No data.")); break; + DEBUG_PRINT(F("No data for ")); + DEBUG_PRINTLN(s); + break; } for (uint8_t i = 0; i < 5; i++) { lp[1] = 48+i; @@ -118,10 +121,12 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) awmode = request->arg(aw).toInt(); channelSwap = (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) ? request->arg(wo).toInt() : 0; // actual finalization is done in WLED::loop() (removing old busses and adding new) + // this may happen even before this loop is finished so we do "doInitBusses" after the loop if (busConfigs[s] != nullptr) delete busConfigs[s]; busConfigs[s] = new BusConfig(type, pins, start, length, colorOrder | (channelSwap<<4), request->hasArg(cv), skip, awmode); - doInitBusses = true; + busesChanged = true; } + //doInitBusses = busesChanged; // we will do that below to ensure all input data is processed ColorOrderMap com = {}; for (uint8_t s = 0; s < WLED_MAX_COLOR_ORDER_MAPPINGS; s++) { @@ -197,6 +202,8 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (t >= 0 && t < 4) strip.paletteBlend = t; t = request->arg(F("BF")).toInt(); if (t > 0) briMultiplier = t; + + doInitBusses = busesChanged; } //UI @@ -547,6 +554,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) releaseJSONBufferLock(); } + #ifndef WLED_DISABLE_2D //2D panels if (subPage == 10) { @@ -570,6 +578,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) } strip.setUpMatrix(); // will check limits } + #endif lastEditTime = millis(); if (subPage != 2 && !doReboot) serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init) @@ -599,17 +608,17 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) pos = req.indexOf(F("SS=")); if (pos > 0) { byte t = getNumVal(&req, pos); - if (t < strip.getMaxSegments()) { + if (t < strip.getSegmentsNum()) { selectedSeg = t; singleSegment = true; } } - WS2812FX::Segment& selseg = strip.getSegment(selectedSeg); + Segment& selseg = strip.getSegment(selectedSeg); pos = req.indexOf(F("SV=")); //segment selected if (pos > 0) { byte t = getNumVal(&req, pos); - if (t == 2) for (uint8_t i = 0; i < strip.getMaxSegments(); i++) strip.getSegment(i).setOption(SEG_OPTION_SELECTED, 0); // unselect other segments + if (t == 2) for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) strip.getSegment(i).setOption(SEG_OPTION_SELECTED, 0); // unselect other segments selseg.setOption(SEG_OPTION_SELECTED, t); } @@ -657,9 +666,9 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) pos = req.indexOf(F("SB=")); //Segment brightness/opacity if (pos > 0) { byte segbri = getNumVal(&req, pos); - selseg.setOption(SEG_OPTION_ON, segbri, selectedSeg); + selseg.setOption(SEG_OPTION_ON, segbri); if (segbri) { - selseg.setOpacity(segbri, selectedSeg); + selseg.setOpacity(segbri); } } @@ -762,7 +771,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) if (pos > 0) { colorFromDecOrHexString(tmpCol, (char*)req.substring(pos + 3).c_str()); uint32_t col2 = RGBW32(tmpCol[0], tmpCol[1], tmpCol[2], tmpCol[3]); - selseg.setColor(2, col2, selectedSeg); // defined above (SS= or main) + selseg.setColor(2, col2); // defined above (SS= or main) stateChanged = true; if (!singleSegment) strip.setColor(2, col2); // will set color to all active & selected segments } @@ -791,14 +800,14 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) if (col0Changed) { stateChanged = true; uint32_t colIn0 = RGBW32(colIn[0], colIn[1], colIn[2], colIn[3]); - selseg.setColor(0, colIn0, selectedSeg); + selseg.setColor(0, colIn0); if (!singleSegment) strip.setColor(0, colIn0); // will set color to all active & selected segments } if (col1Changed) { stateChanged = true; uint32_t colIn1 = RGBW32(colInSec[0], colInSec[1], colInSec[2], colInSec[3]); - selseg.setColor(1, colIn1, selectedSeg); + selseg.setColor(1, colIn1); if (!singleSegment) strip.setColor(1, colIn1); // will set color to all active & selected segments } @@ -815,8 +824,8 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) stateChanged |= (fxModeChanged || speedChanged || intensityChanged || paletteChanged); // apply to main and all selected segments to prevent #1618. - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + for (uint8_t i = 0; i < strip.getSegmentsNum(); i++) { + Segment& seg = strip.getSegment(i); if (i != selectedSeg && (singleSegment || !seg.isActive() || !seg.isSelected())) continue; // skip non main segments if not applying to all if (fxModeChanged) strip.setMode(i, effectIn); if (speedChanged) seg.speed = speedIn; @@ -918,7 +927,7 @@ bool handleSet(AsyncWebServerRequest *request, const String& req, bool apply) realtimeOverride = getNumVal(&req, pos); if (realtimeOverride > 2) realtimeOverride = REALTIME_OVERRIDE_ALWAYS; if (realtimeMode && useMainSegmentOnly) { - strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride, strip.getMainSegmentId()); + strip.getMainSegment().setOption(SEG_OPTION_FREEZE, !realtimeOverride); } } diff --git a/wled00/udp.cpp b/wled00/udp.cpp index b80d1fdff..7d7bc8d73 100644 --- a/wled00/udp.cpp +++ b/wled00/udp.cpp @@ -28,7 +28,7 @@ void notify(byte callMode, bool followUp) default: return; } byte udpOut[WLEDPACKETSIZE]; - WS2812FX::Segment& mainseg = strip.getMainSegment(); + Segment& mainseg = strip.getMainSegment(); udpOut[0] = 0; //0: wled notifier protocol 1: WARLS protocol udpOut[1] = callMode; udpOut[2] = bri; @@ -89,12 +89,14 @@ void notify(byte callMode, bool followUp) udpOut[37] = strip.hasCCTBus() ? 0 : 255; //check this is 0 for the next value to be significant udpOut[38] = mainseg.cct; - udpOut[39] = strip.getMaxSegments(); + udpOut[39] = strip.getActiveSegmentsNum(); udpOut[40] = UDP_SEG_SIZE; //size of each loop iteration (one segment) - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment &selseg = strip.getSegment(i); - uint16_t ofs = 41 + i*UDP_SEG_SIZE; //start of segment offset byte - udpOut[0 +ofs] = i; + size_t s = 0, nsegs = strip.getSegmentsNum(); + for (size_t i = 0; i < nsegs; i++) { + Segment &selseg = strip.getSegment(i); + if (!selseg.isActive()) continue; + uint16_t ofs = 41 + s*UDP_SEG_SIZE; //start of segment offset byte + udpOut[0 +ofs] = s; udpOut[1 +ofs] = selseg.start >> 8; udpOut[2 +ofs] = selseg.start & 0xFF; udpOut[3 +ofs] = selseg.stop >> 8; @@ -122,6 +124,7 @@ void notify(byte callMode, bool followUp) udpOut[25+ofs] = B(selseg.colors[2]); udpOut[26+ofs] = W(selseg.colors[2]); udpOut[27+ofs] = selseg.cct; + ++s; } //uint16_t offs = SEG_OFFSET; @@ -143,20 +146,20 @@ void realtimeLock(uint32_t timeoutMs, byte md) if (!realtimeMode && !realtimeOverride) { uint16_t stop, start; if (useMainSegmentOnly) { - WS2812FX::Segment& mainseg = strip.getMainSegment(); + Segment& mainseg = strip.getMainSegment(); start = mainseg.start; stop = mainseg.stop; - mainseg.setOption(SEG_OPTION_FREEZE, true, strip.getMainSegmentId()); + mainseg.setOption(SEG_OPTION_FREEZE, true); } else { start = 0; stop = strip.getLengthTotal(); } // clear strip/segment - for (uint16_t i = start; i < stop; i++) strip.setPixelColor(i,0,0,0,0); + for (size_t i = start; i < stop; i++) strip.setPixelColor(i,0,0,0,0); // if WLED was off and using main segment only, freeze non-main segments so they stay off if (useMainSegmentOnly && bri == 0) { - for (uint8_t s=0; s < strip.getMaxSegments(); s++) { - strip.getSegment(s).setOption(SEG_OPTION_FREEZE, true, s); + for (size_t s=0; s < strip.getSegmentsNum(); s++) { + strip.getSegment(s).setOption(SEG_OPTION_FREEZE, true); } } } @@ -183,7 +186,7 @@ void exitRealtime() { realtimeMode = REALTIME_MODE_INACTIVE; // inform UI immediately realtimeIP[0] = 0; if (useMainSegmentOnly) { // unfreeze live segment again - strip.getMainSegment().setOption(SEG_OPTION_FREEZE, false, strip.getMainSegmentId()); + strip.getMainSegment().setOption(SEG_OPTION_FREEZE, false); } updateInterfaces(CALL_MODE_WS_SEND); } @@ -221,7 +224,7 @@ void handleNotifications() if (!udpConnected) return; bool isSupp = false; - uint16_t packetSize = notifierUdp.parsePacket(); + size_t packetSize = notifierUdp.parsePacket(); if (!packetSize && udp2Connected) { packetSize = notifier2Udp.parsePacket(); isSupp = true; @@ -241,7 +244,7 @@ void handleNotifications() if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; uint16_t id = 0; uint16_t totalLen = strip.getLengthTotal(); - for (uint16_t i = 0; i < packetSize -2; i += 3) + for (size_t i = 0; i < packetSize -2; i += 3) { setRealtimePixel(id, lbuf[i], lbuf[i+1], lbuf[i+2], 0); id++; if (id >= totalLen) break; @@ -275,7 +278,7 @@ void handleNotifications() } if (it != Nodes.end()) { - for (byte x = 0; x < 4; x++) { + for (size_t x = 0; x < 4; x++) { it->second.ip[x] = udpIn[x + 2]; } it->second.age = 0; // reset 'age counter' @@ -287,7 +290,7 @@ void handleNotifications() it->second.nodeType = udpIn[38]; uint32_t build = 0; if (len >= 44) - for (byte i=0; isecond.build = build; } @@ -339,11 +342,11 @@ void handleNotifications() if (applyEffects && currentPlaylist >= 0) unloadPlaylist(); if (version > 10 && (receiveSegmentOptions || receiveSegmentBounds)) { uint8_t numSrcSegs = udpIn[39]; - for (uint8_t i = 0; i < numSrcSegs; i++) { + for (size_t i = 0; i < numSrcSegs; i++) { uint16_t ofs = 41 + i*udpIn[40]; //start of segment offset byte uint8_t id = udpIn[0 +ofs]; - if (id > strip.getMaxSegments()) break; - WS2812FX::Segment& selseg = strip.getSegment(id); + if (id > strip.getSegmentsNum()) break; + Segment& selseg = strip.getSegment(id); uint16_t start = (udpIn[1+ofs] << 8 | udpIn[2+ofs]); uint16_t stop = (udpIn[3+ofs] << 8 | udpIn[4+ofs]); uint16_t offset = (udpIn[7+ofs] << 8 | udpIn[8+ofs]); @@ -351,8 +354,8 @@ void handleNotifications() strip.setSegment(id, start, stop, selseg.grouping, selseg.spacing, offset); continue; } - for (uint8_t j = 0; j<4; j++) selseg.setOption(j, (udpIn[9 +ofs] >> j) & 0x01, id); //only take into account mirrored, selected, on, reversed - selseg.setOpacity(udpIn[10+ofs], id); + for (size_t j = 0; j<4; j++) selseg.setOption(j, (udpIn[9 +ofs] >> j) & 0x01); //only take into account mirrored, selected, on, reversed + selseg.setOpacity(udpIn[10+ofs]); if (applyEffects) { strip.setMode(id, udpIn[11+ofs]); selseg.speed = udpIn[12+ofs]; @@ -360,10 +363,10 @@ void handleNotifications() selseg.palette = udpIn[14+ofs]; } if (receiveNotificationColor || !someSel) { - selseg.setColor(0, RGBW32(udpIn[15+ofs],udpIn[16+ofs],udpIn[17+ofs],udpIn[18+ofs]), id); - selseg.setColor(1, RGBW32(udpIn[19+ofs],udpIn[20+ofs],udpIn[21+ofs],udpIn[22+ofs]), id); - selseg.setColor(2, RGBW32(udpIn[23+ofs],udpIn[24+ofs],udpIn[25+ofs],udpIn[26+ofs]), id); - selseg.setCCT(udpIn[27+ofs], id); + selseg.setColor(0, RGBW32(udpIn[15+ofs],udpIn[16+ofs],udpIn[17+ofs],udpIn[18+ofs])); + selseg.setColor(1, RGBW32(udpIn[19+ofs],udpIn[20+ofs],udpIn[21+ofs],udpIn[22+ofs])); + selseg.setColor(2, RGBW32(udpIn[23+ofs],udpIn[24+ofs],udpIn[25+ofs],udpIn[26+ofs])); + selseg.setCCT(udpIn[27+ofs]); } //setSegment() also properly resets segments if (receiveSegmentBounds) { @@ -377,8 +380,8 @@ void handleNotifications() // simple effect sync, applies to all selected segments if (applyEffects && (version < 11 || !receiveSegmentOptions)) { - for (uint8_t i = 0; i < strip.getMaxSegments(); i++) { - WS2812FX::Segment& seg = strip.getSegment(i); + 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.speed = udpIn[9]; @@ -458,7 +461,7 @@ void handleNotifications() uint16_t id = (tpmPayloadFrameSize/3)*(packetNum-1); //start LED uint16_t totalLen = strip.getLengthTotal(); - for (uint16_t i = 6; i < tpmPayloadFrameSize + 4; i += 3) + for (size_t i = 6; i < tpmPayloadFrameSize + 4U; i += 3) { if (id < totalLen) { @@ -494,14 +497,14 @@ void handleNotifications() uint16_t totalLen = strip.getLengthTotal(); if (udpIn[0] == 1) //warls { - for (uint16_t i = 2; i < packetSize -3; i += 4) + for (size_t i = 2; i < packetSize -3; i += 4) { setRealtimePixel(udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3], 0); } } else if (udpIn[0] == 2) //drgb { uint16_t id = 0; - for (uint16_t i = 2; i < packetSize -2; i += 3) + for (size_t i = 2; i < packetSize -2; i += 3) { setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0); @@ -510,7 +513,7 @@ void handleNotifications() } else if (udpIn[0] == 3) //drgbw { uint16_t id = 0; - for (uint16_t i = 2; i < packetSize -3; i += 4) + for (size_t i = 2; i < packetSize -3; i += 4) { setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3]); @@ -519,7 +522,7 @@ void handleNotifications() } else if (udpIn[0] == 4) //dnrgb { uint16_t id = ((udpIn[3] << 0) & 0xFF) + ((udpIn[2] << 8) & 0xFF00); - for (uint16_t i = 4; i < packetSize -2; i += 3) + for (size_t i = 4; i < packetSize -2; i += 3) { if (id >= totalLen) break; setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], 0); @@ -528,7 +531,7 @@ void handleNotifications() } else if (udpIn[0] == 5) //dnrgbw { uint16_t id = ((udpIn[3] << 0) & 0xFF) + ((udpIn[2] << 8) & 0xFF00); - for (uint16_t i = 4; i < packetSize -2; i += 4) + for (size_t i = 4; i < packetSize -2; i += 4) { if (id >= totalLen) break; setRealtimePixel(id, udpIn[i], udpIn[i+1], udpIn[i+2], udpIn[i+3]); @@ -618,7 +621,7 @@ void sendSysInfoUDP() data[0] = 255; data[1] = 1; - for (byte x = 0; x < 4; x++) { + for (size_t x = 0; x < 4; x++) { data[x + 2] = ip[x]; } memcpy((byte *)data + 6, serverDescription, 32); @@ -632,7 +635,7 @@ void sendSysInfoUDP() data[39] = ip[3]; // unit ID == last IP number uint32_t build = VERSION; - for (byte i=0; i>(8*i)) & 0xFF; IPAddress broadcastIP(255, 255, 255, 255); @@ -684,15 +687,15 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8 case 0: // DDP { // calculate the number of UDP packets we need to send - uint16_t channelCount = length * 3; // 1 channel for every R,G,B value - uint16_t packetCount = ((channelCount-1) / DDP_CHANNELS_PER_PACKET) +1; + size_t channelCount = length * 3; // 1 channel for every R,G,B value + size_t packetCount = ((channelCount-1) / DDP_CHANNELS_PER_PACKET) +1; // there are 3 channels per RGB pixel uint32_t channel = 0; // TODO: allow specifying the start channel // the current position in the buffer - uint16_t bufferOffset = 0; + size_t bufferOffset = 0; - for (uint16_t currentPacket = 0; currentPacket < packetCount; currentPacket++) { + for (size_t currentPacket = 0; currentPacket < packetCount; currentPacket++) { if (sequenceNumber > 15) sequenceNumber = 0; if (!ddpUdp.beginPacket(client, DDP_DEFAULT_PORT)) { // port defined in ESPAsyncE131.h @@ -701,10 +704,10 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8 } // the amount of data is AFTER the header in the current packet - uint16_t packetSize = DDP_CHANNELS_PER_PACKET; + size_t packetSize = DDP_CHANNELS_PER_PACKET; uint8_t flags = DDP_FLAGS1_VER1; - if (currentPacket == (packetCount - 1)) { + if (currentPacket == (packetCount - 1U)) { // last packet, set the push flag // TODO: determine if we want to send an empty push packet to each destination after sending the pixel data flags = DDP_FLAGS1_VER1 | DDP_FLAGS1_PUSH; @@ -729,7 +732,7 @@ uint8_t realtimeBroadcast(uint8_t type, IPAddress client, uint16_t length, uint8 // write the colors, the write write(const uint8_t *buffer, size_t size) // function is just a loop internally too - for (uint16_t i = 0; i < packetSize; i += 3) { + for (size_t i = 0; i < packetSize; i += 3) { ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // R ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // G ddpUdp.write(scale8(buffer[bufferOffset++], bri)); // B diff --git a/wled00/um_manager.cpp b/wled00/um_manager.cpp index b2b169452..5dfab4126 100644 --- a/wled00/um_manager.cpp +++ b/wled00/um_manager.cpp @@ -59,5 +59,3 @@ bool UsermodManager::add(Usermod* um) ums[numMods++] = um; return true; } - -byte UsermodManager::getModCount() {return numMods;} \ No newline at end of file diff --git a/wled00/util.cpp b/wled00/util.cpp index 6900c88c8..20151aa43 100644 --- a/wled00/util.cpp +++ b/wled00/util.cpp @@ -238,14 +238,13 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe char lineBuffer[256]; //strcpy_P(lineBuffer, (const char*)pgm_read_dword(&(WS2812FX::_modeData[mode]))); strcpy_P(lineBuffer, strip.getModeData(mode)); - if (strlen(lineBuffer) > 0) { - size_t j = 0; - for (; j < maxLen; j++) { - if (lineBuffer[j] == '\0' || lineBuffer[j] == '@') break; - dest[j] = lineBuffer[j]; - } - dest[j] = 0; // terminate string + size_t len = strlen(lineBuffer); + size_t j = 0; + for (; j < maxLen && j < len; j++) { + if (lineBuffer[j] == '\0' || lineBuffer[j] == '@') break; + dest[j] = lineBuffer[j]; } + dest[j] = 0; // terminate string return strlen(dest); } else return 0; } @@ -282,7 +281,7 @@ uint8_t extractModeName(uint8_t mode, const char *src, char *dest, uint8_t maxLe // extracts effect slider data (1st group after @) -uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxLen) +uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxLen, uint8_t *var) { dest[0] = '\0'; // start by clearing buffer @@ -292,30 +291,50 @@ uint8_t extractModeSlider(uint8_t mode, uint8_t slider, char *dest, uint8_t maxL int16_t start = lineBuffer.indexOf('@'); int16_t stop = lineBuffer.indexOf(';', start); if (start>0 && stop>0) { - String names = lineBuffer.substring(start+1, stop); - int16_t nameBegin = 0, nameEnd; - for (size_t i=0; i<=slider; i++) { - const char *tmpstr; - dest[0] = '\0'; //clear dest buffer - if (i > 0 && nameBegin == 0) break; // there are no more names - nameEnd = names.indexOf(',', nameBegin); - if (names.charAt(nameBegin) == '!') { - switch (i) { - case 0: tmpstr = PSTR("FX Speed"); break; - case 1: tmpstr = PSTR("FX Intensity"); break; - case 2: tmpstr = PSTR("FX Custom 1"); break; - case 3: tmpstr = PSTR("FX Custom 2"); break; - case 4: tmpstr = PSTR("FX Custom 3"); break; - default: tmpstr = PSTR("FX Custom"); break; + String names = lineBuffer.substring(start, stop); // include @ + int16_t nameBegin = 1, nameEnd, nameDefault; + if (slider < 10) { + for (size_t i=0; i<=slider; i++) { + const char *tmpstr; + dest[0] = '\0'; //clear dest buffer + if (nameBegin == 0) break; // there are no more names + nameEnd = names.indexOf(',', nameBegin); + if (i == slider) { + nameDefault = names.indexOf('=', nameBegin); // find default value + if (nameDefault > 0 && var && ((nameEnd>0 && nameDefault= 0) { + nameEnd = names.indexOf(';', nameBegin+1); + if (!isdigit(names[nameBegin+1])) nameBegin = names.indexOf('=', nameBegin+1); // look for default value + if (nameEnd >= 0 && nameBegin > nameEnd) nameBegin = -1; + if (nameBegin >= 0 && var) { + *var = (uint8_t)atoi(names.substring(nameBegin+1).c_str()); } - } else { - if (nameEnd<0) tmpstr = names.substring(nameBegin).c_str(); // did not find ",", last name? - else tmpstr = names.substring(nameBegin, nameEnd).c_str(); } - strncpy(dest, tmpstr, maxLen); // copy the name into buffer (replacing previous) - nameBegin = nameEnd+1; // next name (if "," is not found it will be 0) - } // next slider - + } // we have slider name (including default value) in the dest buffer for (size_t i=0; i 0) { + int16_t start = lineBuffer.lastIndexOf(';'); + if (start<0) return -1; + + int16_t stop = lineBuffer.indexOf(segVar, start+1); + if (stop<0) return -1; + return atoi(lineBuffer.substring(stop+strlen(segVar)+1).c_str()); + } + } + return -1; +} + + uint16_t crc16(const unsigned char* data_p, size_t length) { uint8_t x; uint16_t crc = 0xFFFF; @@ -343,4 +380,155 @@ uint16_t crc16(const unsigned char* data_p, size_t length) { crc = (crc << 8) ^ ((uint16_t)(x << 12)) ^ ((uint16_t)(x <<5)) ^ ((uint16_t)x); } return crc; -} \ No newline at end of file +} + + +/////////////////////////////////////////////////////////////////////////////// +// Begin simulateSound (to enable audio enhanced effects to display something) +/////////////////////////////////////////////////////////////////////////////// +// Currently 4 types defined, to be fine tuned and new types added +typedef enum UM_SoundSimulations { + UMS_BeatSin = 0, + UMS_WeWillRockYou, + UMS_10_3, + UMS_14_3 +} um_soundSimulations_t; + +// this is still work in progress +um_data_t* simulateSound(uint8_t simulationId) +{ + static float sampleAvg; + static uint8_t soundAgc; + static float sampleAgc; + static int16_t sampleRaw; + static int16_t rawSampleAgc; + static uint8_t samplePeak; + static float FFT_MajorPeak; + static float FFT_Magnitude; + static uint8_t maxVol; + static uint8_t binNum; + static float multAgc; + + float sampleGain; + uint8_t soundSquelch; + uint8_t inputLevel; + + //arrays + uint8_t *fftResult; + uint8_t *myVals; + float *fftBin; + + static um_data_t* um_data = nullptr; + + if (!um_data) { + //claim storage for arrays + fftResult = (uint8_t *)malloc(sizeof(uint8_t) * 16); + myVals = (uint8_t *)malloc(sizeof(uint8_t) * 32); + fftBin = (float *)malloc(sizeof(float) * 256); // not used (for debugging purposes) + + // initialize um_data pointer structure + // NOTE!!! + // This may change as AudioReactive usermod may change + um_data = new um_data_t; + um_data->u_size = 18; + um_data->u_type = new um_types_t[um_data->u_size]; + um_data->u_data = new void*[um_data->u_size]; + um_data->u_data[ 0] = &sampleAvg; + um_data->u_data[ 1] = &soundAgc; + um_data->u_data[ 2] = &sampleAgc; + um_data->u_data[ 3] = &sampleRaw; + um_data->u_data[ 4] = &rawSampleAgc; + um_data->u_data[ 5] = &samplePeak; + um_data->u_data[ 6] = &FFT_MajorPeak; + um_data->u_data[ 7] = &FFT_Magnitude; + um_data->u_data[ 8] = fftResult; + um_data->u_data[ 9] = &maxVol; + um_data->u_data[10] = &binNum; + um_data->u_data[11] = &multAgc; + um_data->u_data[14] = myVals; //*used (only once, Pixels) + um_data->u_data[13] = &sampleGain; + um_data->u_data[15] = &soundSquelch; + um_data->u_data[16] = fftBin; //only used in binmap + um_data->u_data[17] = &inputLevel; + } else { + // get arrays from um_data + fftResult = (uint8_t*)um_data->u_data[8]; + myVals = (uint8_t*)um_data->u_data[14]; + fftBin = (float*)um_data->u_data[16]; + } + + uint32_t ms = millis(); + + switch (simulationId) { + default: + case UMS_BeatSin: + for (int i = 0; i<16; i++) + fftResult[i] = beatsin8(120 / (i+1), 0, 255); + // fftResult[i] = (beatsin8(120, 0, 255) + (256/16 * i)) % 256; + sampleAvg = fftResult[8]; + break; + case UMS_WeWillRockYou: + if (ms%2000 < 200) { + sampleAvg = random8(255); + for (int i = 0; i<5; i++) + fftResult[i] = random8(255); + } + else if (ms%2000 < 400) { + sampleAvg = 0; + for (int i = 0; i<16; i++) + fftResult[i] = 0; + } + else if (ms%2000 < 600) { + sampleAvg = random8(255); + for (int i = 5; i<11; i++) + fftResult[i] = random8(255); + } + else if (ms%2000 < 800) { + sampleAvg = 0; + for (int i = 0; i<16; i++) + fftResult[i] = 0; + } + else if (ms%2000 < 1000) { + sampleAvg = random8(255); + for (int i = 11; i<16; i++) + fftResult[i] = random8(255); + } + else { + sampleAvg = 0; + for (int i = 0; i<16; i++) + fftResult[i] = 0; + } + break; + case UMS_10_3: + for (int i = 0; i<16; i++) + fftResult[i] = inoise8(beatsin8(90 / (i+1), 0, 200)*15 + (ms>>10), ms>>3); + sampleAvg = fftResult[8]; + break; + case UMS_14_3: + for (int i = 0; i<16; i++) + fftResult[i] = inoise8(beatsin8(120 / (i+1), 10, 30)*10 + (ms>>14), ms>>3); + sampleAvg = fftResult[8]; + break; + } + + //derive other vars from sampleAvg + + //sampleAvg = mapf(sampleAvg, 0, 255, 0, 255); // help me out here + soundAgc = 0; //only avg in simulations + sampleAgc = sampleAvg; + sampleRaw = sampleAvg; + sampleRaw = map(sampleRaw, 50, 190, 0, 224); + rawSampleAgc = sampleAvg; + samplePeak = random8() > 250; + FFT_MajorPeak = sampleAvg; + FFT_Magnitude = sampleAvg; + multAgc = sampleAvg; + myVals[millis()%32] = sampleAvg; // filling values semi randomly (why?) + sampleGain = 40; + soundSquelch = 10; + maxVol = 10; // this gets feedback fro UI + binNum = 8; // this gets feedback fro UI + inputLevel = 128; // this gets feedback fro UI + + return um_data; +} diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 2d1f34702..28441a0b4 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -118,6 +118,7 @@ void WLED::loop() if (stripMillis > maxStripMillis) maxStripMillis = stripMillis; #endif } + yield(); #ifdef ESP8266 MDNS.update(); @@ -692,6 +693,7 @@ void WLED::handleConnection() DEBUG_PRINT(F("Heap too low! ")); DEBUG_PRINTLN(heap); forceReconnect = true; + strip.purgeSegments(); // remove inactive segments from memory } lastHeap = heap; heapTime = now; diff --git a/wled00/wled.h b/wled00/wled.h index d8cfb2fb2..230c23651 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2206281 +#define VERSION 2207271 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG @@ -152,19 +152,19 @@ using PSRAMDynamicJsonDocument = BasicJsonDocument; #define PSRAMDynamicJsonDocument DynamicJsonDocument #endif +#include "const.h" #include "fcn_declare.h" #include "html_ui.h" #ifdef WLED_ENABLE_SIMPLE_UI -#include "html_simple.h" + #include "html_simple.h" #endif #include "html_settings.h" #include "html_other.h" -#include "FX.h" #include "ir_codes.h" -#include "const.h" #include "NodeStruct.h" #include "pin_manager.h" #include "bus_manager.h" +#include "FX.h" #ifndef CLIENT_SSID #define CLIENT_SSID DEFAULT_CLIENT_SSID diff --git a/wled00/wled_eeprom.cpp b/wled00/wled_eeprom.cpp index 11f514fcf..32ba9f50c 100644 --- a/wled00/wled_eeprom.cpp +++ b/wled00/wled_eeprom.cpp @@ -418,7 +418,7 @@ void deEEP() { segObj[F("ix")] = EEPROM.read(i+16); segObj["pal"] = EEPROM.read(i+17); } else { - WS2812FX::Segment* seg = strip.getSegments(); + Segment* seg = strip.getSegments(); memcpy(seg, EEPROM.getDataPtr() +i+2, 240); if (ver == 2) { //versions before 2004230 did not have opacity for (byte j = 0; j < strip.getMaxSegments(); j++) diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 86c993be1..733a8bc82 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -297,8 +297,8 @@ void initServer() DEBUG_PRINTLN(F("Update Success")); } else { DEBUG_PRINTLN(F("Update Failed")); - WLED::instance().enableWatchdog(); usermods.onUpdateBegin(false); // notify usermods that update has failed (some may require task init) + WLED::instance().enableWatchdog(); } } }); diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 977a8fe8d..9e7b58435 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -58,6 +58,10 @@ void wsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventTyp if (verboseResponse) { sendDataWs(client); lastInterfaceUpdate = millis() - (INTERFACE_UPDATE_COOLDOWN -500); + } else { + // we have to send something back otherwise WS connection closes + client->text(F("{\"success\":true}")); + lastInterfaceUpdate = millis() - (INTERFACE_UPDATE_COOLDOWN -500); } } } else { @@ -96,8 +100,6 @@ void sendDataWs(AsyncWebSocketClient * client) if (!ws.count()) return; AsyncWebSocketMessageBuffer * buffer; - while (strip.isUpdating()) yield(); - if (!requestJSONBufferLock(12)) return; JsonObject state = doc.createNestedObject("state"); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index b621012fd..17726632e 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -308,9 +308,15 @@ void getSettingsJS(byte subPage, char* dest) // set limits oappend(SET_F("bLimits(")); + #ifdef ESP32 + // requested by @softhack007 https://github.com/blazoncek/WLED/issues/33 + if (usermods.lookup(USERMOD_ID_AUDIOREACTIVE)) + oappend(itoa(WLED_MAX_BUSSES-2,nS,10)); // prevent use of I2S buses if audio installed + else + #endif oappend(itoa(WLED_MAX_BUSSES,nS,10)); oappend(","); oappend(itoa(MAX_LEDS_PER_BUS,nS,10)); oappend(","); - oappend(itoa(MAX_LED_MEMORY,nS,10)); oappend(","); + oappend(itoa(MAX_LED_MEMORY,nS,10)); oappend(","); oappend(itoa(MAX_LEDS,nS,10)); oappend(SET_F(");")); @@ -636,6 +642,7 @@ void getSettingsJS(byte subPage, char* dest) if (subPage == 10) // 2D matrices { sappend('v',SET_F("SOMP"),strip.isMatrix); + #ifndef WLED_DISABLE_2D oappend(SET_F("resetPanels();")); if (strip.isMatrix) { sappend('v',SET_F("PH"),strip.panelH); @@ -660,5 +667,8 @@ void getSettingsJS(byte subPage, char* dest) pO[l] = 'S'; sappend('c',pO,strip.panel[i].serpentine); } } + #else + oappend(SET_F("gId(\"somp\").remove(1);")); // remove 2D option from dropdown + #endif } }
- +