From 927caf062bab2e08e483666b3d67b94c4a6fb764 Mon Sep 17 00:00:00 2001
From: Javier Peletier <jpeletier@users.noreply.github.com>
Date: Mon, 22 Apr 2024 22:48:06 +0200
Subject: [PATCH 01/81] wifi: fix reconnect issue due to enablement of fast
 connect (#6598)

---
 esphome/components/wifi/wifi_component.cpp | 8 ++++++--
 esphome/components/wifi/wifi_component.h   | 1 +
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp
index 8f46bf29a0..075e683bb5 100644
--- a/esphome/components/wifi/wifi_component.cpp
+++ b/esphome/components/wifi/wifi_component.cpp
@@ -128,7 +128,7 @@ void WiFiComponent::loop() {
       case WIFI_COMPONENT_STATE_COOLDOWN: {
         this->status_set_warning();
         if (millis() - this->action_started_ > 5000) {
-          if (this->fast_connect_) {
+          if (this->fast_connect_ || this->retry_hidden_) {
             this->start_connecting(this->sta_[0], false);
           } else {
             this->start_scanning();
@@ -591,6 +591,9 @@ void WiFiComponent::check_connecting_finished() {
       return;
     }
 
+    // We won't retry hidden networks unless a reconnect fails more than three times again
+    this->retry_hidden_ = false;
+
     ESP_LOGI(TAG, "WiFi Connected!");
     this->print_connect_params_();
 
@@ -668,10 +671,11 @@ void WiFiComponent::retry_connect() {
       this->wifi_mode_(false, {});
       delay(100);  // NOLINT
       this->num_retried_ = 0;
+      this->retry_hidden_ = false;
     } else {
       // Try hidden networks after 3 failed retries
       ESP_LOGD(TAG, "Retrying with hidden networks...");
-      this->fast_connect_ = true;
+      this->retry_hidden_ = true;
       this->num_retried_++;
     }
   } else {
diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h
index d9cb6a9ae2..133fa2970c 100644
--- a/esphome/components/wifi/wifi_component.h
+++ b/esphome/components/wifi/wifi_component.h
@@ -371,6 +371,7 @@ class WiFiComponent : public Component {
   std::vector<WiFiSTAPriority> sta_priorities_;
   WiFiAP selected_ap_;
   bool fast_connect_{false};
+  bool retry_hidden_{false};
 
   bool has_ap_{false};
   WiFiAP ap_;

From 50e3ce4c809489a5cd2b0166d7120d1c990d0c0d Mon Sep 17 00:00:00 2001
From: Mat931 <49403702+Mat931@users.noreply.github.com>
Date: Mon, 22 Apr 2024 20:59:06 +0000
Subject: [PATCH 02/81] Calibrate Beken internal temperature (#6599)

---
 .../internal_temperature/internal_temperature.cpp         | 8 +++++---
 tests/components/internal_temperature/test.bk72xx.yaml    | 3 +++
 .../internal_temperature/test.esp32-c3-idf.yaml           | 3 +++
 tests/components/internal_temperature/test.esp32-c3.yaml  | 3 +++
 tests/components/internal_temperature/test.esp32-idf.yaml | 3 +++
 tests/components/internal_temperature/test.esp32.yaml     | 3 +++
 tests/components/internal_temperature/test.rp2040.yaml    | 3 +++
 7 files changed, 23 insertions(+), 3 deletions(-)
 create mode 100644 tests/components/internal_temperature/test.bk72xx.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-c3.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-idf.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32.yaml
 create mode 100644 tests/components/internal_temperature/test.rp2040.yaml

diff --git a/esphome/components/internal_temperature/internal_temperature.cpp b/esphome/components/internal_temperature/internal_temperature.cpp
index 255d95f6f8..47f516f568 100644
--- a/esphome/components/internal_temperature/internal_temperature.cpp
+++ b/esphome/components/internal_temperature/internal_temperature.cpp
@@ -55,11 +55,13 @@ void InternalTemperatureSensor::update() {
   uint32_t raw, result;
   result = temp_single_get_current_temperature(&raw);
   success = (result == 0);
-#ifdef USE_LIBRETINY_VARIANT_BK7231T
+#if defined(USE_LIBRETINY_VARIANT_BK7231N)
+  temperature = raw * -0.38f + 156.0f;
+#elif defined(USE_LIBRETINY_VARIANT_BK7231T)
   temperature = raw * 0.04f;
-#else
+#else   // USE_LIBRETINY_VARIANT
   temperature = raw * 0.128f;
-#endif  // USE_LIBRETINY_VARIANT_BK7231T
+#endif  // USE_LIBRETINY_VARIANT
 #endif  // USE_BK72XX
   if (success && std::isfinite(temperature)) {
     this->publish_state(temperature);
diff --git a/tests/components/internal_temperature/test.bk72xx.yaml b/tests/components/internal_temperature/test.bk72xx.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.bk72xx.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-c3-idf.yaml b/tests/components/internal_temperature/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-c3.yaml b/tests/components/internal_temperature/test.esp32-c3.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-idf.yaml b/tests/components/internal_temperature/test.esp32-idf.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32.yaml b/tests/components/internal_temperature/test.esp32.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.rp2040.yaml b/tests/components/internal_temperature/test.rp2040.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.rp2040.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"

From a9a9be32d3a6869aab78d37bb77b6d385c95837b Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Tue, 23 Apr 2024 09:14:56 +1200
Subject: [PATCH 03/81] Bump aioesphomeapi from 24.0.0 to 24.3.0 (#6602)

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
 requirements.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/requirements.txt b/requirements.txt
index 68041675f6..df94b8b77c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -13,7 +13,7 @@ platformio==6.1.13  # When updating platformio, also update Dockerfile
 esptool==4.7.0
 click==8.1.7
 esphome-dashboard==20240412.0
-aioesphomeapi==24.0.0
+aioesphomeapi==24.3.0
 zeroconf==0.132.2
 python-magic==0.4.27
 ruamel.yaml==0.18.6 # dashboard_import

From 7c893aa3309bcd7756432c6ba5b96a8c57d9e4ff Mon Sep 17 00:00:00 2001
From: Cody Cutrer <cody@cutrer.us>
Date: Mon, 22 Apr 2024 15:48:29 -0600
Subject: [PATCH 04/81] fix streaming logs from MQTT for ESP32 devices using
 TLS (#6605)

---
 esphome/mqtt.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/esphome/mqtt.py b/esphome/mqtt.py
index 166301005d..667a20bcf8 100644
--- a/esphome/mqtt.py
+++ b/esphome/mqtt.py
@@ -10,6 +10,7 @@ import paho.mqtt.client as mqtt
 
 from esphome.const import (
     CONF_BROKER,
+    CONF_CERTIFICATE_AUTHORITY,
     CONF_DISCOVERY_PREFIX,
     CONF_ESPHOME,
     CONF_LOG_TOPIC,
@@ -99,7 +100,9 @@ def prepare(
     elif username:
         client.username_pw_set(username, password)
 
-    if config[CONF_MQTT].get(CONF_SSL_FINGERPRINTS):
+    if config[CONF_MQTT].get(CONF_SSL_FINGERPRINTS) or config[CONF_MQTT].get(
+        CONF_CERTIFICATE_AUTHORITY
+    ):
         if sys.version_info >= (2, 7, 13):
             tls_version = ssl.PROTOCOL_TLS  # pylint: disable=no-member
         else:

From c7bfd9b46b63a52ad4ccd45e35e36cd4b073dbd9 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Tue, 23 Apr 2024 08:04:56 +1000
Subject: [PATCH 05/81] Disallow variant/family override for known boards
 (#6512)

---
 esphome/components/esp32/__init__.py     | 25 +++++++++++++------
 esphome/components/libretiny/__init__.py | 31 +++++++++++++++---------
 2 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py
index 50d6d229f9..8ae6262f2f 100644
--- a/esphome/components/esp32/__init__.py
+++ b/esphome/components/esp32/__init__.py
@@ -316,17 +316,26 @@ def _parse_platform_version(value):
 
 
 def _detect_variant(value):
-    if CONF_VARIANT not in value:
-        board = value[CONF_BOARD]
-        if board not in BOARDS:
+    board = value[CONF_BOARD]
+    if board in BOARDS:
+        variant = BOARDS[board][KEY_VARIANT]
+        if CONF_VARIANT in value and variant != value[CONF_VARIANT]:
             raise cv.Invalid(
-                "This board is unknown, please set the variant manually",
+                f"Option '{CONF_VARIANT}' does not match selected board.",
+                path=[CONF_VARIANT],
+            )
+        value = value.copy()
+        value[CONF_VARIANT] = variant
+    else:
+        if CONF_VARIANT not in value:
+            raise cv.Invalid(
+                "This board is unknown, if you are sure you want to compile with this board selection, "
+                f"override with option '{CONF_VARIANT}'",
                 path=[CONF_BOARD],
             )
-
-        value = value.copy()
-        value[CONF_VARIANT] = BOARDS[board][KEY_VARIANT]
-
+        _LOGGER.warning(
+            "This board is unknown. Make sure the chosen chip component is correct.",
+        )
     return value
 
 
diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py
index 34aff0ae16..a8034f8fab 100644
--- a/esphome/components/libretiny/__init__.py
+++ b/esphome/components/libretiny/__init__.py
@@ -1,6 +1,10 @@
 import json
 import logging
-from os.path import dirname, isfile, join
+from os.path import (
+    dirname,
+    isfile,
+    join,
+)
 
 import esphome.codegen as cg
 import esphome.config_validation as cv
@@ -55,15 +59,25 @@ def _detect_variant(value):
     component: LibreTinyComponent = CORE.data[KEY_LIBRETINY][KEY_COMPONENT_DATA]
     board = value[CONF_BOARD]
     # read board-default family if not specified
-    if CONF_FAMILY not in value:
-        if board not in component.boards:
+    if board not in component.boards:
+        if CONF_FAMILY not in value:
             raise cv.Invalid(
-                "This board is unknown, please set the family manually. "
-                "Also, make sure the chosen chip component is correct.",
+                "This board is unknown, if you are sure you want to compile with this board selection, "
+                f"override with option '{CONF_FAMILY}'",
                 path=[CONF_BOARD],
             )
+        _LOGGER.warning(
+            "This board is unknown. Make sure the chosen chip component is correct.",
+        )
+    else:
+        family = component.boards[board][KEY_FAMILY]
+        if CONF_FAMILY in value and family != value[CONF_FAMILY]:
+            raise cv.Invalid(
+                f"Option '{CONF_FAMILY}' does not match selected board.",
+                path=[CONF_FAMILY],
+            )
         value = value.copy()
-        value[CONF_FAMILY] = component.boards[board][KEY_FAMILY]
+        value[CONF_FAMILY] = family
     # read component name matching this family
     value[CONF_COMPONENT_ID] = FAMILY_COMPONENT[value[CONF_FAMILY]]
     # make sure the chosen component matches the family
@@ -72,11 +86,6 @@ def _detect_variant(value):
             f"The chosen family doesn't belong to '{component.name}' component. The correct component is '{value[CONF_COMPONENT_ID]}'",
             path=[CONF_FAMILY],
         )
-    # warn anyway if the board wasn't found
-    if board not in component.boards:
-        _LOGGER.warning(
-            "This board is unknown. Make sure the chosen chip component is correct.",
-        )
     return value
 
 

From 7510468a9bd9956b097d5bd4f00ef8e751c97b17 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Tue, 23 Apr 2024 08:10:07 +1000
Subject: [PATCH 06/81] Add yamllint and clang-format to pre-commit hooks
 (#6578)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .pre-commit-config.yaml | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 69aafd4d15..15e59b7eb7 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -31,3 +31,12 @@ repos:
     hooks:
       - id: pyupgrade
         args: [--py39-plus]
+  - repo: https://github.com/adrienverge/yamllint.git
+    rev: v1.35.1
+    hooks:
+      - id: yamllint
+  - repo: https://github.com/pre-commit/mirrors-clang-format
+    rev: v13.0.1
+    hooks:
+      - id: clang-format
+

From aee2a49cad466232b087dc0a690e0cd50f10a802 Mon Sep 17 00:00:00 2001
From: polyfloyd <polyfloyd@users.noreply.github.com>
Date: Tue, 23 Apr 2024 00:17:00 +0200
Subject: [PATCH 07/81] esp32_ble: Consider ESP_BT_STATUS_DONE a successful
 state (#6493)

Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
---
 esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
index a5bbd85b47..a5209c764a 100644
--- a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
+++ b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
@@ -364,7 +364,11 @@ void ESP32BLETracker::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_ga
 }
 
 void ESP32BLETracker::gap_scan_set_param_complete_(const esp_ble_gap_cb_param_t::ble_scan_param_cmpl_evt_param &param) {
-  this->scan_set_param_failed_ = param.status;
+  if (param.status == ESP_BT_STATUS_DONE) {
+    this->scan_set_param_failed_ = ESP_BT_STATUS_SUCCESS;
+  } else {
+    this->scan_set_param_failed_ = param.status;
+  }
 }
 
 void ESP32BLETracker::gap_scan_start_complete_(const esp_ble_gap_cb_param_t::ble_scan_start_cmpl_evt_param &param) {

From 0874440a317bc8541b79f829a253209608be9568 Mon Sep 17 00:00:00 2001
From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
Date: Mon, 22 Apr 2024 18:48:30 -0400
Subject: [PATCH 08/81] Fix or filter (#6574)

Co-authored-by: Jonathan Swoboda <jonathan.swoboda>
---
 esphome/components/sensor/filter.cpp | 6 +++++-
 esphome/components/sensor/filter.h   | 1 +
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/esphome/components/sensor/filter.cpp b/esphome/components/sensor/filter.cpp
index 3f67af59be..eaa909429b 100644
--- a/esphome/components/sensor/filter.cpp
+++ b/esphome/components/sensor/filter.cpp
@@ -359,11 +359,15 @@ OrFilter::OrFilter(std::vector<Filter *> filters) : filters_(std::move(filters))
 OrFilter::PhiNode::PhiNode(OrFilter *or_parent) : or_parent_(or_parent) {}
 
 optional<float> OrFilter::PhiNode::new_value(float value) {
-  this->or_parent_->output(value);
+  if (!this->or_parent_->has_value_) {
+    this->or_parent_->output(value);
+    this->or_parent_->has_value_ = true;
+  }
 
   return {};
 }
 optional<float> OrFilter::new_value(float value) {
+  this->has_value_ = false;
   for (Filter *filter : this->filters_)
     filter->input(value);
 
diff --git a/esphome/components/sensor/filter.h b/esphome/components/sensor/filter.h
index 1a08699d7b..c13cb3420a 100644
--- a/esphome/components/sensor/filter.h
+++ b/esphome/components/sensor/filter.h
@@ -388,6 +388,7 @@ class OrFilter : public Filter {
   };
 
   std::vector<Filter *> filters_;
+  bool has_value_{false};
   PhiNode phi_;
 };
 

From 496b7f45db59958eb5e3c75ebc19f24fc752b698 Mon Sep 17 00:00:00 2001
From: zry98 <dev@zry.io>
Date: Wed, 17 Apr 2024 23:31:20 +0200
Subject: [PATCH 09/81] [Tuya Climate] Fix compilation error caused by codegen
 (#6568)

---
 esphome/components/tuya/climate/__init__.py | 18 +++++++-----------
 1 file changed, 7 insertions(+), 11 deletions(-)

diff --git a/esphome/components/tuya/climate/__init__.py b/esphome/components/tuya/climate/__init__.py
index b3d401e5a4..56eb377ed7 100644
--- a/esphome/components/tuya/climate/__init__.py
+++ b/esphome/components/tuya/climate/__init__.py
@@ -208,7 +208,7 @@ async def to_code(config):
         cg.add(var.set_switch_id(switch_datapoint))
 
     if active_state_config := config.get(CONF_ACTIVE_STATE):
-        cg.add(var.set_active_state_id(CONF_DATAPOINT))
+        cg.add(var.set_active_state_id(active_state_config.get(CONF_DATAPOINT)))
         if (heating_value := active_state_config.get(CONF_HEATING_VALUE)) is not None:
             cg.add(var.set_active_state_heating_value(heating_value))
         if (cooling_value := active_state_config.get(CONF_COOLING_VALUE)) is not None:
@@ -219,14 +219,10 @@ async def to_code(config):
             cg.add(var.set_active_state_fanonly_value(fanonly_value))
     else:
         if heating_state_pin_config := config.get(CONF_HEATING_STATE_PIN):
-            heating_state_pin = await cg.gpio_pin_expression(
-                config(heating_state_pin_config)
-            )
+            heating_state_pin = await cg.gpio_pin_expression(heating_state_pin_config)
             cg.add(var.set_heating_state_pin(heating_state_pin))
         if cooling_state_pin_config := config.get(CONF_COOLING_STATE_PIN):
-            cooling_state_pin = await cg.gpio_pin_expression(
-                config(cooling_state_pin_config)
-            )
+            cooling_state_pin = await cg.gpio_pin_expression(cooling_state_pin_config)
             cg.add(var.set_cooling_state_pin(cooling_state_pin))
 
     if target_temperature_datapoint := config.get(CONF_TARGET_TEMPERATURE_DATAPOINT):
@@ -254,11 +250,11 @@ async def to_code(config):
 
     if preset_config := config.get(CONF_PRESET, {}):
         if eco_config := preset_config.get(CONF_ECO, {}):
-            cg.add(var.set_eco_id(CONF_DATAPOINT))
+            cg.add(var.set_eco_id(eco_config.get(CONF_DATAPOINT)))
             if eco_temperature := eco_config.get(CONF_TEMPERATURE):
                 cg.add(var.set_eco_temperature(eco_temperature))
-        if CONF_SLEEP in preset_config:
-            cg.add(var.set_sleep_id(CONF_DATAPOINT))
+        if sleep_config := preset_config.get(CONF_SLEEP, {}):
+            cg.add(var.set_sleep_id(sleep_config.get(CONF_DATAPOINT)))
 
     if swing_mode_config := config.get(CONF_SWING_MODE):
         if swing_vertical_datapoint := swing_mode_config.get(CONF_VERTICAL_DATAPOINT):
@@ -268,7 +264,7 @@ async def to_code(config):
         ):
             cg.add(var.set_swing_horizontal_id(swing_horizontal_datapoint))
     if fan_mode_config := config.get(CONF_FAN_MODE):
-        cg.add(var.set_fan_speed_id(CONF_DATAPOINT))
+        cg.add(var.set_fan_speed_id(fan_mode_config.get(CONF_DATAPOINT)))
         if (fan_auto_value := fan_mode_config.get(CONF_AUTO_VALUE)) is not None:
             cg.add(var.set_fan_speed_auto_value(fan_auto_value))
         if (fan_low_value := fan_mode_config.get(CONF_LOW_VALUE)) is not None:

From 1a152169e0fb6ea0d1cd0873b9f140c201ae4def Mon Sep 17 00:00:00 2001
From: Javier Peletier <jpeletier@users.noreply.github.com>
Date: Mon, 22 Apr 2024 22:48:06 +0200
Subject: [PATCH 10/81] wifi: fix reconnect issue due to enablement of fast
 connect (#6598)

---
 esphome/components/wifi/wifi_component.cpp | 8 ++++++--
 esphome/components/wifi/wifi_component.h   | 1 +
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/esphome/components/wifi/wifi_component.cpp b/esphome/components/wifi/wifi_component.cpp
index 8f46bf29a0..075e683bb5 100644
--- a/esphome/components/wifi/wifi_component.cpp
+++ b/esphome/components/wifi/wifi_component.cpp
@@ -128,7 +128,7 @@ void WiFiComponent::loop() {
       case WIFI_COMPONENT_STATE_COOLDOWN: {
         this->status_set_warning();
         if (millis() - this->action_started_ > 5000) {
-          if (this->fast_connect_) {
+          if (this->fast_connect_ || this->retry_hidden_) {
             this->start_connecting(this->sta_[0], false);
           } else {
             this->start_scanning();
@@ -591,6 +591,9 @@ void WiFiComponent::check_connecting_finished() {
       return;
     }
 
+    // We won't retry hidden networks unless a reconnect fails more than three times again
+    this->retry_hidden_ = false;
+
     ESP_LOGI(TAG, "WiFi Connected!");
     this->print_connect_params_();
 
@@ -668,10 +671,11 @@ void WiFiComponent::retry_connect() {
       this->wifi_mode_(false, {});
       delay(100);  // NOLINT
       this->num_retried_ = 0;
+      this->retry_hidden_ = false;
     } else {
       // Try hidden networks after 3 failed retries
       ESP_LOGD(TAG, "Retrying with hidden networks...");
-      this->fast_connect_ = true;
+      this->retry_hidden_ = true;
       this->num_retried_++;
     }
   } else {
diff --git a/esphome/components/wifi/wifi_component.h b/esphome/components/wifi/wifi_component.h
index d9cb6a9ae2..133fa2970c 100644
--- a/esphome/components/wifi/wifi_component.h
+++ b/esphome/components/wifi/wifi_component.h
@@ -371,6 +371,7 @@ class WiFiComponent : public Component {
   std::vector<WiFiSTAPriority> sta_priorities_;
   WiFiAP selected_ap_;
   bool fast_connect_{false};
+  bool retry_hidden_{false};
 
   bool has_ap_{false};
   WiFiAP ap_;

From a29e634af103baa07dbcdaf02cd898e638d79d3a Mon Sep 17 00:00:00 2001
From: Mat931 <49403702+Mat931@users.noreply.github.com>
Date: Mon, 22 Apr 2024 20:59:06 +0000
Subject: [PATCH 11/81] Calibrate Beken internal temperature (#6599)

---
 .../internal_temperature/internal_temperature.cpp         | 8 +++++---
 tests/components/internal_temperature/test.bk72xx.yaml    | 3 +++
 .../internal_temperature/test.esp32-c3-idf.yaml           | 3 +++
 tests/components/internal_temperature/test.esp32-c3.yaml  | 3 +++
 tests/components/internal_temperature/test.esp32-idf.yaml | 3 +++
 tests/components/internal_temperature/test.esp32.yaml     | 3 +++
 tests/components/internal_temperature/test.rp2040.yaml    | 3 +++
 7 files changed, 23 insertions(+), 3 deletions(-)
 create mode 100644 tests/components/internal_temperature/test.bk72xx.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-c3.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-idf.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32.yaml
 create mode 100644 tests/components/internal_temperature/test.rp2040.yaml

diff --git a/esphome/components/internal_temperature/internal_temperature.cpp b/esphome/components/internal_temperature/internal_temperature.cpp
index 255d95f6f8..47f516f568 100644
--- a/esphome/components/internal_temperature/internal_temperature.cpp
+++ b/esphome/components/internal_temperature/internal_temperature.cpp
@@ -55,11 +55,13 @@ void InternalTemperatureSensor::update() {
   uint32_t raw, result;
   result = temp_single_get_current_temperature(&raw);
   success = (result == 0);
-#ifdef USE_LIBRETINY_VARIANT_BK7231T
+#if defined(USE_LIBRETINY_VARIANT_BK7231N)
+  temperature = raw * -0.38f + 156.0f;
+#elif defined(USE_LIBRETINY_VARIANT_BK7231T)
   temperature = raw * 0.04f;
-#else
+#else   // USE_LIBRETINY_VARIANT
   temperature = raw * 0.128f;
-#endif  // USE_LIBRETINY_VARIANT_BK7231T
+#endif  // USE_LIBRETINY_VARIANT
 #endif  // USE_BK72XX
   if (success && std::isfinite(temperature)) {
     this->publish_state(temperature);
diff --git a/tests/components/internal_temperature/test.bk72xx.yaml b/tests/components/internal_temperature/test.bk72xx.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.bk72xx.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-c3-idf.yaml b/tests/components/internal_temperature/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-c3.yaml b/tests/components/internal_temperature/test.esp32-c3.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32-idf.yaml b/tests/components/internal_temperature/test.esp32-idf.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.esp32.yaml b/tests/components/internal_temperature/test.esp32.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"
diff --git a/tests/components/internal_temperature/test.rp2040.yaml b/tests/components/internal_temperature/test.rp2040.yaml
new file mode 100644
index 0000000000..28df4a6d9f
--- /dev/null
+++ b/tests/components/internal_temperature/test.rp2040.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: "Internal Temperature"

From dd8be524b433ddd80c68c7556b5ba156b58cf81b Mon Sep 17 00:00:00 2001
From: Cody Cutrer <cody@cutrer.us>
Date: Mon, 22 Apr 2024 15:48:29 -0600
Subject: [PATCH 12/81] fix streaming logs from MQTT for ESP32 devices using
 TLS (#6605)

---
 esphome/mqtt.py | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/esphome/mqtt.py b/esphome/mqtt.py
index 166301005d..667a20bcf8 100644
--- a/esphome/mqtt.py
+++ b/esphome/mqtt.py
@@ -10,6 +10,7 @@ import paho.mqtt.client as mqtt
 
 from esphome.const import (
     CONF_BROKER,
+    CONF_CERTIFICATE_AUTHORITY,
     CONF_DISCOVERY_PREFIX,
     CONF_ESPHOME,
     CONF_LOG_TOPIC,
@@ -99,7 +100,9 @@ def prepare(
     elif username:
         client.username_pw_set(username, password)
 
-    if config[CONF_MQTT].get(CONF_SSL_FINGERPRINTS):
+    if config[CONF_MQTT].get(CONF_SSL_FINGERPRINTS) or config[CONF_MQTT].get(
+        CONF_CERTIFICATE_AUTHORITY
+    ):
         if sys.version_info >= (2, 7, 13):
             tls_version = ssl.PROTOCOL_TLS  # pylint: disable=no-member
         else:

From 03d547d2c0a0b1e89487a5fec8a4696d6afd8685 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Tue, 23 Apr 2024 08:04:56 +1000
Subject: [PATCH 13/81] Disallow variant/family override for known boards
 (#6512)

---
 esphome/components/esp32/__init__.py     | 25 +++++++++++++------
 esphome/components/libretiny/__init__.py | 31 +++++++++++++++---------
 2 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py
index 50d6d229f9..8ae6262f2f 100644
--- a/esphome/components/esp32/__init__.py
+++ b/esphome/components/esp32/__init__.py
@@ -316,17 +316,26 @@ def _parse_platform_version(value):
 
 
 def _detect_variant(value):
-    if CONF_VARIANT not in value:
-        board = value[CONF_BOARD]
-        if board not in BOARDS:
+    board = value[CONF_BOARD]
+    if board in BOARDS:
+        variant = BOARDS[board][KEY_VARIANT]
+        if CONF_VARIANT in value and variant != value[CONF_VARIANT]:
             raise cv.Invalid(
-                "This board is unknown, please set the variant manually",
+                f"Option '{CONF_VARIANT}' does not match selected board.",
+                path=[CONF_VARIANT],
+            )
+        value = value.copy()
+        value[CONF_VARIANT] = variant
+    else:
+        if CONF_VARIANT not in value:
+            raise cv.Invalid(
+                "This board is unknown, if you are sure you want to compile with this board selection, "
+                f"override with option '{CONF_VARIANT}'",
                 path=[CONF_BOARD],
             )
-
-        value = value.copy()
-        value[CONF_VARIANT] = BOARDS[board][KEY_VARIANT]
-
+        _LOGGER.warning(
+            "This board is unknown. Make sure the chosen chip component is correct.",
+        )
     return value
 
 
diff --git a/esphome/components/libretiny/__init__.py b/esphome/components/libretiny/__init__.py
index 34aff0ae16..a8034f8fab 100644
--- a/esphome/components/libretiny/__init__.py
+++ b/esphome/components/libretiny/__init__.py
@@ -1,6 +1,10 @@
 import json
 import logging
-from os.path import dirname, isfile, join
+from os.path import (
+    dirname,
+    isfile,
+    join,
+)
 
 import esphome.codegen as cg
 import esphome.config_validation as cv
@@ -55,15 +59,25 @@ def _detect_variant(value):
     component: LibreTinyComponent = CORE.data[KEY_LIBRETINY][KEY_COMPONENT_DATA]
     board = value[CONF_BOARD]
     # read board-default family if not specified
-    if CONF_FAMILY not in value:
-        if board not in component.boards:
+    if board not in component.boards:
+        if CONF_FAMILY not in value:
             raise cv.Invalid(
-                "This board is unknown, please set the family manually. "
-                "Also, make sure the chosen chip component is correct.",
+                "This board is unknown, if you are sure you want to compile with this board selection, "
+                f"override with option '{CONF_FAMILY}'",
                 path=[CONF_BOARD],
             )
+        _LOGGER.warning(
+            "This board is unknown. Make sure the chosen chip component is correct.",
+        )
+    else:
+        family = component.boards[board][KEY_FAMILY]
+        if CONF_FAMILY in value and family != value[CONF_FAMILY]:
+            raise cv.Invalid(
+                f"Option '{CONF_FAMILY}' does not match selected board.",
+                path=[CONF_FAMILY],
+            )
         value = value.copy()
-        value[CONF_FAMILY] = component.boards[board][KEY_FAMILY]
+        value[CONF_FAMILY] = family
     # read component name matching this family
     value[CONF_COMPONENT_ID] = FAMILY_COMPONENT[value[CONF_FAMILY]]
     # make sure the chosen component matches the family
@@ -72,11 +86,6 @@ def _detect_variant(value):
             f"The chosen family doesn't belong to '{component.name}' component. The correct component is '{value[CONF_COMPONENT_ID]}'",
             path=[CONF_FAMILY],
         )
-    # warn anyway if the board wasn't found
-    if board not in component.boards:
-        _LOGGER.warning(
-            "This board is unknown. Make sure the chosen chip component is correct.",
-        )
     return value
 
 

From 44d13f2405abba7d7f21334e1364b2ca90967a07 Mon Sep 17 00:00:00 2001
From: polyfloyd <polyfloyd@users.noreply.github.com>
Date: Tue, 23 Apr 2024 00:17:00 +0200
Subject: [PATCH 14/81] esp32_ble: Consider ESP_BT_STATUS_DONE a successful
 state (#6493)

Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
---
 esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
index a5bbd85b47..a5209c764a 100644
--- a/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
+++ b/esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp
@@ -364,7 +364,11 @@ void ESP32BLETracker::gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_ga
 }
 
 void ESP32BLETracker::gap_scan_set_param_complete_(const esp_ble_gap_cb_param_t::ble_scan_param_cmpl_evt_param &param) {
-  this->scan_set_param_failed_ = param.status;
+  if (param.status == ESP_BT_STATUS_DONE) {
+    this->scan_set_param_failed_ = ESP_BT_STATUS_SUCCESS;
+  } else {
+    this->scan_set_param_failed_ = param.status;
+  }
 }
 
 void ESP32BLETracker::gap_scan_start_complete_(const esp_ble_gap_cb_param_t::ble_scan_start_cmpl_evt_param &param) {

From 3e6487609714d207a69d2a984ab40f9b9c0539a5 Mon Sep 17 00:00:00 2001
From: Jonathan Swoboda <154711427+swoboda1337@users.noreply.github.com>
Date: Mon, 22 Apr 2024 18:48:30 -0400
Subject: [PATCH 15/81] Fix or filter (#6574)

Co-authored-by: Jonathan Swoboda <jonathan.swoboda>
---
 esphome/components/sensor/filter.cpp | 6 +++++-
 esphome/components/sensor/filter.h   | 1 +
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/esphome/components/sensor/filter.cpp b/esphome/components/sensor/filter.cpp
index 6d7acad7e0..18cc10ed8b 100644
--- a/esphome/components/sensor/filter.cpp
+++ b/esphome/components/sensor/filter.cpp
@@ -359,11 +359,15 @@ OrFilter::OrFilter(std::vector<Filter *> filters) : filters_(std::move(filters))
 OrFilter::PhiNode::PhiNode(OrFilter *or_parent) : or_parent_(or_parent) {}
 
 optional<float> OrFilter::PhiNode::new_value(float value) {
-  this->or_parent_->output(value);
+  if (!this->or_parent_->has_value_) {
+    this->or_parent_->output(value);
+    this->or_parent_->has_value_ = true;
+  }
 
   return {};
 }
 optional<float> OrFilter::new_value(float value) {
+  this->has_value_ = false;
   for (Filter *filter : this->filters_)
     filter->input(value);
 
diff --git a/esphome/components/sensor/filter.h b/esphome/components/sensor/filter.h
index 1a08699d7b..c13cb3420a 100644
--- a/esphome/components/sensor/filter.h
+++ b/esphome/components/sensor/filter.h
@@ -388,6 +388,7 @@ class OrFilter : public Filter {
   };
 
   std::vector<Filter *> filters_;
+  bool has_value_{false};
   PhiNode phi_;
 };
 

From 7ae36b023cec67a6e183df1ee7d183c12dd1d2a2 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Tue, 23 Apr 2024 10:50:41 +1200
Subject: [PATCH 16/81] Bump version to 2024.4.1

---
 esphome/const.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/esphome/const.py b/esphome/const.py
index 76320e6c71..69949dc086 100644
--- a/esphome/const.py
+++ b/esphome/const.py
@@ -1,6 +1,6 @@
 """Constants used by esphome."""
 
-__version__ = "2024.4.0"
+__version__ = "2024.4.1"
 
 ALLOWED_NAME_CHARS = "abcdefghijklmnopqrstuvwxyz0123456789-_"
 VALID_SUBSTITUTIONS_CHARACTERS = (

From a7fb2ce3e114c96b4148b27516581b3455f09f40 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Tue, 23 Apr 2024 11:01:20 +1200
Subject: [PATCH 17/81] Use clang-format version from requirements_dev file
 (#6606)

---
 .github/workflows/ci.yml | 3 +--
 requirements_dev.txt     | 6 +++---
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index d3ac7981d3..15f0904df4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -20,7 +20,6 @@ permissions:
 env:
   DEFAULT_PYTHON: "3.9"
   PYUPGRADE_TARGET: "--py39-plus"
-  CLANG_FORMAT_VERSION: "13.0.1"
 
 concurrency:
   # yamllint disable-line rule:line-length
@@ -239,7 +238,7 @@ jobs:
       - name: Install clang-format
         run: |
           . venv/bin/activate
-          pip install clang-format==${{ env.CLANG_FORMAT_VERSION }}
+          pip install clang-format -c requirements_dev.txt
       - name: Run clang-format
         run: |
           . venv/bin/activate
diff --git a/requirements_dev.txt b/requirements_dev.txt
index 6bfa015c6f..eb749a861d 100644
--- a/requirements_dev.txt
+++ b/requirements_dev.txt
@@ -1,4 +1,4 @@
 # Useful stuff when working in a development environment
-clang-format==13.0.1
-clang-tidy==14.0.6
-yamllint==1.35.1
+clang-format==13.0.1  # also change in .pre-commit-config.yaml and Dockerfile when updating
+clang-tidy==14.0.6  # When updating clang-tidy, also update Dockerfile
+yamllint==1.35.1  # also change in .pre-commit-config.yaml when updating

From b737fe70a6c3fc811845d0e43097a4d4a5abf88c Mon Sep 17 00:00:00 2001
From: mrtoy-me <118446898+mrtoy-me@users.noreply.github.com>
Date: Tue, 23 Apr 2024 09:16:55 +1000
Subject: [PATCH 18/81] Fix SHT3xd fails sometimes in 2024.4.0 (#6592)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/sht3xd/sht3xd.cpp | 34 +++++++++++++++++++++++-----
 esphome/components/sht3xd/sht3xd.h   |  7 ++++++
 2 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/esphome/components/sht3xd/sht3xd.cpp b/esphome/components/sht3xd/sht3xd.cpp
index 888e954c6b..ffaf5db322 100644
--- a/esphome/components/sht3xd/sht3xd.cpp
+++ b/esphome/components/sht3xd/sht3xd.cpp
@@ -6,9 +6,14 @@ namespace sht3xd {
 
 static const char *const TAG = "sht3xd";
 
-// use read serial number register with clock stretching disabled as per other SHT3XD_COMMAND registers
-// which provides support for SHT85 sensor
-// SHT85 does not support clock stretching and uses same registers as SHT3xd with clock stretching disabled
+// https://sensirion.com/media/documents/E5762713/63D103C2/Sensirion_electronic_identification_code_SHT3x.pdf
+// indicates two possible read serial number registers either with clock stretching enabled or disabled.
+// Other SHT3XD_COMMAND registers use the clock stretching disabled register.
+// To ensure compatibility, reading serial number using the register with clock stretching register enabled
+// (used originally in this component) is tried first and if that fails the alternate register address
+// with clock stretching disabled is read.
+
+static const uint16_t SHT3XD_COMMAND_READ_SERIAL_NUMBER_CLOCK_STRETCHING = 0x3780;
 static const uint16_t SHT3XD_COMMAND_READ_SERIAL_NUMBER = 0x3682;
 
 static const uint16_t SHT3XD_COMMAND_READ_STATUS = 0xF32D;
@@ -22,13 +27,19 @@ static const uint16_t SHT3XD_COMMAND_FETCH_DATA = 0xE000;
 void SHT3XDComponent::setup() {
   ESP_LOGCONFIG(TAG, "Setting up SHT3xD...");
   uint16_t raw_serial_number[2];
-  if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER, raw_serial_number, 2)) {
-    this->mark_failed();
-    return;
+  if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER_CLOCK_STRETCHING, raw_serial_number, 2)) {
+    this->error_code_ = READ_SERIAL_STRETCHED_FAILED;
+    if (!this->get_register(SHT3XD_COMMAND_READ_SERIAL_NUMBER, raw_serial_number, 2)) {
+      this->error_code_ = READ_SERIAL_FAILED;
+      this->mark_failed();
+      return;
+    }
   }
+
   this->serial_number_ = (uint32_t(raw_serial_number[0]) << 16) | uint32_t(raw_serial_number[1]);
 
   if (!this->write_command(heater_enabled_ ? SHT3XD_COMMAND_HEATER_ENABLE : SHT3XD_COMMAND_HEATER_DISABLE)) {
+    this->error_code_ = WRITE_HEATER_MODE_FAILED;
     this->mark_failed();
     return;
   }
@@ -36,10 +47,21 @@ void SHT3XDComponent::setup() {
 
 void SHT3XDComponent::dump_config() {
   ESP_LOGCONFIG(TAG, "SHT3xD:");
+  switch (this->error_code_) {
+    case READ_SERIAL_FAILED:
+      ESP_LOGD(TAG, "  Error reading serial number");
+      break;
+    case WRITE_HEATER_MODE_FAILED:
+      ESP_LOGD(TAG, "  Error writing heater mode");
+      break;
+    default:
+      break;
+  }
   if (this->is_failed()) {
     ESP_LOGE(TAG, "  Communication with SHT3xD failed!");
     return;
   }
+  ESP_LOGD(TAG, "  Setup successful");
   ESP_LOGD(TAG, "  Serial Number: 0x%08" PRIX32, this->serial_number_);
   ESP_LOGD(TAG, "  Heater Enabled: %s", this->heater_enabled_ ? "true" : "false");
 
diff --git a/esphome/components/sht3xd/sht3xd.h b/esphome/components/sht3xd/sht3xd.h
index d1a3360e69..74f155121b 100644
--- a/esphome/components/sht3xd/sht3xd.h
+++ b/esphome/components/sht3xd/sht3xd.h
@@ -22,6 +22,13 @@ class SHT3XDComponent : public PollingComponent, public sensirion_common::Sensir
   void set_heater_enabled(bool heater_enabled) { heater_enabled_ = heater_enabled; }
 
  protected:
+  enum ErrorCode {
+    NONE = 0,
+    READ_SERIAL_STRETCHED_FAILED,
+    READ_SERIAL_FAILED,
+    WRITE_HEATER_MODE_FAILED,
+  } error_code_{NONE};
+
   sensor::Sensor *temperature_sensor_{nullptr};
   sensor::Sensor *humidity_sensor_{nullptr};
   bool heater_enabled_{true};

From 057f473a4a19f05de5780337cfd84de6b2ec9061 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 22:38:51 -0500
Subject: [PATCH 19/81] Add some components to the new testing framework (P)
 (#6213)

---
 .../partition/test.esp32-c3-idf.yaml          |  22 ++
 tests/components/partition/test.esp32-c3.yaml |  22 ++
 .../components/partition/test.esp32-idf.yaml  |  22 ++
 tests/components/partition/test.esp32.yaml    |  22 ++
 .../pca6416a/test.esp32-c3-idf.yaml           |  17 ++
 tests/components/pca6416a/test.esp32-c3.yaml  |  17 ++
 tests/components/pca6416a/test.esp32-idf.yaml |  17 ++
 tests/components/pca6416a/test.esp32.yaml     |  17 ++
 tests/components/pca6416a/test.esp8266.yaml   |  17 ++
 tests/components/pca6416a/test.rp2040.yaml    |  17 ++
 .../components/pca9554/test.esp32-c3-idf.yaml |  26 ++
 tests/components/pca9554/test.esp32-c3.yaml   |  26 ++
 tests/components/pca9554/test.esp32-idf.yaml  |  26 ++
 tests/components/pca9554/test.esp32.yaml      |  26 ++
 tests/components/pca9554/test.esp8266.yaml    |  26 ++
 tests/components/pca9554/test.rp2040.yaml     |  26 ++
 .../components/pca9685/test.esp32-c3-idf.yaml |  34 +++
 tests/components/pca9685/test.esp32-c3.yaml   |  34 +++
 tests/components/pca9685/test.esp32-idf.yaml  |  34 +++
 tests/components/pca9685/test.esp32.yaml      |  34 +++
 tests/components/pca9685/test.esp8266.yaml    |  34 +++
 tests/components/pca9685/test.rp2040.yaml     |  26 ++
 .../components/pcd8544/test.esp32-c3-idf.yaml |  14 +
 tests/components/pcd8544/test.esp32-c3.yaml   |  14 +
 tests/components/pcd8544/test.esp32-idf.yaml  |  14 +
 tests/components/pcd8544/test.esp32.yaml      |  14 +
 tests/components/pcd8544/test.esp8266.yaml    |  14 +
 tests/components/pcd8544/test.rp2040.yaml     |  14 +
 .../pcf85063/test.esp32-c3-idf.yaml           |  12 +
 tests/components/pcf85063/test.esp32-c3.yaml  |  12 +
 tests/components/pcf85063/test.esp32-idf.yaml |  12 +
 tests/components/pcf85063/test.esp32.yaml     |  12 +
 tests/components/pcf85063/test.esp8266.yaml   |  12 +
 tests/components/pcf85063/test.rp2040.yaml    |  12 +
 .../components/pcf8563/test.esp32-c3-idf.yaml |  12 +
 tests/components/pcf8563/test.esp32-c3.yaml   |  12 +
 tests/components/pcf8563/test.esp32-idf.yaml  |  12 +
 tests/components/pcf8563/test.esp32.yaml      |  12 +
 tests/components/pcf8563/test.esp8266.yaml    |  12 +
 tests/components/pcf8563/test.rp2040.yaml     |  12 +
 .../components/pcf8574/test.esp32-c3-idf.yaml |  28 ++
 tests/components/pcf8574/test.esp32-c3.yaml   |  28 ++
 tests/components/pcf8574/test.esp32-idf.yaml  |  28 ++
 tests/components/pcf8574/test.esp32.yaml      |  28 ++
 tests/components/pcf8574/test.esp8266.yaml    |  28 ++
 tests/components/pcf8574/test.rp2040.yaml     |  28 ++
 tests/components/pid/test.esp32-c3-idf.yaml   |  56 ++++
 tests/components/pid/test.esp32-c3.yaml       |  56 ++++
 tests/components/pid/test.esp32-idf.yaml      |  56 ++++
 tests/components/pid/test.esp32.yaml          |  56 ++++
 tests/components/pid/test.esp8266.yaml        |  56 ++++
 tests/components/pid/test.rp2040.yaml         |  56 ++++
 .../pipsolar/test.esp32-c3-idf.yaml           | 247 ++++++++++++++++++
 tests/components/pipsolar/test.esp32-c3.yaml  | 247 ++++++++++++++++++
 tests/components/pipsolar/test.esp32-idf.yaml | 247 ++++++++++++++++++
 tests/components/pipsolar/test.esp32.yaml     | 247 ++++++++++++++++++
 tests/components/pipsolar/test.esp8266.yaml   | 247 ++++++++++++++++++
 tests/components/pipsolar/test.rp2040.yaml    | 247 ++++++++++++++++++
 .../components/pm1006/test.esp32-c3-idf.yaml  |  10 +
 tests/components/pm1006/test.esp32-c3.yaml    |  10 +
 tests/components/pm1006/test.esp32-idf.yaml   |  10 +
 tests/components/pm1006/test.esp32.yaml       |  10 +
 tests/components/pm1006/test.esp8266.yaml     |  10 +
 tests/components/pm1006/test.rp2040.yaml      |  10 +
 .../pmsa003i/test.esp32-c3-idf.yaml           |  27 ++
 tests/components/pmsa003i/test.esp32-c3.yaml  |  27 ++
 tests/components/pmsa003i/test.esp32-idf.yaml |  27 ++
 tests/components/pmsa003i/test.esp32.yaml     |  27 ++
 tests/components/pmsa003i/test.esp8266.yaml   |  27 ++
 tests/components/pmsa003i/test.rp2040.yaml    |  27 ++
 .../components/pmsx003/test.esp32-c3-idf.yaml |  34 +++
 tests/components/pmsx003/test.esp32-c3.yaml   |  34 +++
 tests/components/pmsx003/test.esp32-idf.yaml  |  34 +++
 tests/components/pmsx003/test.esp32.yaml      |  34 +++
 tests/components/pmsx003/test.esp8266.yaml    |  34 +++
 tests/components/pmsx003/test.rp2040.yaml     |  34 +++
 .../components/pmwcs3/test.esp32-c3-idf.yaml  |  15 ++
 tests/components/pmwcs3/test.esp32-c3.yaml    |  15 ++
 tests/components/pmwcs3/test.esp32-idf.yaml   |  15 ++
 tests/components/pmwcs3/test.esp32.yaml       |  15 ++
 tests/components/pmwcs3/test.esp8266.yaml     |  15 ++
 tests/components/pmwcs3/test.rp2040.yaml      |  15 ++
 .../pn532_i2c/test.esp32-c3-idf.yaml          |  13 +
 tests/components/pn532_i2c/test.esp32-c3.yaml |  13 +
 .../components/pn532_i2c/test.esp32-idf.yaml  |  13 +
 tests/components/pn532_i2c/test.esp32.yaml    |  13 +
 tests/components/pn532_i2c/test.esp8266.yaml  |  13 +
 tests/components/pn532_i2c/test.rp2040.yaml   |  13 +
 .../pn532_spi/test.esp32-c3-idf.yaml          |  15 ++
 tests/components/pn532_spi/test.esp32-c3.yaml |  15 ++
 .../components/pn532_spi/test.esp32-idf.yaml  |  15 ++
 tests/components/pn532_spi/test.esp32.yaml    |  15 ++
 tests/components/pn532_spi/test.esp8266.yaml  |  15 ++
 tests/components/pn532_spi/test.rp2040.yaml   |  15 ++
 .../pn7150_i2c/test.esp32-c3-idf.yaml         |  35 +++
 .../components/pn7150_i2c/test.esp32-c3.yaml  |  35 +++
 .../components/pn7150_i2c/test.esp32-idf.yaml |  35 +++
 tests/components/pn7150_i2c/test.esp32.yaml   |  35 +++
 tests/components/pn7150_i2c/test.esp8266.yaml |  35 +++
 tests/components/pn7150_i2c/test.rp2040.yaml  |  35 +++
 .../pn7160_i2c/test.esp32-c3-idf.yaml         |  35 +++
 .../components/pn7160_i2c/test.esp32-c3.yaml  |  35 +++
 .../components/pn7160_i2c/test.esp32-idf.yaml |  35 +++
 tests/components/pn7160_i2c/test.esp32.yaml   |  35 +++
 tests/components/pn7160_i2c/test.esp8266.yaml |  35 +++
 tests/components/pn7160_i2c/test.rp2040.yaml  |  35 +++
 .../pn7160_spi/test.esp32-c3-idf.yaml         |  37 +++
 .../components/pn7160_spi/test.esp32-c3.yaml  |  37 +++
 .../components/pn7160_spi/test.esp32-idf.yaml |  37 +++
 tests/components/pn7160_spi/test.esp32.yaml   |  37 +++
 tests/components/pn7160_spi/test.esp8266.yaml |  37 +++
 tests/components/pn7160_spi/test.rp2040.yaml  |  37 +++
 .../power_supply/test.esp32-c3-idf.yaml       |   6 +
 .../power_supply/test.esp32-c3.yaml           |   6 +
 .../power_supply/test.esp32-idf.yaml          |   6 +
 tests/components/power_supply/test.esp32.yaml |   6 +
 .../components/power_supply/test.esp8266.yaml |   6 +
 .../components/power_supply/test.rp2040.yaml  |   6 +
 .../prometheus/test.esp32-c3-idf.yaml         |  21 ++
 .../components/prometheus/test.esp32-c3.yaml  |  21 ++
 .../components/prometheus/test.esp32-idf.yaml |  21 ++
 tests/components/prometheus/test.esp32.yaml   |  21 ++
 tests/components/prometheus/test.esp8266.yaml |  21 ++
 tests/components/psram/test.esp32-c3-idf.yaml |   3 +
 tests/components/psram/test.esp32-c3.yaml     |   3 +
 tests/components/psram/test.esp32-idf.yaml    |   3 +
 tests/components/psram/test.esp32.yaml        |   3 +
 .../pulse_counter/test.esp32-c3-idf.yaml      |   9 +
 .../pulse_counter/test.esp32-c3.yaml          |   9 +
 .../pulse_counter/test.esp32-idf.yaml         |   9 +
 .../components/pulse_counter/test.esp32.yaml  |   9 +
 .../pulse_counter/test.esp8266.yaml           |   9 +
 .../components/pulse_counter/test.rp2040.yaml |   9 +
 .../pulse_meter/test.esp32-c3-idf.yaml        |  13 +
 .../components/pulse_meter/test.esp32-c3.yaml |  13 +
 .../pulse_meter/test.esp32-idf.yaml           |  13 +
 tests/components/pulse_meter/test.esp32.yaml  |  13 +
 .../components/pulse_meter/test.esp8266.yaml  |  13 +
 tests/components/pulse_meter/test.rp2040.yaml |  13 +
 .../pulse_width/test.esp32-c3-idf.yaml        |   4 +
 .../components/pulse_width/test.esp32-c3.yaml |   4 +
 .../pulse_width/test.esp32-idf.yaml           |   4 +
 tests/components/pulse_width/test.esp32.yaml  |   4 +
 .../components/pulse_width/test.esp8266.yaml  |   4 +
 tests/components/pulse_width/test.rp2040.yaml |   4 +
 .../pvvx_mithermometer/test.esp32-c3-idf.yaml |  44 ++++
 .../pvvx_mithermometer/test.esp32-c3.yaml     |  44 ++++
 .../pvvx_mithermometer/test.esp32-idf.yaml    |  44 ++++
 .../pvvx_mithermometer/test.esp32.yaml        |  44 ++++
 .../pylontech/test.esp32-c3-idf.yaml          |  48 ++++
 tests/components/pylontech/test.esp32-c3.yaml |  48 ++++
 .../components/pylontech/test.esp32-idf.yaml  |  48 ++++
 tests/components/pylontech/test.esp32.yaml    |  48 ++++
 tests/components/pylontech/test.esp8266.yaml  |  48 ++++
 tests/components/pylontech/test.rp2040.yaml   |  48 ++++
 .../pzem004t/test.esp32-c3-idf.yaml           |  14 +
 tests/components/pzem004t/test.esp32-c3.yaml  |  14 +
 tests/components/pzem004t/test.esp32-idf.yaml |  14 +
 tests/components/pzem004t/test.esp32.yaml     |  14 +
 tests/components/pzem004t/test.esp8266.yaml   |  14 +
 tests/components/pzem004t/test.rp2040.yaml    |  14 +
 .../components/pzemac/test.esp32-c3-idf.yaml  |  28 ++
 tests/components/pzemac/test.esp32-c3.yaml    |  28 ++
 tests/components/pzemac/test.esp32-idf.yaml   |  28 ++
 tests/components/pzemac/test.esp32.yaml       |  28 ++
 tests/components/pzemac/test.esp8266.yaml     |  28 ++
 tests/components/pzemac/test.rp2040.yaml      |  28 ++
 .../components/pzemdc/test.esp32-c3-idf.yaml  |  23 ++
 tests/components/pzemdc/test.esp32-c3.yaml    |  23 ++
 tests/components/pzemdc/test.esp32-idf.yaml   |  23 ++
 tests/components/pzemdc/test.esp32.yaml       |  23 ++
 tests/components/pzemdc/test.esp8266.yaml     |  23 ++
 tests/components/pzemdc/test.rp2040.yaml      |  23 ++
 173 files changed, 5245 insertions(+)
 create mode 100644 tests/components/partition/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/partition/test.esp32-c3.yaml
 create mode 100644 tests/components/partition/test.esp32-idf.yaml
 create mode 100644 tests/components/partition/test.esp32.yaml
 create mode 100644 tests/components/pca6416a/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pca6416a/test.esp32-c3.yaml
 create mode 100644 tests/components/pca6416a/test.esp32-idf.yaml
 create mode 100644 tests/components/pca6416a/test.esp32.yaml
 create mode 100644 tests/components/pca6416a/test.esp8266.yaml
 create mode 100644 tests/components/pca6416a/test.rp2040.yaml
 create mode 100644 tests/components/pca9554/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pca9554/test.esp32-c3.yaml
 create mode 100644 tests/components/pca9554/test.esp32-idf.yaml
 create mode 100644 tests/components/pca9554/test.esp32.yaml
 create mode 100644 tests/components/pca9554/test.esp8266.yaml
 create mode 100644 tests/components/pca9554/test.rp2040.yaml
 create mode 100644 tests/components/pca9685/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pca9685/test.esp32-c3.yaml
 create mode 100644 tests/components/pca9685/test.esp32-idf.yaml
 create mode 100644 tests/components/pca9685/test.esp32.yaml
 create mode 100644 tests/components/pca9685/test.esp8266.yaml
 create mode 100644 tests/components/pca9685/test.rp2040.yaml
 create mode 100644 tests/components/pcd8544/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pcd8544/test.esp32-c3.yaml
 create mode 100644 tests/components/pcd8544/test.esp32-idf.yaml
 create mode 100644 tests/components/pcd8544/test.esp32.yaml
 create mode 100644 tests/components/pcd8544/test.esp8266.yaml
 create mode 100644 tests/components/pcd8544/test.rp2040.yaml
 create mode 100644 tests/components/pcf85063/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pcf85063/test.esp32-c3.yaml
 create mode 100644 tests/components/pcf85063/test.esp32-idf.yaml
 create mode 100644 tests/components/pcf85063/test.esp32.yaml
 create mode 100644 tests/components/pcf85063/test.esp8266.yaml
 create mode 100644 tests/components/pcf85063/test.rp2040.yaml
 create mode 100644 tests/components/pcf8563/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pcf8563/test.esp32-c3.yaml
 create mode 100644 tests/components/pcf8563/test.esp32-idf.yaml
 create mode 100644 tests/components/pcf8563/test.esp32.yaml
 create mode 100644 tests/components/pcf8563/test.esp8266.yaml
 create mode 100644 tests/components/pcf8563/test.rp2040.yaml
 create mode 100644 tests/components/pcf8574/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pcf8574/test.esp32-c3.yaml
 create mode 100644 tests/components/pcf8574/test.esp32-idf.yaml
 create mode 100644 tests/components/pcf8574/test.esp32.yaml
 create mode 100644 tests/components/pcf8574/test.esp8266.yaml
 create mode 100644 tests/components/pcf8574/test.rp2040.yaml
 create mode 100644 tests/components/pid/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pid/test.esp32-c3.yaml
 create mode 100644 tests/components/pid/test.esp32-idf.yaml
 create mode 100644 tests/components/pid/test.esp32.yaml
 create mode 100644 tests/components/pid/test.esp8266.yaml
 create mode 100644 tests/components/pid/test.rp2040.yaml
 create mode 100644 tests/components/pipsolar/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pipsolar/test.esp32-c3.yaml
 create mode 100644 tests/components/pipsolar/test.esp32-idf.yaml
 create mode 100644 tests/components/pipsolar/test.esp32.yaml
 create mode 100644 tests/components/pipsolar/test.esp8266.yaml
 create mode 100644 tests/components/pipsolar/test.rp2040.yaml
 create mode 100644 tests/components/pm1006/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pm1006/test.esp32-c3.yaml
 create mode 100644 tests/components/pm1006/test.esp32-idf.yaml
 create mode 100644 tests/components/pm1006/test.esp32.yaml
 create mode 100644 tests/components/pm1006/test.esp8266.yaml
 create mode 100644 tests/components/pm1006/test.rp2040.yaml
 create mode 100644 tests/components/pmsa003i/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pmsa003i/test.esp32-c3.yaml
 create mode 100644 tests/components/pmsa003i/test.esp32-idf.yaml
 create mode 100644 tests/components/pmsa003i/test.esp32.yaml
 create mode 100644 tests/components/pmsa003i/test.esp8266.yaml
 create mode 100644 tests/components/pmsa003i/test.rp2040.yaml
 create mode 100644 tests/components/pmsx003/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pmsx003/test.esp32-c3.yaml
 create mode 100644 tests/components/pmsx003/test.esp32-idf.yaml
 create mode 100644 tests/components/pmsx003/test.esp32.yaml
 create mode 100644 tests/components/pmsx003/test.esp8266.yaml
 create mode 100644 tests/components/pmsx003/test.rp2040.yaml
 create mode 100644 tests/components/pmwcs3/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pmwcs3/test.esp32-c3.yaml
 create mode 100644 tests/components/pmwcs3/test.esp32-idf.yaml
 create mode 100644 tests/components/pmwcs3/test.esp32.yaml
 create mode 100644 tests/components/pmwcs3/test.esp8266.yaml
 create mode 100644 tests/components/pmwcs3/test.rp2040.yaml
 create mode 100644 tests/components/pn532_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pn532_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/pn532_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/pn532_i2c/test.esp32.yaml
 create mode 100644 tests/components/pn532_i2c/test.esp8266.yaml
 create mode 100644 tests/components/pn532_i2c/test.rp2040.yaml
 create mode 100644 tests/components/pn532_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pn532_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/pn532_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/pn532_spi/test.esp32.yaml
 create mode 100644 tests/components/pn532_spi/test.esp8266.yaml
 create mode 100644 tests/components/pn532_spi/test.rp2040.yaml
 create mode 100644 tests/components/pn7150_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pn7150_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/pn7150_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/pn7150_i2c/test.esp32.yaml
 create mode 100644 tests/components/pn7150_i2c/test.esp8266.yaml
 create mode 100644 tests/components/pn7150_i2c/test.rp2040.yaml
 create mode 100644 tests/components/pn7160_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pn7160_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/pn7160_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/pn7160_i2c/test.esp32.yaml
 create mode 100644 tests/components/pn7160_i2c/test.esp8266.yaml
 create mode 100644 tests/components/pn7160_i2c/test.rp2040.yaml
 create mode 100644 tests/components/pn7160_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pn7160_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/pn7160_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/pn7160_spi/test.esp32.yaml
 create mode 100644 tests/components/pn7160_spi/test.esp8266.yaml
 create mode 100644 tests/components/pn7160_spi/test.rp2040.yaml
 create mode 100644 tests/components/power_supply/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/power_supply/test.esp32-c3.yaml
 create mode 100644 tests/components/power_supply/test.esp32-idf.yaml
 create mode 100644 tests/components/power_supply/test.esp32.yaml
 create mode 100644 tests/components/power_supply/test.esp8266.yaml
 create mode 100644 tests/components/power_supply/test.rp2040.yaml
 create mode 100644 tests/components/prometheus/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/prometheus/test.esp32-c3.yaml
 create mode 100644 tests/components/prometheus/test.esp32-idf.yaml
 create mode 100644 tests/components/prometheus/test.esp32.yaml
 create mode 100644 tests/components/prometheus/test.esp8266.yaml
 create mode 100644 tests/components/psram/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/psram/test.esp32-c3.yaml
 create mode 100644 tests/components/psram/test.esp32-idf.yaml
 create mode 100644 tests/components/psram/test.esp32.yaml
 create mode 100644 tests/components/pulse_counter/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pulse_counter/test.esp32-c3.yaml
 create mode 100644 tests/components/pulse_counter/test.esp32-idf.yaml
 create mode 100644 tests/components/pulse_counter/test.esp32.yaml
 create mode 100644 tests/components/pulse_counter/test.esp8266.yaml
 create mode 100644 tests/components/pulse_counter/test.rp2040.yaml
 create mode 100644 tests/components/pulse_meter/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pulse_meter/test.esp32-c3.yaml
 create mode 100644 tests/components/pulse_meter/test.esp32-idf.yaml
 create mode 100644 tests/components/pulse_meter/test.esp32.yaml
 create mode 100644 tests/components/pulse_meter/test.esp8266.yaml
 create mode 100644 tests/components/pulse_meter/test.rp2040.yaml
 create mode 100644 tests/components/pulse_width/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pulse_width/test.esp32-c3.yaml
 create mode 100644 tests/components/pulse_width/test.esp32-idf.yaml
 create mode 100644 tests/components/pulse_width/test.esp32.yaml
 create mode 100644 tests/components/pulse_width/test.esp8266.yaml
 create mode 100644 tests/components/pulse_width/test.rp2040.yaml
 create mode 100644 tests/components/pvvx_mithermometer/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pvvx_mithermometer/test.esp32-c3.yaml
 create mode 100644 tests/components/pvvx_mithermometer/test.esp32-idf.yaml
 create mode 100644 tests/components/pvvx_mithermometer/test.esp32.yaml
 create mode 100644 tests/components/pylontech/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pylontech/test.esp32-c3.yaml
 create mode 100644 tests/components/pylontech/test.esp32-idf.yaml
 create mode 100644 tests/components/pylontech/test.esp32.yaml
 create mode 100644 tests/components/pylontech/test.esp8266.yaml
 create mode 100644 tests/components/pylontech/test.rp2040.yaml
 create mode 100644 tests/components/pzem004t/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pzem004t/test.esp32-c3.yaml
 create mode 100644 tests/components/pzem004t/test.esp32-idf.yaml
 create mode 100644 tests/components/pzem004t/test.esp32.yaml
 create mode 100644 tests/components/pzem004t/test.esp8266.yaml
 create mode 100644 tests/components/pzem004t/test.rp2040.yaml
 create mode 100644 tests/components/pzemac/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pzemac/test.esp32-c3.yaml
 create mode 100644 tests/components/pzemac/test.esp32-idf.yaml
 create mode 100644 tests/components/pzemac/test.esp32.yaml
 create mode 100644 tests/components/pzemac/test.esp8266.yaml
 create mode 100644 tests/components/pzemac/test.rp2040.yaml
 create mode 100644 tests/components/pzemdc/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/pzemdc/test.esp32-c3.yaml
 create mode 100644 tests/components/pzemdc/test.esp32-idf.yaml
 create mode 100644 tests/components/pzemdc/test.esp32.yaml
 create mode 100644 tests/components/pzemdc/test.esp8266.yaml
 create mode 100644 tests/components/pzemdc/test.rp2040.yaml

diff --git a/tests/components/partition/test.esp32-c3-idf.yaml b/tests/components/partition/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..77cfc5ad44
--- /dev/null
+++ b/tests/components/partition/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+light:
+  - platform: esp32_rmt_led_strip
+    id: part_leds
+    default_transition_length: 500ms
+    chipset: ws2812
+    rgb_order: GRB
+    num_leds: 256
+    pin: 2
+    rmt_channel: 0
+  - platform: partition
+    name: Partition Light
+    segments:
+      - id: part_leds
+        from: 0
+        to: 0
+      - id: part_leds
+        from: 1
+        to: 10
+      - id: part_leds
+        from: 20
+        to: 25
+      - single_light_id: part_leds
diff --git a/tests/components/partition/test.esp32-c3.yaml b/tests/components/partition/test.esp32-c3.yaml
new file mode 100644
index 0000000000..77cfc5ad44
--- /dev/null
+++ b/tests/components/partition/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+light:
+  - platform: esp32_rmt_led_strip
+    id: part_leds
+    default_transition_length: 500ms
+    chipset: ws2812
+    rgb_order: GRB
+    num_leds: 256
+    pin: 2
+    rmt_channel: 0
+  - platform: partition
+    name: Partition Light
+    segments:
+      - id: part_leds
+        from: 0
+        to: 0
+      - id: part_leds
+        from: 1
+        to: 10
+      - id: part_leds
+        from: 20
+        to: 25
+      - single_light_id: part_leds
diff --git a/tests/components/partition/test.esp32-idf.yaml b/tests/components/partition/test.esp32-idf.yaml
new file mode 100644
index 0000000000..77cfc5ad44
--- /dev/null
+++ b/tests/components/partition/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+light:
+  - platform: esp32_rmt_led_strip
+    id: part_leds
+    default_transition_length: 500ms
+    chipset: ws2812
+    rgb_order: GRB
+    num_leds: 256
+    pin: 2
+    rmt_channel: 0
+  - platform: partition
+    name: Partition Light
+    segments:
+      - id: part_leds
+        from: 0
+        to: 0
+      - id: part_leds
+        from: 1
+        to: 10
+      - id: part_leds
+        from: 20
+        to: 25
+      - single_light_id: part_leds
diff --git a/tests/components/partition/test.esp32.yaml b/tests/components/partition/test.esp32.yaml
new file mode 100644
index 0000000000..c8eae67d40
--- /dev/null
+++ b/tests/components/partition/test.esp32.yaml
@@ -0,0 +1,22 @@
+light:
+  - platform: fastled_clockless
+    id: part_leds
+    chipset: WS2812B
+    pin: 2
+    num_leds: 256
+    rgb_order: GRB
+    default_transition_length: 0s
+    color_correct: [50%, 50%, 50%]
+  - platform: partition
+    name: Partition Light
+    segments:
+      - id: part_leds
+        from: 0
+        to: 0
+      - id: part_leds
+        from: 1
+        to: 10
+      - id: part_leds
+        from: 20
+        to: 25
+      - single_light_id: part_leds
diff --git a/tests/components/pca6416a/test.esp32-c3-idf.yaml b/tests/components/pca6416a/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fe940c44cc
--- /dev/null
+++ b/tests/components/pca6416a/test.esp32-c3-idf.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 5
+    sda: 4
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca6416a/test.esp32-c3.yaml b/tests/components/pca6416a/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fe940c44cc
--- /dev/null
+++ b/tests/components/pca6416a/test.esp32-c3.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 5
+    sda: 4
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca6416a/test.esp32-idf.yaml b/tests/components/pca6416a/test.esp32-idf.yaml
new file mode 100644
index 0000000000..669e9416e4
--- /dev/null
+++ b/tests/components/pca6416a/test.esp32-idf.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 16
+    sda: 17
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca6416a/test.esp32.yaml b/tests/components/pca6416a/test.esp32.yaml
new file mode 100644
index 0000000000..669e9416e4
--- /dev/null
+++ b/tests/components/pca6416a/test.esp32.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 16
+    sda: 17
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca6416a/test.esp8266.yaml b/tests/components/pca6416a/test.esp8266.yaml
new file mode 100644
index 0000000000..fe940c44cc
--- /dev/null
+++ b/tests/components/pca6416a/test.esp8266.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 5
+    sda: 4
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca6416a/test.rp2040.yaml b/tests/components/pca6416a/test.rp2040.yaml
new file mode 100644
index 0000000000..fe940c44cc
--- /dev/null
+++ b/tests/components/pca6416a/test.rp2040.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_pca6416a
+    scl: 5
+    sda: 4
+
+pca6416a:
+  - id: pca6416a_hub
+    address: 0x21
+
+binary_sensor:
+  - platform: gpio
+    name: PCA6416A Binary Sensor
+    pin:
+      pca6416a: pca6416a_hub
+      number: 15
+      mode: INPUT
+      inverted: true
diff --git a/tests/components/pca9554/test.esp32-c3-idf.yaml b/tests/components/pca9554/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0ff453e64f
--- /dev/null
+++ b/tests/components/pca9554/test.esp32-c3-idf.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 5
+    sda: 4
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9554/test.esp32-c3.yaml b/tests/components/pca9554/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0ff453e64f
--- /dev/null
+++ b/tests/components/pca9554/test.esp32-c3.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 5
+    sda: 4
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9554/test.esp32-idf.yaml b/tests/components/pca9554/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8fe9686303
--- /dev/null
+++ b/tests/components/pca9554/test.esp32-idf.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 16
+    sda: 17
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9554/test.esp32.yaml b/tests/components/pca9554/test.esp32.yaml
new file mode 100644
index 0000000000..8fe9686303
--- /dev/null
+++ b/tests/components/pca9554/test.esp32.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 16
+    sda: 17
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9554/test.esp8266.yaml b/tests/components/pca9554/test.esp8266.yaml
new file mode 100644
index 0000000000..0ff453e64f
--- /dev/null
+++ b/tests/components/pca9554/test.esp8266.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 5
+    sda: 4
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9554/test.rp2040.yaml b/tests/components/pca9554/test.rp2040.yaml
new file mode 100644
index 0000000000..0ff453e64f
--- /dev/null
+++ b/tests/components/pca9554/test.rp2040.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 5
+    sda: 4
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pca9685/test.esp32-c3-idf.yaml b/tests/components/pca9685/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e532f323be
--- /dev/null
+++ b/tests/components/pca9685/test.esp32-c3-idf.yaml
@@ -0,0 +1,34 @@
+i2c:
+  - id: i2c_pca9685
+    scl: 5
+    sda: 4
+
+pca9685:
+  frequency: 500
+  address: 0x0
+
+output:
+  - platform: pca9685
+    id: pca_0
+    channel: 0
+  - platform: pca9685
+    id: pca_1
+    channel: 1
+  - platform: pca9685
+    id: pca_2
+    channel: 2
+  - platform: pca9685
+    id: pca_3
+    channel: 3
+  - platform: pca9685
+    id: pca_4
+    channel: 4
+  - platform: pca9685
+    id: pca_5
+    channel: 5
+  - platform: pca9685
+    id: pca_6
+    channel: 6
+  - platform: pca9685
+    id: pca_7
+    channel: 7
diff --git a/tests/components/pca9685/test.esp32-c3.yaml b/tests/components/pca9685/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e532f323be
--- /dev/null
+++ b/tests/components/pca9685/test.esp32-c3.yaml
@@ -0,0 +1,34 @@
+i2c:
+  - id: i2c_pca9685
+    scl: 5
+    sda: 4
+
+pca9685:
+  frequency: 500
+  address: 0x0
+
+output:
+  - platform: pca9685
+    id: pca_0
+    channel: 0
+  - platform: pca9685
+    id: pca_1
+    channel: 1
+  - platform: pca9685
+    id: pca_2
+    channel: 2
+  - platform: pca9685
+    id: pca_3
+    channel: 3
+  - platform: pca9685
+    id: pca_4
+    channel: 4
+  - platform: pca9685
+    id: pca_5
+    channel: 5
+  - platform: pca9685
+    id: pca_6
+    channel: 6
+  - platform: pca9685
+    id: pca_7
+    channel: 7
diff --git a/tests/components/pca9685/test.esp32-idf.yaml b/tests/components/pca9685/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d02a16bcd1
--- /dev/null
+++ b/tests/components/pca9685/test.esp32-idf.yaml
@@ -0,0 +1,34 @@
+i2c:
+  - id: i2c_pca9685
+    scl: 16
+    sda: 17
+
+pca9685:
+  frequency: 500
+  address: 0x0
+
+output:
+  - platform: pca9685
+    id: pca_0
+    channel: 0
+  - platform: pca9685
+    id: pca_1
+    channel: 1
+  - platform: pca9685
+    id: pca_2
+    channel: 2
+  - platform: pca9685
+    id: pca_3
+    channel: 3
+  - platform: pca9685
+    id: pca_4
+    channel: 4
+  - platform: pca9685
+    id: pca_5
+    channel: 5
+  - platform: pca9685
+    id: pca_6
+    channel: 6
+  - platform: pca9685
+    id: pca_7
+    channel: 7
diff --git a/tests/components/pca9685/test.esp32.yaml b/tests/components/pca9685/test.esp32.yaml
new file mode 100644
index 0000000000..d02a16bcd1
--- /dev/null
+++ b/tests/components/pca9685/test.esp32.yaml
@@ -0,0 +1,34 @@
+i2c:
+  - id: i2c_pca9685
+    scl: 16
+    sda: 17
+
+pca9685:
+  frequency: 500
+  address: 0x0
+
+output:
+  - platform: pca9685
+    id: pca_0
+    channel: 0
+  - platform: pca9685
+    id: pca_1
+    channel: 1
+  - platform: pca9685
+    id: pca_2
+    channel: 2
+  - platform: pca9685
+    id: pca_3
+    channel: 3
+  - platform: pca9685
+    id: pca_4
+    channel: 4
+  - platform: pca9685
+    id: pca_5
+    channel: 5
+  - platform: pca9685
+    id: pca_6
+    channel: 6
+  - platform: pca9685
+    id: pca_7
+    channel: 7
diff --git a/tests/components/pca9685/test.esp8266.yaml b/tests/components/pca9685/test.esp8266.yaml
new file mode 100644
index 0000000000..e532f323be
--- /dev/null
+++ b/tests/components/pca9685/test.esp8266.yaml
@@ -0,0 +1,34 @@
+i2c:
+  - id: i2c_pca9685
+    scl: 5
+    sda: 4
+
+pca9685:
+  frequency: 500
+  address: 0x0
+
+output:
+  - platform: pca9685
+    id: pca_0
+    channel: 0
+  - platform: pca9685
+    id: pca_1
+    channel: 1
+  - platform: pca9685
+    id: pca_2
+    channel: 2
+  - platform: pca9685
+    id: pca_3
+    channel: 3
+  - platform: pca9685
+    id: pca_4
+    channel: 4
+  - platform: pca9685
+    id: pca_5
+    channel: 5
+  - platform: pca9685
+    id: pca_6
+    channel: 6
+  - platform: pca9685
+    id: pca_7
+    channel: 7
diff --git a/tests/components/pca9685/test.rp2040.yaml b/tests/components/pca9685/test.rp2040.yaml
new file mode 100644
index 0000000000..0ff453e64f
--- /dev/null
+++ b/tests/components/pca9685/test.rp2040.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_pca9554
+    scl: 5
+    sda: 4
+
+pca9554:
+  - id: pca9554_hub
+    pin_count: 8
+    address: 0x3F
+
+binary_sensor:
+  - platform: gpio
+    id: pca9554_input
+    name: PCA9554 Binary Sensor
+    pin:
+      pca9554: pca9554_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+  - platform: gpio
+    id: pca9554_output
+    pin:
+      pca9554: pca9554_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcd8544/test.esp32-c3-idf.yaml b/tests/components/pcd8544/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..57771d2d73
--- /dev/null
+++ b/tests/components/pcd8544/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: pcd8544
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 1
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcd8544/test.esp32-c3.yaml b/tests/components/pcd8544/test.esp32-c3.yaml
new file mode 100644
index 0000000000..57771d2d73
--- /dev/null
+++ b/tests/components/pcd8544/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: pcd8544
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 1
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcd8544/test.esp32-idf.yaml b/tests/components/pcd8544/test.esp32-idf.yaml
new file mode 100644
index 0000000000..20c05c407f
--- /dev/null
+++ b/tests/components/pcd8544/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: pcd8544
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcd8544/test.esp32.yaml b/tests/components/pcd8544/test.esp32.yaml
new file mode 100644
index 0000000000..20c05c407f
--- /dev/null
+++ b/tests/components/pcd8544/test.esp32.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: pcd8544
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcd8544/test.esp8266.yaml b/tests/components/pcd8544/test.esp8266.yaml
new file mode 100644
index 0000000000..6e6022c6d2
--- /dev/null
+++ b/tests/components/pcd8544/test.esp8266.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: pcd8544
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcd8544/test.rp2040.yaml b/tests/components/pcd8544/test.rp2040.yaml
new file mode 100644
index 0000000000..7181f99fb1
--- /dev/null
+++ b/tests/components/pcd8544/test.rp2040.yaml
@@ -0,0 +1,14 @@
+spi:
+  - id: spi_pcd8544
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: pcd8544
+    cs_pin: 6
+    dc_pin: 5
+    reset_pin: 7
+    contrast: 60
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
diff --git a/tests/components/pcf85063/test.esp32-c3-idf.yaml b/tests/components/pcf85063/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9e1a3da81e
--- /dev/null
+++ b/tests/components/pcf85063/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf85063/test.esp32-c3.yaml b/tests/components/pcf85063/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9e1a3da81e
--- /dev/null
+++ b/tests/components/pcf85063/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf85063/test.esp32-idf.yaml b/tests/components/pcf85063/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9cce415103
--- /dev/null
+++ b/tests/components/pcf85063/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 16
+    sda: 17
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf85063/test.esp32.yaml b/tests/components/pcf85063/test.esp32.yaml
new file mode 100644
index 0000000000..9cce415103
--- /dev/null
+++ b/tests/components/pcf85063/test.esp32.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 16
+    sda: 17
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf85063/test.esp8266.yaml b/tests/components/pcf85063/test.esp8266.yaml
new file mode 100644
index 0000000000..9e1a3da81e
--- /dev/null
+++ b/tests/components/pcf85063/test.esp8266.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf85063/test.rp2040.yaml b/tests/components/pcf85063/test.rp2040.yaml
new file mode 100644
index 0000000000..9e1a3da81e
--- /dev/null
+++ b/tests/components/pcf85063/test.rp2040.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf85063.read_time
+    - pcf85063.write_time
+
+i2c:
+  - id: i2c_pcf85063
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf85063
diff --git a/tests/components/pcf8563/test.esp32-c3-idf.yaml b/tests/components/pcf8563/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f91a465e0f
--- /dev/null
+++ b/tests/components/pcf8563/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8563/test.esp32-c3.yaml b/tests/components/pcf8563/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f91a465e0f
--- /dev/null
+++ b/tests/components/pcf8563/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8563/test.esp32-idf.yaml b/tests/components/pcf8563/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e95b487b19
--- /dev/null
+++ b/tests/components/pcf8563/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 16
+    sda: 17
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8563/test.esp32.yaml b/tests/components/pcf8563/test.esp32.yaml
new file mode 100644
index 0000000000..e95b487b19
--- /dev/null
+++ b/tests/components/pcf8563/test.esp32.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 16
+    sda: 17
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8563/test.esp8266.yaml b/tests/components/pcf8563/test.esp8266.yaml
new file mode 100644
index 0000000000..f91a465e0f
--- /dev/null
+++ b/tests/components/pcf8563/test.esp8266.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8563/test.rp2040.yaml b/tests/components/pcf8563/test.rp2040.yaml
new file mode 100644
index 0000000000..f91a465e0f
--- /dev/null
+++ b/tests/components/pcf8563/test.rp2040.yaml
@@ -0,0 +1,12 @@
+esphome:
+  on_boot:
+    - pcf8563.read_time
+    - pcf8563.write_time
+
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+time:
+  - platform: pcf8563
diff --git a/tests/components/pcf8574/test.esp32-c3-idf.yaml b/tests/components/pcf8574/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..551e425892
--- /dev/null
+++ b/tests/components/pcf8574/test.esp32-c3-idf.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcf8574/test.esp32-c3.yaml b/tests/components/pcf8574/test.esp32-c3.yaml
new file mode 100644
index 0000000000..551e425892
--- /dev/null
+++ b/tests/components/pcf8574/test.esp32-c3.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcf8574/test.esp32-idf.yaml b/tests/components/pcf8574/test.esp32-idf.yaml
new file mode 100644
index 0000000000..aeed55f4fe
--- /dev/null
+++ b/tests/components/pcf8574/test.esp32-idf.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 16
+    sda: 17
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcf8574/test.esp32.yaml b/tests/components/pcf8574/test.esp32.yaml
new file mode 100644
index 0000000000..aeed55f4fe
--- /dev/null
+++ b/tests/components/pcf8574/test.esp32.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 16
+    sda: 17
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcf8574/test.esp8266.yaml b/tests/components/pcf8574/test.esp8266.yaml
new file mode 100644
index 0000000000..551e425892
--- /dev/null
+++ b/tests/components/pcf8574/test.esp8266.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pcf8574/test.rp2040.yaml b/tests/components/pcf8574/test.rp2040.yaml
new file mode 100644
index 0000000000..551e425892
--- /dev/null
+++ b/tests/components/pcf8574/test.rp2040.yaml
@@ -0,0 +1,28 @@
+i2c:
+  - id: i2c_pcf8563
+    scl: 5
+    sda: 4
+
+pcf8574:
+  - id: pcf8574_hub
+    address: 0x21
+    pcf8575: false
+
+binary_sensor:
+  - platform: gpio
+    id: pcf8574_binary_sensor
+    name: PCF Binary Sensor
+    pin:
+      pcf8574: pcf8574_hub
+      number: 1
+      mode: INPUT
+      inverted: true
+
+output:
+  - platform: gpio
+    id: pcf8574_output
+    pin:
+      pcf8574: pcf8574_hub
+      number: 0
+      mode: OUTPUT
+      inverted: false
diff --git a/tests/components/pid/test.esp32-c3-idf.yaml b/tests/components/pid/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.esp32-c3-idf.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pid/test.esp32-c3.yaml b/tests/components/pid/test.esp32-c3.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.esp32-c3.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pid/test.esp32-idf.yaml b/tests/components/pid/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.esp32-idf.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pid/test.esp32.yaml b/tests/components/pid/test.esp32.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.esp32.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pid/test.esp8266.yaml b/tests/components/pid/test.esp8266.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.esp8266.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pid/test.rp2040.yaml b/tests/components/pid/test.rp2040.yaml
new file mode 100644
index 0000000000..5f7762872f
--- /dev/null
+++ b/tests/components/pid/test.rp2040.yaml
@@ -0,0 +1,56 @@
+esphome:
+  on_boot:
+    then:
+      - climate.pid.autotune: pid_climate
+      - climate.pid.autotune:
+          id: pid_climate
+          noiseband: 0.25
+          positive_output: 25%
+          negative_output: -25%
+      - climate.pid.set_control_parameters:
+          id: pid_climate
+          kp: 0.0
+          ki: 0.0
+          kd: 0.0
+      - climate.pid.reset_integral_term: pid_climate
+
+output:
+  - platform: slow_pwm
+    pin: 4
+    id: pid_slow_pwm
+    period: 15s
+    restart_cycle_on_state_change: false
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+climate:
+  - platform: pid
+    id: pid_climate
+    name: PID Climate Controller
+    sensor: template_sensor1
+    humidity_sensor: template_sensor1
+    default_target_temperature: 21°C
+    heat_output: pid_slow_pwm
+    control_parameters:
+      kp: 0.0
+      ki: 0.0
+      kd: 0.0
+      max_integral: 0.0
+      output_averaging_samples: 1
+      derivative_averaging_samples: 1
+    deadband_parameters:
+      threshold_high: 0.4
+      threshold_low: -2.0
+      kp_multiplier: 0.0
+      ki_multiplier: 0.0
+      kd_multiplier: 0.0
+      deadband_output_averaging_samples: 1
diff --git a/tests/components/pipsolar/test.esp32-c3-idf.yaml b/tests/components/pipsolar/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..12e9266343
--- /dev/null
+++ b/tests/components/pipsolar/test.esp32-c3-idf.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pipsolar/test.esp32-c3.yaml b/tests/components/pipsolar/test.esp32-c3.yaml
new file mode 100644
index 0000000000..12e9266343
--- /dev/null
+++ b/tests/components/pipsolar/test.esp32-c3.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pipsolar/test.esp32-idf.yaml b/tests/components/pipsolar/test.esp32-idf.yaml
new file mode 100644
index 0000000000..fcd4575739
--- /dev/null
+++ b/tests/components/pipsolar/test.esp32-idf.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pipsolar/test.esp32.yaml b/tests/components/pipsolar/test.esp32.yaml
new file mode 100644
index 0000000000..fcd4575739
--- /dev/null
+++ b/tests/components/pipsolar/test.esp32.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pipsolar/test.esp8266.yaml b/tests/components/pipsolar/test.esp8266.yaml
new file mode 100644
index 0000000000..12e9266343
--- /dev/null
+++ b/tests/components/pipsolar/test.esp8266.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pipsolar/test.rp2040.yaml b/tests/components/pipsolar/test.rp2040.yaml
new file mode 100644
index 0000000000..12e9266343
--- /dev/null
+++ b/tests/components/pipsolar/test.rp2040.yaml
@@ -0,0 +1,247 @@
+esphome:
+  on_boot:
+    then:
+      - output.pipsolar.set_level:
+          id: inverter0_battery_recharge_voltage_out
+          value: 48.0
+
+uart:
+  - id: uart_pipsolar
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pipsolar:
+  id: inverter0
+
+binary_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    add_sbu_priority_version:
+      id: inverter0_add_sbu_priority_version
+      name: inverter0_add_sbu_priority_version
+    configuration_status:
+      id: inverter0_configuration_status
+      name: inverter0_configuration_status
+    scc_firmware_version:
+      id: inverter0_scc_firmware_version
+      name: inverter0_scc_firmware_version
+    load_status:
+      id: inverter0_load_status
+      name: inverter0_load_status
+    battery_voltage_to_steady_while_charging:
+      id: inverter0_battery_voltage_to_steady_while_charging
+      name: inverter0_battery_voltage_to_steady_while_charging
+    charging_status:
+      id: inverter0_charging_status
+      name: inverter0_charging_status
+    scc_charging_status:
+      id: inverter0_scc_charging_status
+      name: inverter0_scc_charging_status
+    ac_charging_status:
+      id: inverter0_ac_charging_status
+      name: inverter0_ac_charging_status
+    charging_to_floating_mode:
+      id: inverter0_charging_to_floating_mode
+      name: inverter0_charging_to_floating_mode
+    switch_on:
+      id: inverter0_switch_on
+      name: inverter0_switch_on
+    dustproof_installed:
+      id: inverter0_dustproof_installed
+      name: inverter0_dustproof_installed
+    silence_buzzer_open_buzzer:
+      id: inverter0_silence_buzzer_open_buzzer
+      name: inverter0_silence_buzzer_open_buzzer
+    overload_bypass_function:
+      id: inverter0_overload_bypass_function
+      name: inverter0_overload_bypass_function
+    lcd_escape_to_default:
+      id: inverter0_lcd_escape_to_default
+      name: inverter0_lcd_escape_to_default
+    overload_restart_function:
+      id: inverter0_overload_restart_function
+      name: inverter0_overload_restart_function
+    over_temperature_restart_function:
+      id: inverter0_over_temperature_restart_function
+      name: inverter0_over_temperature_restart_function
+    backlight_on:
+      id: inverter0_backlight_on
+      name: inverter0_backlight_on
+
+output:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage_out
+
+sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    grid_rating_voltage:
+      id: inverter0_grid_rating_voltage
+      name: inverter0_grid_rating_voltage
+    grid_rating_current:
+      id: inverter0_grid_rating_current
+      name: inverter0_grid_rating_current
+    ac_output_rating_voltage:
+      id: inverter0_ac_output_rating_voltage
+      name: inverter0_ac_output_rating_voltage
+    ac_output_rating_frequency:
+      id: inverter0_ac_output_rating_frequency
+      name: inverter0_ac_output_rating_frequency
+    ac_output_rating_current:
+      id: inverter0_ac_output_rating_current
+      name: inverter0_ac_output_rating_current
+    ac_output_rating_apparent_power:
+      id: inverter0_ac_output_rating_apparent_power
+      name: inverter0_ac_output_rating_apparent_power
+    ac_output_rating_active_power:
+      id: inverter0_ac_output_rating_active_power
+      name: inverter0_ac_output_rating_active_power
+    battery_rating_voltage:
+      id: inverter0_battery_rating_voltage
+      name: inverter0_battery_rating_voltage
+    battery_recharge_voltage:
+      id: inverter0_battery_recharge_voltage
+      name: inverter0_battery_recharge_voltage
+    battery_under_voltage:
+      id: inverter0_battery_under_voltage
+      name: inverter0_battery_under_voltage
+    battery_bulk_voltage:
+      id: inverter0_battery_bulk_voltage
+      name: inverter0_battery_bulk_voltage
+    battery_float_voltage:
+      id: inverter0_battery_float_voltage
+      name: inverter0_battery_float_voltage
+    battery_type:
+      id: inverter0_battery_type
+      name: inverter0_battery_type
+    current_max_ac_charging_current:
+      id: inverter0_current_max_ac_charging_current
+      name: inverter0_current_max_ac_charging_current
+    current_max_charging_current:
+      id: inverter0_current_max_charging_current
+      name: inverter0_current_max_charging_current
+    input_voltage_range:
+      id: inverter0_input_voltage_range
+      name: inverter0_input_voltage_range
+    output_source_priority:
+      id: inverter0_output_source_priority
+      name: inverter0_output_source_priority
+    charger_source_priority:
+      id: inverter0_charger_source_priority
+      name: inverter0_charger_source_priority
+    parallel_max_num:
+      id: inverter0_parallel_max_num
+      name: inverter0_parallel_max_num
+    machine_type:
+      id: inverter0_machine_type
+      name: inverter0_machine_type
+    topology:
+      id: inverter0_topology
+      name: inverter0_topology
+    output_mode:
+      id: inverter0_output_mode
+      name: inverter0_output_mode
+    battery_redischarge_voltage:
+      id: inverter0_battery_redischarge_voltage
+      name: inverter0_battery_redischarge_voltage
+    pv_ok_condition_for_parallel:
+      id: inverter0_pv_ok_condition_for_parallel
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      id: inverter0_pv_power_balance
+      name: inverter0_pv_power_balance
+    grid_voltage:
+      id: inverter0_grid_voltage
+      name: inverter0_grid_voltage
+    grid_frequency:
+      id: inverter0_grid_frequency
+      name: inverter0_grid_frequency
+    ac_output_voltage:
+      id: inverter0_ac_output_voltage
+      name: inverter0_ac_output_voltage
+    ac_output_frequency:
+      id: inverter0_ac_output_frequency
+      name: inverter0_ac_output_frequency
+    ac_output_apparent_power:
+      id: inverter0_ac_output_apparent_power
+      name: inverter0_ac_output_apparent_power
+    ac_output_active_power:
+      id: inverter0_ac_output_active_power
+      name: inverter0_ac_output_active_power
+    output_load_percent:
+      id: inverter0_output_load_percent
+      name: inverter0_output_load_percent
+    bus_voltage:
+      id: inverter0_bus_voltage
+      name: inverter0_bus_voltage
+    battery_voltage:
+      id: inverter0_battery_voltage
+      name: inverter0_battery_voltage
+    battery_charging_current:
+      id: inverter0_battery_charging_current
+      name: inverter0_battery_charging_current
+    battery_capacity_percent:
+      id: inverter0_battery_capacity_percent
+      name: inverter0_battery_capacity_percent
+    inverter_heat_sink_temperature:
+      id: inverter0_inverter_heat_sink_temperature
+      name: inverter0_inverter_heat_sink_temperature
+    pv_input_current_for_battery:
+      id: inverter0_pv_input_current_for_battery
+      name: inverter0_pv_input_current_for_battery
+    pv_input_voltage:
+      id: inverter0_pv_input_voltage
+      name: inverter0_pv_input_voltage
+    battery_voltage_scc:
+      id: inverter0_battery_voltage_scc
+      name: inverter0_battery_voltage_scc
+    battery_discharge_current:
+      id: inverter0_battery_discharge_current
+      name: inverter0_battery_discharge_current
+    battery_voltage_offset_for_fans_on:
+      id: inverter0_battery_voltage_offset_for_fans_on
+      name: inverter0_battery_voltage_offset_for_fans_on
+    eeprom_version:
+      id: inverter0_eeprom_version
+      name: inverter0_eeprom_version
+    pv_charging_power:
+      id: inverter0_pv_charging_power
+      name: inverter0_pv_charging_power
+
+switch:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    output_source_priority_utility:
+      name: inverter0_output_source_priority_utility
+    output_source_priority_solar:
+      name: inverter0_output_source_priority_solar
+    output_source_priority_battery:
+      name: inverter0_output_source_priority_battery
+    input_voltage_range:
+      name: inverter0_input_voltage_range
+    pv_ok_condition_for_parallel:
+      name: inverter0_pv_ok_condition_for_parallel
+    pv_power_balance:
+      name: inverter0_pv_power_balance
+
+text_sensor:
+  - platform: pipsolar
+    pipsolar_id: inverter0
+    device_mode:
+      id: inverter0_device_mode
+      name: inverter0_device_mode
+    last_qpigs:
+      id: inverter0_last_qpigs
+      name: inverter0_last_qpigs
+    last_qpiri:
+      id: inverter0_last_qpiri
+      name: inverter0_last_qpiri
+    last_qmod:
+      id: inverter0_last_qmod
+      name: inverter0_last_qmod
+    last_qflag:
+      id: inverter0_last_qflag
+      name: inverter0_last_qflag
diff --git a/tests/components/pm1006/test.esp32-c3-idf.yaml b/tests/components/pm1006/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..15ee077f3e
--- /dev/null
+++ b/tests/components/pm1006/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pm1006/test.esp32-c3.yaml b/tests/components/pm1006/test.esp32-c3.yaml
new file mode 100644
index 0000000000..15ee077f3e
--- /dev/null
+++ b/tests/components/pm1006/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pm1006/test.esp32-idf.yaml b/tests/components/pm1006/test.esp32-idf.yaml
new file mode 100644
index 0000000000..635af37b25
--- /dev/null
+++ b/tests/components/pm1006/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pm1006/test.esp32.yaml b/tests/components/pm1006/test.esp32.yaml
new file mode 100644
index 0000000000..635af37b25
--- /dev/null
+++ b/tests/components/pm1006/test.esp32.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pm1006/test.esp8266.yaml b/tests/components/pm1006/test.esp8266.yaml
new file mode 100644
index 0000000000..15ee077f3e
--- /dev/null
+++ b/tests/components/pm1006/test.esp8266.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pm1006/test.rp2040.yaml b/tests/components/pm1006/test.rp2040.yaml
new file mode 100644
index 0000000000..15ee077f3e
--- /dev/null
+++ b/tests/components/pm1006/test.rp2040.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_pm1006
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pm1006
+    pm_2_5:
+      name: Particulate Matter 2.5µm Concentration
diff --git a/tests/components/pmsa003i/test.esp32-c3-idf.yaml b/tests/components/pmsa003i/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..70e28303a2
--- /dev/null
+++ b/tests/components/pmsa003i/test.esp32-c3-idf.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsa003i/test.esp32-c3.yaml b/tests/components/pmsa003i/test.esp32-c3.yaml
new file mode 100644
index 0000000000..70e28303a2
--- /dev/null
+++ b/tests/components/pmsa003i/test.esp32-c3.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsa003i/test.esp32-idf.yaml b/tests/components/pmsa003i/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d8d96400f6
--- /dev/null
+++ b/tests/components/pmsa003i/test.esp32-idf.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsa003i/test.esp32.yaml b/tests/components/pmsa003i/test.esp32.yaml
new file mode 100644
index 0000000000..d8d96400f6
--- /dev/null
+++ b/tests/components/pmsa003i/test.esp32.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsa003i/test.esp8266.yaml b/tests/components/pmsa003i/test.esp8266.yaml
new file mode 100644
index 0000000000..70e28303a2
--- /dev/null
+++ b/tests/components/pmsa003i/test.esp8266.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsa003i/test.rp2040.yaml b/tests/components/pmsa003i/test.rp2040.yaml
new file mode 100644
index 0000000000..70e28303a2
--- /dev/null
+++ b/tests/components/pmsa003i/test.rp2040.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_pmsa003i
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmsa003i
+    pm_1_0:
+      name: PMSA003i PM1.0
+    pm_2_5:
+      name: PMSA003i PM2.5
+    pm_10_0:
+      name: PMSA003i PM10.0
+    pmc_0_3:
+      name: PMSA003i PMC <0.3µm
+    pmc_0_5:
+      name: PMSA003i PMC <0.5µm
+    pmc_1_0:
+      name: PMSA003i PMC <1µm
+    pmc_2_5:
+      name: PMSA003i PMC <2.5µm
+    pmc_5_0:
+      name: PMSA003i PMC <5µm
+    pmc_10_0:
+      name: PMSA003i PMC <10µm
+    address: 0x12
+    standard_units: true
diff --git a/tests/components/pmsx003/test.esp32-c3-idf.yaml b/tests/components/pmsx003/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..58adc9390a
--- /dev/null
+++ b/tests/components/pmsx003/test.esp32-c3-idf.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmsx003/test.esp32-c3.yaml b/tests/components/pmsx003/test.esp32-c3.yaml
new file mode 100644
index 0000000000..58adc9390a
--- /dev/null
+++ b/tests/components/pmsx003/test.esp32-c3.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmsx003/test.esp32-idf.yaml b/tests/components/pmsx003/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5e7ebbbb2e
--- /dev/null
+++ b/tests/components/pmsx003/test.esp32-idf.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmsx003/test.esp32.yaml b/tests/components/pmsx003/test.esp32.yaml
new file mode 100644
index 0000000000..5e7ebbbb2e
--- /dev/null
+++ b/tests/components/pmsx003/test.esp32.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmsx003/test.esp8266.yaml b/tests/components/pmsx003/test.esp8266.yaml
new file mode 100644
index 0000000000..58adc9390a
--- /dev/null
+++ b/tests/components/pmsx003/test.esp8266.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmsx003/test.rp2040.yaml b/tests/components/pmsx003/test.rp2040.yaml
new file mode 100644
index 0000000000..58adc9390a
--- /dev/null
+++ b/tests/components/pmsx003/test.rp2040.yaml
@@ -0,0 +1,34 @@
+uart:
+  - id: uart_pmsx003
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: pmsx003
+    type: PMSX003
+    pm_1_0:
+      name: PM 1.0 Concentration
+    pm_2_5:
+      name: PM 2.5 Concentration
+    pm_10_0:
+      name: PM 10.0 Concentration
+    pm_1_0_std:
+      name: PM 1.0 Standard Atmospher Concentration
+    pm_2_5_std:
+      name: PM 2.5 Standard Atmospher Concentration
+    pm_10_0_std:
+      name: PM 10.0 Standard Atmospher Concentration
+    pm_0_3um:
+      name: Particulate Count >0.3um
+    pm_0_5um:
+      name: Particulate Count >0.5um
+    pm_1_0um:
+      name: Particulate Count >1.0um
+    pm_2_5um:
+      name: Particulate Count >2.5um
+    pm_5_0um:
+      name: Particulate Count >5.0um
+    pm_10_0um:
+      name: Particulate Count >10.0um
+    update_interval: 30s
diff --git a/tests/components/pmwcs3/test.esp32-c3-idf.yaml b/tests/components/pmwcs3/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..7e7e72692d
--- /dev/null
+++ b/tests/components/pmwcs3/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pmwcs3/test.esp32-c3.yaml b/tests/components/pmwcs3/test.esp32-c3.yaml
new file mode 100644
index 0000000000..7e7e72692d
--- /dev/null
+++ b/tests/components/pmwcs3/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pmwcs3/test.esp32-idf.yaml b/tests/components/pmwcs3/test.esp32-idf.yaml
new file mode 100644
index 0000000000..787eaca650
--- /dev/null
+++ b/tests/components/pmwcs3/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pmwcs3/test.esp32.yaml b/tests/components/pmwcs3/test.esp32.yaml
new file mode 100644
index 0000000000..787eaca650
--- /dev/null
+++ b/tests/components/pmwcs3/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pmwcs3/test.esp8266.yaml b/tests/components/pmwcs3/test.esp8266.yaml
new file mode 100644
index 0000000000..7e7e72692d
--- /dev/null
+++ b/tests/components/pmwcs3/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pmwcs3/test.rp2040.yaml b/tests/components/pmwcs3/test.rp2040.yaml
new file mode 100644
index 0000000000..7e7e72692d
--- /dev/null
+++ b/tests/components/pmwcs3/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_pmwcs3
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: pmwcs3
+    e25:
+      name: pmwcs3_e25
+    ec:
+      name: pmwcs3_ec
+    temperature:
+      name: pmwcs3_temperature
+    vwc:
+      name: pmwcs3_vwc
diff --git a/tests/components/pn532_i2c/test.esp32-c3-idf.yaml b/tests/components/pn532_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..62816d2ace
--- /dev/null
+++ b/tests/components/pn532_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 5
+    sda: 4
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_i2c/test.esp32-c3.yaml b/tests/components/pn532_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..62816d2ace
--- /dev/null
+++ b/tests/components/pn532_i2c/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 5
+    sda: 4
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_i2c/test.esp32-idf.yaml b/tests/components/pn532_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a50533b1d0
--- /dev/null
+++ b/tests/components/pn532_i2c/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 16
+    sda: 17
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_i2c/test.esp32.yaml b/tests/components/pn532_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..a50533b1d0
--- /dev/null
+++ b/tests/components/pn532_i2c/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 16
+    sda: 17
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_i2c/test.esp8266.yaml b/tests/components/pn532_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..62816d2ace
--- /dev/null
+++ b/tests/components/pn532_i2c/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 5
+    sda: 4
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_i2c/test.rp2040.yaml b/tests/components/pn532_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..62816d2ace
--- /dev/null
+++ b/tests/components/pn532_i2c/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_pn532
+    scl: 5
+    sda: 4
+
+pn532_i2c:
+  id: pn532_nfcc
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.esp32-c3-idf.yaml b/tests/components/pn532_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d21d50aa5c
--- /dev/null
+++ b/tests/components/pn532_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 4
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.esp32-c3.yaml b/tests/components/pn532_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d21d50aa5c
--- /dev/null
+++ b/tests/components/pn532_spi/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 4
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.esp32-idf.yaml b/tests/components/pn532_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..18a382a007
--- /dev/null
+++ b/tests/components/pn532_spi/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 12
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.esp32.yaml b/tests/components/pn532_spi/test.esp32.yaml
new file mode 100644
index 0000000000..18a382a007
--- /dev/null
+++ b/tests/components/pn532_spi/test.esp32.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 12
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.esp8266.yaml b/tests/components/pn532_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..1dba38e63e
--- /dev/null
+++ b/tests/components/pn532_spi/test.esp8266.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 15
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn532_spi/test.rp2040.yaml b/tests/components/pn532_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..ab02b2cc47
--- /dev/null
+++ b/tests/components/pn532_spi/test.rp2040.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_pn532
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+pn532_spi:
+  id: pn532_nfcc
+  cs_pin: 6
+
+binary_sensor:
+  - platform: pn532
+    pn532_id: pn532_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/pn7150_i2c/test.esp32-c3-idf.yaml b/tests/components/pn7150_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..aee1886cd4
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7150_i2c/test.esp32-c3.yaml b/tests/components/pn7150_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..aee1886cd4
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.esp32-c3.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7150_i2c/test.esp32-idf.yaml b/tests/components/pn7150_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..23d1061608
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.esp32-idf.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 16
+    sda: 17
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7150_i2c/test.esp32.yaml b/tests/components/pn7150_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..23d1061608
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.esp32.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 16
+    sda: 17
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7150_i2c/test.esp8266.yaml b/tests/components/pn7150_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..6017d548ca
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.esp8266.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7150_i2c/test.rp2040.yaml b/tests/components/pn7150_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..aee1886cd4
--- /dev/null
+++ b/tests/components/pn7150_i2c/test.rp2040.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7150
+      - tag.set_format_mode: nfcc_pn7150
+      - tag.set_read_mode: nfcc_pn7150
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7150
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7150
+      - tag.emulation_on: nfcc_pn7150
+      - tag.polling_off: nfcc_pn7150
+      - tag.polling_on: nfcc_pn7150
+
+i2c:
+  - id: i2c_pn7150
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7150
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.esp32-c3-idf.yaml b/tests/components/pn7160_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d1d7947352
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 5
+    sda: 4
+
+pn7160_i2c:
+  id: nfcc_pn7160
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.esp32-c3.yaml b/tests/components/pn7160_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d1d7947352
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.esp32-c3.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 5
+    sda: 4
+
+pn7160_i2c:
+  id: nfcc_pn7160
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.esp32-idf.yaml b/tests/components/pn7160_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d1a3cf5c77
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.esp32-idf.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 16
+    sda: 17
+
+pn7150_i2c:
+  id: nfcc_pn7160
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.esp32.yaml b/tests/components/pn7160_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..d1a3cf5c77
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.esp32.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 16
+    sda: 17
+
+pn7150_i2c:
+  id: nfcc_pn7160
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.esp8266.yaml b/tests/components/pn7160_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..57bd965fc9
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.esp8266.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7160
+  irq_pin: 12
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_i2c/test.rp2040.yaml b/tests/components/pn7160_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..5224b465ed
--- /dev/null
+++ b/tests/components/pn7160_i2c/test.rp2040.yaml
@@ -0,0 +1,35 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+i2c:
+  - id: i2c_pn7160
+    scl: 5
+    sda: 4
+
+pn7150_i2c:
+  id: nfcc_pn7160
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.esp32-c3-idf.yaml b/tests/components/pn7160_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fd19a53b2b
--- /dev/null
+++ b/tests/components/pn7160_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 4
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.esp32-c3.yaml b/tests/components/pn7160_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fd19a53b2b
--- /dev/null
+++ b/tests/components/pn7160_spi/test.esp32-c3.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 4
+  irq_pin: 2
+  ven_pin: 3
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.esp32-idf.yaml b/tests/components/pn7160_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0319648f13
--- /dev/null
+++ b/tests/components/pn7160_spi/test.esp32-idf.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 12
+  irq_pin: 14
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.esp32.yaml b/tests/components/pn7160_spi/test.esp32.yaml
new file mode 100644
index 0000000000..0319648f13
--- /dev/null
+++ b/tests/components/pn7160_spi/test.esp32.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 12
+  irq_pin: 14
+  ven_pin: 13
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.esp8266.yaml b/tests/components/pn7160_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..fa356d5610
--- /dev/null
+++ b/tests/components/pn7160_spi/test.esp8266.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 15
+  irq_pin: 4
+  ven_pin: 5
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/pn7160_spi/test.rp2040.yaml b/tests/components/pn7160_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..b36650032f
--- /dev/null
+++ b/tests/components/pn7160_spi/test.rp2040.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - tag.set_clean_mode: nfcc_pn7160
+      - tag.set_format_mode: nfcc_pn7160
+      - tag.set_read_mode: nfcc_pn7160
+      - tag.set_write_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.set_write_mode: nfcc_pn7160
+      - tag.set_emulation_message:
+          message: https://www.home-assistant.io/tag/pulse
+          include_android_app_record: false
+      - tag.emulation_off: nfcc_pn7160
+      - tag.emulation_on: nfcc_pn7160
+      - tag.polling_off: nfcc_pn7160
+      - tag.polling_on: nfcc_pn7160
+
+spi:
+  - id: spi_pn7160
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+pn7160_spi:
+  id: nfcc_pn7160
+  cs_pin: 6
+  irq_pin: 7
+  ven_pin: 5
+  emulation_message: https://www.home-assistant.io/tag/pulse_ce
+  tag_ttl: 1000ms
+  on_tag:
+    - logger.log: "Tag"
+  on_tag_removed:
+    - logger.log: "Tag removed"
+  on_emulated_tag_scan:
+    - logger.log: "Tag emulated"
diff --git a/tests/components/power_supply/test.esp32-c3-idf.yaml b/tests/components/power_supply/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.esp32-c3-idf.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/power_supply/test.esp32-c3.yaml b/tests/components/power_supply/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.esp32-c3.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/power_supply/test.esp32-idf.yaml b/tests/components/power_supply/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.esp32-idf.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/power_supply/test.esp32.yaml b/tests/components/power_supply/test.esp32.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.esp32.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/power_supply/test.esp8266.yaml b/tests/components/power_supply/test.esp8266.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.esp8266.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/power_supply/test.rp2040.yaml b/tests/components/power_supply/test.rp2040.yaml
new file mode 100644
index 0000000000..3fefc4d425
--- /dev/null
+++ b/tests/components/power_supply/test.rp2040.yaml
@@ -0,0 +1,6 @@
+power_supply:
+  - id: atx_power_supply
+    enable_time: 20ms
+    keep_on_time: 10s
+    enable_on_boot: true
+    pin: 4
diff --git a/tests/components/prometheus/test.esp32-c3-idf.yaml b/tests/components/prometheus/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c8ce17da88
--- /dev/null
+++ b/tests/components/prometheus/test.esp32-c3-idf.yaml
@@ -0,0 +1,21 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+prometheus:
+  include_internal: true
+  relabel:
+    template_sensor1:
+      id: hellow_world
+      name: Hello World
diff --git a/tests/components/prometheus/test.esp32-c3.yaml b/tests/components/prometheus/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c8ce17da88
--- /dev/null
+++ b/tests/components/prometheus/test.esp32-c3.yaml
@@ -0,0 +1,21 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+prometheus:
+  include_internal: true
+  relabel:
+    template_sensor1:
+      id: hellow_world
+      name: Hello World
diff --git a/tests/components/prometheus/test.esp32-idf.yaml b/tests/components/prometheus/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c8ce17da88
--- /dev/null
+++ b/tests/components/prometheus/test.esp32-idf.yaml
@@ -0,0 +1,21 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+prometheus:
+  include_internal: true
+  relabel:
+    template_sensor1:
+      id: hellow_world
+      name: Hello World
diff --git a/tests/components/prometheus/test.esp32.yaml b/tests/components/prometheus/test.esp32.yaml
new file mode 100644
index 0000000000..c8ce17da88
--- /dev/null
+++ b/tests/components/prometheus/test.esp32.yaml
@@ -0,0 +1,21 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+prometheus:
+  include_internal: true
+  relabel:
+    template_sensor1:
+      id: hellow_world
+      name: Hello World
diff --git a/tests/components/prometheus/test.esp8266.yaml b/tests/components/prometheus/test.esp8266.yaml
new file mode 100644
index 0000000000..c8ce17da88
--- /dev/null
+++ b/tests/components/prometheus/test.esp8266.yaml
@@ -0,0 +1,21 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+sensor:
+  - platform: template
+    id: template_sensor1
+    lambda: |-
+      if (millis() > 10000) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+
+prometheus:
+  include_internal: true
+  relabel:
+    template_sensor1:
+      id: hellow_world
+      name: Hello World
diff --git a/tests/components/psram/test.esp32-c3-idf.yaml b/tests/components/psram/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..cfd39f77fe
--- /dev/null
+++ b/tests/components/psram/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+psram:
+  mode: octal
+  speed: 80MHz
diff --git a/tests/components/psram/test.esp32-c3.yaml b/tests/components/psram/test.esp32-c3.yaml
new file mode 100644
index 0000000000..cfd39f77fe
--- /dev/null
+++ b/tests/components/psram/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+psram:
+  mode: octal
+  speed: 80MHz
diff --git a/tests/components/psram/test.esp32-idf.yaml b/tests/components/psram/test.esp32-idf.yaml
new file mode 100644
index 0000000000..cfd39f77fe
--- /dev/null
+++ b/tests/components/psram/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+psram:
+  mode: octal
+  speed: 80MHz
diff --git a/tests/components/psram/test.esp32.yaml b/tests/components/psram/test.esp32.yaml
new file mode 100644
index 0000000000..cfd39f77fe
--- /dev/null
+++ b/tests/components/psram/test.esp32.yaml
@@ -0,0 +1,3 @@
+psram:
+  mode: octal
+  speed: 80MHz
diff --git a/tests/components/pulse_counter/test.esp32-c3-idf.yaml b/tests/components/pulse_counter/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_counter/test.esp32-c3.yaml b/tests/components/pulse_counter/test.esp32-c3.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_counter/test.esp32-idf.yaml b/tests/components/pulse_counter/test.esp32-idf.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_counter/test.esp32.yaml b/tests/components/pulse_counter/test.esp32.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.esp32.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_counter/test.esp8266.yaml b/tests/components/pulse_counter/test.esp8266.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.esp8266.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_counter/test.rp2040.yaml b/tests/components/pulse_counter/test.rp2040.yaml
new file mode 100644
index 0000000000..556b43ee6f
--- /dev/null
+++ b/tests/components/pulse_counter/test.rp2040.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: pulse_counter
+    name: Pulse Counter
+    pin: 4
+    count_mode:
+      rising_edge: INCREMENT
+      falling_edge: DECREMENT
+    internal_filter: 13us
+    update_interval: 15s
diff --git a/tests/components/pulse_meter/test.esp32-c3-idf.yaml b/tests/components/pulse_meter/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_meter/test.esp32-c3.yaml b/tests/components/pulse_meter/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_meter/test.esp32-idf.yaml b/tests/components/pulse_meter/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_meter/test.esp32.yaml b/tests/components/pulse_meter/test.esp32.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.esp32.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_meter/test.esp8266.yaml b/tests/components/pulse_meter/test.esp8266.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.esp8266.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_meter/test.rp2040.yaml b/tests/components/pulse_meter/test.rp2040.yaml
new file mode 100644
index 0000000000..a83ec478bb
--- /dev/null
+++ b/tests/components/pulse_meter/test.rp2040.yaml
@@ -0,0 +1,13 @@
+sensor:
+  - platform: pulse_meter
+    id: pulse_meter_sensor
+    name: Pulse Meter
+    pin: 4
+    internal_filter: 100ms
+    timeout: 2 min
+    on_value:
+      - pulse_meter.set_total_pulses:
+          id: pulse_meter_sensor
+          value: 12345
+    total:
+      name: Pulse Meter Total
diff --git a/tests/components/pulse_width/test.esp32-c3-idf.yaml b/tests/components/pulse_width/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.esp32-c3-idf.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pulse_width/test.esp32-c3.yaml b/tests/components/pulse_width/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.esp32-c3.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pulse_width/test.esp32-idf.yaml b/tests/components/pulse_width/test.esp32-idf.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.esp32-idf.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pulse_width/test.esp32.yaml b/tests/components/pulse_width/test.esp32.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.esp32.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pulse_width/test.esp8266.yaml b/tests/components/pulse_width/test.esp8266.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.esp8266.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pulse_width/test.rp2040.yaml b/tests/components/pulse_width/test.rp2040.yaml
new file mode 100644
index 0000000000..fbda7cda28
--- /dev/null
+++ b/tests/components/pulse_width/test.rp2040.yaml
@@ -0,0 +1,4 @@
+sensor:
+  - platform: pulse_width
+    name: Pulse Width
+    pin: 4
diff --git a/tests/components/pvvx_mithermometer/test.esp32-c3-idf.yaml b/tests/components/pvvx_mithermometer/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..972f23122c
--- /dev/null
+++ b/tests/components/pvvx_mithermometer/test.esp32-c3-idf.yaml
@@ -0,0 +1,44 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: pvvx_ble_display
+
+display:
+  - platform: pvvx_mithermometer
+    ble_client_id: pvvx_ble_display
+    time_id: sntp_time
+    disconnect_delay: 3s
+    update_interval: 10min
+    validity_period: 20min
+    lambda: |-
+      it.print_bignum(188.8);
+      it.print_unit(pvvx_mithermometer::UNIT_DEG_E);
+      it.print_smallnum(88);
+      it.print_percent(true);
+      it.print_happy(true);
+      it.print_sad(true);
+      it.print_bracket(true);
+      it.print_battery(true);
+
+sensor:
+  - platform: pvvx_mithermometer
+    mac_address: A4:C1:38:4E:16:78
+    temperature:
+      name: PVVX Temperature
+    humidity:
+      name: PVVX Humidity
+    battery_level:
+      name: PVVX Battery-Level
+    battery_voltage:
+      name: PVVX Battery-Voltage
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
diff --git a/tests/components/pvvx_mithermometer/test.esp32-c3.yaml b/tests/components/pvvx_mithermometer/test.esp32-c3.yaml
new file mode 100644
index 0000000000..972f23122c
--- /dev/null
+++ b/tests/components/pvvx_mithermometer/test.esp32-c3.yaml
@@ -0,0 +1,44 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: pvvx_ble_display
+
+display:
+  - platform: pvvx_mithermometer
+    ble_client_id: pvvx_ble_display
+    time_id: sntp_time
+    disconnect_delay: 3s
+    update_interval: 10min
+    validity_period: 20min
+    lambda: |-
+      it.print_bignum(188.8);
+      it.print_unit(pvvx_mithermometer::UNIT_DEG_E);
+      it.print_smallnum(88);
+      it.print_percent(true);
+      it.print_happy(true);
+      it.print_sad(true);
+      it.print_bracket(true);
+      it.print_battery(true);
+
+sensor:
+  - platform: pvvx_mithermometer
+    mac_address: A4:C1:38:4E:16:78
+    temperature:
+      name: PVVX Temperature
+    humidity:
+      name: PVVX Humidity
+    battery_level:
+      name: PVVX Battery-Level
+    battery_voltage:
+      name: PVVX Battery-Voltage
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
diff --git a/tests/components/pvvx_mithermometer/test.esp32-idf.yaml b/tests/components/pvvx_mithermometer/test.esp32-idf.yaml
new file mode 100644
index 0000000000..972f23122c
--- /dev/null
+++ b/tests/components/pvvx_mithermometer/test.esp32-idf.yaml
@@ -0,0 +1,44 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: pvvx_ble_display
+
+display:
+  - platform: pvvx_mithermometer
+    ble_client_id: pvvx_ble_display
+    time_id: sntp_time
+    disconnect_delay: 3s
+    update_interval: 10min
+    validity_period: 20min
+    lambda: |-
+      it.print_bignum(188.8);
+      it.print_unit(pvvx_mithermometer::UNIT_DEG_E);
+      it.print_smallnum(88);
+      it.print_percent(true);
+      it.print_happy(true);
+      it.print_sad(true);
+      it.print_bracket(true);
+      it.print_battery(true);
+
+sensor:
+  - platform: pvvx_mithermometer
+    mac_address: A4:C1:38:4E:16:78
+    temperature:
+      name: PVVX Temperature
+    humidity:
+      name: PVVX Humidity
+    battery_level:
+      name: PVVX Battery-Level
+    battery_voltage:
+      name: PVVX Battery-Voltage
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
diff --git a/tests/components/pvvx_mithermometer/test.esp32.yaml b/tests/components/pvvx_mithermometer/test.esp32.yaml
new file mode 100644
index 0000000000..972f23122c
--- /dev/null
+++ b/tests/components/pvvx_mithermometer/test.esp32.yaml
@@ -0,0 +1,44 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: pvvx_ble_display
+
+display:
+  - platform: pvvx_mithermometer
+    ble_client_id: pvvx_ble_display
+    time_id: sntp_time
+    disconnect_delay: 3s
+    update_interval: 10min
+    validity_period: 20min
+    lambda: |-
+      it.print_bignum(188.8);
+      it.print_unit(pvvx_mithermometer::UNIT_DEG_E);
+      it.print_smallnum(88);
+      it.print_percent(true);
+      it.print_happy(true);
+      it.print_sad(true);
+      it.print_bracket(true);
+      it.print_battery(true);
+
+sensor:
+  - platform: pvvx_mithermometer
+    mac_address: A4:C1:38:4E:16:78
+    temperature:
+      name: PVVX Temperature
+    humidity:
+      name: PVVX Humidity
+    battery_level:
+      name: PVVX Battery-Level
+    battery_voltage:
+      name: PVVX Battery-Voltage
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
diff --git a/tests/components/pylontech/test.esp32-c3-idf.yaml b/tests/components/pylontech/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f7ec493422
--- /dev/null
+++ b/tests/components/pylontech/test.esp32-c3-idf.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pylontech/test.esp32-c3.yaml b/tests/components/pylontech/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f7ec493422
--- /dev/null
+++ b/tests/components/pylontech/test.esp32-c3.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pylontech/test.esp32-idf.yaml b/tests/components/pylontech/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a4c168fb47
--- /dev/null
+++ b/tests/components/pylontech/test.esp32-idf.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pylontech/test.esp32.yaml b/tests/components/pylontech/test.esp32.yaml
new file mode 100644
index 0000000000..a4c168fb47
--- /dev/null
+++ b/tests/components/pylontech/test.esp32.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pylontech/test.esp8266.yaml b/tests/components/pylontech/test.esp8266.yaml
new file mode 100644
index 0000000000..f7ec493422
--- /dev/null
+++ b/tests/components/pylontech/test.esp8266.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pylontech/test.rp2040.yaml b/tests/components/pylontech/test.rp2040.yaml
new file mode 100644
index 0000000000..f7ec493422
--- /dev/null
+++ b/tests/components/pylontech/test.rp2040.yaml
@@ -0,0 +1,48 @@
+uart:
+  - id: uart_pylontech0
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+pylontech:
+  - id: pylontech0
+  - id: pylontech1
+
+sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    voltage:
+      id: pyl01_voltage
+    current:
+      id: pyl01_current
+    coulomb:
+      id: pyl01_soc
+    mos_temperature:
+      id: pyl01_mos_temperature
+  - platform: pylontech
+    pylontech_id: pylontech1
+    battery: 1
+    voltage:
+      id: pyl13_voltage
+    temperature_low:
+      id: pyl13_temperature_low
+    temperature_high:
+      id: pyl13_temperature_high
+    voltage_low:
+      id: pyl13_voltage_low
+    voltage_high:
+      id: pyl13_voltage_high
+
+text_sensor:
+  - platform: pylontech
+    pylontech_id: pylontech0
+    battery: 1
+    base_state:
+      id: pyl0_base_state
+    voltage_state:
+      id: pyl0_voltage_state
+    current_state:
+      id: pyl0_current_state
+    temperature_state:
+      id: pyl0_temperature_state
diff --git a/tests/components/pzem004t/test.esp32-c3-idf.yaml b/tests/components/pzem004t/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b9c93f8761
--- /dev/null
+++ b/tests/components/pzem004t/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzem004t/test.esp32-c3.yaml b/tests/components/pzem004t/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b9c93f8761
--- /dev/null
+++ b/tests/components/pzem004t/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzem004t/test.esp32-idf.yaml b/tests/components/pzem004t/test.esp32-idf.yaml
new file mode 100644
index 0000000000..23f2bd0eca
--- /dev/null
+++ b/tests/components/pzem004t/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzem004t/test.esp32.yaml b/tests/components/pzem004t/test.esp32.yaml
new file mode 100644
index 0000000000..23f2bd0eca
--- /dev/null
+++ b/tests/components/pzem004t/test.esp32.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzem004t/test.esp8266.yaml b/tests/components/pzem004t/test.esp8266.yaml
new file mode 100644
index 0000000000..b9c93f8761
--- /dev/null
+++ b/tests/components/pzem004t/test.esp8266.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzem004t/test.rp2040.yaml b/tests/components/pzem004t/test.rp2040.yaml
new file mode 100644
index 0000000000..b9c93f8761
--- /dev/null
+++ b/tests/components/pzem004t/test.rp2040.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_pzem004t
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: pzem004t
+    voltage:
+      name: PZEM004T Voltage
+    current:
+      name: PZEM004T Current
+    power:
+      name: PZEM004T Power
diff --git a/tests/components/pzemac/test.esp32-c3-idf.yaml b/tests/components/pzemac/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..6d9abbebe9
--- /dev/null
+++ b/tests/components/pzemac/test.esp32-c3-idf.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemac/test.esp32-c3.yaml b/tests/components/pzemac/test.esp32-c3.yaml
new file mode 100644
index 0000000000..6d9abbebe9
--- /dev/null
+++ b/tests/components/pzemac/test.esp32-c3.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemac/test.esp32-idf.yaml b/tests/components/pzemac/test.esp32-idf.yaml
new file mode 100644
index 0000000000..ce431a6100
--- /dev/null
+++ b/tests/components/pzemac/test.esp32-idf.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemac/test.esp32.yaml b/tests/components/pzemac/test.esp32.yaml
new file mode 100644
index 0000000000..ce431a6100
--- /dev/null
+++ b/tests/components/pzemac/test.esp32.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemac/test.esp8266.yaml b/tests/components/pzemac/test.esp8266.yaml
new file mode 100644
index 0000000000..6d9abbebe9
--- /dev/null
+++ b/tests/components/pzemac/test.esp8266.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemac/test.rp2040.yaml b/tests/components/pzemac/test.rp2040.yaml
new file mode 100644
index 0000000000..6d9abbebe9
--- /dev/null
+++ b/tests/components/pzemac/test.rp2040.yaml
@@ -0,0 +1,28 @@
+esphome:
+  on_boot:
+    then:
+      - pzemac.reset_energy: pzemac1
+
+uart:
+  - id: uart_pzemac
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+
+sensor:
+  - platform: pzemac
+    id: pzemac1
+    voltage:
+      name: PZEMAC Voltage
+    current:
+      name: PZEMAC Current
+    power:
+      name: PZEMAC Power
+    energy:
+      name: PZEMAC Energy
+    frequency:
+      name: PZEMAC Frequency
+    power_factor:
+      name: PZEMAC Power Factor
diff --git a/tests/components/pzemdc/test.esp32-c3-idf.yaml b/tests/components/pzemdc/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..02114b781d
--- /dev/null
+++ b/tests/components/pzemdc/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy
diff --git a/tests/components/pzemdc/test.esp32-c3.yaml b/tests/components/pzemdc/test.esp32-c3.yaml
new file mode 100644
index 0000000000..02114b781d
--- /dev/null
+++ b/tests/components/pzemdc/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy
diff --git a/tests/components/pzemdc/test.esp32-idf.yaml b/tests/components/pzemdc/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9cc61137de
--- /dev/null
+++ b/tests/components/pzemdc/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy
diff --git a/tests/components/pzemdc/test.esp32.yaml b/tests/components/pzemdc/test.esp32.yaml
new file mode 100644
index 0000000000..9cc61137de
--- /dev/null
+++ b/tests/components/pzemdc/test.esp32.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy
diff --git a/tests/components/pzemdc/test.esp8266.yaml b/tests/components/pzemdc/test.esp8266.yaml
new file mode 100644
index 0000000000..02114b781d
--- /dev/null
+++ b/tests/components/pzemdc/test.esp8266.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy
diff --git a/tests/components/pzemdc/test.rp2040.yaml b/tests/components/pzemdc/test.rp2040.yaml
new file mode 100644
index 0000000000..02114b781d
--- /dev/null
+++ b/tests/components/pzemdc/test.rp2040.yaml
@@ -0,0 +1,23 @@
+esphome:
+  on_boot:
+    then:
+      - pzemdc.reset_energy: pzemdc1
+
+uart:
+  - id: uart_pzemdc
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+    stop_bits: 2
+
+sensor:
+  - platform: pzemdc
+    id: pzemdc1
+    voltage:
+      name: PZEMDC Voltage
+    current:
+      name: PZEMDC Current
+    power:
+      name: PZEMDC Power
+    energy:
+      name: PZEMDC Energy

From 2b215fecc953496d62db17407ec04f85d27abe23 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 22:45:12 -0500
Subject: [PATCH 20/81] Add some components to the new testing framework (M
 part 1) (#6207)

---
 .../matrix_keypad/test.esp32-c3-idf.yaml      | 19 ++++++++
 .../matrix_keypad/test.esp32-c3.yaml          | 19 ++++++++
 .../matrix_keypad/test.esp32-idf.yaml         | 19 ++++++++
 .../components/matrix_keypad/test.esp32.yaml  | 19 ++++++++
 .../matrix_keypad/test.esp8266.yaml           | 19 ++++++++
 .../components/matrix_keypad/test.rp2040.yaml | 19 ++++++++
 .../max31855/test.esp32-c3-idf.yaml           | 13 ++++++
 tests/components/max31855/test.esp32-c3.yaml  | 13 ++++++
 tests/components/max31855/test.esp32-idf.yaml | 13 ++++++
 tests/components/max31855/test.esp32.yaml     | 13 ++++++
 tests/components/max31855/test.esp8266.yaml   | 13 ++++++
 tests/components/max31855/test.rp2040.yaml    | 13 ++++++
 .../max31856/test.esp32-c3-idf.yaml           | 12 +++++
 tests/components/max31856/test.esp32-c3.yaml  | 12 +++++
 tests/components/max31856/test.esp32-idf.yaml | 12 +++++
 tests/components/max31856/test.esp32.yaml     | 12 +++++
 tests/components/max31856/test.esp8266.yaml   | 12 +++++
 tests/components/max31856/test.rp2040.yaml    | 12 +++++
 .../max31865/test.esp32-c3-idf.yaml           | 13 ++++++
 tests/components/max31865/test.esp32-c3.yaml  | 13 ++++++
 tests/components/max31865/test.esp32-idf.yaml | 13 ++++++
 tests/components/max31865/test.esp32.yaml     | 13 ++++++
 tests/components/max31865/test.esp8266.yaml   | 13 ++++++
 tests/components/max31865/test.rp2040.yaml    | 13 ++++++
 .../max44009/test.esp32-c3-idf.yaml           | 12 +++++
 tests/components/max44009/test.esp32-c3.yaml  | 12 +++++
 tests/components/max44009/test.esp32-idf.yaml | 12 +++++
 tests/components/max44009/test.esp32.yaml     | 12 +++++
 tests/components/max44009/test.esp8266.yaml   | 12 +++++
 tests/components/max44009/test.rp2040.yaml    | 12 +++++
 .../components/max6675/test.esp32-c3-idf.yaml | 11 +++++
 tests/components/max6675/test.esp32-c3.yaml   | 11 +++++
 tests/components/max6675/test.esp32-idf.yaml  | 11 +++++
 tests/components/max6675/test.esp32.yaml      | 11 +++++
 tests/components/max6675/test.esp8266.yaml    | 11 +++++
 tests/components/max6675/test.rp2040.yaml     | 11 +++++
 .../components/max6956/test.esp32-c3-idf.yaml | 19 ++++++++
 tests/components/max6956/test.esp32-c3.yaml   | 19 ++++++++
 tests/components/max6956/test.esp32-idf.yaml  | 19 ++++++++
 tests/components/max6956/test.esp32.yaml      | 19 ++++++++
 tests/components/max6956/test.esp8266.yaml    | 19 ++++++++
 tests/components/max6956/test.rp2040.yaml     | 19 ++++++++
 .../components/max7219/test.esp32-c3-idf.yaml | 12 +++++
 tests/components/max7219/test.esp32-c3.yaml   | 12 +++++
 tests/components/max7219/test.esp32-idf.yaml  | 12 +++++
 tests/components/max7219/test.esp32.yaml      | 12 +++++
 tests/components/max7219/test.esp8266.yaml    | 12 +++++
 tests/components/max7219/test.rp2040.yaml     | 12 +++++
 .../max7219digit/test.esp32-c3-idf.yaml       | 16 +++++++
 .../max7219digit/test.esp32-c3.yaml           | 16 +++++++
 .../max7219digit/test.esp32-idf.yaml          | 16 +++++++
 tests/components/max7219digit/test.esp32.yaml | 16 +++++++
 .../components/max7219digit/test.esp8266.yaml | 16 +++++++
 .../components/max7219digit/test.rp2040.yaml  | 16 +++++++
 .../components/max9611/test.esp32-c3-idf.yaml | 18 ++++++++
 tests/components/max9611/test.esp32-c3.yaml   | 18 ++++++++
 tests/components/max9611/test.esp32-idf.yaml  | 18 ++++++++
 tests/components/max9611/test.esp32.yaml      | 18 ++++++++
 tests/components/max9611/test.esp8266.yaml    | 18 ++++++++
 tests/components/max9611/test.rp2040.yaml     | 18 ++++++++
 .../mcp23008/test.esp32-c3-idf.yaml           | 23 ++++++++++
 tests/components/mcp23008/test.esp32-c3.yaml  | 23 ++++++++++
 tests/components/mcp23008/test.esp32-idf.yaml | 23 ++++++++++
 tests/components/mcp23008/test.esp32.yaml     | 23 ++++++++++
 tests/components/mcp23008/test.esp8266.yaml   | 23 ++++++++++
 tests/components/mcp23008/test.rp2040.yaml    | 23 ++++++++++
 .../mcp23016/test.esp32-c3-idf.yaml           | 23 ++++++++++
 tests/components/mcp23016/test.esp32-c3.yaml  | 23 ++++++++++
 tests/components/mcp23016/test.esp32-idf.yaml | 23 ++++++++++
 tests/components/mcp23016/test.esp32.yaml     | 23 ++++++++++
 tests/components/mcp23016/test.esp8266.yaml   | 23 ++++++++++
 tests/components/mcp23016/test.rp2040.yaml    | 23 ++++++++++
 .../mcp23017/test.esp32-c3-idf.yaml           | 23 ++++++++++
 tests/components/mcp23017/test.esp32-c3.yaml  | 23 ++++++++++
 tests/components/mcp23017/test.esp32-idf.yaml | 23 ++++++++++
 tests/components/mcp23017/test.esp32.yaml     | 23 ++++++++++
 tests/components/mcp23017/test.esp8266.yaml   | 23 ++++++++++
 tests/components/mcp23017/test.rp2040.yaml    | 23 ++++++++++
 .../mcp23s08/test.esp32-c3-idf.yaml           | 10 +++++
 tests/components/mcp23s08/test.esp32-c3.yaml  | 10 +++++
 tests/components/mcp23s08/test.esp32-idf.yaml | 10 +++++
 tests/components/mcp23s08/test.esp32.yaml     | 10 +++++
 tests/components/mcp23s08/test.esp8266.yaml   | 10 +++++
 tests/components/mcp23s08/test.rp2040.yaml    | 10 +++++
 .../mcp23s17/test.esp32-c3-idf.yaml           | 10 +++++
 tests/components/mcp23s17/test.esp32-c3.yaml  | 10 +++++
 tests/components/mcp23s17/test.esp32-idf.yaml | 10 +++++
 tests/components/mcp23s17/test.esp32.yaml     | 10 +++++
 tests/components/mcp23s17/test.esp8266.yaml   | 10 +++++
 tests/components/mcp23s17/test.rp2040.yaml    | 10 +++++
 .../components/mcp2515/test.esp32-c3-idf.yaml | 44 +++++++++++++++++++
 tests/components/mcp2515/test.esp32-c3.yaml   | 44 +++++++++++++++++++
 tests/components/mcp2515/test.esp32-idf.yaml  | 44 +++++++++++++++++++
 tests/components/mcp2515/test.esp32.yaml      | 44 +++++++++++++++++++
 tests/components/mcp2515/test.esp8266.yaml    | 44 +++++++++++++++++++
 tests/components/mcp2515/test.rp2040.yaml     | 44 +++++++++++++++++++
 .../components/mcp3008/test.esp32-c3-idf.yaml | 17 +++++++
 tests/components/mcp3008/test.esp32-c3.yaml   | 17 +++++++
 tests/components/mcp3008/test.esp32-idf.yaml  | 17 +++++++
 tests/components/mcp3008/test.esp32.yaml      | 17 +++++++
 tests/components/mcp3008/test.esp8266.yaml    | 17 +++++++
 tests/components/mcp3008/test.rp2040.yaml     | 17 +++++++
 .../components/mcp3204/test.esp32-c3-idf.yaml | 16 +++++++
 tests/components/mcp3204/test.esp32-c3.yaml   | 16 +++++++
 tests/components/mcp3204/test.esp32-idf.yaml  | 16 +++++++
 tests/components/mcp3204/test.esp32.yaml      | 16 +++++++
 tests/components/mcp3204/test.esp8266.yaml    | 16 +++++++
 tests/components/mcp3204/test.rp2040.yaml     | 16 +++++++
 .../components/mcp4725/test.esp32-c3-idf.yaml |  8 ++++
 tests/components/mcp4725/test.esp32-c3.yaml   |  8 ++++
 tests/components/mcp4725/test.esp32-idf.yaml  |  8 ++++
 tests/components/mcp4725/test.esp32.yaml      |  8 ++++
 tests/components/mcp4725/test.esp8266.yaml    |  8 ++++
 tests/components/mcp4725/test.rp2040.yaml     |  8 ++++
 .../components/mcp4728/test.esp32-c3-idf.yaml | 31 +++++++++++++
 tests/components/mcp4728/test.esp32-c3.yaml   | 31 +++++++++++++
 tests/components/mcp4728/test.esp32-idf.yaml  | 31 +++++++++++++
 tests/components/mcp4728/test.esp32.yaml      | 31 +++++++++++++
 tests/components/mcp4728/test.esp8266.yaml    | 31 +++++++++++++
 tests/components/mcp4728/test.rp2040.yaml     | 31 +++++++++++++
 .../components/mcp47a1/test.esp32-c3-idf.yaml |  8 ++++
 tests/components/mcp47a1/test.esp32-c3.yaml   |  8 ++++
 tests/components/mcp47a1/test.esp32-idf.yaml  |  8 ++++
 tests/components/mcp47a1/test.esp32.yaml      |  8 ++++
 tests/components/mcp47a1/test.esp8266.yaml    |  8 ++++
 tests/components/mcp47a1/test.rp2040.yaml     |  8 ++++
 .../components/mcp9600/test.esp32-c3-idf.yaml | 12 +++++
 tests/components/mcp9600/test.esp32-c3.yaml   | 12 +++++
 tests/components/mcp9600/test.esp32-idf.yaml  | 12 +++++
 tests/components/mcp9600/test.esp32.yaml      | 12 +++++
 tests/components/mcp9600/test.esp8266.yaml    | 12 +++++
 tests/components/mcp9600/test.rp2040.yaml     | 12 +++++
 .../components/mcp9808/test.esp32-c3-idf.yaml |  8 ++++
 tests/components/mcp9808/test.esp32-c3.yaml   |  8 ++++
 tests/components/mcp9808/test.esp32-idf.yaml  |  8 ++++
 tests/components/mcp9808/test.esp32.yaml      |  8 ++++
 tests/components/mcp9808/test.esp8266.yaml    |  8 ++++
 tests/components/mcp9808/test.rp2040.yaml     |  8 ++++
 tests/components/mdns/test.esp32-c3-idf.yaml  |  6 +++
 tests/components/mdns/test.esp32-c3.yaml      |  6 +++
 tests/components/mdns/test.esp32-idf.yaml     |  6 +++
 tests/components/mdns/test.esp32.yaml         |  6 +++
 tests/components/mdns/test.esp8266.yaml       |  6 +++
 tests/components/mdns/test.rp2040.yaml        |  6 +++
 tests/components/media_player/test.esp32.yaml | 32 ++++++++++++++
 tests/components/mhz19/test.esp32-c3-idf.yaml | 14 ++++++
 tests/components/mhz19/test.esp32-c3.yaml     | 14 ++++++
 tests/components/mhz19/test.esp32-idf.yaml    | 14 ++++++
 tests/components/mhz19/test.esp32.yaml        | 14 ++++++
 tests/components/mhz19/test.esp8266.yaml      | 14 ++++++
 tests/components/mhz19/test.rp2040.yaml       | 14 ++++++
 151 files changed, 2420 insertions(+)
 create mode 100644 tests/components/matrix_keypad/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/matrix_keypad/test.esp32-c3.yaml
 create mode 100644 tests/components/matrix_keypad/test.esp32-idf.yaml
 create mode 100644 tests/components/matrix_keypad/test.esp32.yaml
 create mode 100644 tests/components/matrix_keypad/test.esp8266.yaml
 create mode 100644 tests/components/matrix_keypad/test.rp2040.yaml
 create mode 100644 tests/components/max31855/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max31855/test.esp32-c3.yaml
 create mode 100644 tests/components/max31855/test.esp32-idf.yaml
 create mode 100644 tests/components/max31855/test.esp32.yaml
 create mode 100644 tests/components/max31855/test.esp8266.yaml
 create mode 100644 tests/components/max31855/test.rp2040.yaml
 create mode 100644 tests/components/max31856/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max31856/test.esp32-c3.yaml
 create mode 100644 tests/components/max31856/test.esp32-idf.yaml
 create mode 100644 tests/components/max31856/test.esp32.yaml
 create mode 100644 tests/components/max31856/test.esp8266.yaml
 create mode 100644 tests/components/max31856/test.rp2040.yaml
 create mode 100644 tests/components/max31865/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max31865/test.esp32-c3.yaml
 create mode 100644 tests/components/max31865/test.esp32-idf.yaml
 create mode 100644 tests/components/max31865/test.esp32.yaml
 create mode 100644 tests/components/max31865/test.esp8266.yaml
 create mode 100644 tests/components/max31865/test.rp2040.yaml
 create mode 100644 tests/components/max44009/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max44009/test.esp32-c3.yaml
 create mode 100644 tests/components/max44009/test.esp32-idf.yaml
 create mode 100644 tests/components/max44009/test.esp32.yaml
 create mode 100644 tests/components/max44009/test.esp8266.yaml
 create mode 100644 tests/components/max44009/test.rp2040.yaml
 create mode 100644 tests/components/max6675/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max6675/test.esp32-c3.yaml
 create mode 100644 tests/components/max6675/test.esp32-idf.yaml
 create mode 100644 tests/components/max6675/test.esp32.yaml
 create mode 100644 tests/components/max6675/test.esp8266.yaml
 create mode 100644 tests/components/max6675/test.rp2040.yaml
 create mode 100644 tests/components/max6956/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max6956/test.esp32-c3.yaml
 create mode 100644 tests/components/max6956/test.esp32-idf.yaml
 create mode 100644 tests/components/max6956/test.esp32.yaml
 create mode 100644 tests/components/max6956/test.esp8266.yaml
 create mode 100644 tests/components/max6956/test.rp2040.yaml
 create mode 100644 tests/components/max7219/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max7219/test.esp32-c3.yaml
 create mode 100644 tests/components/max7219/test.esp32-idf.yaml
 create mode 100644 tests/components/max7219/test.esp32.yaml
 create mode 100644 tests/components/max7219/test.esp8266.yaml
 create mode 100644 tests/components/max7219/test.rp2040.yaml
 create mode 100644 tests/components/max7219digit/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max7219digit/test.esp32-c3.yaml
 create mode 100644 tests/components/max7219digit/test.esp32-idf.yaml
 create mode 100644 tests/components/max7219digit/test.esp32.yaml
 create mode 100644 tests/components/max7219digit/test.esp8266.yaml
 create mode 100644 tests/components/max7219digit/test.rp2040.yaml
 create mode 100644 tests/components/max9611/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/max9611/test.esp32-c3.yaml
 create mode 100644 tests/components/max9611/test.esp32-idf.yaml
 create mode 100644 tests/components/max9611/test.esp32.yaml
 create mode 100644 tests/components/max9611/test.esp8266.yaml
 create mode 100644 tests/components/max9611/test.rp2040.yaml
 create mode 100644 tests/components/mcp23008/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp23008/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp23008/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp23008/test.esp32.yaml
 create mode 100644 tests/components/mcp23008/test.esp8266.yaml
 create mode 100644 tests/components/mcp23008/test.rp2040.yaml
 create mode 100644 tests/components/mcp23016/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp23016/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp23016/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp23016/test.esp32.yaml
 create mode 100644 tests/components/mcp23016/test.esp8266.yaml
 create mode 100644 tests/components/mcp23016/test.rp2040.yaml
 create mode 100644 tests/components/mcp23017/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp23017/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp23017/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp23017/test.esp32.yaml
 create mode 100644 tests/components/mcp23017/test.esp8266.yaml
 create mode 100644 tests/components/mcp23017/test.rp2040.yaml
 create mode 100644 tests/components/mcp23s08/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp23s08/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp23s08/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp23s08/test.esp32.yaml
 create mode 100644 tests/components/mcp23s08/test.esp8266.yaml
 create mode 100644 tests/components/mcp23s08/test.rp2040.yaml
 create mode 100644 tests/components/mcp23s17/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp23s17/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp23s17/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp23s17/test.esp32.yaml
 create mode 100644 tests/components/mcp23s17/test.esp8266.yaml
 create mode 100644 tests/components/mcp23s17/test.rp2040.yaml
 create mode 100644 tests/components/mcp2515/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp2515/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp2515/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp2515/test.esp32.yaml
 create mode 100644 tests/components/mcp2515/test.esp8266.yaml
 create mode 100644 tests/components/mcp2515/test.rp2040.yaml
 create mode 100644 tests/components/mcp3008/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp3008/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp3008/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp3008/test.esp32.yaml
 create mode 100644 tests/components/mcp3008/test.esp8266.yaml
 create mode 100644 tests/components/mcp3008/test.rp2040.yaml
 create mode 100644 tests/components/mcp3204/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp3204/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp3204/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp3204/test.esp32.yaml
 create mode 100644 tests/components/mcp3204/test.esp8266.yaml
 create mode 100644 tests/components/mcp3204/test.rp2040.yaml
 create mode 100644 tests/components/mcp4725/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp4725/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp4725/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp4725/test.esp32.yaml
 create mode 100644 tests/components/mcp4725/test.esp8266.yaml
 create mode 100644 tests/components/mcp4725/test.rp2040.yaml
 create mode 100644 tests/components/mcp4728/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp4728/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp4728/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp4728/test.esp32.yaml
 create mode 100644 tests/components/mcp4728/test.esp8266.yaml
 create mode 100644 tests/components/mcp4728/test.rp2040.yaml
 create mode 100644 tests/components/mcp47a1/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp47a1/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp47a1/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp47a1/test.esp32.yaml
 create mode 100644 tests/components/mcp47a1/test.esp8266.yaml
 create mode 100644 tests/components/mcp47a1/test.rp2040.yaml
 create mode 100644 tests/components/mcp9600/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp9600/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp9600/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp9600/test.esp32.yaml
 create mode 100644 tests/components/mcp9600/test.esp8266.yaml
 create mode 100644 tests/components/mcp9600/test.rp2040.yaml
 create mode 100644 tests/components/mcp9808/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mcp9808/test.esp32-c3.yaml
 create mode 100644 tests/components/mcp9808/test.esp32-idf.yaml
 create mode 100644 tests/components/mcp9808/test.esp32.yaml
 create mode 100644 tests/components/mcp9808/test.esp8266.yaml
 create mode 100644 tests/components/mcp9808/test.rp2040.yaml
 create mode 100644 tests/components/mdns/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mdns/test.esp32-c3.yaml
 create mode 100644 tests/components/mdns/test.esp32-idf.yaml
 create mode 100644 tests/components/mdns/test.esp32.yaml
 create mode 100644 tests/components/mdns/test.esp8266.yaml
 create mode 100644 tests/components/mdns/test.rp2040.yaml
 create mode 100644 tests/components/media_player/test.esp32.yaml
 create mode 100644 tests/components/mhz19/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mhz19/test.esp32-c3.yaml
 create mode 100644 tests/components/mhz19/test.esp32-idf.yaml
 create mode 100644 tests/components/mhz19/test.esp32.yaml
 create mode 100644 tests/components/mhz19/test.esp8266.yaml
 create mode 100644 tests/components/mhz19/test.rp2040.yaml

diff --git a/tests/components/matrix_keypad/test.esp32-c3-idf.yaml b/tests/components/matrix_keypad/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d15e6af21a
--- /dev/null
+++ b/tests/components/matrix_keypad/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 1
+    - pin: 2
+  columns:
+    - pin: 3
+    - pin: 4
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/matrix_keypad/test.esp32-c3.yaml b/tests/components/matrix_keypad/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d15e6af21a
--- /dev/null
+++ b/tests/components/matrix_keypad/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 1
+    - pin: 2
+  columns:
+    - pin: 3
+    - pin: 4
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/matrix_keypad/test.esp32-idf.yaml b/tests/components/matrix_keypad/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c8e9b54534
--- /dev/null
+++ b/tests/components/matrix_keypad/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 12
+    - pin: 13
+  columns:
+    - pin: 14
+    - pin: 15
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/matrix_keypad/test.esp32.yaml b/tests/components/matrix_keypad/test.esp32.yaml
new file mode 100644
index 0000000000..c8e9b54534
--- /dev/null
+++ b/tests/components/matrix_keypad/test.esp32.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 12
+    - pin: 13
+  columns:
+    - pin: 14
+    - pin: 15
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/matrix_keypad/test.esp8266.yaml b/tests/components/matrix_keypad/test.esp8266.yaml
new file mode 100644
index 0000000000..c8e9b54534
--- /dev/null
+++ b/tests/components/matrix_keypad/test.esp8266.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 12
+    - pin: 13
+  columns:
+    - pin: 14
+    - pin: 15
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/matrix_keypad/test.rp2040.yaml b/tests/components/matrix_keypad/test.rp2040.yaml
new file mode 100644
index 0000000000..d15e6af21a
--- /dev/null
+++ b/tests/components/matrix_keypad/test.rp2040.yaml
@@ -0,0 +1,19 @@
+binary_sensor:
+  - platform: matrix_keypad
+    id: key4
+    row: 1
+    col: 1
+  - platform: matrix_keypad
+    id: key1
+    key: 1
+
+matrix_keypad:
+  id: keypad
+  rows:
+    - pin: 1
+    - pin: 2
+  columns:
+    - pin: 3
+    - pin: 4
+  keys: "1234"
+  has_pulldowns: true
diff --git a/tests/components/max31855/test.esp32-c3-idf.yaml b/tests/components/max31855/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e7c8f3f824
--- /dev/null
+++ b/tests/components/max31855/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31855/test.esp32-c3.yaml b/tests/components/max31855/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e7c8f3f824
--- /dev/null
+++ b/tests/components/max31855/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31855/test.esp32-idf.yaml b/tests/components/max31855/test.esp32-idf.yaml
new file mode 100644
index 0000000000..25fee986d2
--- /dev/null
+++ b/tests/components/max31855/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31855/test.esp32.yaml b/tests/components/max31855/test.esp32.yaml
new file mode 100644
index 0000000000..25fee986d2
--- /dev/null
+++ b/tests/components/max31855/test.esp32.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31855/test.esp8266.yaml b/tests/components/max31855/test.esp8266.yaml
new file mode 100644
index 0000000000..7e02d41fce
--- /dev/null
+++ b/tests/components/max31855/test.esp8266.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 15
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31855/test.rp2040.yaml b/tests/components/max31855/test.rp2040.yaml
new file mode 100644
index 0000000000..379d4d33d6
--- /dev/null
+++ b/tests/components/max31855/test.rp2040.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31855
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+sensor:
+  - platform: max31855
+    name: MAX31855 Temperature
+    cs_pin: 6
+    update_interval: 15s
+    reference_temperature:
+      name: MAX31855 Internal Temperature
diff --git a/tests/components/max31856/test.esp32-c3-idf.yaml b/tests/components/max31856/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2794866c59
--- /dev/null
+++ b/tests/components/max31856/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31856/test.esp32-c3.yaml b/tests/components/max31856/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2794866c59
--- /dev/null
+++ b/tests/components/max31856/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31856/test.esp32-idf.yaml b/tests/components/max31856/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5561903207
--- /dev/null
+++ b/tests/components/max31856/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31856/test.esp32.yaml b/tests/components/max31856/test.esp32.yaml
new file mode 100644
index 0000000000..5561903207
--- /dev/null
+++ b/tests/components/max31856/test.esp32.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31856/test.esp8266.yaml b/tests/components/max31856/test.esp8266.yaml
new file mode 100644
index 0000000000..dfd9572ca9
--- /dev/null
+++ b/tests/components/max31856/test.esp8266.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 15
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31856/test.rp2040.yaml b/tests/components/max31856/test.rp2040.yaml
new file mode 100644
index 0000000000..0abc8a081b
--- /dev/null
+++ b/tests/components/max31856/test.rp2040.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max31856
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+sensor:
+  - platform: max31856
+    name: MAX31856 Temperature
+    cs_pin: 6
+    update_interval: 15s
+    mains_filter: 50Hz
diff --git a/tests/components/max31865/test.esp32-c3-idf.yaml b/tests/components/max31865/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..45de22331e
--- /dev/null
+++ b/tests/components/max31865/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max31865/test.esp32-c3.yaml b/tests/components/max31865/test.esp32-c3.yaml
new file mode 100644
index 0000000000..45de22331e
--- /dev/null
+++ b/tests/components/max31865/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 8
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max31865/test.esp32-idf.yaml b/tests/components/max31865/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8326a578ee
--- /dev/null
+++ b/tests/components/max31865/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max31865/test.esp32.yaml b/tests/components/max31865/test.esp32.yaml
new file mode 100644
index 0000000000..8326a578ee
--- /dev/null
+++ b/tests/components/max31865/test.esp32.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 12
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max31865/test.esp8266.yaml b/tests/components/max31865/test.esp8266.yaml
new file mode 100644
index 0000000000..4828019acc
--- /dev/null
+++ b/tests/components/max31865/test.esp8266.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 15
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max31865/test.rp2040.yaml b/tests/components/max31865/test.rp2040.yaml
new file mode 100644
index 0000000000..5af64b41ad
--- /dev/null
+++ b/tests/components/max31865/test.rp2040.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_max31865
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+sensor:
+  - platform: max31865
+    name: MAX31865 Temperature
+    cs_pin: 6
+    update_interval: 15s
+    reference_resistance: 430 Ω
+    rtd_nominal_resistance: 100 Ω
diff --git a/tests/components/max44009/test.esp32-c3-idf.yaml b/tests/components/max44009/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..593d4bd48c
--- /dev/null
+++ b/tests/components/max44009/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max44009/test.esp32-c3.yaml b/tests/components/max44009/test.esp32-c3.yaml
new file mode 100644
index 0000000000..593d4bd48c
--- /dev/null
+++ b/tests/components/max44009/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max44009/test.esp32-idf.yaml b/tests/components/max44009/test.esp32-idf.yaml
new file mode 100644
index 0000000000..56eecebc4a
--- /dev/null
+++ b/tests/components/max44009/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max44009/test.esp32.yaml b/tests/components/max44009/test.esp32.yaml
new file mode 100644
index 0000000000..56eecebc4a
--- /dev/null
+++ b/tests/components/max44009/test.esp32.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max44009/test.esp8266.yaml b/tests/components/max44009/test.esp8266.yaml
new file mode 100644
index 0000000000..593d4bd48c
--- /dev/null
+++ b/tests/components/max44009/test.esp8266.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max44009/test.rp2040.yaml b/tests/components/max44009/test.rp2040.yaml
new file mode 100644
index 0000000000..593d4bd48c
--- /dev/null
+++ b/tests/components/max44009/test.rp2040.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_max44009
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max44009
+    name: MAX44009 Brightness
+    internal: true
+    mode: low_power
+    address: 0x4A
+    update_interval: 30s
diff --git a/tests/components/max6675/test.esp32-c3-idf.yaml b/tests/components/max6675/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2f05102ca1
--- /dev/null
+++ b/tests/components/max6675/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 8
+    update_interval: 15s
diff --git a/tests/components/max6675/test.esp32-c3.yaml b/tests/components/max6675/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2f05102ca1
--- /dev/null
+++ b/tests/components/max6675/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 8
+    update_interval: 15s
diff --git a/tests/components/max6675/test.esp32-idf.yaml b/tests/components/max6675/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9771bf9d5f
--- /dev/null
+++ b/tests/components/max6675/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 12
+    update_interval: 15s
diff --git a/tests/components/max6675/test.esp32.yaml b/tests/components/max6675/test.esp32.yaml
new file mode 100644
index 0000000000..9771bf9d5f
--- /dev/null
+++ b/tests/components/max6675/test.esp32.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 12
+    update_interval: 15s
diff --git a/tests/components/max6675/test.esp8266.yaml b/tests/components/max6675/test.esp8266.yaml
new file mode 100644
index 0000000000..f67e9e04a8
--- /dev/null
+++ b/tests/components/max6675/test.esp8266.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 15
+    update_interval: 15s
diff --git a/tests/components/max6675/test.rp2040.yaml b/tests/components/max6675/test.rp2040.yaml
new file mode 100644
index 0000000000..89c0932f94
--- /dev/null
+++ b/tests/components/max6675/test.rp2040.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+sensor:
+  - platform: max6675
+    name: Temperature
+    cs_pin: 6
+    update_interval: 15s
diff --git a/tests/components/max6956/test.esp32-c3-idf.yaml b/tests/components/max6956/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..690941784c
--- /dev/null
+++ b/tests/components/max6956/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 5
+    sda: 4
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max6956/test.esp32-c3.yaml b/tests/components/max6956/test.esp32-c3.yaml
new file mode 100644
index 0000000000..690941784c
--- /dev/null
+++ b/tests/components/max6956/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 5
+    sda: 4
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max6956/test.esp32-idf.yaml b/tests/components/max6956/test.esp32-idf.yaml
new file mode 100644
index 0000000000..abd1404634
--- /dev/null
+++ b/tests/components/max6956/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 16
+    sda: 17
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max6956/test.esp32.yaml b/tests/components/max6956/test.esp32.yaml
new file mode 100644
index 0000000000..abd1404634
--- /dev/null
+++ b/tests/components/max6956/test.esp32.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 16
+    sda: 17
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max6956/test.esp8266.yaml b/tests/components/max6956/test.esp8266.yaml
new file mode 100644
index 0000000000..690941784c
--- /dev/null
+++ b/tests/components/max6956/test.esp8266.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 5
+    sda: 4
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max6956/test.rp2040.yaml b/tests/components/max6956/test.rp2040.yaml
new file mode 100644
index 0000000000..690941784c
--- /dev/null
+++ b/tests/components/max6956/test.rp2040.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_max6956
+    scl: 5
+    sda: 4
+
+max6956:
+  - id: max6956_1
+    address: 0x40
+
+binary_sensor:
+  - platform: gpio
+    name: Max Input Pin 4
+    pin:
+      max6956: max6956_1
+      number: 4
+      mode:
+        input: true
+        pullup: true
+      inverted: false
diff --git a/tests/components/max7219/test.esp32-c3-idf.yaml b/tests/components/max7219/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fa1ac15f33
--- /dev/null
+++ b/tests/components/max7219/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max7219
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: max7219
+    cs_pin: 8
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219/test.esp32-c3.yaml b/tests/components/max7219/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fa1ac15f33
--- /dev/null
+++ b/tests/components/max7219/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max7219
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: max7219
+    cs_pin: 8
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219/test.esp32-idf.yaml b/tests/components/max7219/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2985345a48
--- /dev/null
+++ b/tests/components/max7219/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: max7219
+    cs_pin: 12
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219/test.esp32.yaml b/tests/components/max7219/test.esp32.yaml
new file mode 100644
index 0000000000..2985345a48
--- /dev/null
+++ b/tests/components/max7219/test.esp32.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: max7219
+    cs_pin: 12
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219/test.esp8266.yaml b/tests/components/max7219/test.esp8266.yaml
new file mode 100644
index 0000000000..a8c280daff
--- /dev/null
+++ b/tests/components/max7219/test.esp8266.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: max7219
+    cs_pin: 15
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219/test.rp2040.yaml b/tests/components/max7219/test.rp2040.yaml
new file mode 100644
index 0000000000..37b2220649
--- /dev/null
+++ b/tests/components/max7219/test.rp2040.yaml
@@ -0,0 +1,12 @@
+spi:
+  - id: spi_max6675
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: max7219
+    cs_pin: 6
+    num_chips: 1
+    lambda: |-
+      it.print("01234567");
diff --git a/tests/components/max7219digit/test.esp32-c3-idf.yaml b/tests/components/max7219digit/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0c04784380
--- /dev/null
+++ b/tests/components/max7219digit/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: max7219digit
+    cs_pin: 8
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max7219digit/test.esp32-c3.yaml b/tests/components/max7219digit/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0c04784380
--- /dev/null
+++ b/tests/components/max7219digit/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: max7219digit
+    cs_pin: 8
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max7219digit/test.esp32-idf.yaml b/tests/components/max7219digit/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7f3aed964a
--- /dev/null
+++ b/tests/components/max7219digit/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: max7219digit
+    cs_pin: 12
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max7219digit/test.esp32.yaml b/tests/components/max7219digit/test.esp32.yaml
new file mode 100644
index 0000000000..7f3aed964a
--- /dev/null
+++ b/tests/components/max7219digit/test.esp32.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: max7219digit
+    cs_pin: 12
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max7219digit/test.esp8266.yaml b/tests/components/max7219digit/test.esp8266.yaml
new file mode 100644
index 0000000000..52587e8b0e
--- /dev/null
+++ b/tests/components/max7219digit/test.esp8266.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: max7219digit
+    cs_pin: 15
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max7219digit/test.rp2040.yaml b/tests/components/max7219digit/test.rp2040.yaml
new file mode 100644
index 0000000000..f986483ec2
--- /dev/null
+++ b/tests/components/max7219digit/test.rp2040.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_max7219digit
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: max7219digit
+    cs_pin: 6
+    num_chips: 4
+    rotate_chip: 0
+    intensity: 10
+    scroll_mode: STOP
+    id: my_matrix
+    lambda: |-
+      it.printdigit("hello");
diff --git a/tests/components/max9611/test.esp32-c3-idf.yaml b/tests/components/max9611/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..00f8330280
--- /dev/null
+++ b/tests/components/max9611/test.esp32-c3-idf.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/max9611/test.esp32-c3.yaml b/tests/components/max9611/test.esp32-c3.yaml
new file mode 100644
index 0000000000..00f8330280
--- /dev/null
+++ b/tests/components/max9611/test.esp32-c3.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/max9611/test.esp32-idf.yaml b/tests/components/max9611/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5c480cc815
--- /dev/null
+++ b/tests/components/max9611/test.esp32-idf.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/max9611/test.esp32.yaml b/tests/components/max9611/test.esp32.yaml
new file mode 100644
index 0000000000..5c480cc815
--- /dev/null
+++ b/tests/components/max9611/test.esp32.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/max9611/test.esp8266.yaml b/tests/components/max9611/test.esp8266.yaml
new file mode 100644
index 0000000000..00f8330280
--- /dev/null
+++ b/tests/components/max9611/test.esp8266.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/max9611/test.rp2040.yaml b/tests/components/max9611/test.rp2040.yaml
new file mode 100644
index 0000000000..00f8330280
--- /dev/null
+++ b/tests/components/max9611/test.rp2040.yaml
@@ -0,0 +1,18 @@
+i2c:
+  - id: i2c_max9611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: max9611
+    shunt_resistance: 0.2 ohm
+    gain: 1X
+    voltage:
+      name: Max9611 Voltage
+    current:
+      name: Max9611 Current
+    power:
+      name: Max9611 Watts
+    temperature:
+      name: Max9611 Temp
+    update_interval: 1s
diff --git a/tests/components/mcp23008/test.esp32-c3-idf.yaml b/tests/components/mcp23008/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..eabd5a7311
--- /dev/null
+++ b/tests/components/mcp23008/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 5
+    sda: 4
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23008/test.esp32-c3.yaml b/tests/components/mcp23008/test.esp32-c3.yaml
new file mode 100644
index 0000000000..eabd5a7311
--- /dev/null
+++ b/tests/components/mcp23008/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 5
+    sda: 4
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23008/test.esp32-idf.yaml b/tests/components/mcp23008/test.esp32-idf.yaml
new file mode 100644
index 0000000000..cbf03f371c
--- /dev/null
+++ b/tests/components/mcp23008/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 16
+    sda: 17
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23008/test.esp32.yaml b/tests/components/mcp23008/test.esp32.yaml
new file mode 100644
index 0000000000..cbf03f371c
--- /dev/null
+++ b/tests/components/mcp23008/test.esp32.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 16
+    sda: 17
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23008/test.esp8266.yaml b/tests/components/mcp23008/test.esp8266.yaml
new file mode 100644
index 0000000000..eabd5a7311
--- /dev/null
+++ b/tests/components/mcp23008/test.esp8266.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 5
+    sda: 4
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23008/test.rp2040.yaml b/tests/components/mcp23008/test.rp2040.yaml
new file mode 100644
index 0000000000..eabd5a7311
--- /dev/null
+++ b/tests/components/mcp23008/test.rp2040.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23008
+    scl: 5
+    sda: 4
+
+mcp23008:
+  id: mcp23008_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23008_binary_sensor
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23008_switch
+    pin:
+      mcp23xxx: mcp23008_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.esp32-c3-idf.yaml b/tests/components/mcp23016/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2211931e3d
--- /dev/null
+++ b/tests/components/mcp23016/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 5
+    sda: 4
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.esp32-c3.yaml b/tests/components/mcp23016/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2211931e3d
--- /dev/null
+++ b/tests/components/mcp23016/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 5
+    sda: 4
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.esp32-idf.yaml b/tests/components/mcp23016/test.esp32-idf.yaml
new file mode 100644
index 0000000000..48574a9b01
--- /dev/null
+++ b/tests/components/mcp23016/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 16
+    sda: 17
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.esp32.yaml b/tests/components/mcp23016/test.esp32.yaml
new file mode 100644
index 0000000000..48574a9b01
--- /dev/null
+++ b/tests/components/mcp23016/test.esp32.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 16
+    sda: 17
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.esp8266.yaml b/tests/components/mcp23016/test.esp8266.yaml
new file mode 100644
index 0000000000..2211931e3d
--- /dev/null
+++ b/tests/components/mcp23016/test.esp8266.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 5
+    sda: 4
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23016/test.rp2040.yaml b/tests/components/mcp23016/test.rp2040.yaml
new file mode 100644
index 0000000000..2211931e3d
--- /dev/null
+++ b/tests/components/mcp23016/test.rp2040.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23016
+    scl: 5
+    sda: 4
+
+mcp23016:
+  id: mcp23016_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23016_binary_sensor
+    pin:
+      mcp23016: mcp23016_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23016_switch
+    pin:
+      mcp23016: mcp23016_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.esp32-c3-idf.yaml b/tests/components/mcp23017/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..863b2b8f0b
--- /dev/null
+++ b/tests/components/mcp23017/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 5
+    sda: 4
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.esp32-c3.yaml b/tests/components/mcp23017/test.esp32-c3.yaml
new file mode 100644
index 0000000000..863b2b8f0b
--- /dev/null
+++ b/tests/components/mcp23017/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 5
+    sda: 4
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.esp32-idf.yaml b/tests/components/mcp23017/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9b7c45eb8a
--- /dev/null
+++ b/tests/components/mcp23017/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 16
+    sda: 17
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.esp32.yaml b/tests/components/mcp23017/test.esp32.yaml
new file mode 100644
index 0000000000..9b7c45eb8a
--- /dev/null
+++ b/tests/components/mcp23017/test.esp32.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 16
+    sda: 17
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.esp8266.yaml b/tests/components/mcp23017/test.esp8266.yaml
new file mode 100644
index 0000000000..863b2b8f0b
--- /dev/null
+++ b/tests/components/mcp23017/test.esp8266.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 5
+    sda: 4
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23017/test.rp2040.yaml b/tests/components/mcp23017/test.rp2040.yaml
new file mode 100644
index 0000000000..863b2b8f0b
--- /dev/null
+++ b/tests/components/mcp23017/test.rp2040.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_mcp23017
+    scl: 5
+    sda: 4
+
+mcp23017:
+  id: mcp23017_hub
+
+binary_sensor:
+  - platform: gpio
+    id: mcp23017_binary_sensor
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 0
+      mode: INPUT
+
+switch:
+  - platform: gpio
+    id: mcp23017_switch
+    pin:
+      mcp23xxx: mcp23017_hub
+      number: 1
+      mode: OUTPUT
diff --git a/tests/components/mcp23s08/test.esp32-c3-idf.yaml b/tests/components/mcp23s08/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f1af8a71a9
--- /dev/null
+++ b/tests/components/mcp23s08/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 8
+    deviceaddress: 0
diff --git a/tests/components/mcp23s08/test.esp32-c3.yaml b/tests/components/mcp23s08/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f1af8a71a9
--- /dev/null
+++ b/tests/components/mcp23s08/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 8
+    deviceaddress: 0
diff --git a/tests/components/mcp23s08/test.esp32-idf.yaml b/tests/components/mcp23s08/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0b26035c3e
--- /dev/null
+++ b/tests/components/mcp23s08/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 12
+    deviceaddress: 0
diff --git a/tests/components/mcp23s08/test.esp32.yaml b/tests/components/mcp23s08/test.esp32.yaml
new file mode 100644
index 0000000000..0b26035c3e
--- /dev/null
+++ b/tests/components/mcp23s08/test.esp32.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 12
+    deviceaddress: 0
diff --git a/tests/components/mcp23s08/test.esp8266.yaml b/tests/components/mcp23s08/test.esp8266.yaml
new file mode 100644
index 0000000000..eff856aca9
--- /dev/null
+++ b/tests/components/mcp23s08/test.esp8266.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 15
+    deviceaddress: 0
diff --git a/tests/components/mcp23s08/test.rp2040.yaml b/tests/components/mcp23s08/test.rp2040.yaml
new file mode 100644
index 0000000000..1b23d2d3b5
--- /dev/null
+++ b/tests/components/mcp23s08/test.rp2040.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s08
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+mcp23s08:
+  - id: mcp23s08_hub
+    cs_pin: 6
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.esp32-c3-idf.yaml b/tests/components/mcp23s17/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d83f66d3b1
--- /dev/null
+++ b/tests/components/mcp23s17/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 8
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.esp32-c3.yaml b/tests/components/mcp23s17/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d83f66d3b1
--- /dev/null
+++ b/tests/components/mcp23s17/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 8
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.esp32-idf.yaml b/tests/components/mcp23s17/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9a42c12e85
--- /dev/null
+++ b/tests/components/mcp23s17/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 12
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.esp32.yaml b/tests/components/mcp23s17/test.esp32.yaml
new file mode 100644
index 0000000000..9a42c12e85
--- /dev/null
+++ b/tests/components/mcp23s17/test.esp32.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 12
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.esp8266.yaml b/tests/components/mcp23s17/test.esp8266.yaml
new file mode 100644
index 0000000000..36dac63f6f
--- /dev/null
+++ b/tests/components/mcp23s17/test.esp8266.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 15
+    deviceaddress: 0
diff --git a/tests/components/mcp23s17/test.rp2040.yaml b/tests/components/mcp23s17/test.rp2040.yaml
new file mode 100644
index 0000000000..2730f6a9d6
--- /dev/null
+++ b/tests/components/mcp23s17/test.rp2040.yaml
@@ -0,0 +1,10 @@
+spi:
+  - id: spi_mcp23s17
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+mcp23s17:
+  - id: mcp23s17_hub
+    cs_pin: 6
+    deviceaddress: 0
diff --git a/tests/components/mcp2515/test.esp32-c3-idf.yaml b/tests/components/mcp2515/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3ceeea268f
--- /dev/null
+++ b/tests/components/mcp2515/test.esp32-c3-idf.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 8
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp2515/test.esp32-c3.yaml b/tests/components/mcp2515/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3ceeea268f
--- /dev/null
+++ b/tests/components/mcp2515/test.esp32-c3.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 8
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp2515/test.esp32-idf.yaml b/tests/components/mcp2515/test.esp32-idf.yaml
new file mode 100644
index 0000000000..07fae36cc3
--- /dev/null
+++ b/tests/components/mcp2515/test.esp32-idf.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 12
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp2515/test.esp32.yaml b/tests/components/mcp2515/test.esp32.yaml
new file mode 100644
index 0000000000..07fae36cc3
--- /dev/null
+++ b/tests/components/mcp2515/test.esp32.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 12
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp2515/test.esp8266.yaml b/tests/components/mcp2515/test.esp8266.yaml
new file mode 100644
index 0000000000..1096a0e809
--- /dev/null
+++ b/tests/components/mcp2515/test.esp8266.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 15
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp2515/test.rp2040.yaml b/tests/components/mcp2515/test.rp2040.yaml
new file mode 100644
index 0000000000..678c817d3d
--- /dev/null
+++ b/tests/components/mcp2515/test.rp2040.yaml
@@ -0,0 +1,44 @@
+spi:
+  - id: spi_mcp2515
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+canbus:
+  - platform: mcp2515
+    id: mcp2515_can
+    cs_pin: 6
+    can_id: 4
+    bit_rate: 50kbps
+    on_frame:
+      - can_id: 500
+        then:
+          - lambda: |-
+              std::string b(x.begin(), x.end());
+              ESP_LOGD("can_id 500", "%s", b.c_str());
+      - can_id: 23
+        then:
+          - if:
+              condition:
+                lambda: "return x[0] == 0x11;"
+              then:
+                logger.log: "x[0] == 0x11"
+      - can_id: 0b00000000000000000000001000000
+        can_id_mask: 0b11111000000000011111111000000
+        use_extended_id: true
+        then:
+          - lambda: |-
+              auto pdo_id = can_id >> 14;
+              switch (pdo_id)
+              {
+                case 117:
+                  ESP_LOGD("canbus", "exhaust_fan_duty");
+                  break;
+                case 118:
+                  ESP_LOGD("canbus", "supply_fan_duty");
+                  break;
+                case 119:
+                  ESP_LOGD("canbus", "supply_fan_flow");
+                  break;
+                // to be continued...
+              }
diff --git a/tests/components/mcp3008/test.esp32-c3-idf.yaml b/tests/components/mcp3008/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9e66372e4f
--- /dev/null
+++ b/tests/components/mcp3008/test.esp32-c3-idf.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 8
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3008/test.esp32-c3.yaml b/tests/components/mcp3008/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9e66372e4f
--- /dev/null
+++ b/tests/components/mcp3008/test.esp32-c3.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 8
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3008/test.esp32-idf.yaml b/tests/components/mcp3008/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a66fbeb7a1
--- /dev/null
+++ b/tests/components/mcp3008/test.esp32-idf.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 12
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3008/test.esp32.yaml b/tests/components/mcp3008/test.esp32.yaml
new file mode 100644
index 0000000000..a66fbeb7a1
--- /dev/null
+++ b/tests/components/mcp3008/test.esp32.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 12
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3008/test.esp8266.yaml b/tests/components/mcp3008/test.esp8266.yaml
new file mode 100644
index 0000000000..eaccca0765
--- /dev/null
+++ b/tests/components/mcp3008/test.esp8266.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 15
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3008/test.rp2040.yaml b/tests/components/mcp3008/test.rp2040.yaml
new file mode 100644
index 0000000000..8ab9630553
--- /dev/null
+++ b/tests/components/mcp3008/test.rp2040.yaml
@@ -0,0 +1,17 @@
+spi:
+  - id: spi_mcp3008
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+mcp3008:
+  - id: mcp3008_hub
+    cs_pin: 6
+
+sensor:
+  - platform: mcp3008
+    id: mcp3008_sensor
+    mcp3008_id: mcp3008_hub
+    number: 0
+    reference_voltage: 3.19
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.esp32-c3-idf.yaml b/tests/components/mcp3204/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..5bf5ba81e1
--- /dev/null
+++ b/tests/components/mcp3204/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 8
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.esp32-c3.yaml b/tests/components/mcp3204/test.esp32-c3.yaml
new file mode 100644
index 0000000000..5bf5ba81e1
--- /dev/null
+++ b/tests/components/mcp3204/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 8
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.esp32-idf.yaml b/tests/components/mcp3204/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c340797c8e
--- /dev/null
+++ b/tests/components/mcp3204/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 12
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.esp32.yaml b/tests/components/mcp3204/test.esp32.yaml
new file mode 100644
index 0000000000..c340797c8e
--- /dev/null
+++ b/tests/components/mcp3204/test.esp32.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 12
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.esp8266.yaml b/tests/components/mcp3204/test.esp8266.yaml
new file mode 100644
index 0000000000..d208e3e06c
--- /dev/null
+++ b/tests/components/mcp3204/test.esp8266.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 15
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp3204/test.rp2040.yaml b/tests/components/mcp3204/test.rp2040.yaml
new file mode 100644
index 0000000000..63f30e3621
--- /dev/null
+++ b/tests/components/mcp3204/test.rp2040.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_mcp3204
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+mcp3204:
+  - id: mcp3204_hub
+    cs_pin: 6
+
+sensor:
+  - platform: mcp3204
+    id: mcp3204_sensor
+    mcp3204_id: mcp3204_hub
+    number: 0
+    update_interval: 5s
diff --git a/tests/components/mcp4725/test.esp32-c3-idf.yaml b/tests/components/mcp4725/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..5fc799203d
--- /dev/null
+++ b/tests/components/mcp4725/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4725/test.esp32-c3.yaml b/tests/components/mcp4725/test.esp32-c3.yaml
new file mode 100644
index 0000000000..5fc799203d
--- /dev/null
+++ b/tests/components/mcp4725/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4725/test.esp32-idf.yaml b/tests/components/mcp4725/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a523ad95e1
--- /dev/null
+++ b/tests/components/mcp4725/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 16
+    sda: 17
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4725/test.esp32.yaml b/tests/components/mcp4725/test.esp32.yaml
new file mode 100644
index 0000000000..a523ad95e1
--- /dev/null
+++ b/tests/components/mcp4725/test.esp32.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 16
+    sda: 17
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4725/test.esp8266.yaml b/tests/components/mcp4725/test.esp8266.yaml
new file mode 100644
index 0000000000..5fc799203d
--- /dev/null
+++ b/tests/components/mcp4725/test.esp8266.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4725/test.rp2040.yaml b/tests/components/mcp4725/test.rp2040.yaml
new file mode 100644
index 0000000000..5fc799203d
--- /dev/null
+++ b/tests/components/mcp4725/test.rp2040.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp4725
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp4725
+    id: mcp4725_dac_output
diff --git a/tests/components/mcp4728/test.esp32-c3-idf.yaml b/tests/components/mcp4728/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2f24dd0b8c
--- /dev/null
+++ b/tests/components/mcp4728/test.esp32-c3-idf.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 5
+    sda: 4
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp4728/test.esp32-c3.yaml b/tests/components/mcp4728/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2f24dd0b8c
--- /dev/null
+++ b/tests/components/mcp4728/test.esp32-c3.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 5
+    sda: 4
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp4728/test.esp32-idf.yaml b/tests/components/mcp4728/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b29a6ee53c
--- /dev/null
+++ b/tests/components/mcp4728/test.esp32-idf.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 16
+    sda: 17
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp4728/test.esp32.yaml b/tests/components/mcp4728/test.esp32.yaml
new file mode 100644
index 0000000000..b29a6ee53c
--- /dev/null
+++ b/tests/components/mcp4728/test.esp32.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 16
+    sda: 17
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp4728/test.esp8266.yaml b/tests/components/mcp4728/test.esp8266.yaml
new file mode 100644
index 0000000000..2f24dd0b8c
--- /dev/null
+++ b/tests/components/mcp4728/test.esp8266.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 5
+    sda: 4
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp4728/test.rp2040.yaml b/tests/components/mcp4728/test.rp2040.yaml
new file mode 100644
index 0000000000..2f24dd0b8c
--- /dev/null
+++ b/tests/components/mcp4728/test.rp2040.yaml
@@ -0,0 +1,31 @@
+i2c:
+  - id: i2c_mcp4728
+    scl: 5
+    sda: 4
+
+mcp4728:
+  - id: mcp4728_dac
+
+output:
+  - platform: mcp4728
+    id: mcp4728_dac_output_a
+    channel: A
+    vref: vdd
+    power_down: normal
+  - platform: mcp4728
+    id: mcp4728_dac_output_b
+    channel: B
+    vref: internal
+    gain: X1
+    power_down: gnd_1k
+  - platform: mcp4728
+    id: mcp4728_dac_output_c
+    channel: C
+    vref: vdd
+    power_down: gnd_100k
+  - platform: mcp4728
+    id: mcp4728_dac_output_d
+    channel: D
+    vref: internal
+    gain: X2
+    power_down: gnd_500k
diff --git a/tests/components/mcp47a1/test.esp32-c3-idf.yaml b/tests/components/mcp47a1/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..68273e00eb
--- /dev/null
+++ b/tests/components/mcp47a1/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp47a1/test.esp32-c3.yaml b/tests/components/mcp47a1/test.esp32-c3.yaml
new file mode 100644
index 0000000000..68273e00eb
--- /dev/null
+++ b/tests/components/mcp47a1/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp47a1/test.esp32-idf.yaml b/tests/components/mcp47a1/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9e2133de66
--- /dev/null
+++ b/tests/components/mcp47a1/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 16
+    sda: 17
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp47a1/test.esp32.yaml b/tests/components/mcp47a1/test.esp32.yaml
new file mode 100644
index 0000000000..9e2133de66
--- /dev/null
+++ b/tests/components/mcp47a1/test.esp32.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 16
+    sda: 17
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp47a1/test.esp8266.yaml b/tests/components/mcp47a1/test.esp8266.yaml
new file mode 100644
index 0000000000..68273e00eb
--- /dev/null
+++ b/tests/components/mcp47a1/test.esp8266.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp47a1/test.rp2040.yaml b/tests/components/mcp47a1/test.rp2040.yaml
new file mode 100644
index 0000000000..68273e00eb
--- /dev/null
+++ b/tests/components/mcp47a1/test.rp2040.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp47a1
+    scl: 5
+    sda: 4
+
+output:
+  - platform: mcp47a1
+    id: output_mcp47a1
diff --git a/tests/components/mcp9600/test.esp32-c3-idf.yaml b/tests/components/mcp9600/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b07f4589ce
--- /dev/null
+++ b/tests/components/mcp9600/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9600/test.esp32-c3.yaml b/tests/components/mcp9600/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b07f4589ce
--- /dev/null
+++ b/tests/components/mcp9600/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9600/test.esp32-idf.yaml b/tests/components/mcp9600/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0c94f099ae
--- /dev/null
+++ b/tests/components/mcp9600/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9600/test.esp32.yaml b/tests/components/mcp9600/test.esp32.yaml
new file mode 100644
index 0000000000..0c94f099ae
--- /dev/null
+++ b/tests/components/mcp9600/test.esp32.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9600/test.esp8266.yaml b/tests/components/mcp9600/test.esp8266.yaml
new file mode 100644
index 0000000000..b07f4589ce
--- /dev/null
+++ b/tests/components/mcp9600/test.esp8266.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9600/test.rp2040.yaml b/tests/components/mcp9600/test.rp2040.yaml
new file mode 100644
index 0000000000..b07f4589ce
--- /dev/null
+++ b/tests/components/mcp9600/test.rp2040.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mcp9600
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9600
+    thermocouple_type: K
+    hot_junction:
+      name: Thermocouple Temperature
+    cold_junction:
+      name: Ambient Temperature
diff --git a/tests/components/mcp9808/test.esp32-c3-idf.yaml b/tests/components/mcp9808/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..86b4d7f181
--- /dev/null
+++ b/tests/components/mcp9808/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mcp9808/test.esp32-c3.yaml b/tests/components/mcp9808/test.esp32-c3.yaml
new file mode 100644
index 0000000000..86b4d7f181
--- /dev/null
+++ b/tests/components/mcp9808/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mcp9808/test.esp32-idf.yaml b/tests/components/mcp9808/test.esp32-idf.yaml
new file mode 100644
index 0000000000..1e5affdac0
--- /dev/null
+++ b/tests/components/mcp9808/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mcp9808/test.esp32.yaml b/tests/components/mcp9808/test.esp32.yaml
new file mode 100644
index 0000000000..1e5affdac0
--- /dev/null
+++ b/tests/components/mcp9808/test.esp32.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mcp9808/test.esp8266.yaml b/tests/components/mcp9808/test.esp8266.yaml
new file mode 100644
index 0000000000..86b4d7f181
--- /dev/null
+++ b/tests/components/mcp9808/test.esp8266.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mcp9808/test.rp2040.yaml b/tests/components/mcp9808/test.rp2040.yaml
new file mode 100644
index 0000000000..86b4d7f181
--- /dev/null
+++ b/tests/components/mcp9808/test.rp2040.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_mcp9808
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mcp9808
+    name: MCP9808 Temperature
diff --git a/tests/components/mdns/test.esp32-c3-idf.yaml b/tests/components/mdns/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.esp32-c3-idf.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/mdns/test.esp32-c3.yaml b/tests/components/mdns/test.esp32-c3.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.esp32-c3.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/mdns/test.esp32-idf.yaml b/tests/components/mdns/test.esp32-idf.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.esp32-idf.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/mdns/test.esp32.yaml b/tests/components/mdns/test.esp32.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.esp32.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/mdns/test.esp8266.yaml b/tests/components/mdns/test.esp8266.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.esp8266.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/mdns/test.rp2040.yaml b/tests/components/mdns/test.rp2040.yaml
new file mode 100644
index 0000000000..bc31e32783
--- /dev/null
+++ b/tests/components/mdns/test.rp2040.yaml
@@ -0,0 +1,6 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mdns:
+  disabled: false
diff --git a/tests/components/media_player/test.esp32.yaml b/tests/components/media_player/test.esp32.yaml
new file mode 100644
index 0000000000..24b85cd474
--- /dev/null
+++ b/tests/components/media_player/test.esp32.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+i2s_audio:
+  i2s_lrclk_pin: 13
+  i2s_bclk_pin: 14
+  i2s_mclk_pin: 15
+
+media_player:
+  - platform: i2s_audio
+    name: None
+    dac_type: external
+    i2s_dout_pin: 18
+    mute_pin: 19
+    on_state:
+      - media_player.play:
+      - media_player.play_media: http://localhost/media.mp3
+      - media_player.play_media: !lambda 'return "http://localhost/media.mp3";'
+    on_idle:
+      - media_player.pause:
+    on_play:
+      - media_player.stop:
+    on_pause:
+      - media_player.toggle:
+      - wait_until:
+          media_player.is_idle:
+      - wait_until:
+          media_player.is_playing:
+      - media_player.volume_up:
+      - media_player.volume_down:
+      - media_player.volume_set: 50%
diff --git a/tests/components/mhz19/test.esp32-c3-idf.yaml b/tests/components/mhz19/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..1edfa49c23
--- /dev/null
+++ b/tests/components/mhz19/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s
diff --git a/tests/components/mhz19/test.esp32-c3.yaml b/tests/components/mhz19/test.esp32-c3.yaml
new file mode 100644
index 0000000000..1edfa49c23
--- /dev/null
+++ b/tests/components/mhz19/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s
diff --git a/tests/components/mhz19/test.esp32-idf.yaml b/tests/components/mhz19/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0e30713b54
--- /dev/null
+++ b/tests/components/mhz19/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s
diff --git a/tests/components/mhz19/test.esp32.yaml b/tests/components/mhz19/test.esp32.yaml
new file mode 100644
index 0000000000..0e30713b54
--- /dev/null
+++ b/tests/components/mhz19/test.esp32.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s
diff --git a/tests/components/mhz19/test.esp8266.yaml b/tests/components/mhz19/test.esp8266.yaml
new file mode 100644
index 0000000000..1edfa49c23
--- /dev/null
+++ b/tests/components/mhz19/test.esp8266.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s
diff --git a/tests/components/mhz19/test.rp2040.yaml b/tests/components/mhz19/test.rp2040.yaml
new file mode 100644
index 0000000000..1edfa49c23
--- /dev/null
+++ b/tests/components/mhz19/test.rp2040.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_mhz19
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: mhz19
+    co2:
+      name: MH-Z19 CO2 Value
+    temperature:
+      name: MH-Z19 Temperature
+    automatic_baseline_calibration: false
+    update_interval: 15s

From c0dc9c20fc7b383659d962cf4ef6de283ca45ba1 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 22:45:25 -0500
Subject: [PATCH 21/81] Add some components to the new testing framework (M
 part 2) (#6208)

---
 .../micronova/test.esp32-c3-idf.yaml          | 49 +++++++++++++++
 tests/components/micronova/test.esp32-c3.yaml | 49 +++++++++++++++
 .../components/micronova/test.esp32-idf.yaml  | 49 +++++++++++++++
 tests/components/micronova/test.esp32.yaml    | 49 +++++++++++++++
 tests/components/micronova/test.esp8266.yaml  | 49 +++++++++++++++
 tests/components/micronova/test.rp2040.yaml   | 49 +++++++++++++++
 .../microphone/test.esp32-c3-idf.yaml         | 11 ++++
 .../components/microphone/test.esp32-c3.yaml  | 11 ++++
 .../components/microphone/test.esp32-idf.yaml | 15 +++++
 tests/components/microphone/test.esp32.yaml   | 15 +++++
 .../mics_4514/test.esp32-c3-idf.yaml          | 20 +++++++
 tests/components/mics_4514/test.esp32-c3.yaml | 20 +++++++
 .../components/mics_4514/test.esp32-idf.yaml  | 20 +++++++
 tests/components/mics_4514/test.esp32.yaml    | 20 +++++++
 tests/components/mics_4514/test.esp8266.yaml  | 20 +++++++
 tests/components/mics_4514/test.rp2040.yaml   | 20 +++++++
 tests/components/midea/test.esp32-c3.yaml     | 59 +++++++++++++++++++
 tests/components/midea/test.esp32.yaml        | 59 +++++++++++++++++++
 tests/components/midea/test.esp8266.yaml      | 59 +++++++++++++++++++
 .../midea_ir/test.esp32-c3-idf.yaml           |  8 +++
 tests/components/midea_ir/test.esp32-c3.yaml  |  8 +++
 tests/components/midea_ir/test.esp32-idf.yaml |  8 +++
 tests/components/midea_ir/test.esp32.yaml     |  8 +++
 tests/components/midea_ir/test.esp8266.yaml   |  8 +++
 .../mitsubishi/test.esp32-c3-idf.yaml         |  7 +++
 .../components/mitsubishi/test.esp32-c3.yaml  |  7 +++
 .../components/mitsubishi/test.esp32-idf.yaml |  7 +++
 tests/components/mitsubishi/test.esp32.yaml   |  7 +++
 tests/components/mitsubishi/test.esp8266.yaml |  7 +++
 .../mlx90393/test.esp32-c3-idf.yaml           | 20 +++++++
 tests/components/mlx90393/test.esp32-c3.yaml  | 20 +++++++
 tests/components/mlx90393/test.esp32-idf.yaml | 20 +++++++
 tests/components/mlx90393/test.esp32.yaml     | 20 +++++++
 tests/components/mlx90393/test.esp8266.yaml   | 20 +++++++
 tests/components/mlx90393/test.rp2040.yaml    | 20 +++++++
 .../mlx90614/test.esp32-c3-idf.yaml           | 12 ++++
 tests/components/mlx90614/test.esp32-c3.yaml  | 12 ++++
 tests/components/mlx90614/test.esp32-idf.yaml | 12 ++++
 tests/components/mlx90614/test.esp32.yaml     | 12 ++++
 tests/components/mlx90614/test.esp8266.yaml   | 12 ++++
 tests/components/mlx90614/test.rp2040.yaml    | 12 ++++
 .../components/mmc5603/test.esp32-c3-idf.yaml | 14 +++++
 tests/components/mmc5603/test.esp32-c3.yaml   | 14 +++++
 tests/components/mmc5603/test.esp32-idf.yaml  | 14 +++++
 tests/components/mmc5603/test.esp32.yaml      | 14 +++++
 tests/components/mmc5603/test.esp8266.yaml    | 14 +++++
 tests/components/mmc5603/test.rp2040.yaml     | 14 +++++
 .../components/mmc5983/test.esp32-c3-idf.yaml | 16 +++++
 tests/components/mmc5983/test.esp32-c3.yaml   | 16 +++++
 tests/components/mmc5983/test.esp32-idf.yaml  | 16 +++++
 tests/components/mmc5983/test.esp32.yaml      | 16 +++++
 tests/components/mmc5983/test.esp8266.yaml    | 16 +++++
 tests/components/mmc5983/test.rp2040.yaml     | 16 +++++
 .../components/modbus/test.esp32-c3-idf.yaml  |  9 +++
 tests/components/modbus/test.esp32-c3.yaml    |  9 +++
 tests/components/modbus/test.esp32-idf.yaml   |  9 +++
 tests/components/modbus/test.esp32.yaml       |  9 +++
 tests/components/modbus/test.esp8266.yaml     |  9 +++
 tests/components/modbus/test.rp2040.yaml      |  9 +++
 .../modbus_controller/test.esp32-c3-idf.yaml  | 14 +++++
 .../modbus_controller/test.esp32-c3.yaml      | 14 +++++
 .../modbus_controller/test.esp32-idf.yaml     | 14 +++++
 .../modbus_controller/test.esp32.yaml         | 14 +++++
 .../modbus_controller/test.esp8266.yaml       | 14 +++++
 .../modbus_controller/test.rp2040.yaml        | 14 +++++
 .../monochromatic/test.esp32-c3-idf.yaml      | 40 +++++++++++++
 .../monochromatic/test.esp32-c3.yaml          | 40 +++++++++++++
 .../monochromatic/test.esp32-idf.yaml         | 40 +++++++++++++
 .../components/monochromatic/test.esp32.yaml  | 40 +++++++++++++
 .../monochromatic/test.esp8266.yaml           | 40 +++++++++++++
 .../components/monochromatic/test.rp2040.yaml | 40 +++++++++++++
 .../mopeka_ble/test.esp32-c3-idf.yaml         |  3 +
 .../components/mopeka_ble/test.esp32-c3.yaml  |  3 +
 .../components/mopeka_ble/test.esp32-idf.yaml |  3 +
 tests/components/mopeka_ble/test.esp32.yaml   |  3 +
 .../mopeka_pro_check/test.esp32-c3-idf.yaml   | 16 +++++
 .../mopeka_pro_check/test.esp32-c3.yaml       | 16 +++++
 .../mopeka_pro_check/test.esp32-idf.yaml      | 16 +++++
 .../mopeka_pro_check/test.esp32.yaml          | 16 +++++
 .../mopeka_std_check/test.esp32-c3-idf.yaml   | 16 +++++
 .../mopeka_std_check/test.esp32-c3.yaml       | 16 +++++
 .../mopeka_std_check/test.esp32-idf.yaml      | 16 +++++
 .../mpl3115a2/test.esp32-c3-idf.yaml          | 12 ++++
 tests/components/mpl3115a2/test.esp32-c3.yaml | 12 ++++
 .../components/mpl3115a2/test.esp32-idf.yaml  | 12 ++++
 tests/components/mpl3115a2/test.esp32.yaml    | 12 ++++
 tests/components/mpl3115a2/test.esp8266.yaml  | 12 ++++
 tests/components/mpl3115a2/test.rp2040.yaml   | 12 ++++
 .../components/mpr121/test.esp32-c3-idf.yaml  | 26 ++++++++
 tests/components/mpr121/test.esp32-c3.yaml    | 26 ++++++++
 tests/components/mpr121/test.esp32-idf.yaml   | 26 ++++++++
 tests/components/mpr121/test.esp32.yaml       | 26 ++++++++
 tests/components/mpr121/test.esp8266.yaml     | 26 ++++++++
 tests/components/mpr121/test.rp2040.yaml      | 26 ++++++++
 .../components/mpu6050/test.esp32-c3-idf.yaml | 22 +++++++
 tests/components/mpu6050/test.esp32-c3.yaml   | 22 +++++++
 tests/components/mpu6050/test.esp32-idf.yaml  | 22 +++++++
 tests/components/mpu6050/test.esp32.yaml      | 22 +++++++
 tests/components/mpu6050/test.esp8266.yaml    | 22 +++++++
 tests/components/mpu6050/test.rp2040.yaml     | 22 +++++++
 .../components/mpu6886/test.esp32-c3-idf.yaml | 22 +++++++
 tests/components/mpu6886/test.esp32-c3.yaml   | 22 +++++++
 tests/components/mpu6886/test.esp32-idf.yaml  | 22 +++++++
 tests/components/mpu6886/test.esp32.yaml      | 22 +++++++
 tests/components/mpu6886/test.esp8266.yaml    | 22 +++++++
 tests/components/mpu6886/test.rp2040.yaml     | 22 +++++++
 tests/components/mqtt/test.esp32-c3-idf.yaml  | 16 +++++
 tests/components/mqtt/test.esp32-c3.yaml      | 15 +++++
 tests/components/mqtt/test.esp32-idf.yaml     | 16 +++++
 tests/components/mqtt/test.esp32.yaml         | 15 +++++
 tests/components/mqtt/test.esp8266.yaml       | 15 +++++
 .../mqtt_subscribe/test.esp32-c3-idf.yaml     | 37 ++++++++++++
 .../mqtt_subscribe/test.esp32-c3.yaml         | 36 +++++++++++
 .../mqtt_subscribe/test.esp32-idf.yaml        | 37 ++++++++++++
 .../components/mqtt_subscribe/test.esp32.yaml | 36 +++++++++++
 .../mqtt_subscribe/test.esp8266.yaml          | 36 +++++++++++
 .../components/ms5611/test.esp32-c3-idf.yaml  | 13 ++++
 tests/components/ms5611/test.esp32-c3.yaml    | 13 ++++
 tests/components/ms5611/test.esp32-idf.yaml   | 13 ++++
 tests/components/ms5611/test.esp32.yaml       | 13 ++++
 tests/components/ms5611/test.esp8266.yaml     | 13 ++++
 tests/components/ms5611/test.rp2040.yaml      | 13 ++++
 .../components/my9231/test.esp32-c3-idf.yaml  | 26 ++++++++
 tests/components/my9231/test.esp32-c3.yaml    | 26 ++++++++
 tests/components/my9231/test.esp32-idf.yaml   | 26 ++++++++
 tests/components/my9231/test.esp32.yaml       | 26 ++++++++
 tests/components/my9231/test.esp8266.yaml     | 26 ++++++++
 tests/components/my9231/test.rp2040.yaml      | 26 ++++++++
 128 files changed, 2577 insertions(+)
 create mode 100644 tests/components/micronova/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/micronova/test.esp32-c3.yaml
 create mode 100644 tests/components/micronova/test.esp32-idf.yaml
 create mode 100644 tests/components/micronova/test.esp32.yaml
 create mode 100644 tests/components/micronova/test.esp8266.yaml
 create mode 100644 tests/components/micronova/test.rp2040.yaml
 create mode 100644 tests/components/microphone/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/microphone/test.esp32-c3.yaml
 create mode 100644 tests/components/microphone/test.esp32-idf.yaml
 create mode 100644 tests/components/microphone/test.esp32.yaml
 create mode 100644 tests/components/mics_4514/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mics_4514/test.esp32-c3.yaml
 create mode 100644 tests/components/mics_4514/test.esp32-idf.yaml
 create mode 100644 tests/components/mics_4514/test.esp32.yaml
 create mode 100644 tests/components/mics_4514/test.esp8266.yaml
 create mode 100644 tests/components/mics_4514/test.rp2040.yaml
 create mode 100644 tests/components/midea/test.esp32-c3.yaml
 create mode 100644 tests/components/midea/test.esp32.yaml
 create mode 100644 tests/components/midea/test.esp8266.yaml
 create mode 100644 tests/components/midea_ir/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/midea_ir/test.esp32-c3.yaml
 create mode 100644 tests/components/midea_ir/test.esp32-idf.yaml
 create mode 100644 tests/components/midea_ir/test.esp32.yaml
 create mode 100644 tests/components/midea_ir/test.esp8266.yaml
 create mode 100644 tests/components/mitsubishi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mitsubishi/test.esp32-c3.yaml
 create mode 100644 tests/components/mitsubishi/test.esp32-idf.yaml
 create mode 100644 tests/components/mitsubishi/test.esp32.yaml
 create mode 100644 tests/components/mitsubishi/test.esp8266.yaml
 create mode 100644 tests/components/mlx90393/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mlx90393/test.esp32-c3.yaml
 create mode 100644 tests/components/mlx90393/test.esp32-idf.yaml
 create mode 100644 tests/components/mlx90393/test.esp32.yaml
 create mode 100644 tests/components/mlx90393/test.esp8266.yaml
 create mode 100644 tests/components/mlx90393/test.rp2040.yaml
 create mode 100644 tests/components/mlx90614/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mlx90614/test.esp32-c3.yaml
 create mode 100644 tests/components/mlx90614/test.esp32-idf.yaml
 create mode 100644 tests/components/mlx90614/test.esp32.yaml
 create mode 100644 tests/components/mlx90614/test.esp8266.yaml
 create mode 100644 tests/components/mlx90614/test.rp2040.yaml
 create mode 100644 tests/components/mmc5603/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mmc5603/test.esp32-c3.yaml
 create mode 100644 tests/components/mmc5603/test.esp32-idf.yaml
 create mode 100644 tests/components/mmc5603/test.esp32.yaml
 create mode 100644 tests/components/mmc5603/test.esp8266.yaml
 create mode 100644 tests/components/mmc5603/test.rp2040.yaml
 create mode 100644 tests/components/mmc5983/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mmc5983/test.esp32-c3.yaml
 create mode 100644 tests/components/mmc5983/test.esp32-idf.yaml
 create mode 100644 tests/components/mmc5983/test.esp32.yaml
 create mode 100644 tests/components/mmc5983/test.esp8266.yaml
 create mode 100644 tests/components/mmc5983/test.rp2040.yaml
 create mode 100644 tests/components/modbus/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/modbus/test.esp32-c3.yaml
 create mode 100644 tests/components/modbus/test.esp32-idf.yaml
 create mode 100644 tests/components/modbus/test.esp32.yaml
 create mode 100644 tests/components/modbus/test.esp8266.yaml
 create mode 100644 tests/components/modbus/test.rp2040.yaml
 create mode 100644 tests/components/modbus_controller/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/modbus_controller/test.esp32-c3.yaml
 create mode 100644 tests/components/modbus_controller/test.esp32-idf.yaml
 create mode 100644 tests/components/modbus_controller/test.esp32.yaml
 create mode 100644 tests/components/modbus_controller/test.esp8266.yaml
 create mode 100644 tests/components/modbus_controller/test.rp2040.yaml
 create mode 100644 tests/components/monochromatic/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/monochromatic/test.esp32-c3.yaml
 create mode 100644 tests/components/monochromatic/test.esp32-idf.yaml
 create mode 100644 tests/components/monochromatic/test.esp32.yaml
 create mode 100644 tests/components/monochromatic/test.esp8266.yaml
 create mode 100644 tests/components/monochromatic/test.rp2040.yaml
 create mode 100644 tests/components/mopeka_ble/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mopeka_ble/test.esp32-c3.yaml
 create mode 100644 tests/components/mopeka_ble/test.esp32-idf.yaml
 create mode 100644 tests/components/mopeka_ble/test.esp32.yaml
 create mode 100644 tests/components/mopeka_pro_check/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mopeka_pro_check/test.esp32-c3.yaml
 create mode 100644 tests/components/mopeka_pro_check/test.esp32-idf.yaml
 create mode 100644 tests/components/mopeka_pro_check/test.esp32.yaml
 create mode 100644 tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mopeka_std_check/test.esp32-c3.yaml
 create mode 100644 tests/components/mopeka_std_check/test.esp32-idf.yaml
 create mode 100644 tests/components/mpl3115a2/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mpl3115a2/test.esp32-c3.yaml
 create mode 100644 tests/components/mpl3115a2/test.esp32-idf.yaml
 create mode 100644 tests/components/mpl3115a2/test.esp32.yaml
 create mode 100644 tests/components/mpl3115a2/test.esp8266.yaml
 create mode 100644 tests/components/mpl3115a2/test.rp2040.yaml
 create mode 100644 tests/components/mpr121/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mpr121/test.esp32-c3.yaml
 create mode 100644 tests/components/mpr121/test.esp32-idf.yaml
 create mode 100644 tests/components/mpr121/test.esp32.yaml
 create mode 100644 tests/components/mpr121/test.esp8266.yaml
 create mode 100644 tests/components/mpr121/test.rp2040.yaml
 create mode 100644 tests/components/mpu6050/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mpu6050/test.esp32-c3.yaml
 create mode 100644 tests/components/mpu6050/test.esp32-idf.yaml
 create mode 100644 tests/components/mpu6050/test.esp32.yaml
 create mode 100644 tests/components/mpu6050/test.esp8266.yaml
 create mode 100644 tests/components/mpu6050/test.rp2040.yaml
 create mode 100644 tests/components/mpu6886/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mpu6886/test.esp32-c3.yaml
 create mode 100644 tests/components/mpu6886/test.esp32-idf.yaml
 create mode 100644 tests/components/mpu6886/test.esp32.yaml
 create mode 100644 tests/components/mpu6886/test.esp8266.yaml
 create mode 100644 tests/components/mpu6886/test.rp2040.yaml
 create mode 100644 tests/components/mqtt/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mqtt/test.esp32-c3.yaml
 create mode 100644 tests/components/mqtt/test.esp32-idf.yaml
 create mode 100644 tests/components/mqtt/test.esp32.yaml
 create mode 100644 tests/components/mqtt/test.esp8266.yaml
 create mode 100644 tests/components/mqtt_subscribe/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/mqtt_subscribe/test.esp32-c3.yaml
 create mode 100644 tests/components/mqtt_subscribe/test.esp32-idf.yaml
 create mode 100644 tests/components/mqtt_subscribe/test.esp32.yaml
 create mode 100644 tests/components/mqtt_subscribe/test.esp8266.yaml
 create mode 100644 tests/components/ms5611/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ms5611/test.esp32-c3.yaml
 create mode 100644 tests/components/ms5611/test.esp32-idf.yaml
 create mode 100644 tests/components/ms5611/test.esp32.yaml
 create mode 100644 tests/components/ms5611/test.esp8266.yaml
 create mode 100644 tests/components/ms5611/test.rp2040.yaml
 create mode 100644 tests/components/my9231/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/my9231/test.esp32-c3.yaml
 create mode 100644 tests/components/my9231/test.esp32-idf.yaml
 create mode 100644 tests/components/my9231/test.esp32.yaml
 create mode 100644 tests/components/my9231/test.esp8266.yaml
 create mode 100644 tests/components/my9231/test.rp2040.yaml

diff --git a/tests/components/micronova/test.esp32-c3-idf.yaml b/tests/components/micronova/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ec9699909e
--- /dev/null
+++ b/tests/components/micronova/test.esp32-c3-idf.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 6
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/micronova/test.esp32-c3.yaml b/tests/components/micronova/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ec9699909e
--- /dev/null
+++ b/tests/components/micronova/test.esp32-c3.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 6
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/micronova/test.esp32-idf.yaml b/tests/components/micronova/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9156f7d6a9
--- /dev/null
+++ b/tests/components/micronova/test.esp32-idf.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 18
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/micronova/test.esp32.yaml b/tests/components/micronova/test.esp32.yaml
new file mode 100644
index 0000000000..9156f7d6a9
--- /dev/null
+++ b/tests/components/micronova/test.esp32.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 18
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/micronova/test.esp8266.yaml b/tests/components/micronova/test.esp8266.yaml
new file mode 100644
index 0000000000..d10ab7ad7a
--- /dev/null
+++ b/tests/components/micronova/test.esp8266.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 16
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/micronova/test.rp2040.yaml b/tests/components/micronova/test.rp2040.yaml
new file mode 100644
index 0000000000..ec9699909e
--- /dev/null
+++ b/tests/components/micronova/test.rp2040.yaml
@@ -0,0 +1,49 @@
+uart:
+  - id: uart_micronova
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+micronova:
+  enable_rx_pin: 6
+
+button:
+  - platform: micronova
+    custom_button:
+      name: Custom Micronova Button
+      memory_location: 0xA0
+      memory_address: 0x7D
+      memory_data: 0x0F
+
+number:
+  - platform: micronova
+    thermostat_temperature:
+      name: Micronova Thermostaat
+      step: 1
+    power_level:
+      name: Micronova Power level
+
+sensor:
+  - platform: micronova
+    room_temperature:
+      name: Room Temperature
+    fumes_temperature:
+      name: Fumes Temperature
+    water_temperature:
+      name: Water temperature
+    water_pressure:
+      name: Water pressure
+    stove_power:
+      name: Stove Power
+    fan_speed:
+      fan_rpm_offset: 240
+      name: Fan RPM
+    memory_address_sensor:
+      memory_location: 0x20
+      memory_address: 0x7d
+      name: Adres sensor
+
+switch:
+  - platform: micronova
+    stove:
+      name: Stove on/off
diff --git a/tests/components/microphone/test.esp32-c3-idf.yaml b/tests/components/microphone/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..706a38f910
--- /dev/null
+++ b/tests/components/microphone/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+i2s_audio:
+  i2s_lrclk_pin: 6
+  i2s_bclk_pin: 7
+  i2s_mclk_pin: 8
+
+microphone:
+  - platform: i2s_audio
+    id: mic_id_external
+    i2s_din_pin: 3
+    adc_type: external
+    pdm: false
diff --git a/tests/components/microphone/test.esp32-c3.yaml b/tests/components/microphone/test.esp32-c3.yaml
new file mode 100644
index 0000000000..706a38f910
--- /dev/null
+++ b/tests/components/microphone/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+i2s_audio:
+  i2s_lrclk_pin: 6
+  i2s_bclk_pin: 7
+  i2s_mclk_pin: 8
+
+microphone:
+  - platform: i2s_audio
+    id: mic_id_external
+    i2s_din_pin: 3
+    adc_type: external
+    pdm: false
diff --git a/tests/components/microphone/test.esp32-idf.yaml b/tests/components/microphone/test.esp32-idf.yaml
new file mode 100644
index 0000000000..166eedb54d
--- /dev/null
+++ b/tests/components/microphone/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2s_audio:
+  i2s_lrclk_pin: 13
+  i2s_bclk_pin: 14
+  i2s_mclk_pin: 15
+
+microphone:
+  - platform: i2s_audio
+    id: mic_id_adc
+    adc_pin: 32
+    adc_type: internal
+  - platform: i2s_audio
+    id: mic_id_external
+    i2s_din_pin: 33
+    adc_type: external
+    pdm: false
diff --git a/tests/components/microphone/test.esp32.yaml b/tests/components/microphone/test.esp32.yaml
new file mode 100644
index 0000000000..166eedb54d
--- /dev/null
+++ b/tests/components/microphone/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2s_audio:
+  i2s_lrclk_pin: 13
+  i2s_bclk_pin: 14
+  i2s_mclk_pin: 15
+
+microphone:
+  - platform: i2s_audio
+    id: mic_id_adc
+    adc_pin: 32
+    adc_type: internal
+  - platform: i2s_audio
+    id: mic_id_external
+    i2s_din_pin: 33
+    adc_type: external
+    pdm: false
diff --git a/tests/components/mics_4514/test.esp32-c3-idf.yaml b/tests/components/mics_4514/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..72369bec01
--- /dev/null
+++ b/tests/components/mics_4514/test.esp32-c3-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/mics_4514/test.esp32-c3.yaml b/tests/components/mics_4514/test.esp32-c3.yaml
new file mode 100644
index 0000000000..72369bec01
--- /dev/null
+++ b/tests/components/mics_4514/test.esp32-c3.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/mics_4514/test.esp32-idf.yaml b/tests/components/mics_4514/test.esp32-idf.yaml
new file mode 100644
index 0000000000..234839c91c
--- /dev/null
+++ b/tests/components/mics_4514/test.esp32-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/mics_4514/test.esp32.yaml b/tests/components/mics_4514/test.esp32.yaml
new file mode 100644
index 0000000000..234839c91c
--- /dev/null
+++ b/tests/components/mics_4514/test.esp32.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/mics_4514/test.esp8266.yaml b/tests/components/mics_4514/test.esp8266.yaml
new file mode 100644
index 0000000000..72369bec01
--- /dev/null
+++ b/tests/components/mics_4514/test.esp8266.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/mics_4514/test.rp2040.yaml b/tests/components/mics_4514/test.rp2040.yaml
new file mode 100644
index 0000000000..72369bec01
--- /dev/null
+++ b/tests/components/mics_4514/test.rp2040.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mics_4514
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mics_4514
+    update_interval: 60s
+    nitrogen_dioxide:
+      name: MICS-4514 NO2
+    carbon_monoxide:
+      name: MICS-4514 CO
+    methane:
+      name: MICS-4514 CH4
+    hydrogen:
+      name: MICS-4514 H2
+    ethanol:
+      name: MICS-4514 C2H5OH
+    ammonia:
+      name: MICS-4514 NH3
diff --git a/tests/components/midea/test.esp32-c3.yaml b/tests/components/midea/test.esp32-c3.yaml
new file mode 100644
index 0000000000..bcb8635eaf
--- /dev/null
+++ b/tests/components/midea/test.esp32-c3.yaml
@@ -0,0 +1,59 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+uart:
+  - id: uart_midea
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+climate:
+  - platform: midea
+    id: midea_unit
+    name: Midea Climate
+    on_control:
+      - logger.log: Control message received!
+      - lambda: |-
+          x.set_mode(CLIMATE_MODE_FAN_ONLY);
+    on_state:
+      - logger.log: State changed!
+    transmitter_id:
+    period: 1s
+    num_attempts: 5
+    timeout: 2s
+    beeper: false
+    autoconf: true
+    visual:
+      min_temperature: 17 °C
+      max_temperature: 30 °C
+      temperature_step: 0.5 °C
+    supported_modes:
+      - FAN_ONLY
+      - HEAT_COOL
+      - COOL
+      - HEAT
+      - DRY
+    custom_fan_modes:
+      - SILENT
+      - TURBO
+    supported_presets:
+      - ECO
+      - BOOST
+      - SLEEP
+    custom_presets:
+      - FREEZE_PROTECTION
+    supported_swing_modes:
+      - VERTICAL
+      - HORIZONTAL
+      - BOTH
+    outdoor_temperature:
+      name: Temp
+    power_usage:
+      name: Power
+    humidity_setpoint:
+      name: Humidity
diff --git a/tests/components/midea/test.esp32.yaml b/tests/components/midea/test.esp32.yaml
new file mode 100644
index 0000000000..5c638b9613
--- /dev/null
+++ b/tests/components/midea/test.esp32.yaml
@@ -0,0 +1,59 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+remote_transmitter:
+  pin: 18
+  carrier_duty_percent: 50%
+
+uart:
+  - id: uart_midea
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+climate:
+  - platform: midea
+    id: midea_unit
+    name: Midea Climate
+    on_control:
+      - logger.log: Control message received!
+      - lambda: |-
+          x.set_mode(CLIMATE_MODE_FAN_ONLY);
+    on_state:
+      - logger.log: State changed!
+    transmitter_id:
+    period: 1s
+    num_attempts: 5
+    timeout: 2s
+    beeper: false
+    autoconf: true
+    visual:
+      min_temperature: 17 °C
+      max_temperature: 30 °C
+      temperature_step: 0.5 °C
+    supported_modes:
+      - FAN_ONLY
+      - HEAT_COOL
+      - COOL
+      - HEAT
+      - DRY
+    custom_fan_modes:
+      - SILENT
+      - TURBO
+    supported_presets:
+      - ECO
+      - BOOST
+      - SLEEP
+    custom_presets:
+      - FREEZE_PROTECTION
+    supported_swing_modes:
+      - VERTICAL
+      - HORIZONTAL
+      - BOTH
+    outdoor_temperature:
+      name: Temp
+    power_usage:
+      name: Power
+    humidity_setpoint:
+      name: Humidity
diff --git a/tests/components/midea/test.esp8266.yaml b/tests/components/midea/test.esp8266.yaml
new file mode 100644
index 0000000000..b0ed7eb472
--- /dev/null
+++ b/tests/components/midea/test.esp8266.yaml
@@ -0,0 +1,59 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+remote_transmitter:
+  pin: 12
+  carrier_duty_percent: 50%
+
+uart:
+  - id: uart_midea
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+climate:
+  - platform: midea
+    id: midea_unit
+    name: Midea Climate
+    on_control:
+      - logger.log: Control message received!
+      - lambda: |-
+          x.set_mode(CLIMATE_MODE_FAN_ONLY);
+    on_state:
+      - logger.log: State changed!
+    transmitter_id:
+    period: 1s
+    num_attempts: 5
+    timeout: 2s
+    beeper: false
+    autoconf: true
+    visual:
+      min_temperature: 17 °C
+      max_temperature: 30 °C
+      temperature_step: 0.5 °C
+    supported_modes:
+      - FAN_ONLY
+      - HEAT_COOL
+      - COOL
+      - HEAT
+      - DRY
+    custom_fan_modes:
+      - SILENT
+      - TURBO
+    supported_presets:
+      - ECO
+      - BOOST
+      - SLEEP
+    custom_presets:
+      - FREEZE_PROTECTION
+    supported_swing_modes:
+      - VERTICAL
+      - HORIZONTAL
+      - BOTH
+    outdoor_temperature:
+      name: Temp
+    power_usage:
+      name: Power
+    humidity_setpoint:
+      name: Humidity
diff --git a/tests/components/midea_ir/test.esp32-c3-idf.yaml b/tests/components/midea_ir/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e8d89cecc2
--- /dev/null
+++ b/tests/components/midea_ir/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: midea_ir
+    name: Midea IR
+    use_fahrenheit: true
diff --git a/tests/components/midea_ir/test.esp32-c3.yaml b/tests/components/midea_ir/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e8d89cecc2
--- /dev/null
+++ b/tests/components/midea_ir/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: midea_ir
+    name: Midea IR
+    use_fahrenheit: true
diff --git a/tests/components/midea_ir/test.esp32-idf.yaml b/tests/components/midea_ir/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e8d89cecc2
--- /dev/null
+++ b/tests/components/midea_ir/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: midea_ir
+    name: Midea IR
+    use_fahrenheit: true
diff --git a/tests/components/midea_ir/test.esp32.yaml b/tests/components/midea_ir/test.esp32.yaml
new file mode 100644
index 0000000000..e8d89cecc2
--- /dev/null
+++ b/tests/components/midea_ir/test.esp32.yaml
@@ -0,0 +1,8 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: midea_ir
+    name: Midea IR
+    use_fahrenheit: true
diff --git a/tests/components/midea_ir/test.esp8266.yaml b/tests/components/midea_ir/test.esp8266.yaml
new file mode 100644
index 0000000000..e8d89cecc2
--- /dev/null
+++ b/tests/components/midea_ir/test.esp8266.yaml
@@ -0,0 +1,8 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: midea_ir
+    name: Midea IR
+    use_fahrenheit: true
diff --git a/tests/components/mitsubishi/test.esp32-c3-idf.yaml b/tests/components/mitsubishi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c0fc959c5b
--- /dev/null
+++ b/tests/components/mitsubishi/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: mitsubishi
+    name: Mitsubishi
diff --git a/tests/components/mitsubishi/test.esp32-c3.yaml b/tests/components/mitsubishi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c0fc959c5b
--- /dev/null
+++ b/tests/components/mitsubishi/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: mitsubishi
+    name: Mitsubishi
diff --git a/tests/components/mitsubishi/test.esp32-idf.yaml b/tests/components/mitsubishi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c0fc959c5b
--- /dev/null
+++ b/tests/components/mitsubishi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: mitsubishi
+    name: Mitsubishi
diff --git a/tests/components/mitsubishi/test.esp32.yaml b/tests/components/mitsubishi/test.esp32.yaml
new file mode 100644
index 0000000000..c0fc959c5b
--- /dev/null
+++ b/tests/components/mitsubishi/test.esp32.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: mitsubishi
+    name: Mitsubishi
diff --git a/tests/components/mitsubishi/test.esp8266.yaml b/tests/components/mitsubishi/test.esp8266.yaml
new file mode 100644
index 0000000000..c0fc959c5b
--- /dev/null
+++ b/tests/components/mitsubishi/test.esp8266.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 4
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: mitsubishi
+    name: Mitsubishi
diff --git a/tests/components/mlx90393/test.esp32-c3-idf.yaml b/tests/components/mlx90393/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..549eea8032
--- /dev/null
+++ b/tests/components/mlx90393/test.esp32-c3-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90393/test.esp32-c3.yaml b/tests/components/mlx90393/test.esp32-c3.yaml
new file mode 100644
index 0000000000..549eea8032
--- /dev/null
+++ b/tests/components/mlx90393/test.esp32-c3.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90393/test.esp32-idf.yaml b/tests/components/mlx90393/test.esp32-idf.yaml
new file mode 100644
index 0000000000..089fd136f4
--- /dev/null
+++ b/tests/components/mlx90393/test.esp32-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90393/test.esp32.yaml b/tests/components/mlx90393/test.esp32.yaml
new file mode 100644
index 0000000000..089fd136f4
--- /dev/null
+++ b/tests/components/mlx90393/test.esp32.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90393/test.esp8266.yaml b/tests/components/mlx90393/test.esp8266.yaml
new file mode 100644
index 0000000000..549eea8032
--- /dev/null
+++ b/tests/components/mlx90393/test.esp8266.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90393/test.rp2040.yaml b/tests/components/mlx90393/test.rp2040.yaml
new file mode 100644
index 0000000000..549eea8032
--- /dev/null
+++ b/tests/components/mlx90393/test.rp2040.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_mlx90393
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90393
+    oversampling: 1
+    filter: 0
+    gain: 3X
+    x_axis:
+      name: mlxxaxis
+    y_axis:
+      name: mlxyaxis
+    z_axis:
+      name: mlxzaxis
+      resolution: 17BIT
+    temperature:
+      name: mlxtemp
+      oversampling: 2
diff --git a/tests/components/mlx90614/test.esp32-c3-idf.yaml b/tests/components/mlx90614/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a863e0ee2e
--- /dev/null
+++ b/tests/components/mlx90614/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mlx90614/test.esp32-c3.yaml b/tests/components/mlx90614/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a863e0ee2e
--- /dev/null
+++ b/tests/components/mlx90614/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mlx90614/test.esp32-idf.yaml b/tests/components/mlx90614/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8c1ee68f42
--- /dev/null
+++ b/tests/components/mlx90614/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mlx90614/test.esp32.yaml b/tests/components/mlx90614/test.esp32.yaml
new file mode 100644
index 0000000000..8c1ee68f42
--- /dev/null
+++ b/tests/components/mlx90614/test.esp32.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mlx90614/test.esp8266.yaml b/tests/components/mlx90614/test.esp8266.yaml
new file mode 100644
index 0000000000..a863e0ee2e
--- /dev/null
+++ b/tests/components/mlx90614/test.esp8266.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mlx90614/test.rp2040.yaml b/tests/components/mlx90614/test.rp2040.yaml
new file mode 100644
index 0000000000..a863e0ee2e
--- /dev/null
+++ b/tests/components/mlx90614/test.rp2040.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mlx90614
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mlx90614
+    ambient:
+      name: Ambient
+    object:
+      name: Object
+      emissivity: 1.0
diff --git a/tests/components/mmc5603/test.esp32-c3-idf.yaml b/tests/components/mmc5603/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..834591bb39
--- /dev/null
+++ b/tests/components/mmc5603/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5603/test.esp32-c3.yaml b/tests/components/mmc5603/test.esp32-c3.yaml
new file mode 100644
index 0000000000..834591bb39
--- /dev/null
+++ b/tests/components/mmc5603/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5603/test.esp32-idf.yaml b/tests/components/mmc5603/test.esp32-idf.yaml
new file mode 100644
index 0000000000..fbb83cd9f8
--- /dev/null
+++ b/tests/components/mmc5603/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5603/test.esp32.yaml b/tests/components/mmc5603/test.esp32.yaml
new file mode 100644
index 0000000000..fbb83cd9f8
--- /dev/null
+++ b/tests/components/mmc5603/test.esp32.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5603/test.esp8266.yaml b/tests/components/mmc5603/test.esp8266.yaml
new file mode 100644
index 0000000000..834591bb39
--- /dev/null
+++ b/tests/components/mmc5603/test.esp8266.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5603/test.rp2040.yaml b/tests/components/mmc5603/test.rp2040.yaml
new file mode 100644
index 0000000000..834591bb39
--- /dev/null
+++ b/tests/components/mmc5603/test.rp2040.yaml
@@ -0,0 +1,14 @@
+i2c:
+  - id: i2c_mmc5603
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5603
+    address: 0x30
+    field_strength_x:
+      name: HMC5883L Field Strength X
+    field_strength_y:
+      name: HMC5883L Field Strength Y
+    field_strength_z:
+      name: HMC5883L Field Strength Z
diff --git a/tests/components/mmc5983/test.esp32-c3-idf.yaml b/tests/components/mmc5983/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..68d821e9a5
--- /dev/null
+++ b/tests/components/mmc5983/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/mmc5983/test.esp32-c3.yaml b/tests/components/mmc5983/test.esp32-c3.yaml
new file mode 100644
index 0000000000..68d821e9a5
--- /dev/null
+++ b/tests/components/mmc5983/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/mmc5983/test.esp32-idf.yaml b/tests/components/mmc5983/test.esp32-idf.yaml
new file mode 100644
index 0000000000..6104be9b83
--- /dev/null
+++ b/tests/components/mmc5983/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/mmc5983/test.esp32.yaml b/tests/components/mmc5983/test.esp32.yaml
new file mode 100644
index 0000000000..6104be9b83
--- /dev/null
+++ b/tests/components/mmc5983/test.esp32.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/mmc5983/test.esp8266.yaml b/tests/components/mmc5983/test.esp8266.yaml
new file mode 100644
index 0000000000..68d821e9a5
--- /dev/null
+++ b/tests/components/mmc5983/test.esp8266.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/mmc5983/test.rp2040.yaml b/tests/components/mmc5983/test.rp2040.yaml
new file mode 100644
index 0000000000..68d821e9a5
--- /dev/null
+++ b/tests/components/mmc5983/test.rp2040.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_mmc5983
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mmc5983
+    field_strength_x:
+      name: "Magnet X"
+      id: magnet_x
+    field_strength_y:
+      name: "Magnet Y"
+      id: magnet_y
+    field_strength_z:
+      name: "Magnet Z"
+      id: magnet_z
diff --git a/tests/components/modbus/test.esp32-c3-idf.yaml b/tests/components/modbus/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d22b507be0
--- /dev/null
+++ b/tests/components/modbus/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
diff --git a/tests/components/modbus/test.esp32-c3.yaml b/tests/components/modbus/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d22b507be0
--- /dev/null
+++ b/tests/components/modbus/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
diff --git a/tests/components/modbus/test.esp32-idf.yaml b/tests/components/modbus/test.esp32-idf.yaml
new file mode 100644
index 0000000000..20cf238b1b
--- /dev/null
+++ b/tests/components/modbus/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 15
diff --git a/tests/components/modbus/test.esp32.yaml b/tests/components/modbus/test.esp32.yaml
new file mode 100644
index 0000000000..20cf238b1b
--- /dev/null
+++ b/tests/components/modbus/test.esp32.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 15
diff --git a/tests/components/modbus/test.esp8266.yaml b/tests/components/modbus/test.esp8266.yaml
new file mode 100644
index 0000000000..560c044766
--- /dev/null
+++ b/tests/components/modbus/test.esp8266.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 12
diff --git a/tests/components/modbus/test.rp2040.yaml b/tests/components/modbus/test.rp2040.yaml
new file mode 100644
index 0000000000..d22b507be0
--- /dev/null
+++ b/tests/components/modbus/test.rp2040.yaml
@@ -0,0 +1,9 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
diff --git a/tests/components/modbus_controller/test.esp32-c3-idf.yaml b/tests/components/modbus_controller/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..476e65ecb0
--- /dev/null
+++ b/tests/components/modbus_controller/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/modbus_controller/test.esp32-c3.yaml b/tests/components/modbus_controller/test.esp32-c3.yaml
new file mode 100644
index 0000000000..476e65ecb0
--- /dev/null
+++ b/tests/components/modbus_controller/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/modbus_controller/test.esp32-idf.yaml b/tests/components/modbus_controller/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c5fe3fd057
--- /dev/null
+++ b/tests/components/modbus_controller/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 15
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/modbus_controller/test.esp32.yaml b/tests/components/modbus_controller/test.esp32.yaml
new file mode 100644
index 0000000000..c5fe3fd057
--- /dev/null
+++ b/tests/components/modbus_controller/test.esp32.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 15
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/modbus_controller/test.esp8266.yaml b/tests/components/modbus_controller/test.esp8266.yaml
new file mode 100644
index 0000000000..67cac65d1b
--- /dev/null
+++ b/tests/components/modbus_controller/test.esp8266.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 12
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/modbus_controller/test.rp2040.yaml b/tests/components/modbus_controller/test.rp2040.yaml
new file mode 100644
index 0000000000..476e65ecb0
--- /dev/null
+++ b/tests/components/modbus_controller/test.rp2040.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_modbus
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+modbus:
+  id: mod_bus1
+  flow_control_pin: 6
+
+modbus_controller:
+  - id: modbus_controller1
+    address: 0x2
+    modbus_id: mod_bus1
diff --git a/tests/components/monochromatic/test.esp32-c3-idf.yaml b/tests/components/monochromatic/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9524efcb2d
--- /dev/null
+++ b/tests/components/monochromatic/test.esp32-c3-idf.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/monochromatic/test.esp32-c3.yaml b/tests/components/monochromatic/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9524efcb2d
--- /dev/null
+++ b/tests/components/monochromatic/test.esp32-c3.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/monochromatic/test.esp32-idf.yaml b/tests/components/monochromatic/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9524efcb2d
--- /dev/null
+++ b/tests/components/monochromatic/test.esp32-idf.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/monochromatic/test.esp32.yaml b/tests/components/monochromatic/test.esp32.yaml
new file mode 100644
index 0000000000..9524efcb2d
--- /dev/null
+++ b/tests/components/monochromatic/test.esp32.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/monochromatic/test.esp8266.yaml b/tests/components/monochromatic/test.esp8266.yaml
new file mode 100644
index 0000000000..94d849581d
--- /dev/null
+++ b/tests/components/monochromatic/test.esp8266.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/monochromatic/test.rp2040.yaml b/tests/components/monochromatic/test.rp2040.yaml
new file mode 100644
index 0000000000..093577e256
--- /dev/null
+++ b/tests/components/monochromatic/test.rp2040.yaml
@@ -0,0 +1,40 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 4
+
+light:
+  - platform: monochromatic
+    name: Monochromatic Light
+    id: monochromatic_light
+    output: light_output_1
+    gamma_correct: 2.8
+    default_transition_length: 2s
+    effects:
+      - strobe:
+      - flicker:
+      - flicker:
+          name: My Flicker
+          alpha: 98%
+          intensity: 1.5%
+      - lambda:
+          name: My Custom Effect
+          update_interval: 1s
+          lambda: |-
+            static int state = 0;
+            state += 1;
+            if (state == 4)
+              state = 0;
+      - pulse:
+          transition_length: 10s
+          update_interval: 20s
+          min_brightness: 10%
+          max_brightness: 90%
+      - pulse:
+          name: pulse2
+          transition_length:
+            on_length: 10s
+            off_length: 5s
+          update_interval: 15s
+          min_brightness: 10%
+          max_brightness: 90%
diff --git a/tests/components/mopeka_ble/test.esp32-c3-idf.yaml b/tests/components/mopeka_ble/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a115404f1c
--- /dev/null
+++ b/tests/components/mopeka_ble/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+mopeka_ble:
diff --git a/tests/components/mopeka_ble/test.esp32-c3.yaml b/tests/components/mopeka_ble/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a115404f1c
--- /dev/null
+++ b/tests/components/mopeka_ble/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+mopeka_ble:
diff --git a/tests/components/mopeka_ble/test.esp32-idf.yaml b/tests/components/mopeka_ble/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a115404f1c
--- /dev/null
+++ b/tests/components/mopeka_ble/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+mopeka_ble:
diff --git a/tests/components/mopeka_ble/test.esp32.yaml b/tests/components/mopeka_ble/test.esp32.yaml
new file mode 100644
index 0000000000..a115404f1c
--- /dev/null
+++ b/tests/components/mopeka_ble/test.esp32.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+mopeka_ble:
diff --git a/tests/components/mopeka_pro_check/test.esp32-c3-idf.yaml b/tests/components/mopeka_pro_check/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..147cbcb9de
--- /dev/null
+++ b/tests/components/mopeka_pro_check/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: mopeka_pro_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: CUSTOM
+    custom_distance_full: 40cm
+    custom_distance_empty: 10mm
+    temperature:
+      name: Propane test temp
+    level:
+      name: Propane test level
+    distance:
+      name: Propane test distance
+    battery_level:
+      name: Propane test battery level
diff --git a/tests/components/mopeka_pro_check/test.esp32-c3.yaml b/tests/components/mopeka_pro_check/test.esp32-c3.yaml
new file mode 100644
index 0000000000..147cbcb9de
--- /dev/null
+++ b/tests/components/mopeka_pro_check/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: mopeka_pro_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: CUSTOM
+    custom_distance_full: 40cm
+    custom_distance_empty: 10mm
+    temperature:
+      name: Propane test temp
+    level:
+      name: Propane test level
+    distance:
+      name: Propane test distance
+    battery_level:
+      name: Propane test battery level
diff --git a/tests/components/mopeka_pro_check/test.esp32-idf.yaml b/tests/components/mopeka_pro_check/test.esp32-idf.yaml
new file mode 100644
index 0000000000..147cbcb9de
--- /dev/null
+++ b/tests/components/mopeka_pro_check/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: mopeka_pro_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: CUSTOM
+    custom_distance_full: 40cm
+    custom_distance_empty: 10mm
+    temperature:
+      name: Propane test temp
+    level:
+      name: Propane test level
+    distance:
+      name: Propane test distance
+    battery_level:
+      name: Propane test battery level
diff --git a/tests/components/mopeka_pro_check/test.esp32.yaml b/tests/components/mopeka_pro_check/test.esp32.yaml
new file mode 100644
index 0000000000..147cbcb9de
--- /dev/null
+++ b/tests/components/mopeka_pro_check/test.esp32.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: mopeka_pro_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: CUSTOM
+    custom_distance_full: 40cm
+    custom_distance_empty: 10mm
+    temperature:
+      name: Propane test temp
+    level:
+      name: Propane test level
+    distance:
+      name: Propane test distance
+    battery_level:
+      name: Propane test battery level
diff --git a/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml b/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..830adf952f
--- /dev/null
+++ b/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  # Example using 11kg 100% propane tank.
+  - platform: mopeka_std_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: Europe_11kg
+    temperature:
+        name: "Propane test temp"
+    level:
+        name: "Propane test level"
+    distance:
+        name: "Propane test distance"
+    battery_level:
+        name: "Propane test battery level"
+
diff --git a/tests/components/mopeka_std_check/test.esp32-c3.yaml b/tests/components/mopeka_std_check/test.esp32-c3.yaml
new file mode 100644
index 0000000000..830adf952f
--- /dev/null
+++ b/tests/components/mopeka_std_check/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  # Example using 11kg 100% propane tank.
+  - platform: mopeka_std_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: Europe_11kg
+    temperature:
+        name: "Propane test temp"
+    level:
+        name: "Propane test level"
+    distance:
+        name: "Propane test distance"
+    battery_level:
+        name: "Propane test battery level"
+
diff --git a/tests/components/mopeka_std_check/test.esp32-idf.yaml b/tests/components/mopeka_std_check/test.esp32-idf.yaml
new file mode 100644
index 0000000000..830adf952f
--- /dev/null
+++ b/tests/components/mopeka_std_check/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+esp32_ble_tracker:
+
+sensor:
+  # Example using 11kg 100% propane tank.
+  - platform: mopeka_std_check
+    mac_address: D3:75:F2:DC:16:91
+    tank_type: Europe_11kg
+    temperature:
+        name: "Propane test temp"
+    level:
+        name: "Propane test level"
+    distance:
+        name: "Propane test distance"
+    battery_level:
+        name: "Propane test battery level"
+
diff --git a/tests/components/mpl3115a2/test.esp32-c3-idf.yaml b/tests/components/mpl3115a2/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9cbe08d920
--- /dev/null
+++ b/tests/components/mpl3115a2/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpl3115a2/test.esp32-c3.yaml b/tests/components/mpl3115a2/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9cbe08d920
--- /dev/null
+++ b/tests/components/mpl3115a2/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpl3115a2/test.esp32-idf.yaml b/tests/components/mpl3115a2/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5e9d6d190d
--- /dev/null
+++ b/tests/components/mpl3115a2/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpl3115a2/test.esp32.yaml b/tests/components/mpl3115a2/test.esp32.yaml
new file mode 100644
index 0000000000..5e9d6d190d
--- /dev/null
+++ b/tests/components/mpl3115a2/test.esp32.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpl3115a2/test.esp8266.yaml b/tests/components/mpl3115a2/test.esp8266.yaml
new file mode 100644
index 0000000000..9cbe08d920
--- /dev/null
+++ b/tests/components/mpl3115a2/test.esp8266.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpl3115a2/test.rp2040.yaml b/tests/components/mpl3115a2/test.rp2040.yaml
new file mode 100644
index 0000000000..9cbe08d920
--- /dev/null
+++ b/tests/components/mpl3115a2/test.rp2040.yaml
@@ -0,0 +1,12 @@
+i2c:
+  - id: i2c_mpl3115a2
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpl3115a2
+    temperature:
+      name: MPL3115A2 Temperature
+    pressure:
+      name: MPL3115A2 Pressure
+    update_interval: 10s
diff --git a/tests/components/mpr121/test.esp32-c3-idf.yaml b/tests/components/mpr121/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..517e092560
--- /dev/null
+++ b/tests/components/mpr121/test.esp32-c3-idf.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 5
+    sda: 4
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpr121/test.esp32-c3.yaml b/tests/components/mpr121/test.esp32-c3.yaml
new file mode 100644
index 0000000000..517e092560
--- /dev/null
+++ b/tests/components/mpr121/test.esp32-c3.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 5
+    sda: 4
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpr121/test.esp32-idf.yaml b/tests/components/mpr121/test.esp32-idf.yaml
new file mode 100644
index 0000000000..96996fd8ee
--- /dev/null
+++ b/tests/components/mpr121/test.esp32-idf.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 16
+    sda: 17
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpr121/test.esp32.yaml b/tests/components/mpr121/test.esp32.yaml
new file mode 100644
index 0000000000..96996fd8ee
--- /dev/null
+++ b/tests/components/mpr121/test.esp32.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 16
+    sda: 17
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpr121/test.esp8266.yaml b/tests/components/mpr121/test.esp8266.yaml
new file mode 100644
index 0000000000..517e092560
--- /dev/null
+++ b/tests/components/mpr121/test.esp8266.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 5
+    sda: 4
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpr121/test.rp2040.yaml b/tests/components/mpr121/test.rp2040.yaml
new file mode 100644
index 0000000000..517e092560
--- /dev/null
+++ b/tests/components/mpr121/test.rp2040.yaml
@@ -0,0 +1,26 @@
+i2c:
+  - id: i2c_mpr121
+    scl: 5
+    sda: 4
+
+mpr121:
+  id: mpr121_first
+  address: 0x5A
+
+binary_sensor:
+  - platform: mpr121
+    id: touchkey0
+    name: touchkey0
+    channel: 0
+  - platform: mpr121
+    id: bin1
+    name: touchkey1
+    channel: 1
+  - platform: mpr121
+    id: bin2
+    name: touchkey2
+    channel: 2
+  - platform: mpr121
+    id: bin3
+    name: touchkey3
+    channel: 3
diff --git a/tests/components/mpu6050/test.esp32-c3-idf.yaml b/tests/components/mpu6050/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..39c8506d2b
--- /dev/null
+++ b/tests/components/mpu6050/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6050/test.esp32-c3.yaml b/tests/components/mpu6050/test.esp32-c3.yaml
new file mode 100644
index 0000000000..39c8506d2b
--- /dev/null
+++ b/tests/components/mpu6050/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6050/test.esp32-idf.yaml b/tests/components/mpu6050/test.esp32-idf.yaml
new file mode 100644
index 0000000000..45bca55dea
--- /dev/null
+++ b/tests/components/mpu6050/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6050/test.esp32.yaml b/tests/components/mpu6050/test.esp32.yaml
new file mode 100644
index 0000000000..45bca55dea
--- /dev/null
+++ b/tests/components/mpu6050/test.esp32.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6050/test.esp8266.yaml b/tests/components/mpu6050/test.esp8266.yaml
new file mode 100644
index 0000000000..39c8506d2b
--- /dev/null
+++ b/tests/components/mpu6050/test.esp8266.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6050/test.rp2040.yaml b/tests/components/mpu6050/test.rp2040.yaml
new file mode 100644
index 0000000000..39c8506d2b
--- /dev/null
+++ b/tests/components/mpu6050/test.rp2040.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6050
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6050
+    address: 0x68
+    accel_x:
+      name: MPU6050 Accel X
+    accel_y:
+      name: MPU6050 Accel Y
+    accel_z:
+      name: MPU6050 Accel z
+    gyro_x:
+      name: MPU6050 Gyro X
+    gyro_y:
+      name: MPU6050 Gyro Y
+    gyro_z:
+      name: MPU6050 Gyro z
+    temperature:
+      name: MPU6050 Temperature
diff --git a/tests/components/mpu6886/test.esp32-c3-idf.yaml b/tests/components/mpu6886/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fad51a80b4
--- /dev/null
+++ b/tests/components/mpu6886/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mpu6886/test.esp32-c3.yaml b/tests/components/mpu6886/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fad51a80b4
--- /dev/null
+++ b/tests/components/mpu6886/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mpu6886/test.esp32-idf.yaml b/tests/components/mpu6886/test.esp32-idf.yaml
new file mode 100644
index 0000000000..84e4d56739
--- /dev/null
+++ b/tests/components/mpu6886/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mpu6886/test.esp32.yaml b/tests/components/mpu6886/test.esp32.yaml
new file mode 100644
index 0000000000..84e4d56739
--- /dev/null
+++ b/tests/components/mpu6886/test.esp32.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mpu6886/test.esp8266.yaml b/tests/components/mpu6886/test.esp8266.yaml
new file mode 100644
index 0000000000..fad51a80b4
--- /dev/null
+++ b/tests/components/mpu6886/test.esp8266.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mpu6886/test.rp2040.yaml b/tests/components/mpu6886/test.rp2040.yaml
new file mode 100644
index 0000000000..fad51a80b4
--- /dev/null
+++ b/tests/components/mpu6886/test.rp2040.yaml
@@ -0,0 +1,22 @@
+i2c:
+  - id: i2c_mpu6886
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: mpu6886
+    address: 0x68
+    accel_x:
+      name: MPU6886 Accel X
+    accel_y:
+      name: MPU6886 Accel Y
+    accel_z:
+      name: MPU6886 Accel z
+    gyro_x:
+      name: MPU6886 Gyro X
+    gyro_y:
+      name: MPU6886 Gyro Y
+    gyro_z:
+      name: MPU6886 Gyro z
+    temperature:
+      name: MPU6886 Temperature
diff --git a/tests/components/mqtt/test.esp32-c3-idf.yaml b/tests/components/mqtt/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..7702ed5610
--- /dev/null
+++ b/tests/components/mqtt/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  idf_send_async: false
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-c3.yaml
new file mode 100644
index 0000000000..692d504d6d
--- /dev/null
+++ b/tests/components/mqtt/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
diff --git a/tests/components/mqtt/test.esp32-idf.yaml b/tests/components/mqtt/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7702ed5610
--- /dev/null
+++ b/tests/components/mqtt/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  idf_send_async: false
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32.yaml
new file mode 100644
index 0000000000..692d504d6d
--- /dev/null
+++ b/tests/components/mqtt/test.esp32.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266.yaml
new file mode 100644
index 0000000000..692d504d6d
--- /dev/null
+++ b/tests/components/mqtt/test.esp8266.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
diff --git a/tests/components/mqtt_subscribe/test.esp32-c3-idf.yaml b/tests/components/mqtt_subscribe/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..070672f15c
--- /dev/null
+++ b/tests/components/mqtt_subscribe/test.esp32-c3-idf.yaml
@@ -0,0 +1,37 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  idf_send_async: false
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
+
+sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(the_sensor).state;
+            root["greeting"] = "Hello World";
+
+text_sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: "the/topic"
+    qos: 2
+    on_value:
+      - logger.log: "Text sensor got value"
diff --git a/tests/components/mqtt_subscribe/test.esp32-c3.yaml b/tests/components/mqtt_subscribe/test.esp32-c3.yaml
new file mode 100644
index 0000000000..13ed311b17
--- /dev/null
+++ b/tests/components/mqtt_subscribe/test.esp32-c3.yaml
@@ -0,0 +1,36 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
+
+sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(the_sensor).state;
+            root["greeting"] = "Hello World";
+
+text_sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: "the/topic"
+    qos: 2
+    on_value:
+      - logger.log: "Text sensor got value"
diff --git a/tests/components/mqtt_subscribe/test.esp32-idf.yaml b/tests/components/mqtt_subscribe/test.esp32-idf.yaml
new file mode 100644
index 0000000000..070672f15c
--- /dev/null
+++ b/tests/components/mqtt_subscribe/test.esp32-idf.yaml
@@ -0,0 +1,37 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  idf_send_async: false
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
+
+sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(the_sensor).state;
+            root["greeting"] = "Hello World";
+
+text_sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: "the/topic"
+    qos: 2
+    on_value:
+      - logger.log: "Text sensor got value"
diff --git a/tests/components/mqtt_subscribe/test.esp32.yaml b/tests/components/mqtt_subscribe/test.esp32.yaml
new file mode 100644
index 0000000000..13ed311b17
--- /dev/null
+++ b/tests/components/mqtt_subscribe/test.esp32.yaml
@@ -0,0 +1,36 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
+
+sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(the_sensor).state;
+            root["greeting"] = "Hello World";
+
+text_sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: "the/topic"
+    qos: 2
+    on_value:
+      - logger.log: "Text sensor got value"
diff --git a/tests/components/mqtt_subscribe/test.esp8266.yaml b/tests/components/mqtt_subscribe/test.esp8266.yaml
new file mode 100644
index 0000000000..13ed311b17
--- /dev/null
+++ b/tests/components/mqtt_subscribe/test.esp8266.yaml
@@ -0,0 +1,36 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+mqtt:
+  broker: test.mosquitto.org
+  port: 1883
+  discovery: true
+  discovery_prefix: homeassistant
+  log_topic:
+  on_message:
+    topic: testing/sensor/testing_sensor/state
+    qos: 0
+    then:
+      - logger.log: Mqtt Test
+
+sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(the_sensor).state;
+            root["greeting"] = "Hello World";
+
+text_sensor:
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: "the/topic"
+    qos: 2
+    on_value:
+      - logger.log: "Text sensor got value"
diff --git a/tests/components/ms5611/test.esp32-c3-idf.yaml b/tests/components/ms5611/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..8f18501eef
--- /dev/null
+++ b/tests/components/ms5611/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/ms5611/test.esp32-c3.yaml b/tests/components/ms5611/test.esp32-c3.yaml
new file mode 100644
index 0000000000..8f18501eef
--- /dev/null
+++ b/tests/components/ms5611/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/ms5611/test.esp32-idf.yaml b/tests/components/ms5611/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b090eeaa93
--- /dev/null
+++ b/tests/components/ms5611/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/ms5611/test.esp32.yaml b/tests/components/ms5611/test.esp32.yaml
new file mode 100644
index 0000000000..b090eeaa93
--- /dev/null
+++ b/tests/components/ms5611/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/ms5611/test.esp8266.yaml b/tests/components/ms5611/test.esp8266.yaml
new file mode 100644
index 0000000000..8f18501eef
--- /dev/null
+++ b/tests/components/ms5611/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/ms5611/test.rp2040.yaml b/tests/components/ms5611/test.rp2040.yaml
new file mode 100644
index 0000000000..8f18501eef
--- /dev/null
+++ b/tests/components/ms5611/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_ms5611
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ms5611
+    temperature:
+      name: Outside Temperature
+    pressure:
+      name: Outside Pressure
+    address: 0x77
+    update_interval: 15s
diff --git a/tests/components/my9231/test.esp32-c3-idf.yaml b/tests/components/my9231/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.esp32-c3-idf.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5
diff --git a/tests/components/my9231/test.esp32-c3.yaml b/tests/components/my9231/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.esp32-c3.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5
diff --git a/tests/components/my9231/test.esp32-idf.yaml b/tests/components/my9231/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.esp32-idf.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5
diff --git a/tests/components/my9231/test.esp32.yaml b/tests/components/my9231/test.esp32.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.esp32.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5
diff --git a/tests/components/my9231/test.esp8266.yaml b/tests/components/my9231/test.esp8266.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.esp8266.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5
diff --git a/tests/components/my9231/test.rp2040.yaml b/tests/components/my9231/test.rp2040.yaml
new file mode 100644
index 0000000000..3f2e81ef98
--- /dev/null
+++ b/tests/components/my9231/test.rp2040.yaml
@@ -0,0 +1,26 @@
+my9231:
+  clock_pin: 5
+  data_pin: 4
+  num_channels: 6
+  num_chips: 2
+  bit_depth: 16
+
+output:
+  - platform: my9231
+    id: my_0
+    channel: 0
+  - platform: my9231
+    id: my_1
+    channel: 1
+  - platform: my9231
+    id: my_2
+    channel: 2
+  - platform: my9231
+    id: my_3
+    channel: 3
+  - platform: my9231
+    id: my_4
+    channel: 4
+  - platform: my9231
+    id: my_5
+    channel: 5

From 6806cb28f616287a4db61eb18ea1f6206e35a50f Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 22:45:59 -0500
Subject: [PATCH 22/81] Add some components to the new testing framework (O)
 (#6211)

---
 tests/components/ota/test.esp32-c3-idf.yaml   | 30 +++++++++++++++++++
 tests/components/ota/test.esp32-c3.yaml       | 30 +++++++++++++++++++
 tests/components/ota/test.esp32-idf.yaml      | 30 +++++++++++++++++++
 tests/components/ota/test.esp32.yaml          | 30 +++++++++++++++++++
 tests/components/ota/test.esp8266.yaml        | 30 +++++++++++++++++++
 tests/components/ota/test.rp2040.yaml         | 30 +++++++++++++++++++
 .../components/output/test.esp32-c3-idf.yaml  | 13 ++++++++
 tests/components/output/test.esp32-c3.yaml    | 13 ++++++++
 tests/components/output/test.esp32-idf.yaml   | 13 ++++++++
 tests/components/output/test.esp32.yaml       | 13 ++++++++
 tests/components/output/test.esp8266.yaml     | 13 ++++++++
 tests/components/output/test.rp2040.yaml      | 13 ++++++++
 12 files changed, 258 insertions(+)
 create mode 100644 tests/components/ota/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ota/test.esp32-c3.yaml
 create mode 100644 tests/components/ota/test.esp32-idf.yaml
 create mode 100644 tests/components/ota/test.esp32.yaml
 create mode 100644 tests/components/ota/test.esp8266.yaml
 create mode 100644 tests/components/ota/test.rp2040.yaml
 create mode 100644 tests/components/output/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/output/test.esp32-c3.yaml
 create mode 100644 tests/components/output/test.esp32-idf.yaml
 create mode 100644 tests/components/output/test.esp32.yaml
 create mode 100644 tests/components/output/test.esp8266.yaml
 create mode 100644 tests/components/output/test.rp2040.yaml

diff --git a/tests/components/ota/test.esp32-c3-idf.yaml b/tests/components/ota/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.esp32-c3-idf.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/ota/test.esp32-c3.yaml b/tests/components/ota/test.esp32-c3.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.esp32-c3.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/ota/test.esp32-idf.yaml b/tests/components/ota/test.esp32-idf.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.esp32-idf.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/ota/test.esp32.yaml b/tests/components/ota/test.esp32.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.esp32.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/ota/test.esp8266.yaml b/tests/components/ota/test.esp8266.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.esp8266.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/ota/test.rp2040.yaml b/tests/components/ota/test.rp2040.yaml
new file mode 100644
index 0000000000..367454995f
--- /dev/null
+++ b/tests/components/ota/test.rp2040.yaml
@@ -0,0 +1,30 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+  safe_mode: true
+  password: "superlongpasswordthatnoonewillknow"
+  port: 3286
+  reboot_timeout: 2min
+  num_attempts: 5
+  on_begin:
+    then:
+      - logger.log: "OTA start"
+  on_progress:
+    then:
+      - logger.log:
+          format: "OTA progress %0.1f%%"
+          args: ["x"]
+  on_end:
+    then:
+      - logger.log: "OTA end"
+  on_error:
+    then:
+      - logger.log:
+          format: "OTA update error %d"
+          args: ["x"]
+  on_state_change:
+    then:
+      lambda: >-
+        ESP_LOGD("ota", "State %d", state);
diff --git a/tests/components/output/test.esp32-c3-idf.yaml b/tests/components/output/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c56d85c296
--- /dev/null
+++ b/tests/components/output/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
diff --git a/tests/components/output/test.esp32-c3.yaml b/tests/components/output/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c56d85c296
--- /dev/null
+++ b/tests/components/output/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
diff --git a/tests/components/output/test.esp32-idf.yaml b/tests/components/output/test.esp32-idf.yaml
new file mode 100644
index 0000000000..480f9dfe1f
--- /dev/null
+++ b/tests/components/output/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
diff --git a/tests/components/output/test.esp32.yaml b/tests/components/output/test.esp32.yaml
new file mode 100644
index 0000000000..480f9dfe1f
--- /dev/null
+++ b/tests/components/output/test.esp32.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
diff --git a/tests/components/output/test.esp8266.yaml b/tests/components/output/test.esp8266.yaml
new file mode 100644
index 0000000000..d9cb353636
--- /dev/null
+++ b/tests/components/output/test.esp8266.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 12
diff --git a/tests/components/output/test.rp2040.yaml b/tests/components/output/test.rp2040.yaml
new file mode 100644
index 0000000000..399259fdd9
--- /dev/null
+++ b/tests/components/output/test.rp2040.yaml
@@ -0,0 +1,13 @@
+esphome:
+  on_boot:
+    then:
+      - output.turn_off: light_output_1
+      - output.turn_on: light_output_1
+      - output.set_level:
+          id: light_output_1
+          level: 50%
+
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 12

From fa8d09aca9dc26befd101df0720d4563dd8c1577 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Tue, 23 Apr 2024 16:20:37 +1200
Subject: [PATCH 23/81] [mopeka_std_check] Fix test file indentation (#6610)

---
 tests/components/mopeka_std_check/test.esp32-c3-idf.yaml | 9 ++++-----
 tests/components/mopeka_std_check/test.esp32-c3.yaml     | 9 ++++-----
 tests/components/mopeka_std_check/test.esp32-idf.yaml    | 9 ++++-----
 3 files changed, 12 insertions(+), 15 deletions(-)

diff --git a/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml b/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
index 830adf952f..383e2e2a19 100644
--- a/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
+++ b/tests/components/mopeka_std_check/test.esp32-c3-idf.yaml
@@ -6,11 +6,10 @@ sensor:
     mac_address: D3:75:F2:DC:16:91
     tank_type: Europe_11kg
     temperature:
-        name: "Propane test temp"
+      name: "Propane test temp"
     level:
-        name: "Propane test level"
+      name: "Propane test level"
     distance:
-        name: "Propane test distance"
+      name: "Propane test distance"
     battery_level:
-        name: "Propane test battery level"
-
+      name: "Propane test battery level"
diff --git a/tests/components/mopeka_std_check/test.esp32-c3.yaml b/tests/components/mopeka_std_check/test.esp32-c3.yaml
index 830adf952f..383e2e2a19 100644
--- a/tests/components/mopeka_std_check/test.esp32-c3.yaml
+++ b/tests/components/mopeka_std_check/test.esp32-c3.yaml
@@ -6,11 +6,10 @@ sensor:
     mac_address: D3:75:F2:DC:16:91
     tank_type: Europe_11kg
     temperature:
-        name: "Propane test temp"
+      name: "Propane test temp"
     level:
-        name: "Propane test level"
+      name: "Propane test level"
     distance:
-        name: "Propane test distance"
+      name: "Propane test distance"
     battery_level:
-        name: "Propane test battery level"
-
+      name: "Propane test battery level"
diff --git a/tests/components/mopeka_std_check/test.esp32-idf.yaml b/tests/components/mopeka_std_check/test.esp32-idf.yaml
index 830adf952f..383e2e2a19 100644
--- a/tests/components/mopeka_std_check/test.esp32-idf.yaml
+++ b/tests/components/mopeka_std_check/test.esp32-idf.yaml
@@ -6,11 +6,10 @@ sensor:
     mac_address: D3:75:F2:DC:16:91
     tank_type: Europe_11kg
     temperature:
-        name: "Propane test temp"
+      name: "Propane test temp"
     level:
-        name: "Propane test level"
+      name: "Propane test level"
     distance:
-        name: "Propane test distance"
+      name: "Propane test distance"
     battery_level:
-        name: "Propane test battery level"
-
+      name: "Propane test battery level"

From eb89d99999941a6de6872d3bea01d2ef3c684924 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 23:47:03 -0500
Subject: [PATCH 24/81] Add valve component (#6447)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 CODEOWNERS                                    |   1 +
 esphome/components/api/api.proto              |  51 ++++
 esphome/components/api/api_connection.cpp     |  42 +++
 esphome/components/api/api_connection.h       |   5 +
 esphome/components/api/api_pb2.cpp            | 247 ++++++++++++++++++
 esphome/components/api/api_pb2.h              |  57 ++++
 esphome/components/api/api_pb2_service.cpp    |  42 +++
 esphome/components/api/api_pb2_service.h      |  15 ++
 esphome/components/api/api_server.cpp         |   9 +
 esphome/components/api/api_server.h           |   3 +
 esphome/components/api/list_entities.cpp      |   3 +
 esphome/components/api/list_entities.h        |   3 +
 esphome/components/api/subscribe_state.cpp    |   3 +
 esphome/components/api/subscribe_state.h      |   3 +
 esphome/components/mqtt/__init__.py           |   1 +
 esphome/components/mqtt/mqtt_valve.cpp        |  90 +++++++
 esphome/components/mqtt/mqtt_valve.h          |  41 +++
 esphome/components/template/valve/__init__.py | 118 +++++++++
 .../template/valve/template_valve.cpp         | 131 ++++++++++
 .../template/valve/template_valve.h           |  60 +++++
 esphome/components/valve/__init__.py          | 186 +++++++++++++
 esphome/components/valve/automation.h         | 129 +++++++++
 esphome/components/valve/valve.cpp            | 179 +++++++++++++
 esphome/components/valve/valve.h              | 152 +++++++++++
 esphome/components/valve/valve_traits.h       |  27 ++
 .../components/web_server/list_entities.cpp   |   9 +
 esphome/components/web_server/list_entities.h |   3 +
 esphome/components/web_server/web_server.cpp  |  74 ++++++
 esphome/components/web_server/web_server.h    |  10 +
 esphome/core/application.h                    |  19 ++
 esphome/core/component_iterator.cpp           |  15 ++
 esphome/core/component_iterator.h             |   6 +
 esphome/core/controller.cpp                   |   6 +
 esphome/core/controller.h                     |   6 +
 esphome/core/defines.h                        |   1 +
 script/ci-custom.py                           |   1 +
 tests/components/template/test.all.yaml       |  17 ++
 37 files changed, 1765 insertions(+)
 create mode 100644 esphome/components/mqtt/mqtt_valve.cpp
 create mode 100644 esphome/components/mqtt/mqtt_valve.h
 create mode 100644 esphome/components/template/valve/__init__.py
 create mode 100644 esphome/components/template/valve/template_valve.cpp
 create mode 100644 esphome/components/template/valve/template_valve.h
 create mode 100644 esphome/components/valve/__init__.py
 create mode 100644 esphome/components/valve/automation.h
 create mode 100644 esphome/components/valve/valve.cpp
 create mode 100644 esphome/components/valve/valve.h
 create mode 100644 esphome/components/valve/valve_traits.h

diff --git a/CODEOWNERS b/CODEOWNERS
index 9f770d4efc..28ce8e7b6a 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -390,6 +390,7 @@ esphome/components/ufire_ec/* @pvizeli
 esphome/components/ufire_ise/* @pvizeli
 esphome/components/ultrasonic/* @OttoWinter
 esphome/components/uponor_smatrix/* @kroimon
+esphome/components/valve/* @esphome/core
 esphome/components/vbus/* @ssieb
 esphome/components/veml3235/* @kbx81
 esphome/components/veml7700/* @latonita
diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto
index 8d5459e717..12b7ef0958 100644
--- a/esphome/components/api/api.proto
+++ b/esphome/components/api/api.proto
@@ -43,6 +43,7 @@ service APIConnection {
   rpc select_command (SelectCommandRequest) returns (void) {}
   rpc button_command (ButtonCommandRequest) returns (void) {}
   rpc lock_command (LockCommandRequest) returns (void) {}
+  rpc valve_command (ValveCommandRequest) returns (void) {}
   rpc media_player_command (MediaPlayerCommandRequest) returns (void) {}
   rpc date_command (DateCommandRequest) returns (void) {}
   rpc time_command (TimeCommandRequest) returns (void) {}
@@ -1700,3 +1701,53 @@ message TimeCommandRequest {
   uint32 minute = 3;
   uint32 second = 4;
 }
+
+
+// ==================== VALVE ====================
+message ListEntitiesValveResponse {
+  option (id) = 109;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_VALVE";
+
+  string object_id = 1;
+  fixed32 key = 2;
+  string name = 3;
+  string unique_id = 4;
+
+  string icon = 5;
+  bool disabled_by_default = 6;
+  EntityCategory entity_category = 7;
+  string device_class = 8;
+
+  bool assumed_state = 9;
+  bool supports_position = 10;
+  bool supports_stop = 11;
+}
+
+enum ValveOperation {
+  VALVE_OPERATION_IDLE = 0;
+  VALVE_OPERATION_IS_OPENING = 1;
+  VALVE_OPERATION_IS_CLOSING = 2;
+}
+message ValveStateResponse {
+  option (id) = 110;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_VALVE";
+  option (no_delay) = true;
+
+  fixed32 key = 1;
+  float position = 2;
+  ValveOperation current_operation = 3;
+}
+
+message ValveCommandRequest {
+  option (id) = 111;
+  option (source) = SOURCE_CLIENT;
+  option (ifdef) = "USE_VALVE";
+  option (no_delay) = true;
+
+  fixed32 key = 1;
+  bool has_position = 2;
+  float position = 3;
+  bool stop = 4;
+}
diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp
index e51fa8c154..47136fff98 100644
--- a/esphome/components/api/api_connection.cpp
+++ b/esphome/components/api/api_connection.cpp
@@ -915,6 +915,48 @@ void APIConnection::lock_command(const LockCommandRequest &msg) {
 }
 #endif
 
+#ifdef USE_VALVE
+bool APIConnection::send_valve_state(valve::Valve *valve) {
+  if (!this->state_subscription_)
+    return false;
+
+  ValveStateResponse resp{};
+  resp.key = valve->get_object_id_hash();
+  resp.position = valve->position;
+  resp.current_operation = static_cast<enums::ValveOperation>(valve->current_operation);
+  return this->send_valve_state_response(resp);
+}
+bool APIConnection::send_valve_info(valve::Valve *valve) {
+  auto traits = valve->get_traits();
+  ListEntitiesValveResponse msg;
+  msg.key = valve->get_object_id_hash();
+  msg.object_id = valve->get_object_id();
+  if (valve->has_own_name())
+    msg.name = valve->get_name();
+  msg.unique_id = get_default_unique_id("valve", valve);
+  msg.icon = valve->get_icon();
+  msg.disabled_by_default = valve->is_disabled_by_default();
+  msg.entity_category = static_cast<enums::EntityCategory>(valve->get_entity_category());
+  msg.device_class = valve->get_device_class();
+  msg.assumed_state = traits.get_is_assumed_state();
+  msg.supports_position = traits.get_supports_position();
+  msg.supports_stop = traits.get_supports_stop();
+  return this->send_list_entities_valve_response(msg);
+}
+void APIConnection::valve_command(const ValveCommandRequest &msg) {
+  valve::Valve *valve = App.get_valve_by_key(msg.key);
+  if (valve == nullptr)
+    return;
+
+  auto call = valve->make_call();
+  if (msg.has_position)
+    call.set_position(msg.position);
+  if (msg.stop)
+    call.set_command_stop();
+  call.perform();
+}
+#endif
+
 #ifdef USE_MEDIA_PLAYER
 bool APIConnection::send_media_player_state(media_player::MediaPlayer *media_player) {
   if (!this->state_subscription_)
diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h
index 5c0a78015d..af2dd9e681 100644
--- a/esphome/components/api/api_connection.h
+++ b/esphome/components/api/api_connection.h
@@ -101,6 +101,11 @@ class APIConnection : public APIServerConnection {
   bool send_lock_info(lock::Lock *a_lock);
   void lock_command(const LockCommandRequest &msg) override;
 #endif
+#ifdef USE_VALVE
+  bool send_valve_state(valve::Valve *valve);
+  bool send_valve_info(valve::Valve *valve);
+  void valve_command(const ValveCommandRequest &msg) override;
+#endif
 #ifdef USE_MEDIA_PLAYER
   bool send_media_player_state(media_player::MediaPlayer *media_player);
   bool send_media_player_info(media_player::MediaPlayer *media_player);
diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp
index 884396bda3..508947ba24 100644
--- a/esphome/components/api/api_pb2.cpp
+++ b/esphome/components/api/api_pb2.cpp
@@ -537,6 +537,20 @@ template<> const char *proto_enum_to_string<enums::TextMode>(enums::TextMode val
   }
 }
 #endif
+#ifdef HAS_PROTO_MESSAGE_DUMP
+template<> const char *proto_enum_to_string<enums::ValveOperation>(enums::ValveOperation value) {
+  switch (value) {
+    case enums::VALVE_OPERATION_IDLE:
+      return "VALVE_OPERATION_IDLE";
+    case enums::VALVE_OPERATION_IS_OPENING:
+      return "VALVE_OPERATION_IS_OPENING";
+    case enums::VALVE_OPERATION_IS_CLOSING:
+      return "VALVE_OPERATION_IS_CLOSING";
+    default:
+      return "UNKNOWN";
+  }
+}
+#endif
 bool HelloRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
   switch (field_id) {
     case 2: {
@@ -7695,6 +7709,239 @@ void TimeCommandRequest::dump_to(std::string &out) const {
   out.append("}");
 }
 #endif
+bool ListEntitiesValveResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 6: {
+      this->disabled_by_default = value.as_bool();
+      return true;
+    }
+    case 7: {
+      this->entity_category = value.as_enum<enums::EntityCategory>();
+      return true;
+    }
+    case 9: {
+      this->assumed_state = value.as_bool();
+      return true;
+    }
+    case 10: {
+      this->supports_position = value.as_bool();
+      return true;
+    }
+    case 11: {
+      this->supports_stop = value.as_bool();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesValveResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
+  switch (field_id) {
+    case 1: {
+      this->object_id = value.as_string();
+      return true;
+    }
+    case 3: {
+      this->name = value.as_string();
+      return true;
+    }
+    case 4: {
+      this->unique_id = value.as_string();
+      return true;
+    }
+    case 5: {
+      this->icon = value.as_string();
+      return true;
+    }
+    case 8: {
+      this->device_class = value.as_string();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesValveResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 2: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void ListEntitiesValveResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_string(1, this->object_id);
+  buffer.encode_fixed32(2, this->key);
+  buffer.encode_string(3, this->name);
+  buffer.encode_string(4, this->unique_id);
+  buffer.encode_string(5, this->icon);
+  buffer.encode_bool(6, this->disabled_by_default);
+  buffer.encode_enum<enums::EntityCategory>(7, this->entity_category);
+  buffer.encode_string(8, this->device_class);
+  buffer.encode_bool(9, this->assumed_state);
+  buffer.encode_bool(10, this->supports_position);
+  buffer.encode_bool(11, this->supports_stop);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void ListEntitiesValveResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("ListEntitiesValveResponse {\n");
+  out.append("  object_id: ");
+  out.append("'").append(this->object_id).append("'");
+  out.append("\n");
+
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  name: ");
+  out.append("'").append(this->name).append("'");
+  out.append("\n");
+
+  out.append("  unique_id: ");
+  out.append("'").append(this->unique_id).append("'");
+  out.append("\n");
+
+  out.append("  icon: ");
+  out.append("'").append(this->icon).append("'");
+  out.append("\n");
+
+  out.append("  disabled_by_default: ");
+  out.append(YESNO(this->disabled_by_default));
+  out.append("\n");
+
+  out.append("  entity_category: ");
+  out.append(proto_enum_to_string<enums::EntityCategory>(this->entity_category));
+  out.append("\n");
+
+  out.append("  device_class: ");
+  out.append("'").append(this->device_class).append("'");
+  out.append("\n");
+
+  out.append("  assumed_state: ");
+  out.append(YESNO(this->assumed_state));
+  out.append("\n");
+
+  out.append("  supports_position: ");
+  out.append(YESNO(this->supports_position));
+  out.append("\n");
+
+  out.append("  supports_stop: ");
+  out.append(YESNO(this->supports_stop));
+  out.append("\n");
+  out.append("}");
+}
+#endif
+bool ValveStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 3: {
+      this->current_operation = value.as_enum<enums::ValveOperation>();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ValveStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 1: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    case 2: {
+      this->position = value.as_float();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void ValveStateResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_fixed32(1, this->key);
+  buffer.encode_float(2, this->position);
+  buffer.encode_enum<enums::ValveOperation>(3, this->current_operation);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void ValveStateResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("ValveStateResponse {\n");
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  position: ");
+  sprintf(buffer, "%g", this->position);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  current_operation: ");
+  out.append(proto_enum_to_string<enums::ValveOperation>(this->current_operation));
+  out.append("\n");
+  out.append("}");
+}
+#endif
+bool ValveCommandRequest::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 2: {
+      this->has_position = value.as_bool();
+      return true;
+    }
+    case 4: {
+      this->stop = value.as_bool();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ValveCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 1: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    case 3: {
+      this->position = value.as_float();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void ValveCommandRequest::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_fixed32(1, this->key);
+  buffer.encode_bool(2, this->has_position);
+  buffer.encode_float(3, this->position);
+  buffer.encode_bool(4, this->stop);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void ValveCommandRequest::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("ValveCommandRequest {\n");
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  has_position: ");
+  out.append(YESNO(this->has_position));
+  out.append("\n");
+
+  out.append("  position: ");
+  sprintf(buffer, "%g", this->position);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  stop: ");
+  out.append(YESNO(this->stop));
+  out.append("\n");
+  out.append("}");
+}
+#endif
 
 }  // namespace api
 }  // namespace esphome
diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h
index 2ae6fd2bb6..950ffcdc88 100644
--- a/esphome/components/api/api_pb2.h
+++ b/esphome/components/api/api_pb2.h
@@ -216,6 +216,11 @@ enum TextMode : uint32_t {
   TEXT_MODE_TEXT = 0,
   TEXT_MODE_PASSWORD = 1,
 };
+enum ValveOperation : uint32_t {
+  VALVE_OPERATION_IDLE = 0,
+  VALVE_OPERATION_IS_OPENING = 1,
+  VALVE_OPERATION_IS_CLOSING = 2,
+};
 
 }  // namespace enums
 
@@ -1969,6 +1974,58 @@ class TimeCommandRequest : public ProtoMessage {
   bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
   bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
 };
+class ListEntitiesValveResponse : public ProtoMessage {
+ public:
+  std::string object_id{};
+  uint32_t key{0};
+  std::string name{};
+  std::string unique_id{};
+  std::string icon{};
+  bool disabled_by_default{false};
+  enums::EntityCategory entity_category{};
+  std::string device_class{};
+  bool assumed_state{false};
+  bool supports_position{false};
+  bool supports_stop{false};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
+class ValveStateResponse : public ProtoMessage {
+ public:
+  uint32_t key{0};
+  float position{0.0f};
+  enums::ValveOperation current_operation{};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
+class ValveCommandRequest : public ProtoMessage {
+ public:
+  uint32_t key{0};
+  bool has_position{false};
+  float position{0.0f};
+  bool stop{false};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
 
 }  // namespace api
 }  // namespace esphome
diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp
index 7a97df1ce0..4b8b8cf5ae 100644
--- a/esphome/components/api/api_pb2_service.cpp
+++ b/esphome/components/api/api_pb2_service.cpp
@@ -557,6 +557,24 @@ bool APIServerConnectionBase::send_time_state_response(const TimeStateResponse &
 #endif
 #ifdef USE_DATETIME_TIME
 #endif
+#ifdef USE_VALVE
+bool APIServerConnectionBase::send_list_entities_valve_response(const ListEntitiesValveResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_list_entities_valve_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<ListEntitiesValveResponse>(msg, 109);
+}
+#endif
+#ifdef USE_VALVE
+bool APIServerConnectionBase::send_valve_state_response(const ValveStateResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_valve_state_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<ValveStateResponse>(msg, 110);
+}
+#endif
+#ifdef USE_VALVE
+#endif
 bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) {
   switch (msg_type) {
     case 1: {
@@ -1019,6 +1037,17 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type,
       ESP_LOGVV(TAG, "on_voice_assistant_audio: %s", msg.dump().c_str());
 #endif
       this->on_voice_assistant_audio(msg);
+#endif
+      break;
+    }
+    case 111: {
+#ifdef USE_VALVE
+      ValveCommandRequest msg;
+      msg.decode(msg_data, msg_size);
+#ifdef HAS_PROTO_MESSAGE_DUMP
+      ESP_LOGVV(TAG, "on_valve_command_request: %s", msg.dump().c_str());
+#endif
+      this->on_valve_command_request(msg);
 #endif
       break;
     }
@@ -1282,6 +1311,19 @@ void APIServerConnection::on_lock_command_request(const LockCommandRequest &msg)
   this->lock_command(msg);
 }
 #endif
+#ifdef USE_VALVE
+void APIServerConnection::on_valve_command_request(const ValveCommandRequest &msg) {
+  if (!this->is_connection_setup()) {
+    this->on_no_setup_connection();
+    return;
+  }
+  if (!this->is_authenticated()) {
+    this->on_unauthenticated_access();
+    return;
+  }
+  this->valve_command(msg);
+}
+#endif
 #ifdef USE_MEDIA_PLAYER
 void APIServerConnection::on_media_player_command_request(const MediaPlayerCommandRequest &msg) {
   if (!this->is_connection_setup()) {
diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h
index 095ce51b0f..9f1d711257 100644
--- a/esphome/components/api/api_pb2_service.h
+++ b/esphome/components/api/api_pb2_service.h
@@ -279,6 +279,15 @@ class APIServerConnectionBase : public ProtoService {
 #endif
 #ifdef USE_DATETIME_TIME
   virtual void on_time_command_request(const TimeCommandRequest &value){};
+#endif
+#ifdef USE_VALVE
+  bool send_list_entities_valve_response(const ListEntitiesValveResponse &msg);
+#endif
+#ifdef USE_VALVE
+  bool send_valve_state_response(const ValveStateResponse &msg);
+#endif
+#ifdef USE_VALVE
+  virtual void on_valve_command_request(const ValveCommandRequest &value){};
 #endif
  protected:
   bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) override;
@@ -331,6 +340,9 @@ class APIServerConnection : public APIServerConnectionBase {
 #ifdef USE_LOCK
   virtual void lock_command(const LockCommandRequest &msg) = 0;
 #endif
+#ifdef USE_VALVE
+  virtual void valve_command(const ValveCommandRequest &msg) = 0;
+#endif
 #ifdef USE_MEDIA_PLAYER
   virtual void media_player_command(const MediaPlayerCommandRequest &msg) = 0;
 #endif
@@ -423,6 +435,9 @@ class APIServerConnection : public APIServerConnectionBase {
 #ifdef USE_LOCK
   void on_lock_command_request(const LockCommandRequest &msg) override;
 #endif
+#ifdef USE_VALVE
+  void on_valve_command_request(const ValveCommandRequest &msg) override;
+#endif
 #ifdef USE_MEDIA_PLAYER
   void on_media_player_command_request(const MediaPlayerCommandRequest &msg) override;
 #endif
diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp
index 4c809126e6..457eeb1229 100644
--- a/esphome/components/api/api_server.cpp
+++ b/esphome/components/api/api_server.cpp
@@ -300,6 +300,15 @@ void APIServer::on_lock_update(lock::Lock *obj) {
 }
 #endif
 
+#ifdef USE_VALVE
+void APIServer::on_valve_update(valve::Valve *obj) {
+  if (obj->is_internal())
+    return;
+  for (auto &c : this->clients_)
+    c->send_valve_state(obj);
+}
+#endif
+
 #ifdef USE_MEDIA_PLAYER
 void APIServer::on_media_player_update(media_player::MediaPlayer *obj) {
   if (obj->is_internal())
diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h
index 8a9c26af73..d64643b961 100644
--- a/esphome/components/api/api_server.h
+++ b/esphome/components/api/api_server.h
@@ -81,6 +81,9 @@ class APIServer : public Component, public Controller {
 #ifdef USE_LOCK
   void on_lock_update(lock::Lock *obj) override;
 #endif
+#ifdef USE_VALVE
+  void on_valve_update(valve::Valve *obj) override;
+#endif
 #ifdef USE_MEDIA_PLAYER
   void on_media_player_update(media_player::MediaPlayer *obj) override;
 #endif
diff --git a/esphome/components/api/list_entities.cpp b/esphome/components/api/list_entities.cpp
index 18685ee4d1..d6ff8e5557 100644
--- a/esphome/components/api/list_entities.cpp
+++ b/esphome/components/api/list_entities.cpp
@@ -38,6 +38,9 @@ bool ListEntitiesIterator::on_text_sensor(text_sensor::TextSensor *text_sensor)
 #ifdef USE_LOCK
 bool ListEntitiesIterator::on_lock(lock::Lock *a_lock) { return this->client_->send_lock_info(a_lock); }
 #endif
+#ifdef USE_VALVE
+bool ListEntitiesIterator::on_valve(valve::Valve *valve) { return this->client_->send_valve_info(valve); }
+#endif
 
 bool ListEntitiesIterator::on_end() { return this->client_->send_list_info_done(); }
 ListEntitiesIterator::ListEntitiesIterator(APIConnection *client) : client_(client) {}
diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h
index 95a09fc25b..5d0c243f4a 100644
--- a/esphome/components/api/list_entities.h
+++ b/esphome/components/api/list_entities.h
@@ -61,6 +61,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #ifdef USE_LOCK
   bool on_lock(lock::Lock *a_lock) override;
 #endif
+#ifdef USE_VALVE
+  bool on_valve(valve::Valve *valve) override;
+#endif
 #ifdef USE_MEDIA_PLAYER
   bool on_media_player(media_player::MediaPlayer *media_player) override;
 #endif
diff --git a/esphome/components/api/subscribe_state.cpp b/esphome/components/api/subscribe_state.cpp
index 5eb40cfa7e..7aa8e8ffac 100644
--- a/esphome/components/api/subscribe_state.cpp
+++ b/esphome/components/api/subscribe_state.cpp
@@ -59,6 +59,9 @@ bool InitialStateIterator::on_select(select::Select *select) {
 #ifdef USE_LOCK
 bool InitialStateIterator::on_lock(lock::Lock *a_lock) { return this->client_->send_lock_state(a_lock, a_lock->state); }
 #endif
+#ifdef USE_VALVE
+bool InitialStateIterator::on_valve(valve::Valve *valve) { return this->client_->send_valve_state(valve); }
+#endif
 #ifdef USE_MEDIA_PLAYER
 bool InitialStateIterator::on_media_player(media_player::MediaPlayer *media_player) {
   return this->client_->send_media_player_state(media_player);
diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h
index 447f1707d2..8d50e0d89a 100644
--- a/esphome/components/api/subscribe_state.h
+++ b/esphome/components/api/subscribe_state.h
@@ -58,6 +58,9 @@ class InitialStateIterator : public ComponentIterator {
 #ifdef USE_LOCK
   bool on_lock(lock::Lock *a_lock) override;
 #endif
+#ifdef USE_VALVE
+  bool on_valve(valve::Valve *valve) override;
+#endif
 #ifdef USE_MEDIA_PLAYER
   bool on_media_player(media_player::MediaPlayer *media_player) override;
 #endif
diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py
index b2c03c1546..72ee81dbbc 100644
--- a/esphome/components/mqtt/__init__.py
+++ b/esphome/components/mqtt/__init__.py
@@ -119,6 +119,7 @@ MQTTTextComponent = mqtt_ns.class_("MQTTTextComponent", MQTTComponent)
 MQTTSelectComponent = mqtt_ns.class_("MQTTSelectComponent", MQTTComponent)
 MQTTButtonComponent = mqtt_ns.class_("MQTTButtonComponent", MQTTComponent)
 MQTTLockComponent = mqtt_ns.class_("MQTTLockComponent", MQTTComponent)
+MQTTValveComponent = mqtt_ns.class_("MQTTValveComponent", MQTTComponent)
 
 MQTTDiscoveryUniqueIdGenerator = mqtt_ns.enum("MQTTDiscoveryUniqueIdGenerator")
 MQTT_DISCOVERY_UNIQUE_ID_GENERATOR_OPTIONS = {
diff --git a/esphome/components/mqtt/mqtt_valve.cpp b/esphome/components/mqtt/mqtt_valve.cpp
new file mode 100644
index 0000000000..07eeca08d6
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_valve.cpp
@@ -0,0 +1,90 @@
+#include "mqtt_valve.h"
+#include "esphome/core/log.h"
+
+#include "mqtt_const.h"
+
+#ifdef USE_MQTT
+#ifdef USE_VALVE
+
+namespace esphome {
+namespace mqtt {
+
+static const char *const TAG = "mqtt.valve";
+
+using namespace esphome::valve;
+
+MQTTValveComponent::MQTTValveComponent(Valve *valve) : valve_(valve) {}
+void MQTTValveComponent::setup() {
+  auto traits = this->valve_->get_traits();
+  this->valve_->add_on_state_callback([this]() { this->publish_state(); });
+  this->subscribe(this->get_command_topic_(), [this](const std::string &topic, const std::string &payload) {
+    auto call = this->valve_->make_call();
+    call.set_command(payload.c_str());
+    call.perform();
+  });
+  if (traits.get_supports_position()) {
+    this->subscribe(this->get_position_command_topic(), [this](const std::string &topic, const std::string &payload) {
+      auto value = parse_number<float>(payload);
+      if (!value.has_value()) {
+        ESP_LOGW(TAG, "Invalid position value: '%s'", payload.c_str());
+        return;
+      }
+      auto call = this->valve_->make_call();
+      call.set_position(*value / 100.0f);
+      call.perform();
+    });
+  }
+}
+
+void MQTTValveComponent::dump_config() {
+  ESP_LOGCONFIG(TAG, "MQTT valve '%s':", this->valve_->get_name().c_str());
+  auto traits = this->valve_->get_traits();
+  bool has_command_topic = traits.get_supports_position();
+  LOG_MQTT_COMPONENT(true, has_command_topic)
+  if (traits.get_supports_position()) {
+    ESP_LOGCONFIG(TAG, "  Position State Topic: '%s'", this->get_position_state_topic().c_str());
+    ESP_LOGCONFIG(TAG, "  Position Command Topic: '%s'", this->get_position_command_topic().c_str());
+  }
+}
+void MQTTValveComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) {
+  if (!this->valve_->get_device_class().empty())
+    root[MQTT_DEVICE_CLASS] = this->valve_->get_device_class();
+
+  auto traits = this->valve_->get_traits();
+  if (traits.get_is_assumed_state()) {
+    root[MQTT_OPTIMISTIC] = true;
+  }
+  if (traits.get_supports_position()) {
+    root[MQTT_POSITION_TOPIC] = this->get_position_state_topic();
+    root[MQTT_SET_POSITION_TOPIC] = this->get_position_command_topic();
+  }
+}
+
+std::string MQTTValveComponent::component_type() const { return "valve"; }
+const EntityBase *MQTTValveComponent::get_entity() const { return this->valve_; }
+
+bool MQTTValveComponent::send_initial_state() { return this->publish_state(); }
+bool MQTTValveComponent::publish_state() {
+  auto traits = this->valve_->get_traits();
+  bool success = true;
+  if (traits.get_supports_position()) {
+    std::string pos = value_accuracy_to_string(roundf(this->valve_->position * 100), 0);
+    if (!this->publish(this->get_position_state_topic(), pos))
+      success = false;
+  }
+  const char *state_s = this->valve_->current_operation == VALVE_OPERATION_OPENING   ? "opening"
+                        : this->valve_->current_operation == VALVE_OPERATION_CLOSING ? "closing"
+                        : this->valve_->position == VALVE_CLOSED                     ? "closed"
+                        : this->valve_->position == VALVE_OPEN                       ? "open"
+                        : traits.get_supports_position()                             ? "open"
+                                                                                     : "unknown";
+  if (!this->publish(this->get_state_topic_(), state_s))
+    success = false;
+  return success;
+}
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif
+#endif  // USE_MQTT
diff --git a/esphome/components/mqtt/mqtt_valve.h b/esphome/components/mqtt/mqtt_valve.h
new file mode 100644
index 0000000000..63a0462193
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_valve.h
@@ -0,0 +1,41 @@
+#pragma once
+
+#include "esphome/core/defines.h"
+#include "mqtt_component.h"
+
+#ifdef USE_MQTT
+#ifdef USE_VALVE
+
+#include "esphome/components/valve/valve.h"
+
+namespace esphome {
+namespace mqtt {
+
+class MQTTValveComponent : public mqtt::MQTTComponent {
+ public:
+  explicit MQTTValveComponent(valve::Valve *valve);
+
+  void setup() override;
+  void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override;
+
+  MQTT_COMPONENT_CUSTOM_TOPIC(position, command)
+  MQTT_COMPONENT_CUSTOM_TOPIC(position, state)
+
+  bool send_initial_state() override;
+
+  bool publish_state();
+
+  void dump_config() override;
+
+ protected:
+  std::string component_type() const override;
+  const EntityBase *get_entity() const override;
+
+  valve::Valve *valve_;
+};
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif
+#endif  // USE_MQTT
diff --git a/esphome/components/template/valve/__init__.py b/esphome/components/template/valve/__init__.py
new file mode 100644
index 0000000000..89d776dfdd
--- /dev/null
+++ b/esphome/components/template/valve/__init__.py
@@ -0,0 +1,118 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import automation
+from esphome.components import valve
+from esphome.const import (
+    CONF_ASSUMED_STATE,
+    CONF_CLOSE_ACTION,
+    CONF_CURRENT_OPERATION,
+    CONF_ID,
+    CONF_LAMBDA,
+    CONF_OPEN_ACTION,
+    CONF_OPTIMISTIC,
+    CONF_POSITION,
+    CONF_POSITION_ACTION,
+    CONF_RESTORE_MODE,
+    CONF_STATE,
+    CONF_STOP_ACTION,
+)
+from .. import template_ns
+
+TemplateValve = template_ns.class_("TemplateValve", valve.Valve, cg.Component)
+
+TemplateValveRestoreMode = template_ns.enum("TemplateValveRestoreMode")
+RESTORE_MODES = {
+    "NO_RESTORE": TemplateValveRestoreMode.VALVE_NO_RESTORE,
+    "RESTORE": TemplateValveRestoreMode.VALVE_RESTORE,
+    "RESTORE_AND_CALL": TemplateValveRestoreMode.VALVE_RESTORE_AND_CALL,
+}
+
+CONF_HAS_POSITION = "has_position"
+CONF_TOGGLE_ACTION = "toggle_action"
+
+CONFIG_SCHEMA = valve.VALVE_SCHEMA.extend(
+    {
+        cv.GenerateID(): cv.declare_id(TemplateValve),
+        cv.Optional(CONF_LAMBDA): cv.returning_lambda,
+        cv.Optional(CONF_OPTIMISTIC, default=False): cv.boolean,
+        cv.Optional(CONF_ASSUMED_STATE, default=False): cv.boolean,
+        cv.Optional(CONF_HAS_POSITION, default=False): cv.boolean,
+        cv.Optional(CONF_OPEN_ACTION): automation.validate_automation(single=True),
+        cv.Optional(CONF_CLOSE_ACTION): automation.validate_automation(single=True),
+        cv.Optional(CONF_STOP_ACTION): automation.validate_automation(single=True),
+        cv.Optional(CONF_TOGGLE_ACTION): automation.validate_automation(single=True),
+        cv.Optional(CONF_POSITION_ACTION): automation.validate_automation(single=True),
+        cv.Optional(CONF_RESTORE_MODE, default="NO_RESTORE"): cv.enum(
+            RESTORE_MODES, upper=True
+        ),
+    }
+).extend(cv.COMPONENT_SCHEMA)
+
+
+async def to_code(config):
+    var = await valve.new_valve(config)
+    await cg.register_component(var, config)
+    if lambda_config := config.get(CONF_LAMBDA):
+        template_ = await cg.process_lambda(
+            lambda_config, [], return_type=cg.optional.template(float)
+        )
+        cg.add(var.set_state_lambda(template_))
+    if open_action_config := config.get(CONF_OPEN_ACTION):
+        await automation.build_automation(
+            var.get_open_trigger(), [], open_action_config
+        )
+    if close_action_config := config.get(CONF_CLOSE_ACTION):
+        await automation.build_automation(
+            var.get_close_trigger(), [], close_action_config
+        )
+    if stop_action_config := config.get(CONF_STOP_ACTION):
+        await automation.build_automation(
+            var.get_stop_trigger(), [], stop_action_config
+        )
+        cg.add(var.set_has_stop(True))
+    if toggle_action_config := config.get(CONF_TOGGLE_ACTION):
+        await automation.build_automation(
+            var.get_toggle_trigger(), [], toggle_action_config
+        )
+        cg.add(var.set_has_toggle(True))
+    if position_action_config := config.get(CONF_POSITION_ACTION):
+        await automation.build_automation(
+            var.get_position_trigger(), [(float, "pos")], position_action_config
+        )
+        cg.add(var.set_has_position(True))
+    else:
+        cg.add(var.set_has_position(config[CONF_HAS_POSITION]))
+    cg.add(var.set_optimistic(config[CONF_OPTIMISTIC]))
+    cg.add(var.set_assumed_state(config[CONF_ASSUMED_STATE]))
+    cg.add(var.set_restore_mode(config[CONF_RESTORE_MODE]))
+
+
+@automation.register_action(
+    "valve.template.publish",
+    valve.ValvePublishAction,
+    cv.Schema(
+        {
+            cv.Required(CONF_ID): cv.use_id(valve.Valve),
+            cv.Exclusive(CONF_STATE, "pos"): cv.templatable(valve.validate_valve_state),
+            cv.Exclusive(CONF_POSITION, "pos"): cv.templatable(cv.percentage),
+            cv.Optional(CONF_CURRENT_OPERATION): cv.templatable(
+                valve.validate_valve_operation
+            ),
+        }
+    ),
+)
+async def valve_template_publish_to_code(config, action_id, template_arg, args):
+    paren = await cg.get_variable(config[CONF_ID])
+    var = cg.new_Pvariable(action_id, template_arg, paren)
+    if state_config := config.get(CONF_STATE):
+        template_ = await cg.templatable(state_config, args, float)
+        cg.add(var.set_position(template_))
+    if (position_config := config.get(CONF_POSITION)) is not None:
+        template_ = await cg.templatable(position_config, args, float)
+        cg.add(var.set_position(template_))
+    if current_operation_config := config.get(CONF_CURRENT_OPERATION):
+        template_ = await cg.templatable(
+            current_operation_config, args, valve.ValveOperation
+        )
+        cg.add(var.set_current_operation(template_))
+    return var
diff --git a/esphome/components/template/valve/template_valve.cpp b/esphome/components/template/valve/template_valve.cpp
new file mode 100644
index 0000000000..f943e19da9
--- /dev/null
+++ b/esphome/components/template/valve/template_valve.cpp
@@ -0,0 +1,131 @@
+#include "template_valve.h"
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace template_ {
+
+using namespace esphome::valve;
+
+static const char *const TAG = "template.valve";
+
+TemplateValve::TemplateValve()
+    : open_trigger_(new Trigger<>()),
+      close_trigger_(new Trigger<>),
+      stop_trigger_(new Trigger<>()),
+      toggle_trigger_(new Trigger<>()),
+      position_trigger_(new Trigger<float>()) {}
+
+void TemplateValve::setup() {
+  ESP_LOGCONFIG(TAG, "Setting up template valve '%s'...", this->name_.c_str());
+  switch (this->restore_mode_) {
+    case VALVE_NO_RESTORE:
+      break;
+    case VALVE_RESTORE: {
+      auto restore = this->restore_state_();
+      if (restore.has_value())
+        restore->apply(this);
+      break;
+    }
+    case VALVE_RESTORE_AND_CALL: {
+      auto restore = this->restore_state_();
+      if (restore.has_value()) {
+        restore->to_call(this).perform();
+      }
+      break;
+    }
+  }
+}
+
+void TemplateValve::loop() {
+  bool changed = false;
+
+  if (this->state_f_.has_value()) {
+    auto s = (*this->state_f_)();
+    if (s.has_value()) {
+      auto pos = clamp(*s, 0.0f, 1.0f);
+      if (pos != this->position) {
+        this->position = pos;
+        changed = true;
+      }
+    }
+  }
+
+  if (changed)
+    this->publish_state();
+}
+
+void TemplateValve::set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
+void TemplateValve::set_assumed_state(bool assumed_state) { this->assumed_state_ = assumed_state; }
+void TemplateValve::set_state_lambda(std::function<optional<float>()> &&f) { this->state_f_ = f; }
+float TemplateValve::get_setup_priority() const { return setup_priority::HARDWARE; }
+
+Trigger<> *TemplateValve::get_open_trigger() const { return this->open_trigger_; }
+Trigger<> *TemplateValve::get_close_trigger() const { return this->close_trigger_; }
+Trigger<> *TemplateValve::get_stop_trigger() const { return this->stop_trigger_; }
+Trigger<> *TemplateValve::get_toggle_trigger() const { return this->toggle_trigger_; }
+
+void TemplateValve::dump_config() {
+  LOG_VALVE("", "Template Valve", this);
+  ESP_LOGCONFIG(TAG, "  Has position: %s", YESNO(this->has_position_));
+  ESP_LOGCONFIG(TAG, "  Optimistic: %s", YESNO(this->optimistic_));
+}
+
+void TemplateValve::control(const ValveCall &call) {
+  if (call.get_stop()) {
+    this->stop_prev_trigger_();
+    this->stop_trigger_->trigger();
+    this->prev_command_trigger_ = this->stop_trigger_;
+    this->publish_state();
+  }
+  if (call.get_toggle().has_value()) {
+    this->stop_prev_trigger_();
+    this->toggle_trigger_->trigger();
+    this->prev_command_trigger_ = this->toggle_trigger_;
+    this->publish_state();
+  }
+  if (call.get_position().has_value()) {
+    auto pos = *call.get_position();
+    this->stop_prev_trigger_();
+
+    if (pos == VALVE_OPEN) {
+      this->open_trigger_->trigger();
+      this->prev_command_trigger_ = this->open_trigger_;
+    } else if (pos == VALVE_CLOSED) {
+      this->close_trigger_->trigger();
+      this->prev_command_trigger_ = this->close_trigger_;
+    } else {
+      this->position_trigger_->trigger(pos);
+    }
+
+    if (this->optimistic_) {
+      this->position = pos;
+    }
+  }
+
+  this->publish_state();
+}
+
+ValveTraits TemplateValve::get_traits() {
+  auto traits = ValveTraits();
+  traits.set_is_assumed_state(this->assumed_state_);
+  traits.set_supports_stop(this->has_stop_);
+  traits.set_supports_toggle(this->has_toggle_);
+  traits.set_supports_position(this->has_position_);
+  return traits;
+}
+
+Trigger<float> *TemplateValve::get_position_trigger() const { return this->position_trigger_; }
+
+void TemplateValve::set_has_stop(bool has_stop) { this->has_stop_ = has_stop; }
+void TemplateValve::set_has_toggle(bool has_toggle) { this->has_toggle_ = has_toggle; }
+void TemplateValve::set_has_position(bool has_position) { this->has_position_ = has_position; }
+
+void TemplateValve::stop_prev_trigger_() {
+  if (this->prev_command_trigger_ != nullptr) {
+    this->prev_command_trigger_->stop_action();
+    this->prev_command_trigger_ = nullptr;
+  }
+}
+
+}  // namespace template_
+}  // namespace esphome
diff --git a/esphome/components/template/valve/template_valve.h b/esphome/components/template/valve/template_valve.h
new file mode 100644
index 0000000000..5e3fb6aff3
--- /dev/null
+++ b/esphome/components/template/valve/template_valve.h
@@ -0,0 +1,60 @@
+#pragma once
+
+#include "esphome/core/component.h"
+#include "esphome/core/automation.h"
+#include "esphome/components/valve/valve.h"
+
+namespace esphome {
+namespace template_ {
+
+enum TemplateValveRestoreMode {
+  VALVE_NO_RESTORE,
+  VALVE_RESTORE,
+  VALVE_RESTORE_AND_CALL,
+};
+
+class TemplateValve : public valve::Valve, public Component {
+ public:
+  TemplateValve();
+
+  void set_state_lambda(std::function<optional<float>()> &&f);
+  Trigger<> *get_open_trigger() const;
+  Trigger<> *get_close_trigger() const;
+  Trigger<> *get_stop_trigger() const;
+  Trigger<> *get_toggle_trigger() const;
+  Trigger<float> *get_position_trigger() const;
+  void set_optimistic(bool optimistic);
+  void set_assumed_state(bool assumed_state);
+  void set_has_stop(bool has_stop);
+  void set_has_position(bool has_position);
+  void set_has_toggle(bool has_toggle);
+  void set_restore_mode(TemplateValveRestoreMode restore_mode) { restore_mode_ = restore_mode; }
+
+  void setup() override;
+  void loop() override;
+  void dump_config() override;
+
+  float get_setup_priority() const override;
+
+ protected:
+  void control(const valve::ValveCall &call) override;
+  valve::ValveTraits get_traits() override;
+  void stop_prev_trigger_();
+
+  TemplateValveRestoreMode restore_mode_{VALVE_NO_RESTORE};
+  optional<std::function<optional<float>()>> state_f_;
+  bool assumed_state_{false};
+  bool optimistic_{false};
+  Trigger<> *open_trigger_;
+  Trigger<> *close_trigger_;
+  bool has_stop_{false};
+  bool has_toggle_{false};
+  Trigger<> *stop_trigger_;
+  Trigger<> *toggle_trigger_;
+  Trigger<> *prev_command_trigger_{nullptr};
+  Trigger<float> *position_trigger_;
+  bool has_position_{false};
+};
+
+}  // namespace template_
+}  // namespace esphome
diff --git a/esphome/components/valve/__init__.py b/esphome/components/valve/__init__.py
new file mode 100644
index 0000000000..22d617cc36
--- /dev/null
+++ b/esphome/components/valve/__init__.py
@@ -0,0 +1,186 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import automation
+from esphome.automation import maybe_simple_id, Condition
+from esphome.components import mqtt
+from esphome.const import (
+    CONF_DEVICE_CLASS,
+    CONF_ID,
+    CONF_MQTT_ID,
+    CONF_ON_OPEN,
+    CONF_POSITION,
+    CONF_POSITION_COMMAND_TOPIC,
+    CONF_POSITION_STATE_TOPIC,
+    CONF_STATE,
+    CONF_STOP,
+    CONF_TRIGGER_ID,
+)
+from esphome.core import CORE, coroutine_with_priority
+from esphome.cpp_helpers import setup_entity
+
+IS_PLATFORM_COMPONENT = True
+
+CODEOWNERS = ["@esphome/core"]
+
+valve_ns = cg.esphome_ns.namespace("valve")
+
+Valve = valve_ns.class_("Valve", cg.EntityBase)
+
+VALVE_OPEN = valve_ns.VALVE_OPEN
+VALVE_CLOSED = valve_ns.VALVE_CLOSED
+
+VALVE_STATES = {
+    "OPEN": VALVE_OPEN,
+    "CLOSED": VALVE_CLOSED,
+}
+validate_valve_state = cv.enum(VALVE_STATES, upper=True)
+
+ValveOperation = valve_ns.enum("ValveOperation")
+VALVE_OPERATIONS = {
+    "IDLE": ValveOperation.VALVE_OPERATION_IDLE,
+    "OPENING": ValveOperation.VALVE_OPERATION_OPENING,
+    "CLOSING": ValveOperation.VALVE_OPERATION_CLOSING,
+}
+validate_valve_operation = cv.enum(VALVE_OPERATIONS, upper=True)
+
+# Actions
+OpenAction = valve_ns.class_("OpenAction", automation.Action)
+CloseAction = valve_ns.class_("CloseAction", automation.Action)
+StopAction = valve_ns.class_("StopAction", automation.Action)
+ToggleAction = valve_ns.class_("ToggleAction", automation.Action)
+ControlAction = valve_ns.class_("ControlAction", automation.Action)
+ValvePublishAction = valve_ns.class_("ValvePublishAction", automation.Action)
+ValveIsOpenCondition = valve_ns.class_("ValveIsOpenCondition", Condition)
+ValveIsClosedCondition = valve_ns.class_("ValveIsClosedCondition", Condition)
+
+# Triggers
+ValveOpenTrigger = valve_ns.class_("ValveOpenTrigger", automation.Trigger.template())
+ValveClosedTrigger = valve_ns.class_(
+    "ValveClosedTrigger", automation.Trigger.template()
+)
+
+CONF_ON_CLOSED = "on_closed"
+
+VALVE_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA).extend(
+    {
+        cv.GenerateID(): cv.declare_id(Valve),
+        cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTValveComponent),
+        cv.Optional(CONF_POSITION_COMMAND_TOPIC): cv.All(
+            cv.requires_component("mqtt"), cv.subscribe_topic
+        ),
+        cv.Optional(CONF_POSITION_STATE_TOPIC): cv.All(
+            cv.requires_component("mqtt"), cv.subscribe_topic
+        ),
+        cv.Optional(CONF_ON_OPEN): automation.validate_automation(
+            {
+                cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ValveOpenTrigger),
+            }
+        ),
+        cv.Optional(CONF_ON_CLOSED): automation.validate_automation(
+            {
+                cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(ValveClosedTrigger),
+            }
+        ),
+    }
+)
+
+
+async def setup_valve_core_(var, config):
+    await setup_entity(var, config)
+
+    if device_class_config := config.get(CONF_DEVICE_CLASS):
+        cg.add(var.set_device_class(device_class_config))
+
+    for conf in config.get(CONF_ON_OPEN, []):
+        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
+        await automation.build_automation(trigger, [], conf)
+    for conf in config.get(CONF_ON_CLOSED, []):
+        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
+        await automation.build_automation(trigger, [], conf)
+
+    if mqtt_id_config := config.get(CONF_MQTT_ID):
+        mqtt_ = cg.new_Pvariable(mqtt_id_config, var)
+        await mqtt.register_mqtt_component(mqtt_, config)
+
+        if position_state_topic_config := config.get(CONF_POSITION_STATE_TOPIC):
+            cg.add(mqtt_.set_custom_position_state_topic(position_state_topic_config))
+        if position_command_topic_config := config.get(CONF_POSITION_COMMAND_TOPIC):
+            cg.add(
+                mqtt_.set_custom_position_command_topic(position_command_topic_config)
+            )
+
+
+async def register_valve(var, config):
+    if not CORE.has_id(config[CONF_ID]):
+        var = cg.Pvariable(config[CONF_ID], var)
+    cg.add(cg.App.register_valve(var))
+    await setup_valve_core_(var, config)
+
+
+async def new_valve(config, *args):
+    var = cg.new_Pvariable(config[CONF_ID], *args)
+    await register_valve(var, config)
+    return var
+
+
+VALVE_ACTION_SCHEMA = maybe_simple_id(
+    {
+        cv.Required(CONF_ID): cv.use_id(Valve),
+    }
+)
+
+
+@automation.register_action("valve.open", OpenAction, VALVE_ACTION_SCHEMA)
+async def valve_open_to_code(config, action_id, template_arg, args):
+    paren = await cg.get_variable(config[CONF_ID])
+    return cg.new_Pvariable(action_id, template_arg, paren)
+
+
+@automation.register_action("valve.close", CloseAction, VALVE_ACTION_SCHEMA)
+async def valve_close_to_code(config, action_id, template_arg, args):
+    paren = await cg.get_variable(config[CONF_ID])
+    return cg.new_Pvariable(action_id, template_arg, paren)
+
+
+@automation.register_action("valve.stop", StopAction, VALVE_ACTION_SCHEMA)
+async def valve_stop_to_code(config, action_id, template_arg, args):
+    paren = await cg.get_variable(config[CONF_ID])
+    return cg.new_Pvariable(action_id, template_arg, paren)
+
+
+@automation.register_action("valve.toggle", ToggleAction, VALVE_ACTION_SCHEMA)
+def valve_toggle_to_code(config, action_id, template_arg, args):
+    paren = yield cg.get_variable(config[CONF_ID])
+    yield cg.new_Pvariable(action_id, template_arg, paren)
+
+
+VALVE_CONTROL_ACTION_SCHEMA = cv.Schema(
+    {
+        cv.Required(CONF_ID): cv.use_id(Valve),
+        cv.Optional(CONF_STOP): cv.templatable(cv.boolean),
+        cv.Exclusive(CONF_STATE, "pos"): cv.templatable(validate_valve_state),
+        cv.Exclusive(CONF_POSITION, "pos"): cv.templatable(cv.percentage),
+    }
+)
+
+
+@automation.register_action("valve.control", ControlAction, VALVE_CONTROL_ACTION_SCHEMA)
+async def valve_control_to_code(config, action_id, template_arg, args):
+    paren = await cg.get_variable(config[CONF_ID])
+    var = cg.new_Pvariable(action_id, template_arg, paren)
+    if stop_config := config.get(CONF_STOP):
+        template_ = await cg.templatable(stop_config, args, bool)
+        cg.add(var.set_stop(template_))
+    if state_config := config.get(CONF_STATE):
+        template_ = await cg.templatable(state_config, args, float)
+        cg.add(var.set_position(template_))
+    if (position_config := config.get(CONF_POSITION)) is not None:
+        template_ = await cg.templatable(position_config, args, float)
+        cg.add(var.set_position(template_))
+    return var
+
+
+@coroutine_with_priority(100.0)
+async def to_code(config):
+    cg.add_define("USE_VALVE")
+    cg.add_global(valve_ns.using)
diff --git a/esphome/components/valve/automation.h b/esphome/components/valve/automation.h
new file mode 100644
index 0000000000..24c94a5570
--- /dev/null
+++ b/esphome/components/valve/automation.h
@@ -0,0 +1,129 @@
+#pragma once
+
+#include "esphome/core/component.h"
+#include "esphome/core/automation.h"
+#include "valve.h"
+
+namespace esphome {
+namespace valve {
+
+template<typename... Ts> class OpenAction : public Action<Ts...> {
+ public:
+  explicit OpenAction(Valve *valve) : valve_(valve) {}
+
+  void play(Ts... x) override { this->valve_->make_call().set_command_open().perform(); }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class CloseAction : public Action<Ts...> {
+ public:
+  explicit CloseAction(Valve *valve) : valve_(valve) {}
+
+  void play(Ts... x) override { this->valve_->make_call().set_command_close().perform(); }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class StopAction : public Action<Ts...> {
+ public:
+  explicit StopAction(Valve *valve) : valve_(valve) {}
+
+  void play(Ts... x) override { this->valve_->make_call().set_command_stop().perform(); }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class ToggleAction : public Action<Ts...> {
+ public:
+  explicit ToggleAction(Valve *valve) : valve_(valve) {}
+
+  void play(Ts... x) override { this->valve_->make_call().set_command_toggle().perform(); }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class ControlAction : public Action<Ts...> {
+ public:
+  explicit ControlAction(Valve *valve) : valve_(valve) {}
+
+  TEMPLATABLE_VALUE(bool, stop)
+  TEMPLATABLE_VALUE(float, position)
+
+  void play(Ts... x) override {
+    auto call = this->valve_->make_call();
+    if (this->stop_.has_value())
+      call.set_stop(this->stop_.value(x...));
+    if (this->position_.has_value())
+      call.set_position(this->position_.value(x...));
+    call.perform();
+  }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class ValvePublishAction : public Action<Ts...> {
+ public:
+  ValvePublishAction(Valve *valve) : valve_(valve) {}
+  TEMPLATABLE_VALUE(float, position)
+  TEMPLATABLE_VALUE(ValveOperation, current_operation)
+
+  void play(Ts... x) override {
+    if (this->position_.has_value())
+      this->valve_->position = this->position_.value(x...);
+    if (this->current_operation_.has_value())
+      this->valve_->current_operation = this->current_operation_.value(x...);
+    this->valve_->publish_state();
+  }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class ValveIsOpenCondition : public Condition<Ts...> {
+ public:
+  ValveIsOpenCondition(Valve *valve) : valve_(valve) {}
+  bool check(Ts... x) override { return this->valve_->is_fully_open(); }
+
+ protected:
+  Valve *valve_;
+};
+
+template<typename... Ts> class ValveIsClosedCondition : public Condition<Ts...> {
+ public:
+  ValveIsClosedCondition(Valve *valve) : valve_(valve) {}
+  bool check(Ts... x) override { return this->valve_->is_fully_closed(); }
+
+ protected:
+  Valve *valve_;
+};
+
+class ValveOpenTrigger : public Trigger<> {
+ public:
+  ValveOpenTrigger(Valve *a_valve) {
+    a_valve->add_on_state_callback([this, a_valve]() {
+      if (a_valve->is_fully_open()) {
+        this->trigger();
+      }
+    });
+  }
+};
+
+class ValveClosedTrigger : public Trigger<> {
+ public:
+  ValveClosedTrigger(Valve *a_valve) {
+    a_valve->add_on_state_callback([this, a_valve]() {
+      if (a_valve->is_fully_closed()) {
+        this->trigger();
+      }
+    });
+  }
+};
+
+}  // namespace valve
+}  // namespace esphome
diff --git a/esphome/components/valve/valve.cpp b/esphome/components/valve/valve.cpp
new file mode 100644
index 0000000000..d1ec17945a
--- /dev/null
+++ b/esphome/components/valve/valve.cpp
@@ -0,0 +1,179 @@
+#include "valve.h"
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace valve {
+
+static const char *const TAG = "valve";
+
+const float VALVE_OPEN = 1.0f;
+const float VALVE_CLOSED = 0.0f;
+
+const char *valve_command_to_str(float pos) {
+  if (pos == VALVE_OPEN) {
+    return "OPEN";
+  } else if (pos == VALVE_CLOSED) {
+    return "CLOSE";
+  } else {
+    return "UNKNOWN";
+  }
+}
+const char *valve_operation_to_str(ValveOperation op) {
+  switch (op) {
+    case VALVE_OPERATION_IDLE:
+      return "IDLE";
+    case VALVE_OPERATION_OPENING:
+      return "OPENING";
+    case VALVE_OPERATION_CLOSING:
+      return "CLOSING";
+    default:
+      return "UNKNOWN";
+  }
+}
+
+Valve::Valve() : position{VALVE_OPEN} {}
+
+ValveCall::ValveCall(Valve *parent) : parent_(parent) {}
+ValveCall &ValveCall::set_command(const char *command) {
+  if (strcasecmp(command, "OPEN") == 0) {
+    this->set_command_open();
+  } else if (strcasecmp(command, "CLOSE") == 0) {
+    this->set_command_close();
+  } else if (strcasecmp(command, "STOP") == 0) {
+    this->set_command_stop();
+  } else if (strcasecmp(command, "TOGGLE") == 0) {
+    this->set_command_toggle();
+  } else {
+    ESP_LOGW(TAG, "'%s' - Unrecognized command %s", this->parent_->get_name().c_str(), command);
+  }
+  return *this;
+}
+ValveCall &ValveCall::set_command_open() {
+  this->position_ = VALVE_OPEN;
+  return *this;
+}
+ValveCall &ValveCall::set_command_close() {
+  this->position_ = VALVE_CLOSED;
+  return *this;
+}
+ValveCall &ValveCall::set_command_stop() {
+  this->stop_ = true;
+  return *this;
+}
+ValveCall &ValveCall::set_command_toggle() {
+  this->toggle_ = true;
+  return *this;
+}
+ValveCall &ValveCall::set_position(float position) {
+  this->position_ = position;
+  return *this;
+}
+void ValveCall::perform() {
+  ESP_LOGD(TAG, "'%s' - Setting", this->parent_->get_name().c_str());
+  auto traits = this->parent_->get_traits();
+  this->validate_();
+  if (this->stop_) {
+    ESP_LOGD(TAG, "  Command: STOP");
+  }
+  if (this->position_.has_value()) {
+    if (traits.get_supports_position()) {
+      ESP_LOGD(TAG, "  Position: %.0f%%", *this->position_ * 100.0f);
+    } else {
+      ESP_LOGD(TAG, "  Command: %s", valve_command_to_str(*this->position_));
+    }
+  }
+  if (this->toggle_.has_value()) {
+    ESP_LOGD(TAG, "  Command: TOGGLE");
+  }
+  this->parent_->control(*this);
+}
+const optional<float> &ValveCall::get_position() const { return this->position_; }
+const optional<bool> &ValveCall::get_toggle() const { return this->toggle_; }
+void ValveCall::validate_() {
+  auto traits = this->parent_->get_traits();
+  if (this->position_.has_value()) {
+    auto pos = *this->position_;
+    if (!traits.get_supports_position() && pos != VALVE_OPEN && pos != VALVE_CLOSED) {
+      ESP_LOGW(TAG, "'%s' - This valve device does not support setting position!", this->parent_->get_name().c_str());
+      this->position_.reset();
+    } else if (pos < 0.0f || pos > 1.0f) {
+      ESP_LOGW(TAG, "'%s' - Position %.2f is out of range [0.0 - 1.0]", this->parent_->get_name().c_str(), pos);
+      this->position_ = clamp(pos, 0.0f, 1.0f);
+    }
+  }
+  if (this->toggle_.has_value()) {
+    if (!traits.get_supports_toggle()) {
+      ESP_LOGW(TAG, "'%s' - This valve device does not support toggle!", this->parent_->get_name().c_str());
+      this->toggle_.reset();
+    }
+  }
+  if (this->stop_) {
+    if (this->position_.has_value()) {
+      ESP_LOGW(TAG, "Cannot set position when stopping a valve!");
+      this->position_.reset();
+    }
+    if (this->toggle_.has_value()) {
+      ESP_LOGW(TAG, "Cannot set toggle when stopping a valve!");
+      this->toggle_.reset();
+    }
+  }
+}
+ValveCall &ValveCall::set_stop(bool stop) {
+  this->stop_ = stop;
+  return *this;
+}
+bool ValveCall::get_stop() const { return this->stop_; }
+
+ValveCall Valve::make_call() { return {this}; }
+
+void Valve::add_on_state_callback(std::function<void()> &&f) { this->state_callback_.add(std::move(f)); }
+void Valve::publish_state(bool save) {
+  this->position = clamp(this->position, 0.0f, 1.0f);
+
+  ESP_LOGD(TAG, "'%s' - Publishing:", this->name_.c_str());
+  auto traits = this->get_traits();
+  if (traits.get_supports_position()) {
+    ESP_LOGD(TAG, "  Position: %.0f%%", this->position * 100.0f);
+  } else {
+    if (this->position == VALVE_OPEN) {
+      ESP_LOGD(TAG, "  State: OPEN");
+    } else if (this->position == VALVE_CLOSED) {
+      ESP_LOGD(TAG, "  State: CLOSED");
+    } else {
+      ESP_LOGD(TAG, "  State: UNKNOWN");
+    }
+  }
+  ESP_LOGD(TAG, "  Current Operation: %s", valve_operation_to_str(this->current_operation));
+
+  this->state_callback_.call();
+
+  if (save) {
+    ValveRestoreState restore{};
+    memset(&restore, 0, sizeof(restore));
+    restore.position = this->position;
+    this->rtc_.save(&restore);
+  }
+}
+optional<ValveRestoreState> Valve::restore_state_() {
+  this->rtc_ = global_preferences->make_preference<ValveRestoreState>(this->get_object_id_hash());
+  ValveRestoreState recovered{};
+  if (!this->rtc_.load(&recovered))
+    return {};
+  return recovered;
+}
+
+bool Valve::is_fully_open() const { return this->position == VALVE_OPEN; }
+bool Valve::is_fully_closed() const { return this->position == VALVE_CLOSED; }
+
+ValveCall ValveRestoreState::to_call(Valve *valve) {
+  auto call = valve->make_call();
+  call.set_position(this->position);
+  return call;
+}
+void ValveRestoreState::apply(Valve *valve) {
+  valve->position = this->position;
+  valve->publish_state();
+}
+
+}  // namespace valve
+}  // namespace esphome
diff --git a/esphome/components/valve/valve.h b/esphome/components/valve/valve.h
new file mode 100644
index 0000000000..0e14a8d8f0
--- /dev/null
+++ b/esphome/components/valve/valve.h
@@ -0,0 +1,152 @@
+#pragma once
+
+#include "esphome/core/component.h"
+#include "esphome/core/entity_base.h"
+#include "esphome/core/helpers.h"
+#include "esphome/core/preferences.h"
+#include "valve_traits.h"
+
+namespace esphome {
+namespace valve {
+
+const extern float VALVE_OPEN;
+const extern float VALVE_CLOSED;
+
+#define LOG_VALVE(prefix, type, obj) \
+  if ((obj) != nullptr) { \
+    ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
+    auto traits_ = (obj)->get_traits(); \
+    if (traits_.get_is_assumed_state()) { \
+      ESP_LOGCONFIG(TAG, "%s  Assumed State: YES", prefix); \
+    } \
+    if (!(obj)->get_device_class().empty()) { \
+      ESP_LOGCONFIG(TAG, "%s  Device Class: '%s'", prefix, (obj)->get_device_class().c_str()); \
+    } \
+  }
+
+class Valve;
+
+class ValveCall {
+ public:
+  ValveCall(Valve *parent);
+
+  /// Set the command as a string, "STOP", "OPEN", "CLOSE", "TOGGLE".
+  ValveCall &set_command(const char *command);
+  /// Set the command to open the valve.
+  ValveCall &set_command_open();
+  /// Set the command to close the valve.
+  ValveCall &set_command_close();
+  /// Set the command to stop the valve.
+  ValveCall &set_command_stop();
+  /// Set the command to toggle the valve.
+  ValveCall &set_command_toggle();
+  /// Set the call to a certain target position.
+  ValveCall &set_position(float position);
+  /// Set whether this valve call should stop the valve.
+  ValveCall &set_stop(bool stop);
+
+  /// Perform the valve call.
+  void perform();
+
+  const optional<float> &get_position() const;
+  bool get_stop() const;
+  const optional<bool> &get_toggle() const;
+
+ protected:
+  void validate_();
+
+  Valve *parent_;
+  bool stop_{false};
+  optional<float> position_{};
+  optional<bool> toggle_{};
+};
+
+/// Struct used to store the restored state of a valve
+struct ValveRestoreState {
+  float position;
+
+  /// Convert this struct to a valve call that can be performed.
+  ValveCall to_call(Valve *valve);
+  /// Apply these settings to the valve
+  void apply(Valve *valve);
+} __attribute__((packed));
+
+/// Enum encoding the current operation of a valve.
+enum ValveOperation : uint8_t {
+  /// The valve is currently idle (not moving)
+  VALVE_OPERATION_IDLE = 0,
+  /// The valve is currently opening.
+  VALVE_OPERATION_OPENING,
+  /// The valve is currently closing.
+  VALVE_OPERATION_CLOSING,
+};
+
+const char *valve_operation_to_str(ValveOperation op);
+
+/** Base class for all valve devices.
+ *
+ * Valves currently have three properties:
+ *  - position - The current position of the valve from 0.0 (fully closed) to 1.0 (fully open).
+ *    For valves with only binary OPEN/CLOSED position this will always be either 0.0 or 1.0
+ *  - current_operation - The operation the valve is currently performing, this can
+ *    be one of IDLE, OPENING and CLOSING.
+ *
+ * For users: All valve operations must be performed over the .make_call() interface.
+ * To command a valve, use .make_call() to create a call object, set all properties
+ * you wish to set, and activate the command with .perform().
+ * For reading out the current values of the valve, use the public .position, etc.
+ * properties (these are read-only for users)
+ *
+ * For integrations: Integrations must implement two methods: control() and get_traits().
+ * Control will be called with the arguments supplied by the user and should be used
+ * to control all values of the valve. Also implement get_traits() to return what operations
+ * the valve supports.
+ */
+class Valve : public EntityBase, public EntityBase_DeviceClass {
+ public:
+  explicit Valve();
+
+  /// The current operation of the valve (idle, opening, closing).
+  ValveOperation current_operation{VALVE_OPERATION_IDLE};
+  /** The position of the valve from 0.0 (fully closed) to 1.0 (fully open).
+   *
+   * For binary valves this is always equals to 0.0 or 1.0 (see also VALVE_OPEN and
+   * VALVE_CLOSED constants).
+   */
+  float position;
+
+  /// Construct a new valve call used to control the valve.
+  ValveCall make_call();
+
+  void add_on_state_callback(std::function<void()> &&f);
+
+  /** Publish the current state of the valve.
+   *
+   * First set the .position, etc. values and then call this method
+   * to publish the state of the valve.
+   *
+   * @param save Whether to save the updated values in RTC area.
+   */
+  void publish_state(bool save = true);
+
+  virtual ValveTraits get_traits() = 0;
+
+  /// Helper method to check if the valve is fully open. Equivalent to comparing .position against 1.0
+  bool is_fully_open() const;
+  /// Helper method to check if the valve is fully closed. Equivalent to comparing .position against 0.0
+  bool is_fully_closed() const;
+
+ protected:
+  friend ValveCall;
+
+  virtual void control(const ValveCall &call) = 0;
+
+  optional<ValveRestoreState> restore_state_();
+
+  CallbackManager<void()> state_callback_{};
+
+  ESPPreferenceObject rtc_;
+};
+
+}  // namespace valve
+}  // namespace esphome
diff --git a/esphome/components/valve/valve_traits.h b/esphome/components/valve/valve_traits.h
new file mode 100644
index 0000000000..7e9aab2f26
--- /dev/null
+++ b/esphome/components/valve/valve_traits.h
@@ -0,0 +1,27 @@
+#pragma once
+
+namespace esphome {
+namespace valve {
+
+class ValveTraits {
+ public:
+  ValveTraits() = default;
+
+  bool get_is_assumed_state() const { return this->is_assumed_state_; }
+  void set_is_assumed_state(bool is_assumed_state) { this->is_assumed_state_ = is_assumed_state; }
+  bool get_supports_position() const { return this->supports_position_; }
+  void set_supports_position(bool supports_position) { this->supports_position_ = supports_position; }
+  bool get_supports_toggle() const { return this->supports_toggle_; }
+  void set_supports_toggle(bool supports_toggle) { this->supports_toggle_ = supports_toggle; }
+  bool get_supports_stop() const { return this->supports_stop_; }
+  void set_supports_stop(bool supports_stop) { this->supports_stop_ = supports_stop; }
+
+ protected:
+  bool is_assumed_state_{false};
+  bool supports_position_{false};
+  bool supports_toggle_{false};
+  bool supports_stop_{false};
+};
+
+}  // namespace valve
+}  // namespace esphome
diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp
index dd9fd4afe4..13e396dc82 100644
--- a/esphome/components/web_server/list_entities.cpp
+++ b/esphome/components/web_server/list_entities.cpp
@@ -86,6 +86,15 @@ bool ListEntitiesIterator::on_lock(lock::Lock *a_lock) {
 }
 #endif
 
+#ifdef USE_VALVE
+bool ListEntitiesIterator::on_valve(valve::Valve *valve) {
+  if (this->web_server_->events_.count() == 0)
+    return true;
+  this->web_server_->events_.send(this->web_server_->valve_json(valve, DETAIL_ALL).c_str(), "state");
+  return true;
+}
+#endif
+
 #ifdef USE_CLIMATE
 bool ListEntitiesIterator::on_climate(climate::Climate *climate) {
   if (this->web_server_->events_.count() == 0)
diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h
index fc48186b32..d0b8dda233 100644
--- a/esphome/components/web_server/list_entities.h
+++ b/esphome/components/web_server/list_entities.h
@@ -56,6 +56,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #ifdef USE_LOCK
   bool on_lock(lock::Lock *a_lock) override;
 #endif
+#ifdef USE_VALVE
+  bool on_valve(valve::Valve *valve) override;
+#endif
 #ifdef USE_ALARM_CONTROL_PANEL
   bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) override;
 #endif
diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp
index 2e6206b691..412f8816ee 100644
--- a/esphome/components/web_server/web_server.cpp
+++ b/esphome/components/web_server/web_server.cpp
@@ -1260,6 +1260,68 @@ void WebServer::handle_lock_request(AsyncWebServerRequest *request, const UrlMat
 }
 #endif
 
+#ifdef USE_VALVE
+void WebServer::on_valve_update(valve::Valve *obj) {
+  if (this->events_.count() == 0)
+    return;
+  this->events_.send(this->valve_json(obj, DETAIL_STATE).c_str(), "state");
+}
+void WebServer::handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match) {
+  for (valve::Valve *obj : App.get_valves()) {
+    if (obj->get_object_id() != match.id)
+      continue;
+
+    if (request->method() == HTTP_GET && match.method.empty()) {
+      std::string data = this->valve_json(obj, DETAIL_STATE);
+      request->send(200, "application/json", data.c_str());
+      continue;
+    }
+
+    auto call = obj->make_call();
+    if (match.method == "open") {
+      call.set_command_open();
+    } else if (match.method == "close") {
+      call.set_command_close();
+    } else if (match.method == "stop") {
+      call.set_command_stop();
+    } else if (match.method == "toggle") {
+      call.set_command_toggle();
+    } else if (match.method != "set") {
+      request->send(404);
+      return;
+    }
+
+    auto traits = obj->get_traits();
+    if (request->hasParam("position") && !traits.get_supports_position()) {
+      request->send(409);
+      return;
+    }
+
+    if (request->hasParam("position")) {
+      auto position = parse_number<float>(request->getParam("position")->value().c_str());
+      if (position.has_value()) {
+        call.set_position(*position);
+      }
+    }
+
+    this->schedule_([call]() mutable { call.perform(); });
+    request->send(200);
+    return;
+  }
+  request->send(404);
+}
+std::string WebServer::valve_json(valve::Valve *obj, JsonDetail start_config) {
+  return json::build_json([obj, start_config](JsonObject root) {
+    set_json_icon_state_value(root, obj, "valve-" + obj->get_object_id(), obj->is_fully_closed() ? "CLOSED" : "OPEN",
+                              obj->position, start_config);
+    root["current_operation"] = valve::valve_operation_to_str(obj->current_operation);
+
+    if (obj->get_traits().get_supports_position())
+      root["position"] = obj->position;
+  });
+}
+#endif
+
 #ifdef USE_ALARM_CONTROL_PANEL
 void WebServer::on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj) {
   if (this->events_.count() == 0)
@@ -1394,6 +1456,11 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) {
     return true;
 #endif
 
+#ifdef USE_VALVE
+  if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "valve")
+    return true;
+#endif
+
 #ifdef USE_ALARM_CONTROL_PANEL
   if (request->method() == HTTP_GET && match.domain == "alarm_control_panel")
     return true;
@@ -1535,6 +1602,13 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) {
   }
 #endif
 
+#ifdef USE_VALVE
+  if (match.domain == "valve") {
+    this->handle_valve_request(request, match);
+    return;
+  }
+#endif
+
 #ifdef USE_ALARM_CONTROL_PANEL
   if (match.domain == "alarm_control_panel") {
     this->handle_alarm_control_panel_request(request, match);
diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h
index 1935f8d076..9f807efc43 100644
--- a/esphome/components/web_server/web_server.h
+++ b/esphome/components/web_server/web_server.h
@@ -276,6 +276,16 @@ class WebServer : public Controller, public Component, public AsyncWebHandler {
   std::string lock_json(lock::Lock *obj, lock::LockState value, JsonDetail start_config);
 #endif
 
+#ifdef USE_VALVE
+  void on_valve_update(valve::Valve *obj) override;
+
+  /// Handle a valve request under '/valve/<id>/<open/close/stop/set>'.
+  void handle_valve_request(AsyncWebServerRequest *request, const UrlMatch &match);
+
+  /// Dump the valve state as a JSON string.
+  std::string valve_json(valve::Valve *obj, JsonDetail start_config);
+#endif
+
 #ifdef USE_ALARM_CONTROL_PANEL
   void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj) override;
 
diff --git a/esphome/core/application.h b/esphome/core/application.h
index 73330d27e3..ee931282a6 100644
--- a/esphome/core/application.h
+++ b/esphome/core/application.h
@@ -54,6 +54,9 @@
 #ifdef USE_LOCK
 #include "esphome/components/lock/lock.h"
 #endif
+#ifdef USE_VALVE
+#include "esphome/components/valve/valve.h"
+#endif
 #ifdef USE_MEDIA_PLAYER
 #include "esphome/components/media_player/media_player.h"
 #endif
@@ -147,6 +150,10 @@ class Application {
   void register_lock(lock::Lock *a_lock) { this->locks_.push_back(a_lock); }
 #endif
 
+#ifdef USE_VALVE
+  void register_valve(valve::Valve *valve) { this->valves_.push_back(valve); }
+#endif
+
 #ifdef USE_MEDIA_PLAYER
   void register_media_player(media_player::MediaPlayer *media_player) { this->media_players_.push_back(media_player); }
 #endif
@@ -348,6 +355,15 @@ class Application {
     return nullptr;
   }
 #endif
+#ifdef USE_VALVE
+  const std::vector<valve::Valve *> &get_valves() { return this->valves_; }
+  valve::Valve *get_valve_by_key(uint32_t key, bool include_internal = false) {
+    for (auto *obj : this->valves_)
+      if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
+        return obj;
+    return nullptr;
+  }
+#endif
 #ifdef USE_MEDIA_PLAYER
   const std::vector<media_player::MediaPlayer *> &get_media_players() { return this->media_players_; }
   media_player::MediaPlayer *get_media_player_by_key(uint32_t key, bool include_internal = false) {
@@ -429,6 +445,9 @@ class Application {
 #ifdef USE_LOCK
   std::vector<lock::Lock *> locks_{};
 #endif
+#ifdef USE_VALVE
+  std::vector<valve::Valve *> valves_{};
+#endif
 #ifdef USE_MEDIA_PLAYER
   std::vector<media_player::MediaPlayer *> media_players_{};
 #endif
diff --git a/esphome/core/component_iterator.cpp b/esphome/core/component_iterator.cpp
index 228cf64d54..b00154c685 100644
--- a/esphome/core/component_iterator.cpp
+++ b/esphome/core/component_iterator.cpp
@@ -277,6 +277,21 @@ void ComponentIterator::advance() {
       }
       break;
 #endif
+#ifdef USE_VALVE
+    case IteratorState::VALVE:
+      if (this->at_ >= App.get_valves().size()) {
+        advance_platform = true;
+      } else {
+        auto *valve = App.get_valves()[this->at_];
+        if (valve->is_internal() && !this->include_internal_) {
+          success = true;
+          break;
+        } else {
+          success = this->on_valve(valve);
+        }
+      }
+      break;
+#endif
 #ifdef USE_MEDIA_PLAYER
     case IteratorState::MEDIA_PLAYER:
       if (this->at_ >= App.get_media_players().size()) {
diff --git a/esphome/core/component_iterator.h b/esphome/core/component_iterator.h
index d7f19f2850..3fbbc0bc19 100644
--- a/esphome/core/component_iterator.h
+++ b/esphome/core/component_iterator.h
@@ -72,6 +72,9 @@ class ComponentIterator {
 #ifdef USE_LOCK
   virtual bool on_lock(lock::Lock *a_lock) = 0;
 #endif
+#ifdef USE_VALVE
+  virtual bool on_valve(valve::Valve *valve) = 0;
+#endif
 #ifdef USE_MEDIA_PLAYER
   virtual bool on_media_player(media_player::MediaPlayer *media_player);
 #endif
@@ -135,6 +138,9 @@ class ComponentIterator {
 #ifdef USE_LOCK
     LOCK,
 #endif
+#ifdef USE_VALVE
+    VALVE,
+#endif
 #ifdef USE_MEDIA_PLAYER
     MEDIA_PLAYER,
 #endif
diff --git a/esphome/core/controller.cpp b/esphome/core/controller.cpp
index db5818d455..eab818bdb4 100644
--- a/esphome/core/controller.cpp
+++ b/esphome/core/controller.cpp
@@ -91,6 +91,12 @@ void Controller::setup_controller(bool include_internal) {
       obj->add_on_state_callback([this, obj]() { this->on_lock_update(obj); });
   }
 #endif
+#ifdef USE_VALVE
+  for (auto *obj : App.get_valves()) {
+    if (include_internal || !obj->is_internal())
+      obj->add_on_state_callback([this, obj]() { this->on_valve_update(obj); });
+  }
+#endif
 #ifdef USE_MEDIA_PLAYER
   for (auto *obj : App.get_media_players()) {
     if (include_internal || !obj->is_internal())
diff --git a/esphome/core/controller.h b/esphome/core/controller.h
index 9b1cfd93c6..94a4acb7c7 100644
--- a/esphome/core/controller.h
+++ b/esphome/core/controller.h
@@ -46,6 +46,9 @@
 #ifdef USE_LOCK
 #include "esphome/components/lock/lock.h"
 #endif
+#ifdef USE_VALVE
+#include "esphome/components/valve/valve.h"
+#endif
 #ifdef USE_MEDIA_PLAYER
 #include "esphome/components/media_player/media_player.h"
 #endif
@@ -100,6 +103,9 @@ class Controller {
 #ifdef USE_LOCK
   virtual void on_lock_update(lock::Lock *obj){};
 #endif
+#ifdef USE_VALVE
+  virtual void on_valve_update(valve::Valve *obj){};
+#endif
 #ifdef USE_MEDIA_PLAYER
   virtual void on_media_player_update(media_player::MediaPlayer *obj){};
 #endif
diff --git a/esphome/core/defines.h b/esphome/core/defines.h
index f13ae968f0..2064ca1356 100644
--- a/esphome/core/defines.h
+++ b/esphome/core/defines.h
@@ -54,6 +54,7 @@
 #define USE_TIME
 #define USE_TOUCHSCREEN
 #define USE_UART_DEBUGGER
+#define USE_VALVE
 #define USE_WIFI
 #define USE_WIFI_AP
 #define USE_GRAPHICAL_DISPLAY_MENU
diff --git a/script/ci-custom.py b/script/ci-custom.py
index c3cfc7a331..c591bfe5c3 100755
--- a/script/ci-custom.py
+++ b/script/ci-custom.py
@@ -638,6 +638,7 @@ def lint_trailing_whitespace(fname, match):
         "esphome/components/stepper/stepper.h",
         "esphome/components/switch/switch.h",
         "esphome/components/text_sensor/text_sensor.h",
+        "esphome/components/valve/valve.h",
         "esphome/core/component.h",
         "esphome/core/gpio.h",
         "esphome/core/log.h",
diff --git a/tests/components/template/test.all.yaml b/tests/components/template/test.all.yaml
index 29dc83b649..64faec36c2 100644
--- a/tests/components/template/test.all.yaml
+++ b/tests/components/template/test.all.yaml
@@ -125,6 +125,23 @@ lock:
     open_action:
       - logger.log: open_action
 
+valve:
+  - platform: template
+    name: "Template Valve"
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return VALVE_OPEN;
+      } else {
+        return VALVE_CLOSED;
+      }
+    open_action:
+      - logger.log: open_action
+    close_action:
+      - logger.log: close_action
+    stop_action:
+      - logger.log: stop_action
+    optimistic: true
+
 text:
   - platform: template
     name: "Template text"

From 7e5b100b7778ba451d2ebda597ca7c4dc37ac3c1 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Mon, 22 Apr 2024 23:53:13 -0500
Subject: [PATCH 25/81] Add some components to the new testing framework (R)
 (#6219)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .../radon_eye_ble/test.esp32-c3-idf.yaml      |  3 ++
 .../radon_eye_ble/test.esp32-c3.yaml          |  3 ++
 .../radon_eye_ble/test.esp32-idf.yaml         |  3 ++
 .../components/radon_eye_ble/test.esp32.yaml  |  3 ++
 .../radon_eye_rd200/test.esp32-c3-idf.yaml    | 14 ++++++++
 .../radon_eye_rd200/test.esp32-c3.yaml        | 14 ++++++++
 .../radon_eye_rd200/test.esp32-idf.yaml       | 14 ++++++++
 .../radon_eye_rd200/test.esp32.yaml           | 14 ++++++++
 .../rc522_i2c/test.esp32-c3-idf.yaml          | 17 +++++++++
 tests/components/rc522_i2c/test.esp32-c3.yaml | 17 +++++++++
 .../components/rc522_i2c/test.esp32-idf.yaml  | 17 +++++++++
 tests/components/rc522_i2c/test.esp32.yaml    | 17 +++++++++
 tests/components/rc522_i2c/test.esp8266.yaml  | 17 +++++++++
 tests/components/rc522_i2c/test.rp2040.yaml   | 17 +++++++++
 .../rc522_spi/test.esp32-c3-idf.yaml          | 15 ++++++++
 tests/components/rc522_spi/test.esp32-c3.yaml | 15 ++++++++
 .../components/rc522_spi/test.esp32-idf.yaml  | 15 ++++++++
 tests/components/rc522_spi/test.esp32.yaml    | 15 ++++++++
 tests/components/rc522_spi/test.esp8266.yaml  | 15 ++++++++
 tests/components/rc522_spi/test.rp2040.yaml   | 15 ++++++++
 .../components/rdm6300/test.esp32-c3-idf.yaml | 12 +++++++
 tests/components/rdm6300/test.esp32-c3.yaml   | 12 +++++++
 tests/components/rdm6300/test.esp32-idf.yaml  | 12 +++++++
 tests/components/rdm6300/test.esp32.yaml      | 12 +++++++
 tests/components/rdm6300/test.esp8266.yaml    | 12 +++++++
 tests/components/rdm6300/test.rp2040.yaml     | 12 +++++++
 .../components/resistance/test.esp32-c3.yaml  | 12 +++++++
 .../components/resistance/test.esp32-idf.yaml | 12 +++++++
 .../components/resistance/test.esp32-s2.yaml  | 12 +++++++
 .../components/resistance/test.esp32-s3.yaml  | 12 +++++++
 tests/components/resistance/test.esp32.yaml   | 12 +++++++
 tests/components/resistance/test.esp8266.yaml | 11 ++++++
 tests/components/resistance/test.rp2040.yaml  | 12 +++++++
 .../components/restart/test.esp32-c3-idf.yaml |  7 ++++
 tests/components/restart/test.esp32-c3.yaml   |  7 ++++
 tests/components/restart/test.esp32-idf.yaml  |  7 ++++
 tests/components/restart/test.esp32.yaml      |  7 ++++
 tests/components/restart/test.esp8266.yaml    |  7 ++++
 tests/components/restart/test.rp2040.yaml     |  7 ++++
 .../rf_bridge/test.esp32-c3-idf.yaml          | 35 +++++++++++++++++++
 tests/components/rf_bridge/test.esp32-c3.yaml | 35 +++++++++++++++++++
 .../components/rf_bridge/test.esp32-idf.yaml  | 35 +++++++++++++++++++
 tests/components/rf_bridge/test.esp32.yaml    | 35 +++++++++++++++++++
 tests/components/rf_bridge/test.esp8266.yaml  | 35 +++++++++++++++++++
 tests/components/rf_bridge/test.rp2040.yaml   | 35 +++++++++++++++++++
 tests/components/rgb/test.esp32-c3-idf.yaml   | 18 ++++++++++
 tests/components/rgb/test.esp32-c3.yaml       | 18 ++++++++++
 tests/components/rgb/test.esp32-idf.yaml      | 18 ++++++++++
 tests/components/rgb/test.esp32.yaml          | 18 ++++++++++
 tests/components/rgb/test.esp8266.yaml        | 18 ++++++++++
 tests/components/rgb/test.rp2040.yaml         | 18 ++++++++++
 tests/components/rgbct/test.esp32-c3-idf.yaml | 28 +++++++++++++++
 tests/components/rgbct/test.esp32-c3.yaml     | 28 +++++++++++++++
 tests/components/rgbct/test.esp32-idf.yaml    | 28 +++++++++++++++
 tests/components/rgbct/test.esp32.yaml        | 28 +++++++++++++++
 tests/components/rgbct/test.esp8266.yaml      | 28 +++++++++++++++
 tests/components/rgbct/test.rp2040.yaml       | 28 +++++++++++++++
 tests/components/rgbw/test.esp32-c3-idf.yaml  | 22 ++++++++++++
 tests/components/rgbw/test.esp32-c3.yaml      | 22 ++++++++++++
 tests/components/rgbw/test.esp32-idf.yaml     | 22 ++++++++++++
 tests/components/rgbw/test.esp32.yaml         | 22 ++++++++++++
 tests/components/rgbw/test.esp8266.yaml       | 22 ++++++++++++
 tests/components/rgbw/test.rp2040.yaml        | 22 ++++++++++++
 tests/components/rgbww/test.esp32-c3-idf.yaml | 28 +++++++++++++++
 tests/components/rgbww/test.esp32-c3.yaml     | 28 +++++++++++++++
 tests/components/rgbww/test.esp32-idf.yaml    | 28 +++++++++++++++
 tests/components/rgbww/test.esp32.yaml        | 28 +++++++++++++++
 tests/components/rgbww/test.esp8266.yaml      | 28 +++++++++++++++
 tests/components/rgbww/test.rp2040.yaml       | 28 +++++++++++++++
 .../rotary_encoder/test.esp32-c3-idf.yaml     | 25 +++++++++++++
 .../rotary_encoder/test.esp32-c3.yaml         | 25 +++++++++++++
 .../rotary_encoder/test.esp32-idf.yaml        | 25 +++++++++++++
 .../components/rotary_encoder/test.esp32.yaml | 25 +++++++++++++
 .../rotary_encoder/test.esp8266.yaml          | 25 +++++++++++++
 .../rotary_encoder/test.rp2040.yaml           | 25 +++++++++++++
 .../rp2040_pio_led_strip/test.rp2040.yaml     | 18 ++++++++++
 tests/components/rp2040_pwm/test.rp2040.yaml  |  7 ++++
 tests/components/rtttl/test.esp32-c3-idf.yaml | 16 +++++++++
 tests/components/rtttl/test.esp32-c3.yaml     | 16 +++++++++
 tests/components/rtttl/test.esp32-idf.yaml    | 16 +++++++++
 tests/components/rtttl/test.esp32.yaml        | 16 +++++++++
 tests/components/rtttl/test.esp8266.yaml      | 15 ++++++++
 tests/components/rtttl/test.rp2040.yaml       | 15 ++++++++
 .../ruuvi_ble/test.esp32-c3-idf.yaml          |  3 ++
 tests/components/ruuvi_ble/test.esp32-c3.yaml |  3 ++
 .../components/ruuvi_ble/test.esp32-idf.yaml  |  3 ++
 tests/components/ruuvi_ble/test.esp32.yaml    |  3 ++
 .../ruuvitag/test.esp32-c3-idf.yaml           | 27 ++++++++++++++
 tests/components/ruuvitag/test.esp32-c3.yaml  | 27 ++++++++++++++
 tests/components/ruuvitag/test.esp32-idf.yaml | 27 ++++++++++++++
 tests/components/ruuvitag/test.esp32.yaml     | 27 ++++++++++++++
 91 files changed, 1632 insertions(+)
 create mode 100644 tests/components/radon_eye_ble/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/radon_eye_ble/test.esp32-c3.yaml
 create mode 100644 tests/components/radon_eye_ble/test.esp32-idf.yaml
 create mode 100644 tests/components/radon_eye_ble/test.esp32.yaml
 create mode 100644 tests/components/radon_eye_rd200/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/radon_eye_rd200/test.esp32-c3.yaml
 create mode 100644 tests/components/radon_eye_rd200/test.esp32-idf.yaml
 create mode 100644 tests/components/radon_eye_rd200/test.esp32.yaml
 create mode 100644 tests/components/rc522_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rc522_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/rc522_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/rc522_i2c/test.esp32.yaml
 create mode 100644 tests/components/rc522_i2c/test.esp8266.yaml
 create mode 100644 tests/components/rc522_i2c/test.rp2040.yaml
 create mode 100644 tests/components/rc522_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rc522_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/rc522_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/rc522_spi/test.esp32.yaml
 create mode 100644 tests/components/rc522_spi/test.esp8266.yaml
 create mode 100644 tests/components/rc522_spi/test.rp2040.yaml
 create mode 100644 tests/components/rdm6300/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rdm6300/test.esp32-c3.yaml
 create mode 100644 tests/components/rdm6300/test.esp32-idf.yaml
 create mode 100644 tests/components/rdm6300/test.esp32.yaml
 create mode 100644 tests/components/rdm6300/test.esp8266.yaml
 create mode 100644 tests/components/rdm6300/test.rp2040.yaml
 create mode 100644 tests/components/resistance/test.esp32-c3.yaml
 create mode 100644 tests/components/resistance/test.esp32-idf.yaml
 create mode 100644 tests/components/resistance/test.esp32-s2.yaml
 create mode 100644 tests/components/resistance/test.esp32-s3.yaml
 create mode 100644 tests/components/resistance/test.esp32.yaml
 create mode 100644 tests/components/resistance/test.esp8266.yaml
 create mode 100644 tests/components/resistance/test.rp2040.yaml
 create mode 100644 tests/components/restart/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/restart/test.esp32-c3.yaml
 create mode 100644 tests/components/restart/test.esp32-idf.yaml
 create mode 100644 tests/components/restart/test.esp32.yaml
 create mode 100644 tests/components/restart/test.esp8266.yaml
 create mode 100644 tests/components/restart/test.rp2040.yaml
 create mode 100644 tests/components/rf_bridge/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rf_bridge/test.esp32-c3.yaml
 create mode 100644 tests/components/rf_bridge/test.esp32-idf.yaml
 create mode 100644 tests/components/rf_bridge/test.esp32.yaml
 create mode 100644 tests/components/rf_bridge/test.esp8266.yaml
 create mode 100644 tests/components/rf_bridge/test.rp2040.yaml
 create mode 100644 tests/components/rgb/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rgb/test.esp32-c3.yaml
 create mode 100644 tests/components/rgb/test.esp32-idf.yaml
 create mode 100644 tests/components/rgb/test.esp32.yaml
 create mode 100644 tests/components/rgb/test.esp8266.yaml
 create mode 100644 tests/components/rgb/test.rp2040.yaml
 create mode 100644 tests/components/rgbct/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rgbct/test.esp32-c3.yaml
 create mode 100644 tests/components/rgbct/test.esp32-idf.yaml
 create mode 100644 tests/components/rgbct/test.esp32.yaml
 create mode 100644 tests/components/rgbct/test.esp8266.yaml
 create mode 100644 tests/components/rgbct/test.rp2040.yaml
 create mode 100644 tests/components/rgbw/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rgbw/test.esp32-c3.yaml
 create mode 100644 tests/components/rgbw/test.esp32-idf.yaml
 create mode 100644 tests/components/rgbw/test.esp32.yaml
 create mode 100644 tests/components/rgbw/test.esp8266.yaml
 create mode 100644 tests/components/rgbw/test.rp2040.yaml
 create mode 100644 tests/components/rgbww/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rgbww/test.esp32-c3.yaml
 create mode 100644 tests/components/rgbww/test.esp32-idf.yaml
 create mode 100644 tests/components/rgbww/test.esp32.yaml
 create mode 100644 tests/components/rgbww/test.esp8266.yaml
 create mode 100644 tests/components/rgbww/test.rp2040.yaml
 create mode 100644 tests/components/rotary_encoder/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rotary_encoder/test.esp32-c3.yaml
 create mode 100644 tests/components/rotary_encoder/test.esp32-idf.yaml
 create mode 100644 tests/components/rotary_encoder/test.esp32.yaml
 create mode 100644 tests/components/rotary_encoder/test.esp8266.yaml
 create mode 100644 tests/components/rotary_encoder/test.rp2040.yaml
 create mode 100644 tests/components/rp2040_pio_led_strip/test.rp2040.yaml
 create mode 100644 tests/components/rp2040_pwm/test.rp2040.yaml
 create mode 100644 tests/components/rtttl/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/rtttl/test.esp32-c3.yaml
 create mode 100644 tests/components/rtttl/test.esp32-idf.yaml
 create mode 100644 tests/components/rtttl/test.esp32.yaml
 create mode 100644 tests/components/rtttl/test.esp8266.yaml
 create mode 100644 tests/components/rtttl/test.rp2040.yaml
 create mode 100644 tests/components/ruuvi_ble/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ruuvi_ble/test.esp32-c3.yaml
 create mode 100644 tests/components/ruuvi_ble/test.esp32-idf.yaml
 create mode 100644 tests/components/ruuvi_ble/test.esp32.yaml
 create mode 100644 tests/components/ruuvitag/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ruuvitag/test.esp32-c3.yaml
 create mode 100644 tests/components/ruuvitag/test.esp32-idf.yaml
 create mode 100644 tests/components/ruuvitag/test.esp32.yaml

diff --git a/tests/components/radon_eye_ble/test.esp32-c3-idf.yaml b/tests/components/radon_eye_ble/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..85638d5c0e
--- /dev/null
+++ b/tests/components/radon_eye_ble/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+radon_eye_ble:
diff --git a/tests/components/radon_eye_ble/test.esp32-c3.yaml b/tests/components/radon_eye_ble/test.esp32-c3.yaml
new file mode 100644
index 0000000000..85638d5c0e
--- /dev/null
+++ b/tests/components/radon_eye_ble/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+radon_eye_ble:
diff --git a/tests/components/radon_eye_ble/test.esp32-idf.yaml b/tests/components/radon_eye_ble/test.esp32-idf.yaml
new file mode 100644
index 0000000000..85638d5c0e
--- /dev/null
+++ b/tests/components/radon_eye_ble/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+radon_eye_ble:
diff --git a/tests/components/radon_eye_ble/test.esp32.yaml b/tests/components/radon_eye_ble/test.esp32.yaml
new file mode 100644
index 0000000000..85638d5c0e
--- /dev/null
+++ b/tests/components/radon_eye_ble/test.esp32.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+radon_eye_ble:
diff --git a/tests/components/radon_eye_rd200/test.esp32-c3-idf.yaml b/tests/components/radon_eye_rd200/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d06979be6f
--- /dev/null
+++ b/tests/components/radon_eye_rd200/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: radon_eye_blec
+
+sensor:
+  - platform: radon_eye_rd200
+    ble_client_id: radon_eye_blec
+    radon:
+      name: RD200 Radon
+    radon_long_term:
+      name: RD200 Radon Long Term
+    update_interval: 10min
diff --git a/tests/components/radon_eye_rd200/test.esp32-c3.yaml b/tests/components/radon_eye_rd200/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d06979be6f
--- /dev/null
+++ b/tests/components/radon_eye_rd200/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: radon_eye_blec
+
+sensor:
+  - platform: radon_eye_rd200
+    ble_client_id: radon_eye_blec
+    radon:
+      name: RD200 Radon
+    radon_long_term:
+      name: RD200 Radon Long Term
+    update_interval: 10min
diff --git a/tests/components/radon_eye_rd200/test.esp32-idf.yaml b/tests/components/radon_eye_rd200/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d06979be6f
--- /dev/null
+++ b/tests/components/radon_eye_rd200/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: radon_eye_blec
+
+sensor:
+  - platform: radon_eye_rd200
+    ble_client_id: radon_eye_blec
+    radon:
+      name: RD200 Radon
+    radon_long_term:
+      name: RD200 Radon Long Term
+    update_interval: 10min
diff --git a/tests/components/radon_eye_rd200/test.esp32.yaml b/tests/components/radon_eye_rd200/test.esp32.yaml
new file mode 100644
index 0000000000..d06979be6f
--- /dev/null
+++ b/tests/components/radon_eye_rd200/test.esp32.yaml
@@ -0,0 +1,14 @@
+esp32_ble_tracker:
+
+ble_client:
+  - mac_address: 01:02:03:04:05:06
+    id: radon_eye_blec
+
+sensor:
+  - platform: radon_eye_rd200
+    ble_client_id: radon_eye_blec
+    radon:
+      name: RD200 Radon
+    radon_long_term:
+      name: RD200 Radon Long Term
+    update_interval: 10min
diff --git a/tests/components/rc522_i2c/test.esp32-c3-idf.yaml b/tests/components/rc522_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..8c8819e257
--- /dev/null
+++ b/tests/components/rc522_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 5
+    sda: 4
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_i2c/test.esp32-c3.yaml b/tests/components/rc522_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..8c8819e257
--- /dev/null
+++ b/tests/components/rc522_i2c/test.esp32-c3.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 5
+    sda: 4
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_i2c/test.esp32-idf.yaml b/tests/components/rc522_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..69b7d892a4
--- /dev/null
+++ b/tests/components/rc522_i2c/test.esp32-idf.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 16
+    sda: 17
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_i2c/test.esp32.yaml b/tests/components/rc522_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..69b7d892a4
--- /dev/null
+++ b/tests/components/rc522_i2c/test.esp32.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 16
+    sda: 17
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_i2c/test.esp8266.yaml b/tests/components/rc522_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..8c8819e257
--- /dev/null
+++ b/tests/components/rc522_i2c/test.esp8266.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 5
+    sda: 4
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_i2c/test.rp2040.yaml b/tests/components/rc522_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..8c8819e257
--- /dev/null
+++ b/tests/components/rc522_i2c/test.rp2040.yaml
@@ -0,0 +1,17 @@
+i2c:
+  - id: i2c_rc522
+    scl: 5
+    sda: 4
+
+rc522_i2c:
+  - id: rc522_nfcc
+    update_interval: 1s
+    on_tag:
+      - lambda: |-
+          ESP_LOGD("main", "Found tag %s", x.c_str());
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: RC522 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.esp32-c3-idf.yaml b/tests/components/rc522_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..8bcab84700
--- /dev/null
+++ b/tests/components/rc522_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 4
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.esp32-c3.yaml b/tests/components/rc522_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..8bcab84700
--- /dev/null
+++ b/tests/components/rc522_spi/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 4
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.esp32-idf.yaml b/tests/components/rc522_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..5c0b698a08
--- /dev/null
+++ b/tests/components/rc522_spi/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 12
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.esp32.yaml b/tests/components/rc522_spi/test.esp32.yaml
new file mode 100644
index 0000000000..5c0b698a08
--- /dev/null
+++ b/tests/components/rc522_spi/test.esp32.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 12
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.esp8266.yaml b/tests/components/rc522_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..3c33311266
--- /dev/null
+++ b/tests/components/rc522_spi/test.esp8266.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 15
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rc522_spi/test.rp2040.yaml b/tests/components/rc522_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..ed2827dbb9
--- /dev/null
+++ b/tests/components/rc522_spi/test.rp2040.yaml
@@ -0,0 +1,15 @@
+spi:
+  - id: spi_rc522
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+rc522_spi:
+  id: rc522_nfcc
+  cs_pin: 6
+
+binary_sensor:
+  - platform: rc522
+    rc522_id: rc522_nfcc
+    name: PN532 NFC Tag
+    uid: 74-10-37-94
diff --git a/tests/components/rdm6300/test.esp32-c3-idf.yaml b/tests/components/rdm6300/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b92fce06e2
--- /dev/null
+++ b/tests/components/rdm6300/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/rdm6300/test.esp32-c3.yaml b/tests/components/rdm6300/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b92fce06e2
--- /dev/null
+++ b/tests/components/rdm6300/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/rdm6300/test.esp32-idf.yaml b/tests/components/rdm6300/test.esp32-idf.yaml
new file mode 100644
index 0000000000..4159248124
--- /dev/null
+++ b/tests/components/rdm6300/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/rdm6300/test.esp32.yaml b/tests/components/rdm6300/test.esp32.yaml
new file mode 100644
index 0000000000..4159248124
--- /dev/null
+++ b/tests/components/rdm6300/test.esp32.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/rdm6300/test.esp8266.yaml b/tests/components/rdm6300/test.esp8266.yaml
new file mode 100644
index 0000000000..b92fce06e2
--- /dev/null
+++ b/tests/components/rdm6300/test.esp8266.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/rdm6300/test.rp2040.yaml b/tests/components/rdm6300/test.rp2040.yaml
new file mode 100644
index 0000000000..b92fce06e2
--- /dev/null
+++ b/tests/components/rdm6300/test.rp2040.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_rdm6300
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rdm6300:
+
+binary_sensor:
+  - platform: rdm6300
+    uid: 7616525
+    name: RDM6300 NFC Tag
diff --git a/tests/components/resistance/test.esp32-c3.yaml b/tests/components/resistance/test.esp32-c3.yaml
new file mode 100644
index 0000000000..84e23d5115
--- /dev/null
+++ b/tests/components/resistance/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 4
+    attenuation: 11db
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.esp32-idf.yaml b/tests/components/resistance/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b1ffc64972
--- /dev/null
+++ b/tests/components/resistance/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 32
+    attenuation: 11db
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.esp32-s2.yaml b/tests/components/resistance/test.esp32-s2.yaml
new file mode 100644
index 0000000000..4ebd6b5c49
--- /dev/null
+++ b/tests/components/resistance/test.esp32-s2.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 1
+    attenuation: 11db
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.esp32-s3.yaml b/tests/components/resistance/test.esp32-s3.yaml
new file mode 100644
index 0000000000..4ebd6b5c49
--- /dev/null
+++ b/tests/components/resistance/test.esp32-s3.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 1
+    attenuation: 11db
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.esp32.yaml b/tests/components/resistance/test.esp32.yaml
new file mode 100644
index 0000000000..b1ffc64972
--- /dev/null
+++ b/tests/components/resistance/test.esp32.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 32
+    attenuation: 11db
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.esp8266.yaml b/tests/components/resistance/test.esp8266.yaml
new file mode 100644
index 0000000000..f723f7c7c7
--- /dev/null
+++ b/tests/components/resistance/test.esp8266.yaml
@@ -0,0 +1,11 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: VCC
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/resistance/test.rp2040.yaml b/tests/components/resistance/test.rp2040.yaml
new file mode 100644
index 0000000000..5cc643926a
--- /dev/null
+++ b/tests/components/resistance/test.rp2040.yaml
@@ -0,0 +1,12 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    name: VSYS
+    pin: VCC
+  - platform: resistance
+    sensor: my_sensor
+    configuration: DOWNSTREAM
+    resistor: 10kΩ
+    reference_voltage: 3.3V
+    name: Resistance
+    id: resist
diff --git a/tests/components/restart/test.esp32-c3-idf.yaml b/tests/components/restart/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/restart/test.esp32-c3.yaml b/tests/components/restart/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/restart/test.esp32-idf.yaml b/tests/components/restart/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/restart/test.esp32.yaml b/tests/components/restart/test.esp32.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.esp32.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/restart/test.esp8266.yaml b/tests/components/restart/test.esp8266.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.esp8266.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/restart/test.rp2040.yaml b/tests/components/restart/test.rp2040.yaml
new file mode 100644
index 0000000000..f0d25809ac
--- /dev/null
+++ b/tests/components/restart/test.rp2040.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: restart
+    name: Restart Button
+
+switch:
+  - platform: restart
+    name: Restart Switch
diff --git a/tests/components/rf_bridge/test.esp32-c3-idf.yaml b/tests/components/rf_bridge/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..95a7aa861a
--- /dev/null
+++ b/tests/components/rf_bridge/test.esp32-c3-idf.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rf_bridge/test.esp32-c3.yaml b/tests/components/rf_bridge/test.esp32-c3.yaml
new file mode 100644
index 0000000000..95a7aa861a
--- /dev/null
+++ b/tests/components/rf_bridge/test.esp32-c3.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rf_bridge/test.esp32-idf.yaml b/tests/components/rf_bridge/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9ade7f0ac0
--- /dev/null
+++ b/tests/components/rf_bridge/test.esp32-idf.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rf_bridge/test.esp32.yaml b/tests/components/rf_bridge/test.esp32.yaml
new file mode 100644
index 0000000000..9ade7f0ac0
--- /dev/null
+++ b/tests/components/rf_bridge/test.esp32.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rf_bridge/test.esp8266.yaml b/tests/components/rf_bridge/test.esp8266.yaml
new file mode 100644
index 0000000000..95a7aa861a
--- /dev/null
+++ b/tests/components/rf_bridge/test.esp8266.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rf_bridge/test.rp2040.yaml b/tests/components/rf_bridge/test.rp2040.yaml
new file mode 100644
index 0000000000..95a7aa861a
--- /dev/null
+++ b/tests/components/rf_bridge/test.rp2040.yaml
@@ -0,0 +1,35 @@
+uart:
+  - id: uart_rf_bridge
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+rf_bridge:
+  on_code_received:
+    - lambda: |-
+        uint32_t test;
+        test = data.sync;
+        test = data.low;
+        test = data.high;
+        test = data.code;
+    - rf_bridge.send_code:
+        sync: 0x1234
+        low: 0x1234
+        high: 0x1234
+        code: 0x123456
+    - rf_bridge.learn
+  on_advanced_code_received:
+    - lambda: |-
+        uint32_t test;
+        std::string test_code;
+        test = data.length;
+        test = data.protocol;
+        test_code = data.code;
+    - rf_bridge.start_advanced_sniffing:
+    - rf_bridge.stop_advanced_sniffing:
+    - rf_bridge.send_advanced_code:
+        length: 0x04
+        protocol: 0x01
+        code: "ABC123"
+    - rf_bridge.send_raw:
+        raw: "AAA5070008001000ABC12355"
diff --git a/tests/components/rgb/test.esp32-c3-idf.yaml b/tests/components/rgb/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..30ff1527b4
--- /dev/null
+++ b/tests/components/rgb/test.esp32-c3-idf.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgb/test.esp32-c3.yaml b/tests/components/rgb/test.esp32-c3.yaml
new file mode 100644
index 0000000000..30ff1527b4
--- /dev/null
+++ b/tests/components/rgb/test.esp32-c3.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgb/test.esp32-idf.yaml b/tests/components/rgb/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2173e718be
--- /dev/null
+++ b/tests/components/rgb/test.esp32-idf.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgb/test.esp32.yaml b/tests/components/rgb/test.esp32.yaml
new file mode 100644
index 0000000000..2173e718be
--- /dev/null
+++ b/tests/components/rgb/test.esp32.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgb/test.esp8266.yaml b/tests/components/rgb/test.esp8266.yaml
new file mode 100644
index 0000000000..60c5a7e04f
--- /dev/null
+++ b/tests/components/rgb/test.esp8266.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 12
+  - platform: esp8266_pwm
+    id: light_output_2
+    pin: 13
+  - platform: esp8266_pwm
+    id: light_output_3
+    pin: 14
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgb/test.rp2040.yaml b/tests/components/rgb/test.rp2040.yaml
new file mode 100644
index 0000000000..fd6519707b
--- /dev/null
+++ b/tests/components/rgb/test.rp2040.yaml
@@ -0,0 +1,18 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 12
+  - platform: rp2040_pwm
+    id: light_output_2
+    pin: 13
+  - platform: rp2040_pwm
+    id: light_output_3
+    pin: 14
+
+light:
+  - platform: rgb
+    name: RGB Light
+    id: rgb_light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
diff --git a/tests/components/rgbct/test.esp32-c3-idf.yaml b/tests/components/rgbct/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..426c4b8937
--- /dev/null
+++ b/tests/components/rgbct/test.esp32-c3-idf.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+  - platform: ledc
+    id: light_output_5
+    pin: 5
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbct/test.esp32-c3.yaml b/tests/components/rgbct/test.esp32-c3.yaml
new file mode 100644
index 0000000000..426c4b8937
--- /dev/null
+++ b/tests/components/rgbct/test.esp32-c3.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+  - platform: ledc
+    id: light_output_5
+    pin: 5
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbct/test.esp32-idf.yaml b/tests/components/rgbct/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d9758c9ec7
--- /dev/null
+++ b/tests/components/rgbct/test.esp32-idf.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+  - platform: ledc
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbct/test.esp32.yaml b/tests/components/rgbct/test.esp32.yaml
new file mode 100644
index 0000000000..d9758c9ec7
--- /dev/null
+++ b/tests/components/rgbct/test.esp32.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+  - platform: ledc
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbct/test.esp8266.yaml b/tests/components/rgbct/test.esp8266.yaml
new file mode 100644
index 0000000000..b7008c9ae3
--- /dev/null
+++ b/tests/components/rgbct/test.esp8266.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 12
+  - platform: esp8266_pwm
+    id: light_output_2
+    pin: 13
+  - platform: esp8266_pwm
+    id: light_output_3
+    pin: 14
+  - platform: esp8266_pwm
+    id: light_output_4
+    pin: 15
+  - platform: esp8266_pwm
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbct/test.rp2040.yaml b/tests/components/rgbct/test.rp2040.yaml
new file mode 100644
index 0000000000..e7e959b2a4
--- /dev/null
+++ b/tests/components/rgbct/test.rp2040.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 12
+  - platform: rp2040_pwm
+    id: light_output_2
+    pin: 13
+  - platform: rp2040_pwm
+    id: light_output_3
+    pin: 14
+  - platform: rp2040_pwm
+    id: light_output_4
+    pin: 15
+  - platform: rp2040_pwm
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbct
+    name: RGBCT Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    color_temperature: light_output_4
+    white_brightness: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbw/test.esp32-c3-idf.yaml b/tests/components/rgbw/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c5d4fceb9d
--- /dev/null
+++ b/tests/components/rgbw/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbw/test.esp32-c3.yaml b/tests/components/rgbw/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c5d4fceb9d
--- /dev/null
+++ b/tests/components/rgbw/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbw/test.esp32-idf.yaml b/tests/components/rgbw/test.esp32-idf.yaml
new file mode 100644
index 0000000000..6e9e92a03c
--- /dev/null
+++ b/tests/components/rgbw/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbw/test.esp32.yaml b/tests/components/rgbw/test.esp32.yaml
new file mode 100644
index 0000000000..6e9e92a03c
--- /dev/null
+++ b/tests/components/rgbw/test.esp32.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbw/test.esp8266.yaml b/tests/components/rgbw/test.esp8266.yaml
new file mode 100644
index 0000000000..54098613e4
--- /dev/null
+++ b/tests/components/rgbw/test.esp8266.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 12
+  - platform: esp8266_pwm
+    id: light_output_2
+    pin: 13
+  - platform: esp8266_pwm
+    id: light_output_3
+    pin: 14
+  - platform: esp8266_pwm
+    id: light_output_4
+    pin: 15
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbw/test.rp2040.yaml b/tests/components/rgbw/test.rp2040.yaml
new file mode 100644
index 0000000000..6a4437b898
--- /dev/null
+++ b/tests/components/rgbw/test.rp2040.yaml
@@ -0,0 +1,22 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 12
+  - platform: rp2040_pwm
+    id: light_output_2
+    pin: 13
+  - platform: rp2040_pwm
+    id: light_output_3
+    pin: 14
+  - platform: rp2040_pwm
+    id: light_output_4
+    pin: 15
+
+light:
+  - platform: rgbw
+    name: RGBW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    white: light_output_4
+    color_interlock: true
diff --git a/tests/components/rgbww/test.esp32-c3-idf.yaml b/tests/components/rgbww/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..49e9c7f331
--- /dev/null
+++ b/tests/components/rgbww/test.esp32-c3-idf.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+  - platform: ledc
+    id: light_output_5
+    pin: 5
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbww/test.esp32-c3.yaml b/tests/components/rgbww/test.esp32-c3.yaml
new file mode 100644
index 0000000000..49e9c7f331
--- /dev/null
+++ b/tests/components/rgbww/test.esp32-c3.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 1
+  - platform: ledc
+    id: light_output_2
+    pin: 2
+  - platform: ledc
+    id: light_output_3
+    pin: 3
+  - platform: ledc
+    id: light_output_4
+    pin: 4
+  - platform: ledc
+    id: light_output_5
+    pin: 5
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbww/test.esp32-idf.yaml b/tests/components/rgbww/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c24b6b7746
--- /dev/null
+++ b/tests/components/rgbww/test.esp32-idf.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+  - platform: ledc
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbww/test.esp32.yaml b/tests/components/rgbww/test.esp32.yaml
new file mode 100644
index 0000000000..c24b6b7746
--- /dev/null
+++ b/tests/components/rgbww/test.esp32.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: ledc
+    id: light_output_1
+    pin: 12
+  - platform: ledc
+    id: light_output_2
+    pin: 13
+  - platform: ledc
+    id: light_output_3
+    pin: 14
+  - platform: ledc
+    id: light_output_4
+    pin: 15
+  - platform: ledc
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbww/test.esp8266.yaml b/tests/components/rgbww/test.esp8266.yaml
new file mode 100644
index 0000000000..4ea26e6526
--- /dev/null
+++ b/tests/components/rgbww/test.esp8266.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: esp8266_pwm
+    id: light_output_1
+    pin: 12
+  - platform: esp8266_pwm
+    id: light_output_2
+    pin: 13
+  - platform: esp8266_pwm
+    id: light_output_3
+    pin: 14
+  - platform: esp8266_pwm
+    id: light_output_4
+    pin: 15
+  - platform: esp8266_pwm
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rgbww/test.rp2040.yaml b/tests/components/rgbww/test.rp2040.yaml
new file mode 100644
index 0000000000..0986f06e78
--- /dev/null
+++ b/tests/components/rgbww/test.rp2040.yaml
@@ -0,0 +1,28 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 12
+  - platform: rp2040_pwm
+    id: light_output_2
+    pin: 13
+  - platform: rp2040_pwm
+    id: light_output_3
+    pin: 14
+  - platform: rp2040_pwm
+    id: light_output_4
+    pin: 15
+  - platform: rp2040_pwm
+    id: light_output_5
+    pin: 16
+
+light:
+  - platform: rgbww
+    name: RGBWW Light
+    red: light_output_1
+    green: light_output_2
+    blue: light_output_3
+    cold_white: light_output_4
+    warm_white: light_output_5
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    color_interlock: true
diff --git a/tests/components/rotary_encoder/test.esp32-c3-idf.yaml b/tests/components/rotary_encoder/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..59f8b56abf
--- /dev/null
+++ b/tests/components/rotary_encoder/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 3
+    pin_b: 4
+    pin_reset: 5
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rotary_encoder/test.esp32-c3.yaml b/tests/components/rotary_encoder/test.esp32-c3.yaml
new file mode 100644
index 0000000000..59f8b56abf
--- /dev/null
+++ b/tests/components/rotary_encoder/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 3
+    pin_b: 4
+    pin_reset: 5
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rotary_encoder/test.esp32-idf.yaml b/tests/components/rotary_encoder/test.esp32-idf.yaml
new file mode 100644
index 0000000000..da3843f82d
--- /dev/null
+++ b/tests/components/rotary_encoder/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 13
+    pin_b: 14
+    pin_reset: 15
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rotary_encoder/test.esp32.yaml b/tests/components/rotary_encoder/test.esp32.yaml
new file mode 100644
index 0000000000..da3843f82d
--- /dev/null
+++ b/tests/components/rotary_encoder/test.esp32.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 13
+    pin_b: 14
+    pin_reset: 15
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rotary_encoder/test.esp8266.yaml b/tests/components/rotary_encoder/test.esp8266.yaml
new file mode 100644
index 0000000000..da3843f82d
--- /dev/null
+++ b/tests/components/rotary_encoder/test.esp8266.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 13
+    pin_b: 14
+    pin_reset: 15
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rotary_encoder/test.rp2040.yaml b/tests/components/rotary_encoder/test.rp2040.yaml
new file mode 100644
index 0000000000..da3843f82d
--- /dev/null
+++ b/tests/components/rotary_encoder/test.rp2040.yaml
@@ -0,0 +1,25 @@
+sensor:
+  - platform: rotary_encoder
+    name: Rotary Encoder
+    id: rotary_encoder1
+    pin_a: 13
+    pin_b: 14
+    pin_reset: 15
+    filters:
+      - or:
+          - debounce: 0.1s
+          - delta: 10
+    resolution: 4
+    min_value: -10
+    max_value: 30
+    on_value:
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: 10
+      - sensor.rotary_encoder.set_value:
+          id: rotary_encoder1
+          value: !lambda "return -1;"
+    on_clockwise:
+      - logger.log: Clockwise
+    on_anticlockwise:
+      - logger.log: Anticlockwise
diff --git a/tests/components/rp2040_pio_led_strip/test.rp2040.yaml b/tests/components/rp2040_pio_led_strip/test.rp2040.yaml
new file mode 100644
index 0000000000..b9b1436cdb
--- /dev/null
+++ b/tests/components/rp2040_pio_led_strip/test.rp2040.yaml
@@ -0,0 +1,18 @@
+light:
+  - platform: rp2040_pio_led_strip
+    id: led_strip
+    pin: 4
+    num_leds: 60
+    pio: 0
+    rgb_order: GRB
+    chipset: WS2812
+  - platform: rp2040_pio_led_strip
+    id: led_strip_custom_timings
+    pin: 5
+    num_leds: 60
+    pio: 1
+    rgb_order: GRB
+    bit0_high: .1us
+    bit0_low: 1.2us
+    bit1_high: .69us
+    bit1_low: .4us
diff --git a/tests/components/rp2040_pwm/test.rp2040.yaml b/tests/components/rp2040_pwm/test.rp2040.yaml
new file mode 100644
index 0000000000..45c039106f
--- /dev/null
+++ b/tests/components/rp2040_pwm/test.rp2040.yaml
@@ -0,0 +1,7 @@
+output:
+  - platform: rp2040_pwm
+    id: light_output_1
+    pin: 2
+  - platform: rp2040_pwm
+    id: light_output_2
+    pin: 3
diff --git a/tests/components/rtttl/test.esp32-c3-idf.yaml b/tests/components/rtttl/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c525f417de
--- /dev/null
+++ b/tests/components/rtttl/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: ledc
+    id: rtttl_output
+    pin: 1
+    frequency: 1500Hz
+    channel: 14
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/rtttl/test.esp32-c3.yaml b/tests/components/rtttl/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c525f417de
--- /dev/null
+++ b/tests/components/rtttl/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: ledc
+    id: rtttl_output
+    pin: 1
+    frequency: 1500Hz
+    channel: 14
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/rtttl/test.esp32-idf.yaml b/tests/components/rtttl/test.esp32-idf.yaml
new file mode 100644
index 0000000000..367a670741
--- /dev/null
+++ b/tests/components/rtttl/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: ledc
+    id: rtttl_output
+    pin: 13
+    frequency: 1500Hz
+    channel: 14
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/rtttl/test.esp32.yaml b/tests/components/rtttl/test.esp32.yaml
new file mode 100644
index 0000000000..367a670741
--- /dev/null
+++ b/tests/components/rtttl/test.esp32.yaml
@@ -0,0 +1,16 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: ledc
+    id: rtttl_output
+    pin: 13
+    frequency: 1500Hz
+    channel: 14
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/rtttl/test.esp8266.yaml b/tests/components/rtttl/test.esp8266.yaml
new file mode 100644
index 0000000000..c3b87c0f72
--- /dev/null
+++ b/tests/components/rtttl/test.esp8266.yaml
@@ -0,0 +1,15 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: esp8266_pwm
+    id: rtttl_output
+    pin: 13
+    frequency: 1500Hz
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/rtttl/test.rp2040.yaml b/tests/components/rtttl/test.rp2040.yaml
new file mode 100644
index 0000000000..ea240aa34d
--- /dev/null
+++ b/tests/components/rtttl/test.rp2040.yaml
@@ -0,0 +1,15 @@
+esphome:
+  on_boot:
+    then:
+      - rtttl.play: 'siren:d=8,o=5,b=100:d,e,d,e,d,e,d,e'
+      - rtttl.stop
+
+output:
+  - platform: rp2040_pwm
+    id: rtttl_output
+    pin: 3
+    frequency: 1500Hz
+    max_power: 0.5
+
+rtttl:
+  output: rtttl_output
diff --git a/tests/components/ruuvi_ble/test.esp32-c3-idf.yaml b/tests/components/ruuvi_ble/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..1f155fd8e1
--- /dev/null
+++ b/tests/components/ruuvi_ble/test.esp32-c3-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+ruuvi_ble:
diff --git a/tests/components/ruuvi_ble/test.esp32-c3.yaml b/tests/components/ruuvi_ble/test.esp32-c3.yaml
new file mode 100644
index 0000000000..1f155fd8e1
--- /dev/null
+++ b/tests/components/ruuvi_ble/test.esp32-c3.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+ruuvi_ble:
diff --git a/tests/components/ruuvi_ble/test.esp32-idf.yaml b/tests/components/ruuvi_ble/test.esp32-idf.yaml
new file mode 100644
index 0000000000..1f155fd8e1
--- /dev/null
+++ b/tests/components/ruuvi_ble/test.esp32-idf.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+ruuvi_ble:
diff --git a/tests/components/ruuvi_ble/test.esp32.yaml b/tests/components/ruuvi_ble/test.esp32.yaml
new file mode 100644
index 0000000000..1f155fd8e1
--- /dev/null
+++ b/tests/components/ruuvi_ble/test.esp32.yaml
@@ -0,0 +1,3 @@
+esp32_ble_tracker:
+
+ruuvi_ble:
diff --git a/tests/components/ruuvitag/test.esp32-c3-idf.yaml b/tests/components/ruuvitag/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..7990617710
--- /dev/null
+++ b/tests/components/ruuvitag/test.esp32-c3-idf.yaml
@@ -0,0 +1,27 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: ruuvitag
+    mac_address: FF:56:D3:2F:7D:E8
+    humidity:
+      name: RuuviTag Humidity
+    temperature:
+      name: RuuviTag Temperature
+    pressure:
+      name: RuuviTag Pressure
+    acceleration:
+      name: RuuviTag Acceleration
+    acceleration_x:
+      name: RuuviTag Acceleration X
+    acceleration_y:
+      name: RuuviTag Acceleration Y
+    acceleration_z:
+      name: RuuviTag Acceleration Z
+    battery_voltage:
+      name: RuuviTag Battery Voltage
+    tx_power:
+      name: RuuviTag TX Power
+    movement_counter:
+      name: RuuviTag Movement Counter
+    measurement_sequence_number:
+      name: RuuviTag Measurement Sequence Number
diff --git a/tests/components/ruuvitag/test.esp32-c3.yaml b/tests/components/ruuvitag/test.esp32-c3.yaml
new file mode 100644
index 0000000000..7990617710
--- /dev/null
+++ b/tests/components/ruuvitag/test.esp32-c3.yaml
@@ -0,0 +1,27 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: ruuvitag
+    mac_address: FF:56:D3:2F:7D:E8
+    humidity:
+      name: RuuviTag Humidity
+    temperature:
+      name: RuuviTag Temperature
+    pressure:
+      name: RuuviTag Pressure
+    acceleration:
+      name: RuuviTag Acceleration
+    acceleration_x:
+      name: RuuviTag Acceleration X
+    acceleration_y:
+      name: RuuviTag Acceleration Y
+    acceleration_z:
+      name: RuuviTag Acceleration Z
+    battery_voltage:
+      name: RuuviTag Battery Voltage
+    tx_power:
+      name: RuuviTag TX Power
+    movement_counter:
+      name: RuuviTag Movement Counter
+    measurement_sequence_number:
+      name: RuuviTag Measurement Sequence Number
diff --git a/tests/components/ruuvitag/test.esp32-idf.yaml b/tests/components/ruuvitag/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7990617710
--- /dev/null
+++ b/tests/components/ruuvitag/test.esp32-idf.yaml
@@ -0,0 +1,27 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: ruuvitag
+    mac_address: FF:56:D3:2F:7D:E8
+    humidity:
+      name: RuuviTag Humidity
+    temperature:
+      name: RuuviTag Temperature
+    pressure:
+      name: RuuviTag Pressure
+    acceleration:
+      name: RuuviTag Acceleration
+    acceleration_x:
+      name: RuuviTag Acceleration X
+    acceleration_y:
+      name: RuuviTag Acceleration Y
+    acceleration_z:
+      name: RuuviTag Acceleration Z
+    battery_voltage:
+      name: RuuviTag Battery Voltage
+    tx_power:
+      name: RuuviTag TX Power
+    movement_counter:
+      name: RuuviTag Movement Counter
+    measurement_sequence_number:
+      name: RuuviTag Measurement Sequence Number
diff --git a/tests/components/ruuvitag/test.esp32.yaml b/tests/components/ruuvitag/test.esp32.yaml
new file mode 100644
index 0000000000..7990617710
--- /dev/null
+++ b/tests/components/ruuvitag/test.esp32.yaml
@@ -0,0 +1,27 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: ruuvitag
+    mac_address: FF:56:D3:2F:7D:E8
+    humidity:
+      name: RuuviTag Humidity
+    temperature:
+      name: RuuviTag Temperature
+    pressure:
+      name: RuuviTag Pressure
+    acceleration:
+      name: RuuviTag Acceleration
+    acceleration_x:
+      name: RuuviTag Acceleration X
+    acceleration_y:
+      name: RuuviTag Acceleration Y
+    acceleration_z:
+      name: RuuviTag Acceleration Z
+    battery_voltage:
+      name: RuuviTag Battery Voltage
+    tx_power:
+      name: RuuviTag TX Power
+    movement_counter:
+      name: RuuviTag Movement Counter
+    measurement_sequence_number:
+      name: RuuviTag Measurement Sequence Number

From 8cb809d84de843a5866760ccb05ba7d5a266347f Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Tue, 23 Apr 2024 17:22:14 +1200
Subject: [PATCH 26/81] [sn74hc595] Enforce type field to distinguish gpio vs
 spi mode (#6609)

---
 esphome/components/sn74hc595/__init__.py      | 69 +++++++++----------
 .../sn74hc595/test.esp32-c3-idf.yaml          | 27 ++++++++
 tests/components/sn74hc595/test.esp32-c3.yaml | 27 ++++++++
 .../components/sn74hc595/test.esp32-idf.yaml  | 27 ++++++++
 tests/components/sn74hc595/test.esp32.yaml    | 27 ++++++++
 tests/components/sn74hc595/test.esp8266.yaml  | 27 ++++++++
 tests/components/sn74hc595/test.rp2040.yaml   | 27 ++++++++
 tests/test1.yaml                              |  1 +
 8 files changed, 197 insertions(+), 35 deletions(-)
 create mode 100644 tests/components/sn74hc595/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sn74hc595/test.esp32-c3.yaml
 create mode 100644 tests/components/sn74hc595/test.esp32-idf.yaml
 create mode 100644 tests/components/sn74hc595/test.esp32.yaml
 create mode 100644 tests/components/sn74hc595/test.esp8266.yaml
 create mode 100644 tests/components/sn74hc595/test.rp2040.yaml

diff --git a/esphome/components/sn74hc595/__init__.py b/esphome/components/sn74hc595/__init__.py
index 11a6747656..e0cd5e70ad 100644
--- a/esphome/components/sn74hc595/__init__.py
+++ b/esphome/components/sn74hc595/__init__.py
@@ -4,14 +4,13 @@ from esphome import pins
 from esphome.components import spi
 from esphome.const import (
     CONF_ID,
-    CONF_SPI_ID,
     CONF_NUMBER,
     CONF_INVERTED,
     CONF_DATA_PIN,
     CONF_CLOCK_PIN,
     CONF_OUTPUT,
+    CONF_TYPE,
 )
-from esphome.core import EsphomeError
 
 MULTI_CONF = True
 
@@ -34,53 +33,53 @@ CONF_LATCH_PIN = "latch_pin"
 CONF_OE_PIN = "oe_pin"
 CONF_SR_COUNT = "sr_count"
 
-CONFIG_SCHEMA = cv.Any(
-    cv.Schema(
-        {
-            cv.Required(CONF_ID): cv.declare_id(SN74HC595GPIOComponent),
-            cv.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema,
-            cv.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
-            cv.Required(CONF_LATCH_PIN): pins.gpio_output_pin_schema,
-            cv.Optional(CONF_OE_PIN): pins.gpio_output_pin_schema,
-            cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
-        }
-    ).extend(cv.COMPONENT_SCHEMA),
-    cv.Schema(
-        {
-            cv.Required(CONF_ID): cv.declare_id(SN74HC595SPIComponent),
-            cv.Required(CONF_LATCH_PIN): pins.gpio_output_pin_schema,
-            cv.Optional(CONF_OE_PIN): pins.gpio_output_pin_schema,
-            cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
-        }
-    )
-    .extend(cv.COMPONENT_SCHEMA)
-    .extend(spi.spi_device_schema(cs_pin_required=False))
-    .extend(
-        {
-            cv.Required(CONF_SPI_ID): cv.use_id(spi.SPIComponent),
-        }
-    ),
-    msg='Either "data_pin" and "clock_pin" must be set or "spi_id" must be set.',
+TYPE_GPIO = "gpio"
+TYPE_SPI = "spi"
+
+_COMMON_SCHEMA = cv.Schema(
+    {
+        cv.Required(CONF_LATCH_PIN): pins.gpio_output_pin_schema,
+        cv.Optional(CONF_OE_PIN): pins.gpio_output_pin_schema,
+        cv.Optional(CONF_SR_COUNT, default=1): cv.int_range(min=1, max=256),
+    }
+)
+
+CONFIG_SCHEMA = cv.typed_schema(
+    {
+        TYPE_GPIO: _COMMON_SCHEMA.extend(
+            {
+                cv.Required(CONF_ID): cv.declare_id(SN74HC595GPIOComponent),
+                cv.Required(CONF_DATA_PIN): pins.gpio_output_pin_schema,
+                cv.Required(CONF_CLOCK_PIN): pins.gpio_output_pin_schema,
+            }
+        ).extend(cv.COMPONENT_SCHEMA),
+        TYPE_SPI: _COMMON_SCHEMA.extend(
+            {
+                cv.Required(CONF_ID): cv.declare_id(SN74HC595SPIComponent),
+            }
+        )
+        .extend(cv.COMPONENT_SCHEMA)
+        .extend(spi.spi_device_schema(cs_pin_required=False)),
+    },
+    default_type=TYPE_GPIO,
 )
 
 
 async def to_code(config):
     var = cg.new_Pvariable(config[CONF_ID])
     await cg.register_component(var, config)
-    if CONF_DATA_PIN in config:
+    if config[CONF_TYPE] == TYPE_GPIO:
         data_pin = await cg.gpio_pin_expression(config[CONF_DATA_PIN])
         cg.add(var.set_data_pin(data_pin))
         clock_pin = await cg.gpio_pin_expression(config[CONF_CLOCK_PIN])
         cg.add(var.set_clock_pin(clock_pin))
-    elif CONF_SPI_ID in config:
-        await spi.register_spi_device(var, config)
     else:
-        raise EsphomeError("Not supported")
+        await spi.register_spi_device(var, config)
 
     latch_pin = await cg.gpio_pin_expression(config[CONF_LATCH_PIN])
     cg.add(var.set_latch_pin(latch_pin))
-    if CONF_OE_PIN in config:
-        oe_pin = await cg.gpio_pin_expression(config[CONF_OE_PIN])
+    if oe_pin := config.get(CONF_OE_PIN):
+        oe_pin = await cg.gpio_pin_expression(oe_pin)
         cg.add(var.set_oe_pin(oe_pin))
     cg.add(var.set_sr_count(config[CONF_SR_COUNT]))
 
diff --git a/tests/components/sn74hc595/test.esp32-c3-idf.yaml b/tests/components/sn74hc595/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9b093899d3
--- /dev/null
+++ b/tests/components/sn74hc595/test.esp32-c3-idf.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 0
+    data_pin: 1
+    latch_pin: 2
+    oe_pin: 3
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 8
+    oe_pin: 9
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/components/sn74hc595/test.esp32-c3.yaml b/tests/components/sn74hc595/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9b093899d3
--- /dev/null
+++ b/tests/components/sn74hc595/test.esp32-c3.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 0
+    data_pin: 1
+    latch_pin: 2
+    oe_pin: 3
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 8
+    oe_pin: 9
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/components/sn74hc595/test.esp32-idf.yaml b/tests/components/sn74hc595/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f695395797
--- /dev/null
+++ b/tests/components/sn74hc595/test.esp32-idf.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 12
+    data_pin: 13
+    latch_pin: 14
+    oe_pin: 18
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 21
+    oe_pin: 22
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/components/sn74hc595/test.esp32.yaml b/tests/components/sn74hc595/test.esp32.yaml
new file mode 100644
index 0000000000..f695395797
--- /dev/null
+++ b/tests/components/sn74hc595/test.esp32.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 12
+    data_pin: 13
+    latch_pin: 14
+    oe_pin: 18
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 21
+    oe_pin: 22
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/components/sn74hc595/test.esp8266.yaml b/tests/components/sn74hc595/test.esp8266.yaml
new file mode 100644
index 0000000000..64bf5d1925
--- /dev/null
+++ b/tests/components/sn74hc595/test.esp8266.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 0
+    data_pin: 2
+    latch_pin: 4
+    oe_pin: 5
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 15
+    oe_pin: 16
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/components/sn74hc595/test.rp2040.yaml b/tests/components/sn74hc595/test.rp2040.yaml
new file mode 100644
index 0000000000..de8e192659
--- /dev/null
+++ b/tests/components/sn74hc595/test.rp2040.yaml
@@ -0,0 +1,27 @@
+spi:
+  - id: spi_sn74hc595
+    clk_pin: 6
+    mosi_pin: 5
+    miso_pin: 4
+
+sn74hc595:
+  - id: sn74hc595_hub
+    clock_pin: 0
+    data_pin: 1
+    latch_pin: 2
+    oe_pin: 3
+    sr_count: 2
+  - id: sn74hc595_hub_2
+    latch_pin: 8
+    oe_pin: 9
+    spi_id: spi_sn74hc595
+    type: spi
+    sr_count: 2
+
+switch:
+  - platform: gpio
+    name: SN74HC595 Pin 0
+    pin:
+      sn74hc595: sn74hc595_hub_2
+      number: 0
+      inverted: false
diff --git a/tests/test1.yaml b/tests/test1.yaml
index c8ae9691c2..09994afa42 100644
--- a/tests/test1.yaml
+++ b/tests/test1.yaml
@@ -3996,6 +3996,7 @@ sn74hc595:
       number: GPIO32
     sr_count: 2
     spi_id: spi_bus
+    type: spi
 
 rtttl:
   output: gpio_19

From 06d3829b45911952a01c47b8a3961623ff1dab0b Mon Sep 17 00:00:00 2001
From: Samuel Sieb <samuel-github@sieb.net>
Date: Mon, 22 Apr 2024 23:43:11 -0700
Subject: [PATCH 27/81] allow defaults with no include vars (#6613)

---
 esphome/yaml_util.py | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/esphome/yaml_util.py b/esphome/yaml_util.py
index c7aa78201f..06bfd8b217 100644
--- a/esphome/yaml_util.py
+++ b/esphome/yaml_util.py
@@ -321,8 +321,9 @@ class ESPHomeLoaderMixin:
             file, vars = node.value, None
 
         result = _load_yaml_internal(self._rel_path(file))
-        if vars:
-            result = substitute_vars(result, vars)
+        if not vars:
+            vars = {}
+        result = substitute_vars(result, vars)
         return result
 
     @_add_data_ref

From b1839702f914621a90cc4c30644c449d32e006f1 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Tue, 23 Apr 2024 21:19:10 +1200
Subject: [PATCH 28/81] [tests] Run yaml tests in groups if over 100 to run
 (#6612)

---
 .github/workflows/ci.yml | 81 +++++++++++++++++++++++++++++++++++++---
 1 file changed, 75 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 15f0904df4..fd7a45ff50 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -398,7 +398,8 @@ jobs:
       - common
     if: github.event_name == 'pull_request'
     outputs:
-      matrix: ${{ steps.set-matrix.outputs.matrix }}
+      components: ${{ steps.list-components.outputs.components }}
+      count: ${{ steps.list-components.outputs.count }}
     steps:
       - name: Check out code from GitHub
         uses: actions/checkout@v4.1.1
@@ -419,10 +420,18 @@ jobs:
           python-version: ${{ env.DEFAULT_PYTHON }}
           cache-key: ${{ needs.common.outputs.cache-key }}
       - name: Find changed components
-        id: set-matrix
+        id: list-components
         run: |
           . venv/bin/activate
-          echo "matrix=$(script/list-components.py --changed --branch ${{ steps.target-branch.outputs.branch }} | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
+          components=$(script/list-components.py --changed --branch ${{ steps.target-branch.outputs.branch }})
+          output_components=$(echo "$components" | jq -R -s -c 'split("\n")[:-1] | map(select(length > 0))')
+          count=$(echo "$output_components" | jq length)
+
+          echo "components=$output_components" >> $GITHUB_OUTPUT
+          echo "count=$count" >> $GITHUB_OUTPUT
+
+          echo "$count Components:"
+          echo "$output_components" | jq
 
   test-build-components:
     name: Component test ${{ matrix.file }}
@@ -430,12 +439,12 @@ jobs:
     needs:
       - common
       - list-components
-    if: ${{ github.event_name == 'pull_request' && needs.list-components.outputs.matrix != '[]' && needs.list-components.outputs.matrix != '' }}
+    if: github.event_name == 'pull_request' && fromJSON(needs.list-components.outputs.count) > 0 && fromJSON(needs.list-components.outputs.count) < 100
     strategy:
       fail-fast: false
       max-parallel: 2
       matrix:
-        file: ${{ fromJson(needs.list-components.outputs.matrix) }}
+        file: ${{ fromJson(needs.list-components.outputs.components) }}
     steps:
       - name: Install libsodium
         run: sudo apt-get install libsodium-dev
@@ -456,6 +465,64 @@ jobs:
           . venv/bin/activate
           ./script/test_build_components -e compile -c ${{ matrix.file }}
 
+  test-build-components-splitter:
+    name: Split components for testing into 20 groups maximum
+    runs-on: ubuntu-latest
+    needs:
+      - common
+      - list-components
+    if: github.event_name == 'pull_request' && fromJSON(needs.list-components.outputs.count) >= 100
+    outputs:
+      matrix: ${{ steps.split.outputs.components }}
+    steps:
+      - name: Check out code from GitHub
+        uses: actions/checkout@v4.1.1
+      - name: Split components into 20 groups
+        id: split
+        run: |
+          components=$(echo '${{ needs.list-components.outputs.components }}' | jq -c '.[]' | shuf | jq -s -c '[_nwise(20) | join(" ")]')
+          echo "components=$components" >> $GITHUB_OUTPUT
+
+  test-build-components-split:
+    name: Test split components
+    runs-on: ubuntu-latest
+    needs:
+      - common
+      - list-components
+      - test-build-components-splitter
+    if: github.event_name == 'pull_request' && fromJSON(needs.list-components.outputs.count) >= 100
+    strategy:
+      fail-fast: false
+      max-parallel: 4
+      matrix:
+        components: ${{ fromJson(needs.test-build-components-splitter.outputs.matrix) }}
+    steps:
+      - name: List components
+        run: echo ${{ matrix.components }}
+
+      - name: Install libsodium
+        run: sudo apt-get install libsodium-dev
+
+      - name: Check out code from GitHub
+        uses: actions/checkout@v4.1.1
+      - name: Restore Python
+        uses: ./.github/actions/restore-python
+        with:
+          python-version: ${{ env.DEFAULT_PYTHON }}
+          cache-key: ${{ needs.common.outputs.cache-key }}
+      - name: Validate config
+        run: |
+          . venv/bin/activate
+          for component in ${{ matrix.components }}; do
+            ./script/test_build_components -e config -c $component
+          done
+      - name: Compile config
+        run: |
+          . venv/bin/activate
+          for component in ${{ matrix.components }}; do
+            ./script/test_build_components -e compile -c $component
+          done
+
   ci-status:
     name: CI Status
     runs-on: ubuntu-latest
@@ -470,8 +537,10 @@ jobs:
       - pyupgrade
       - compile-tests
       - clang-tidy
-      - test-build-components
       - list-components
+      - test-build-components
+      - test-build-components-splitter
+      - test-build-components-split
     if: always()
     steps:
       - name: Success

From 18149bc2762b284c17a0a0030691fa7566a9d1c4 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Tue, 23 Apr 2024 04:36:30 -0500
Subject: [PATCH 29/81] Add some components to the new testing framework (I)
 (#6185)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 tests/components/i2c/test.esp32-c3-idf.yaml   |  4 ++
 tests/components/i2c/test.esp32-c3.yaml       |  4 ++
 tests/components/i2c/test.esp32-idf.yaml      |  4 ++
 tests/components/i2c/test.esp32.yaml          |  4 ++
 tests/components/i2c/test.esp8266.yaml        |  4 ++
 tests/components/i2c/test.rp2040.yaml         |  4 ++
 .../i2s_audio/test.esp32-c3-idf.yaml          |  4 ++
 tests/components/i2s_audio/test.esp32-c3.yaml |  4 ++
 .../components/i2s_audio/test.esp32-idf.yaml  |  4 ++
 tests/components/i2s_audio/test.esp32.yaml    |  4 ++
 .../components/iaqcore/test.esp32-c3-idf.yaml | 11 ++++
 tests/components/iaqcore/test.esp32-c3.yaml   | 11 ++++
 tests/components/iaqcore/test.esp32-idf.yaml  | 11 ++++
 tests/components/iaqcore/test.esp32.yaml      | 11 ++++
 tests/components/iaqcore/test.esp8266.yaml    | 11 ++++
 tests/components/iaqcore/test.rp2040.yaml     | 11 ++++
 .../components/ili9xxx/test.esp32-c3-idf.yaml | 35 +++++++++++
 tests/components/ili9xxx/test.esp32-c3.yaml   | 35 +++++++++++
 tests/components/ili9xxx/test.esp32-idf.yaml  | 35 +++++++++++
 tests/components/ili9xxx/test.esp32.yaml      | 37 ++++++++---
 tests/components/ili9xxx/test.esp8266.yaml    | 35 +++++++++++
 tests/components/ili9xxx/test.rp2040.yaml     | 35 +++++++++++
 tests/components/image/test.esp32-c3-idf.yaml | 52 ++++++++++++++++
 tests/components/image/test.esp32-c3.yaml     | 52 ++++++++++++++++
 tests/components/image/test.esp32-idf.yaml    | 52 ++++++++++++++++
 tests/components/image/test.esp32.yaml        | 52 ++++++++++++++++
 tests/components/image/test.esp8266.yaml      | 52 ++++++++++++++++
 tests/components/image/test.rp2040.yaml       | 52 ++++++++++++++++
 .../improv_serial/test.esp32-c3-idf.yaml      |  5 ++
 .../improv_serial/test.esp32-c3.yaml          |  5 ++
 .../improv_serial/test.esp32-idf.yaml         |  5 ++
 .../components/improv_serial/test.esp32.yaml  |  5 ++
 .../improv_serial/test.esp8266.yaml           |  5 ++
 .../components/improv_serial/test.rp2040.yaml |  5 ++
 .../components/ina219/test.esp32-c3-idf.yaml  | 20 ++++++
 tests/components/ina219/test.esp32-c3.yaml    | 20 ++++++
 tests/components/ina219/test.esp32-idf.yaml   | 20 ++++++
 tests/components/ina219/test.esp32.yaml       | 20 ++++++
 tests/components/ina219/test.esp8266.yaml     | 20 ++++++
 tests/components/ina219/test.rp2040.yaml      | 20 ++++++
 .../components/ina226/test.esp32-c3-idf.yaml  | 19 ++++++
 tests/components/ina226/test.esp32-c3.yaml    | 19 ++++++
 tests/components/ina226/test.esp32-idf.yaml   | 19 ++++++
 tests/components/ina226/test.esp32.yaml       | 19 ++++++
 tests/components/ina226/test.esp8266.yaml     | 19 ++++++
 tests/components/ina226/test.rp2040.yaml      | 19 ++++++
 .../components/ina260/test.esp32-c3-idf.yaml  | 15 +++++
 tests/components/ina260/test.esp32-c3.yaml    | 15 +++++
 tests/components/ina260/test.esp32-idf.yaml   | 15 +++++
 tests/components/ina260/test.esp32.yaml       | 15 +++++
 tests/components/ina260/test.esp8266.yaml     | 15 +++++
 tests/components/ina260/test.rp2040.yaml      | 15 +++++
 .../components/ina3221/test.esp32-c3-idf.yaml | 19 ++++++
 tests/components/ina3221/test.esp32-c3.yaml   | 19 ++++++
 tests/components/ina3221/test.esp32-idf.yaml  | 19 ++++++
 tests/components/ina3221/test.esp32.yaml      | 19 ++++++
 tests/components/ina3221/test.esp8266.yaml    | 19 ++++++
 tests/components/ina3221/test.rp2040.yaml     | 19 ++++++
 .../test.esp32-c3-idf.yaml                    | 11 ++++
 .../inkbird_ibsth1_mini/test.esp32-c3.yaml    | 11 ++++
 .../inkbird_ibsth1_mini/test.esp32-idf.yaml   | 11 ++++
 .../inkbird_ibsth1_mini/test.esp32.yaml       | 11 ++++
 tests/components/inkplate6/test.esp32.yaml    | 62 +++++++++++++++++++
 .../components/integration/test.esp32-c3.yaml |  9 +++
 .../integration/test.esp32-idf.yaml           |  9 +++
 .../components/integration/test.esp32-s2.yaml |  9 +++
 .../components/integration/test.esp32-s3.yaml |  9 +++
 tests/components/integration/test.esp32.yaml  |  9 +++
 .../components/integration/test.esp8266.yaml  |  8 +++
 tests/components/integration/test.rp2040.yaml |  8 +++
 .../internal_temperature/test.esp32-c3.yaml   |  2 +-
 .../internal_temperature/test.esp32-idf.yaml  |  2 +-
 .../internal_temperature/test.esp32-s2.yaml   |  3 +
 .../internal_temperature/test.esp32-s3.yaml   |  7 +++
 .../internal_temperature/test.esp32.yaml      |  2 +-
 .../internal_temperature/test.rp2040.yaml     |  2 +-
 .../interval/test.esp32-c3-idf.yaml           |  4 ++
 tests/components/interval/test.esp32-c3.yaml  |  4 ++
 tests/components/interval/test.esp32-idf.yaml |  4 ++
 tests/components/interval/test.esp32.yaml     |  4 ++
 tests/components/interval/test.esp8266.yaml   |  4 ++
 tests/components/interval/test.rp2040.yaml    |  4 ++
 82 files changed, 1296 insertions(+), 11 deletions(-)
 create mode 100644 tests/components/i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/i2c/test.esp32.yaml
 create mode 100644 tests/components/i2c/test.esp8266.yaml
 create mode 100644 tests/components/i2c/test.rp2040.yaml
 create mode 100644 tests/components/i2s_audio/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/i2s_audio/test.esp32-c3.yaml
 create mode 100644 tests/components/i2s_audio/test.esp32-idf.yaml
 create mode 100644 tests/components/i2s_audio/test.esp32.yaml
 create mode 100644 tests/components/iaqcore/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/iaqcore/test.esp32-c3.yaml
 create mode 100644 tests/components/iaqcore/test.esp32-idf.yaml
 create mode 100644 tests/components/iaqcore/test.esp32.yaml
 create mode 100644 tests/components/iaqcore/test.esp8266.yaml
 create mode 100644 tests/components/iaqcore/test.rp2040.yaml
 create mode 100644 tests/components/ili9xxx/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ili9xxx/test.esp32-c3.yaml
 create mode 100644 tests/components/ili9xxx/test.esp32-idf.yaml
 create mode 100644 tests/components/ili9xxx/test.esp8266.yaml
 create mode 100644 tests/components/ili9xxx/test.rp2040.yaml
 create mode 100644 tests/components/image/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/image/test.esp32-c3.yaml
 create mode 100644 tests/components/image/test.esp32-idf.yaml
 create mode 100644 tests/components/image/test.esp32.yaml
 create mode 100644 tests/components/image/test.esp8266.yaml
 create mode 100644 tests/components/image/test.rp2040.yaml
 create mode 100644 tests/components/improv_serial/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/improv_serial/test.esp32-c3.yaml
 create mode 100644 tests/components/improv_serial/test.esp32-idf.yaml
 create mode 100644 tests/components/improv_serial/test.esp32.yaml
 create mode 100644 tests/components/improv_serial/test.esp8266.yaml
 create mode 100644 tests/components/improv_serial/test.rp2040.yaml
 create mode 100644 tests/components/ina219/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ina219/test.esp32-c3.yaml
 create mode 100644 tests/components/ina219/test.esp32-idf.yaml
 create mode 100644 tests/components/ina219/test.esp32.yaml
 create mode 100644 tests/components/ina219/test.esp8266.yaml
 create mode 100644 tests/components/ina219/test.rp2040.yaml
 create mode 100644 tests/components/ina226/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ina226/test.esp32-c3.yaml
 create mode 100644 tests/components/ina226/test.esp32-idf.yaml
 create mode 100644 tests/components/ina226/test.esp32.yaml
 create mode 100644 tests/components/ina226/test.esp8266.yaml
 create mode 100644 tests/components/ina226/test.rp2040.yaml
 create mode 100644 tests/components/ina260/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ina260/test.esp32-c3.yaml
 create mode 100644 tests/components/ina260/test.esp32-idf.yaml
 create mode 100644 tests/components/ina260/test.esp32.yaml
 create mode 100644 tests/components/ina260/test.esp8266.yaml
 create mode 100644 tests/components/ina260/test.rp2040.yaml
 create mode 100644 tests/components/ina3221/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ina3221/test.esp32-c3.yaml
 create mode 100644 tests/components/ina3221/test.esp32-idf.yaml
 create mode 100644 tests/components/ina3221/test.esp32.yaml
 create mode 100644 tests/components/ina3221/test.esp8266.yaml
 create mode 100644 tests/components/ina3221/test.rp2040.yaml
 create mode 100644 tests/components/inkbird_ibsth1_mini/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml
 create mode 100644 tests/components/inkbird_ibsth1_mini/test.esp32-idf.yaml
 create mode 100644 tests/components/inkbird_ibsth1_mini/test.esp32.yaml
 create mode 100644 tests/components/inkplate6/test.esp32.yaml
 create mode 100644 tests/components/integration/test.esp32-c3.yaml
 create mode 100644 tests/components/integration/test.esp32-idf.yaml
 create mode 100644 tests/components/integration/test.esp32-s2.yaml
 create mode 100644 tests/components/integration/test.esp32-s3.yaml
 create mode 100644 tests/components/integration/test.esp32.yaml
 create mode 100644 tests/components/integration/test.esp8266.yaml
 create mode 100644 tests/components/integration/test.rp2040.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-s2.yaml
 create mode 100644 tests/components/internal_temperature/test.esp32-s3.yaml
 create mode 100644 tests/components/interval/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/interval/test.esp32-c3.yaml
 create mode 100644 tests/components/interval/test.esp32-idf.yaml
 create mode 100644 tests/components/interval/test.esp32.yaml
 create mode 100644 tests/components/interval/test.esp8266.yaml
 create mode 100644 tests/components/interval/test.rp2040.yaml

diff --git a/tests/components/i2c/test.esp32-c3-idf.yaml b/tests/components/i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a881438faa
--- /dev/null
+++ b/tests/components/i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 5
+    sda: 4
diff --git a/tests/components/i2c/test.esp32-c3.yaml b/tests/components/i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a881438faa
--- /dev/null
+++ b/tests/components/i2c/test.esp32-c3.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 5
+    sda: 4
diff --git a/tests/components/i2c/test.esp32-idf.yaml b/tests/components/i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..19114a9e5d
--- /dev/null
+++ b/tests/components/i2c/test.esp32-idf.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 16
+    sda: 17
diff --git a/tests/components/i2c/test.esp32.yaml b/tests/components/i2c/test.esp32.yaml
new file mode 100644
index 0000000000..19114a9e5d
--- /dev/null
+++ b/tests/components/i2c/test.esp32.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 16
+    sda: 17
diff --git a/tests/components/i2c/test.esp8266.yaml b/tests/components/i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..a881438faa
--- /dev/null
+++ b/tests/components/i2c/test.esp8266.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 5
+    sda: 4
diff --git a/tests/components/i2c/test.rp2040.yaml b/tests/components/i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..a881438faa
--- /dev/null
+++ b/tests/components/i2c/test.rp2040.yaml
@@ -0,0 +1,4 @@
+i2c:
+  - id: i2c_i2c
+    scl: 5
+    sda: 4
diff --git a/tests/components/i2s_audio/test.esp32-c3-idf.yaml b/tests/components/i2s_audio/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..08cd56b1a7
--- /dev/null
+++ b/tests/components/i2s_audio/test.esp32-c3-idf.yaml
@@ -0,0 +1,4 @@
+i2s_audio:
+  i2s_bclk_pin: 7
+  i2s_lrclk_pin: 6
+  i2s_mclk_pin: 5
diff --git a/tests/components/i2s_audio/test.esp32-c3.yaml b/tests/components/i2s_audio/test.esp32-c3.yaml
new file mode 100644
index 0000000000..08cd56b1a7
--- /dev/null
+++ b/tests/components/i2s_audio/test.esp32-c3.yaml
@@ -0,0 +1,4 @@
+i2s_audio:
+  i2s_bclk_pin: 7
+  i2s_lrclk_pin: 6
+  i2s_mclk_pin: 5
diff --git a/tests/components/i2s_audio/test.esp32-idf.yaml b/tests/components/i2s_audio/test.esp32-idf.yaml
new file mode 100644
index 0000000000..938dd5c25f
--- /dev/null
+++ b/tests/components/i2s_audio/test.esp32-idf.yaml
@@ -0,0 +1,4 @@
+i2s_audio:
+  i2s_bclk_pin: 27
+  i2s_lrclk_pin: 26
+  i2s_mclk_pin: 25
diff --git a/tests/components/i2s_audio/test.esp32.yaml b/tests/components/i2s_audio/test.esp32.yaml
new file mode 100644
index 0000000000..938dd5c25f
--- /dev/null
+++ b/tests/components/i2s_audio/test.esp32.yaml
@@ -0,0 +1,4 @@
+i2s_audio:
+  i2s_bclk_pin: 27
+  i2s_lrclk_pin: 26
+  i2s_mclk_pin: 25
diff --git a/tests/components/iaqcore/test.esp32-c3-idf.yaml b/tests/components/iaqcore/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a1809dffd7
--- /dev/null
+++ b/tests/components/iaqcore/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/iaqcore/test.esp32-c3.yaml b/tests/components/iaqcore/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a1809dffd7
--- /dev/null
+++ b/tests/components/iaqcore/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/iaqcore/test.esp32-idf.yaml b/tests/components/iaqcore/test.esp32-idf.yaml
new file mode 100644
index 0000000000..26b01dadf9
--- /dev/null
+++ b/tests/components/iaqcore/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/iaqcore/test.esp32.yaml b/tests/components/iaqcore/test.esp32.yaml
new file mode 100644
index 0000000000..26b01dadf9
--- /dev/null
+++ b/tests/components/iaqcore/test.esp32.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/iaqcore/test.esp8266.yaml b/tests/components/iaqcore/test.esp8266.yaml
new file mode 100644
index 0000000000..a1809dffd7
--- /dev/null
+++ b/tests/components/iaqcore/test.esp8266.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/iaqcore/test.rp2040.yaml b/tests/components/iaqcore/test.rp2040.yaml
new file mode 100644
index 0000000000..a1809dffd7
--- /dev/null
+++ b/tests/components/iaqcore/test.rp2040.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_iaqcore
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: iaqcore
+    co2:
+      name: iAQ Core CO2 Sensor
+    tvoc:
+      name: iAQ Core TVOC Sensor
diff --git a/tests/components/ili9xxx/test.esp32-c3-idf.yaml b/tests/components/ili9xxx/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9526ae1f6b
--- /dev/null
+++ b/tests/components/ili9xxx/test.esp32-c3-idf.yaml
@@ -0,0 +1,35 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ili9xxx
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 8
+    dc_pin: 9
+    reset_pin: 10
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/ili9xxx/test.esp32-c3.yaml b/tests/components/ili9xxx/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9526ae1f6b
--- /dev/null
+++ b/tests/components/ili9xxx/test.esp32-c3.yaml
@@ -0,0 +1,35 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ili9xxx
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 8
+    dc_pin: 9
+    reset_pin: 10
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/ili9xxx/test.esp32-idf.yaml b/tests/components/ili9xxx/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0d7bda8ac6
--- /dev/null
+++ b/tests/components/ili9xxx/test.esp32-idf.yaml
@@ -0,0 +1,35 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ili9xxx
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 25
+    dc_pin: 26
+    reset_pin: 27
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/ili9xxx/test.esp32.yaml b/tests/components/ili9xxx/test.esp32.yaml
index 1095d565d2..ecee21686e 100644
--- a/tests/components/ili9xxx/test.esp32.yaml
+++ b/tests/components/ili9xxx/test.esp32.yaml
@@ -1,11 +1,34 @@
 spi:
-  mosi_pin: GPIO23
-  clk_pin: GPIO18
+  - id: spi_main_lcd
+    clk_pin: 16
+    mosi_pin: 17
 
 display:
   - platform: ili9xxx
-    model: gc9a01a
-    id: gca901_display
-    cs_pin: GPIO5
-    dc_pin: GPIO22
-    reset_pin: GPIO21
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 25
+    dc_pin: 26
+    reset_pin: 27
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/ili9xxx/test.esp8266.yaml b/tests/components/ili9xxx/test.esp8266.yaml
new file mode 100644
index 0000000000..0791c25aca
--- /dev/null
+++ b/tests/components/ili9xxx/test.esp8266.yaml
@@ -0,0 +1,35 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ili9xxx
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 5
+    dc_pin: 15
+    reset_pin: 16
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 2
+    dc_pin: 4
+    reset_pin: 0
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/ili9xxx/test.rp2040.yaml b/tests/components/ili9xxx/test.rp2040.yaml
new file mode 100644
index 0000000000..54083ebce8
--- /dev/null
+++ b/tests/components/ili9xxx/test.rp2040.yaml
@@ -0,0 +1,35 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ili9xxx
+    invert_colors: true
+    dimensions: 320x240
+    transform:
+      swap_xy: true
+      mirror_x: true
+      mirror_y: false
+    model: TFT 2.4
+    color_palette: GRAYSCALE
+    cs_pin: 5
+    dc_pin: 15
+    reset_pin: 16
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: ili9xxx
+    dimensions:
+      width: 320
+      height: 240
+      offset_width: 20
+      offset_height: 10
+    model: TFT 2.4
+    cs_pin: 20
+    dc_pin: 21
+    reset_pin: 22
+    auto_clear_enabled: false
+    rotation: 90
+    lambda: |-
+      it.fill(Color::WHITE);
diff --git a/tests/components/image/test.esp32-c3-idf.yaml b/tests/components/image/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c083a97c94
--- /dev/null
+++ b/tests/components/image/test.esp32-c3-idf.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 8
+    dc_pin: 9
+    reset_pin: 10
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/image/test.esp32-c3.yaml b/tests/components/image/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c083a97c94
--- /dev/null
+++ b/tests/components/image/test.esp32-c3.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 8
+    dc_pin: 9
+    reset_pin: 10
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/image/test.esp32-idf.yaml b/tests/components/image/test.esp32-idf.yaml
new file mode 100644
index 0000000000..ff9adde6b1
--- /dev/null
+++ b/tests/components/image/test.esp32-idf.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 21
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/image/test.esp32.yaml b/tests/components/image/test.esp32.yaml
new file mode 100644
index 0000000000..ff9adde6b1
--- /dev/null
+++ b/tests/components/image/test.esp32.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 21
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/image/test.esp8266.yaml b/tests/components/image/test.esp8266.yaml
new file mode 100644
index 0000000000..3632b95485
--- /dev/null
+++ b/tests/components/image/test.esp8266.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 5
+    dc_pin: 15
+    reset_pin: 16
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/image/test.rp2040.yaml b/tests/components/image/test.rp2040.yaml
new file mode 100644
index 0000000000..b79c8a9195
--- /dev/null
+++ b/tests/components/image/test.rp2040.yaml
@@ -0,0 +1,52 @@
+spi:
+  - id: spi_main_lcd
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ili9xxx
+    id: main_lcd
+    model: ili9342
+    cs_pin: 20
+    dc_pin: 21
+    reset_pin: 22
+
+image:
+  - id: binary_image
+    file: ../../pnglogo.png
+    type: BINARY
+    dither: FloydSteinberg
+  - id: transparent_transparent_image
+    file: ../../pnglogo.png
+    type: TRANSPARENT_BINARY
+  - id: rgba_image
+    file: ../../pnglogo.png
+    type: RGBA
+    resize: 50x50
+  - id: rgb24_image
+    file: ../../pnglogo.png
+    type: RGB24
+    use_transparency: yes
+  - id: rgb565_image
+    file: ../../pnglogo.png
+    type: RGB565
+    use_transparency: no
+  - id: web_svg_image
+    file: https://raw.githubusercontent.com/esphome/esphome-docs/a62d7ab193c1a464ed791670170c7d518189109b/images/logo.svg
+    resize: 256x48
+    type: TRANSPARENT_BINARY
+  - id: web_tiff_image
+    file: https://upload.wikimedia.org/wikipedia/commons/b/b6/SIPI_Jelly_Beans_4.1.07.tiff
+    type: RGB24
+    resize: 48x48
+  - id: web_redirect_image
+    file: https://avatars.githubusercontent.com/u/3060199?s=48&v=4
+    type: RGB24
+    resize: 48x48
+  - id: mdi_alert
+    file: mdi:alert-circle-outline
+    resize: 50x50
+  - id: another_alert_icon
+    file: mdi:alert-outline
+    type: BINARY
diff --git a/tests/components/improv_serial/test.esp32-c3-idf.yaml b/tests/components/improv_serial/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.esp32-c3-idf.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/improv_serial/test.esp32-c3.yaml b/tests/components/improv_serial/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.esp32-c3.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/improv_serial/test.esp32-idf.yaml b/tests/components/improv_serial/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/improv_serial/test.esp32.yaml b/tests/components/improv_serial/test.esp32.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.esp32.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/improv_serial/test.esp8266.yaml b/tests/components/improv_serial/test.esp8266.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.esp8266.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/improv_serial/test.rp2040.yaml b/tests/components/improv_serial/test.rp2040.yaml
new file mode 100644
index 0000000000..b36fe5a4a7
--- /dev/null
+++ b/tests/components/improv_serial/test.rp2040.yaml
@@ -0,0 +1,5 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+improv_serial:
diff --git a/tests/components/ina219/test.esp32-c3-idf.yaml b/tests/components/ina219/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..586add9d16
--- /dev/null
+++ b/tests/components/ina219/test.esp32-c3-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina219/test.esp32-c3.yaml b/tests/components/ina219/test.esp32-c3.yaml
new file mode 100644
index 0000000000..586add9d16
--- /dev/null
+++ b/tests/components/ina219/test.esp32-c3.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina219/test.esp32-idf.yaml b/tests/components/ina219/test.esp32-idf.yaml
new file mode 100644
index 0000000000..affbec67c4
--- /dev/null
+++ b/tests/components/ina219/test.esp32-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina219/test.esp32.yaml b/tests/components/ina219/test.esp32.yaml
new file mode 100644
index 0000000000..affbec67c4
--- /dev/null
+++ b/tests/components/ina219/test.esp32.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina219/test.esp8266.yaml b/tests/components/ina219/test.esp8266.yaml
new file mode 100644
index 0000000000..586add9d16
--- /dev/null
+++ b/tests/components/ina219/test.esp8266.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina219/test.rp2040.yaml b/tests/components/ina219/test.rp2040.yaml
new file mode 100644
index 0000000000..586add9d16
--- /dev/null
+++ b/tests/components/ina219/test.rp2040.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_ina219
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina219
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA219 Current
+    power:
+      name: INA219 Power
+    bus_voltage:
+      name: INA219 Bus Voltage
+    shunt_voltage:
+      name: INA219 Shunt Voltage
+    max_voltage: 32.0V
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.esp32-c3-idf.yaml b/tests/components/ina226/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..6581763294
--- /dev/null
+++ b/tests/components/ina226/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.esp32-c3.yaml b/tests/components/ina226/test.esp32-c3.yaml
new file mode 100644
index 0000000000..6581763294
--- /dev/null
+++ b/tests/components/ina226/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.esp32-idf.yaml b/tests/components/ina226/test.esp32-idf.yaml
new file mode 100644
index 0000000000..feab5e146c
--- /dev/null
+++ b/tests/components/ina226/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.esp32.yaml b/tests/components/ina226/test.esp32.yaml
new file mode 100644
index 0000000000..feab5e146c
--- /dev/null
+++ b/tests/components/ina226/test.esp32.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.esp8266.yaml b/tests/components/ina226/test.esp8266.yaml
new file mode 100644
index 0000000000..6581763294
--- /dev/null
+++ b/tests/components/ina226/test.esp8266.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina226/test.rp2040.yaml b/tests/components/ina226/test.rp2040.yaml
new file mode 100644
index 0000000000..6581763294
--- /dev/null
+++ b/tests/components/ina226/test.rp2040.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina226
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina226
+    address: 0x40
+    shunt_resistance: 0.1 ohm
+    current:
+      name: INA226 Current
+    power:
+      name: INA226 Power
+    bus_voltage:
+      name: INA226 Bus Voltage
+    shunt_voltage:
+      name: INA226 Shunt Voltage
+    max_current: 3.2A
+    update_interval: 15s
diff --git a/tests/components/ina260/test.esp32-c3-idf.yaml b/tests/components/ina260/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a1da63351d
--- /dev/null
+++ b/tests/components/ina260/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina260/test.esp32-c3.yaml b/tests/components/ina260/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a1da63351d
--- /dev/null
+++ b/tests/components/ina260/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina260/test.esp32-idf.yaml b/tests/components/ina260/test.esp32-idf.yaml
new file mode 100644
index 0000000000..be6cf73bff
--- /dev/null
+++ b/tests/components/ina260/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina260/test.esp32.yaml b/tests/components/ina260/test.esp32.yaml
new file mode 100644
index 0000000000..be6cf73bff
--- /dev/null
+++ b/tests/components/ina260/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina260/test.esp8266.yaml b/tests/components/ina260/test.esp8266.yaml
new file mode 100644
index 0000000000..a1da63351d
--- /dev/null
+++ b/tests/components/ina260/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina260/test.rp2040.yaml b/tests/components/ina260/test.rp2040.yaml
new file mode 100644
index 0000000000..a1da63351d
--- /dev/null
+++ b/tests/components/ina260/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_ina260
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina260
+    address: 0x40
+    current:
+      name: INA260 Current
+    power:
+      name: INA260 Power
+    bus_voltage:
+      name: INA260 Voltage
+    update_interval: 60s
diff --git a/tests/components/ina3221/test.esp32-c3-idf.yaml b/tests/components/ina3221/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..55990871a0
--- /dev/null
+++ b/tests/components/ina3221/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/ina3221/test.esp32-c3.yaml b/tests/components/ina3221/test.esp32-c3.yaml
new file mode 100644
index 0000000000..55990871a0
--- /dev/null
+++ b/tests/components/ina3221/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/ina3221/test.esp32-idf.yaml b/tests/components/ina3221/test.esp32-idf.yaml
new file mode 100644
index 0000000000..ad9cf79e38
--- /dev/null
+++ b/tests/components/ina3221/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/ina3221/test.esp32.yaml b/tests/components/ina3221/test.esp32.yaml
new file mode 100644
index 0000000000..ad9cf79e38
--- /dev/null
+++ b/tests/components/ina3221/test.esp32.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/ina3221/test.esp8266.yaml b/tests/components/ina3221/test.esp8266.yaml
new file mode 100644
index 0000000000..55990871a0
--- /dev/null
+++ b/tests/components/ina3221/test.esp8266.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/ina3221/test.rp2040.yaml b/tests/components/ina3221/test.rp2040.yaml
new file mode 100644
index 0000000000..55990871a0
--- /dev/null
+++ b/tests/components/ina3221/test.rp2040.yaml
@@ -0,0 +1,19 @@
+i2c:
+  - id: i2c_ina3221
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: ina3221
+    address: 0x40
+    channel_1:
+      shunt_resistance: 0.1 ohm
+      current:
+        name: INA3221 Channel 1 Current
+      power:
+        name: INA3221 Channel 1 Power
+      bus_voltage:
+        name: INA3221 Channel 1 Bus Voltage
+      shunt_voltage:
+        name: INA3221 Channel 1 Shunt Voltage
+    update_interval: 15s
diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32-c3-idf.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ba46b7dbf6
--- /dev/null
+++ b/tests/components/inkbird_ibsth1_mini/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: inkbird_ibsth1_mini
+    mac_address: 38:81:D7:0A:9C:11
+    temperature:
+      name: Inkbird IBS-TH1 Temperature
+    humidity:
+      name: Inkbird IBS-TH1 Humidity
+    battery_level:
+      name: Inkbird IBS-TH1 Battery Level
diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ba46b7dbf6
--- /dev/null
+++ b/tests/components/inkbird_ibsth1_mini/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: inkbird_ibsth1_mini
+    mac_address: 38:81:D7:0A:9C:11
+    temperature:
+      name: Inkbird IBS-TH1 Temperature
+    humidity:
+      name: Inkbird IBS-TH1 Humidity
+    battery_level:
+      name: Inkbird IBS-TH1 Battery Level
diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32-idf.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32-idf.yaml
new file mode 100644
index 0000000000..ba46b7dbf6
--- /dev/null
+++ b/tests/components/inkbird_ibsth1_mini/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: inkbird_ibsth1_mini
+    mac_address: 38:81:D7:0A:9C:11
+    temperature:
+      name: Inkbird IBS-TH1 Temperature
+    humidity:
+      name: Inkbird IBS-TH1 Humidity
+    battery_level:
+      name: Inkbird IBS-TH1 Battery Level
diff --git a/tests/components/inkbird_ibsth1_mini/test.esp32.yaml b/tests/components/inkbird_ibsth1_mini/test.esp32.yaml
new file mode 100644
index 0000000000..ba46b7dbf6
--- /dev/null
+++ b/tests/components/inkbird_ibsth1_mini/test.esp32.yaml
@@ -0,0 +1,11 @@
+esp32_ble_tracker:
+
+sensor:
+  - platform: inkbird_ibsth1_mini
+    mac_address: 38:81:D7:0A:9C:11
+    temperature:
+      name: Inkbird IBS-TH1 Temperature
+    humidity:
+      name: Inkbird IBS-TH1 Humidity
+    battery_level:
+      name: Inkbird IBS-TH1 Battery Level
diff --git a/tests/components/inkplate6/test.esp32.yaml b/tests/components/inkplate6/test.esp32.yaml
new file mode 100644
index 0000000000..31b14e6c73
--- /dev/null
+++ b/tests/components/inkplate6/test.esp32.yaml
@@ -0,0 +1,62 @@
+i2c:
+  - id: i2c_inkplate6
+    scl: 16
+    sda: 17
+
+display:
+  - platform: inkplate6
+    id: inkplate_display
+    greyscale: false
+    partial_updating: false
+    update_interval: 60s
+    display_data_0_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_1_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_2_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_3_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_5_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_4_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_6_pin:
+      number: 1
+      allow_other_uses: true
+    display_data_7_pin:
+      number: 1
+      allow_other_uses: true
+    ckv_pin:
+      number: 1
+      allow_other_uses: true
+    sph_pin:
+      number: 1
+      allow_other_uses: true
+    gmod_pin:
+      number: 1
+      allow_other_uses: true
+    gpio0_enable_pin:
+      number: 1
+      allow_other_uses: true
+    oe_pin:
+      number: 1
+      allow_other_uses: true
+    spv_pin:
+      number: 1
+      allow_other_uses: true
+    powerup_pin:
+      number: 1
+      allow_other_uses: true
+    wakeup_pin:
+      number: 1
+      allow_other_uses: true
+    vcom_pin:
+      number: 1
+      allow_other_uses: true
diff --git a/tests/components/integration/test.esp32-c3.yaml b/tests/components/integration/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b68cb9f87d
--- /dev/null
+++ b/tests/components/integration/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 4
+    attenuation: 11db
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.esp32-idf.yaml b/tests/components/integration/test.esp32-idf.yaml
new file mode 100644
index 0000000000..0095fdb1ff
--- /dev/null
+++ b/tests/components/integration/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: A0
+    attenuation: 2.5db
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.esp32-s2.yaml b/tests/components/integration/test.esp32-s2.yaml
new file mode 100644
index 0000000000..1415952571
--- /dev/null
+++ b/tests/components/integration/test.esp32-s2.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 1
+    attenuation: 11db
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.esp32-s3.yaml b/tests/components/integration/test.esp32-s3.yaml
new file mode 100644
index 0000000000..1415952571
--- /dev/null
+++ b/tests/components/integration/test.esp32-s3.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: 1
+    attenuation: 11db
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.esp32.yaml b/tests/components/integration/test.esp32.yaml
new file mode 100644
index 0000000000..0095fdb1ff
--- /dev/null
+++ b/tests/components/integration/test.esp32.yaml
@@ -0,0 +1,9 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: A0
+    attenuation: 2.5db
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.esp8266.yaml b/tests/components/integration/test.esp8266.yaml
new file mode 100644
index 0000000000..51d3e19077
--- /dev/null
+++ b/tests/components/integration/test.esp8266.yaml
@@ -0,0 +1,8 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: VCC
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/integration/test.rp2040.yaml b/tests/components/integration/test.rp2040.yaml
new file mode 100644
index 0000000000..51d3e19077
--- /dev/null
+++ b/tests/components/integration/test.rp2040.yaml
@@ -0,0 +1,8 @@
+sensor:
+  - platform: adc
+    id: my_sensor
+    pin: VCC
+  - platform: integration
+    sensor: my_sensor
+    name: Integration Sensor
+    time_unit: s
diff --git a/tests/components/internal_temperature/test.esp32-c3.yaml b/tests/components/internal_temperature/test.esp32-c3.yaml
index 28df4a6d9f..19f740339d 100644
--- a/tests/components/internal_temperature/test.esp32-c3.yaml
+++ b/tests/components/internal_temperature/test.esp32-c3.yaml
@@ -1,3 +1,3 @@
 sensor:
   - platform: internal_temperature
-    name: "Internal Temperature"
+    name: Internal Temperature
diff --git a/tests/components/internal_temperature/test.esp32-idf.yaml b/tests/components/internal_temperature/test.esp32-idf.yaml
index 28df4a6d9f..19f740339d 100644
--- a/tests/components/internal_temperature/test.esp32-idf.yaml
+++ b/tests/components/internal_temperature/test.esp32-idf.yaml
@@ -1,3 +1,3 @@
 sensor:
   - platform: internal_temperature
-    name: "Internal Temperature"
+    name: Internal Temperature
diff --git a/tests/components/internal_temperature/test.esp32-s2.yaml b/tests/components/internal_temperature/test.esp32-s2.yaml
new file mode 100644
index 0000000000..19f740339d
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-s2.yaml
@@ -0,0 +1,3 @@
+sensor:
+  - platform: internal_temperature
+    name: Internal Temperature
diff --git a/tests/components/internal_temperature/test.esp32-s3.yaml b/tests/components/internal_temperature/test.esp32-s3.yaml
new file mode 100644
index 0000000000..9eb1ec0b0f
--- /dev/null
+++ b/tests/components/internal_temperature/test.esp32-s3.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: internal_temperature
+    name: Internal Temperature
+
+esp32:
+  framework:
+    version: 2.0.9
diff --git a/tests/components/internal_temperature/test.esp32.yaml b/tests/components/internal_temperature/test.esp32.yaml
index 28df4a6d9f..19f740339d 100644
--- a/tests/components/internal_temperature/test.esp32.yaml
+++ b/tests/components/internal_temperature/test.esp32.yaml
@@ -1,3 +1,3 @@
 sensor:
   - platform: internal_temperature
-    name: "Internal Temperature"
+    name: Internal Temperature
diff --git a/tests/components/internal_temperature/test.rp2040.yaml b/tests/components/internal_temperature/test.rp2040.yaml
index 28df4a6d9f..19f740339d 100644
--- a/tests/components/internal_temperature/test.rp2040.yaml
+++ b/tests/components/internal_temperature/test.rp2040.yaml
@@ -1,3 +1,3 @@
 sensor:
   - platform: internal_temperature
-    name: "Internal Temperature"
+    name: Internal Temperature
diff --git a/tests/components/interval/test.esp32-c3-idf.yaml b/tests/components/interval/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.esp32-c3-idf.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick
diff --git a/tests/components/interval/test.esp32-c3.yaml b/tests/components/interval/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.esp32-c3.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick
diff --git a/tests/components/interval/test.esp32-idf.yaml b/tests/components/interval/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.esp32-idf.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick
diff --git a/tests/components/interval/test.esp32.yaml b/tests/components/interval/test.esp32.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.esp32.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick
diff --git a/tests/components/interval/test.esp8266.yaml b/tests/components/interval/test.esp8266.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.esp8266.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick
diff --git a/tests/components/interval/test.rp2040.yaml b/tests/components/interval/test.rp2040.yaml
new file mode 100644
index 0000000000..2a3c979ae2
--- /dev/null
+++ b/tests/components/interval/test.rp2040.yaml
@@ -0,0 +1,4 @@
+interval:
+  - interval: 1s
+    then:
+      - logger.log: Tick

From ed381b45eb99c0774edf619b4239b7a35a1984e9 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Tue, 23 Apr 2024 04:49:03 -0500
Subject: [PATCH 30/81] Add some components to the new testing framework (T)
 (#6229)

---
 tests/components/t6615/test.esp32-c3-idf.yaml |  10 ++
 tests/components/t6615/test.esp32-c3.yaml     |  10 ++
 tests/components/t6615/test.esp32-idf.yaml    |  10 ++
 tests/components/t6615/test.esp32.yaml        |  10 ++
 tests/components/t6615/test.esp8266.yaml      |  10 ++
 tests/components/t6615/test.rp2040.yaml       |  10 ++
 .../tca9548a/test.esp32-c3-idf.yaml           |  15 +++
 tests/components/tca9548a/test.esp32-c3.yaml  |  15 +++
 tests/components/tca9548a/test.esp32-idf.yaml |  15 +++
 tests/components/tca9548a/test.esp32.yaml     |  15 +++
 tests/components/tca9548a/test.esp8266.yaml   |  15 +++
 tests/components/tca9548a/test.rp2040.yaml    |  15 +++
 .../components/tcl112/test.esp32-c3-idf.yaml  |  15 +++
 tests/components/tcl112/test.esp32-c3.yaml    |  15 +++
 tests/components/tcl112/test.esp32-idf.yaml   |  15 +++
 tests/components/tcl112/test.esp32.yaml       |  15 +++
 tests/components/tcl112/test.esp8266.yaml     |  15 +++
 .../tcs34725/test.esp32-c3-idf.yaml           |  21 ++++
 tests/components/tcs34725/test.esp32-c3.yaml  |  21 ++++
 tests/components/tcs34725/test.esp32-idf.yaml |  21 ++++
 tests/components/tcs34725/test.esp32.yaml     |  21 ++++
 tests/components/tcs34725/test.esp8266.yaml   |  21 ++++
 tests/components/tcs34725/test.rp2040.yaml    |  21 ++++
 .../components/tee501/test.esp32-c3-idf.yaml  |   9 ++
 tests/components/tee501/test.esp32-c3.yaml    |   9 ++
 tests/components/tee501/test.esp32-idf.yaml   |   9 ++
 tests/components/tee501/test.esp32.yaml       |   9 ++
 tests/components/tee501/test.esp8266.yaml     |   9 ++
 tests/components/tee501/test.rp2040.yaml      |   9 ++
 .../teleinfo/test.esp32-c3-idf.yaml           |  42 +++++++
 tests/components/teleinfo/test.esp32-c3.yaml  |  42 +++++++
 tests/components/teleinfo/test.esp32-idf.yaml |  42 +++++++
 tests/components/teleinfo/test.esp32.yaml     |  42 +++++++
 tests/components/teleinfo/test.esp8266.yaml   |  42 +++++++
 tests/components/teleinfo/test.rp2040.yaml    |  42 +++++++
 .../thermostat/test.esp32-c3-idf.yaml         |  93 ++++++++++++++
 .../components/thermostat/test.esp32-c3.yaml  |  93 ++++++++++++++
 .../components/thermostat/test.esp32-idf.yaml |  93 ++++++++++++++
 tests/components/thermostat/test.esp32.yaml   |  93 ++++++++++++++
 tests/components/thermostat/test.esp8266.yaml |  93 ++++++++++++++
 tests/components/thermostat/test.rp2040.yaml  |  93 ++++++++++++++
 tests/components/time/test.esp32-c3-idf.yaml  |  10 ++
 tests/components/time/test.esp32-c3.yaml      |  10 ++
 tests/components/time/test.esp32-idf.yaml     |  10 ++
 tests/components/time/test.esp32.yaml         |  10 ++
 tests/components/time/test.esp8266.yaml       |  10 ++
 tests/components/time/test.rp2040.yaml        |  10 ++
 .../time_based/test.esp32-c3-idf.yaml         |  12 ++
 .../components/time_based/test.esp32-c3.yaml  |  12 ++
 .../components/time_based/test.esp32-idf.yaml |  12 ++
 tests/components/time_based/test.esp32.yaml   |  12 ++
 tests/components/time_based/test.esp8266.yaml |  12 ++
 tests/components/time_based/test.rp2040.yaml  |  12 ++
 .../tlc59208f/test.esp32-c3-idf.yaml          |  50 ++++++++
 tests/components/tlc59208f/test.esp32-c3.yaml |  50 ++++++++
 .../components/tlc59208f/test.esp32-idf.yaml  |  50 ++++++++
 tests/components/tlc59208f/test.esp32.yaml    |  50 ++++++++
 tests/components/tlc59208f/test.esp8266.yaml  |  50 ++++++++
 tests/components/tlc59208f/test.rp2040.yaml   |  50 ++++++++
 .../components/tm1621/test.esp32-c3-idf.yaml  |  12 ++
 tests/components/tm1621/test.esp32-c3.yaml    |  12 ++
 tests/components/tm1621/test.esp32-idf.yaml   |  12 ++
 tests/components/tm1621/test.esp32.yaml       |  12 ++
 tests/components/tm1621/test.esp8266.yaml     |  12 ++
 tests/components/tm1621/test.rp2040.yaml      |  12 ++
 .../components/tm1637/test.esp32-c3-idf.yaml  |   7 ++
 tests/components/tm1637/test.esp32-c3.yaml    |   7 ++
 tests/components/tm1637/test.esp32-idf.yaml   |   7 ++
 tests/components/tm1637/test.esp32.yaml       |   7 ++
 tests/components/tm1637/test.esp8266.yaml     |   7 ++
 tests/components/tm1637/test.rp2040.yaml      |   7 ++
 .../components/tm1638/test.esp32-c3-idf.yaml  | 118 ++++++++++++++++++
 tests/components/tm1638/test.esp32-c3.yaml    | 118 ++++++++++++++++++
 tests/components/tm1638/test.esp32-idf.yaml   | 118 ++++++++++++++++++
 tests/components/tm1638/test.esp32.yaml       | 118 ++++++++++++++++++
 tests/components/tm1638/test.esp8266.yaml     | 118 ++++++++++++++++++
 tests/components/tm1638/test.rp2040.yaml      | 118 ++++++++++++++++++
 tests/components/tm1651/test.esp32-c3.yaml    |  21 ++++
 tests/components/tm1651/test.esp32.yaml       |  21 ++++
 tests/components/tm1651/test.esp8266.yaml     |  21 ++++
 tests/components/tm1651/test.rp2040.yaml      |  21 ++++
 .../components/tmp102/test.esp32-c3-idf.yaml  |   8 ++
 tests/components/tmp102/test.esp32-c3.yaml    |   8 ++
 tests/components/tmp102/test.esp32-idf.yaml   |   8 ++
 tests/components/tmp102/test.esp32.yaml       |   8 ++
 tests/components/tmp102/test.esp8266.yaml     |   8 ++
 tests/components/tmp102/test.rp2040.yaml      |   8 ++
 .../components/tmp1075/test.esp32-c3-idf.yaml |  16 +++
 tests/components/tmp1075/test.esp32-c3.yaml   |  16 +++
 tests/components/tmp1075/test.esp32-idf.yaml  |  16 +++
 tests/components/tmp1075/test.esp32.yaml      |  16 +++
 tests/components/tmp1075/test.esp8266.yaml    |  16 +++
 tests/components/tmp1075/test.rp2040.yaml     |  16 +++
 .../components/tmp117/test.esp32-c3-idf.yaml  |   9 ++
 tests/components/tmp117/test.esp32-c3.yaml    |   9 ++
 tests/components/tmp117/test.esp32-idf.yaml   |   9 ++
 tests/components/tmp117/test.esp32.yaml       |   9 ++
 tests/components/tmp117/test.esp8266.yaml     |   9 ++
 tests/components/tmp117/test.rp2040.yaml      |   9 ++
 .../tof10120/test.esp32-c3-idf.yaml           |   9 ++
 tests/components/tof10120/test.esp32-c3.yaml  |   9 ++
 tests/components/tof10120/test.esp32-idf.yaml |   9 ++
 tests/components/tof10120/test.esp32.yaml     |   9 ++
 tests/components/tof10120/test.esp8266.yaml   |   9 ++
 tests/components/tof10120/test.rp2040.yaml    |   9 ++
 .../components/toshiba/test.esp32-c3-idf.yaml |   7 ++
 tests/components/toshiba/test.esp32-c3.yaml   |   7 ++
 tests/components/toshiba/test.esp32-idf.yaml  |   7 ++
 tests/components/toshiba/test.esp32.yaml      |   7 ++
 tests/components/toshiba/test.esp8266.yaml    |   7 ++
 .../total_daily_energy/test.esp32-c3-idf.yaml |  32 +++++
 .../total_daily_energy/test.esp32-c3.yaml     |  32 +++++
 .../total_daily_energy/test.esp32-idf.yaml    |  32 +++++
 .../total_daily_energy/test.esp32.yaml        |  32 +++++
 .../total_daily_energy/test.esp8266.yaml      |  32 +++++
 .../total_daily_energy/test.rp2040.yaml       |  32 +++++
 .../components/tsl2561/test.esp32-c3-idf.yaml |  13 ++
 tests/components/tsl2561/test.esp32-c3.yaml   |  13 ++
 tests/components/tsl2561/test.esp32-idf.yaml  |  13 ++
 tests/components/tsl2561/test.esp32.yaml      |  13 ++
 tests/components/tsl2561/test.esp8266.yaml    |  13 ++
 tests/components/tsl2561/test.rp2040.yaml     |  13 ++
 .../components/tsl2591/test.esp32-c3-idf.yaml |  25 ++++
 tests/components/tsl2591/test.esp32-c3.yaml   |  25 ++++
 tests/components/tsl2591/test.esp32-idf.yaml  |  25 ++++
 tests/components/tsl2591/test.esp32.yaml      |  25 ++++
 tests/components/tsl2591/test.esp8266.yaml    |  25 ++++
 tests/components/tsl2591/test.rp2040.yaml     |  25 ++++
 .../components/tt21100/test.esp32-c3-idf.yaml |  25 ++++
 tests/components/tt21100/test.esp32-c3.yaml   |  25 ++++
 tests/components/tt21100/test.esp32-idf.yaml  |  25 ++++
 tests/components/tt21100/test.esp32.yaml      |  25 ++++
 tests/components/tt21100/test.esp8266.yaml    |  25 ++++
 tests/components/tt21100/test.rp2040.yaml     |  25 ++++
 .../ttp229_bsf/test.esp32-c3-idf.yaml         |   8 ++
 .../components/ttp229_bsf/test.esp32-c3.yaml  |   8 ++
 .../components/ttp229_bsf/test.esp32-idf.yaml |   8 ++
 tests/components/ttp229_bsf/test.esp32.yaml   |   8 ++
 tests/components/ttp229_bsf/test.esp8266.yaml |   8 ++
 tests/components/ttp229_bsf/test.rp2040.yaml  |   8 ++
 .../ttp229_lsf/test.esp32-c3-idf.yaml         |  11 ++
 .../components/ttp229_lsf/test.esp32-c3.yaml  |  11 ++
 .../components/ttp229_lsf/test.esp32-idf.yaml |  11 ++
 tests/components/ttp229_lsf/test.esp32.yaml   |  11 ++
 tests/components/ttp229_lsf/test.esp8266.yaml |  11 ++
 tests/components/ttp229_lsf/test.rp2040.yaml  |  11 ++
 tests/components/tuya/test.esp32-c3-idf.yaml  |  78 ++++++++++++
 tests/components/tuya/test.esp32-c3.yaml      |  78 ++++++++++++
 tests/components/tuya/test.esp32-idf.yaml     |  78 ++++++++++++
 tests/components/tuya/test.esp32.yaml         |  78 ++++++++++++
 tests/components/tuya/test.esp8266.yaml       |  78 ++++++++++++
 tests/components/tuya/test.rp2040.yaml        |  78 ++++++++++++
 tests/components/tx20/test.esp32-c3-idf.yaml  |   7 ++
 tests/components/tx20/test.esp32-c3.yaml      |   7 ++
 tests/components/tx20/test.esp32-idf.yaml     |   7 ++
 tests/components/tx20/test.esp32.yaml         |   7 ++
 tests/components/tx20/test.esp8266.yaml       |   7 ++
 tests/components/tx20/test.rp2040.yaml        |   7 ++
 158 files changed, 4034 insertions(+)
 create mode 100644 tests/components/t6615/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/t6615/test.esp32-c3.yaml
 create mode 100644 tests/components/t6615/test.esp32-idf.yaml
 create mode 100644 tests/components/t6615/test.esp32.yaml
 create mode 100644 tests/components/t6615/test.esp8266.yaml
 create mode 100644 tests/components/t6615/test.rp2040.yaml
 create mode 100644 tests/components/tca9548a/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tca9548a/test.esp32-c3.yaml
 create mode 100644 tests/components/tca9548a/test.esp32-idf.yaml
 create mode 100644 tests/components/tca9548a/test.esp32.yaml
 create mode 100644 tests/components/tca9548a/test.esp8266.yaml
 create mode 100644 tests/components/tca9548a/test.rp2040.yaml
 create mode 100644 tests/components/tcl112/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tcl112/test.esp32-c3.yaml
 create mode 100644 tests/components/tcl112/test.esp32-idf.yaml
 create mode 100644 tests/components/tcl112/test.esp32.yaml
 create mode 100644 tests/components/tcl112/test.esp8266.yaml
 create mode 100644 tests/components/tcs34725/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tcs34725/test.esp32-c3.yaml
 create mode 100644 tests/components/tcs34725/test.esp32-idf.yaml
 create mode 100644 tests/components/tcs34725/test.esp32.yaml
 create mode 100644 tests/components/tcs34725/test.esp8266.yaml
 create mode 100644 tests/components/tcs34725/test.rp2040.yaml
 create mode 100644 tests/components/tee501/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tee501/test.esp32-c3.yaml
 create mode 100644 tests/components/tee501/test.esp32-idf.yaml
 create mode 100644 tests/components/tee501/test.esp32.yaml
 create mode 100644 tests/components/tee501/test.esp8266.yaml
 create mode 100644 tests/components/tee501/test.rp2040.yaml
 create mode 100644 tests/components/teleinfo/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/teleinfo/test.esp32-c3.yaml
 create mode 100644 tests/components/teleinfo/test.esp32-idf.yaml
 create mode 100644 tests/components/teleinfo/test.esp32.yaml
 create mode 100644 tests/components/teleinfo/test.esp8266.yaml
 create mode 100644 tests/components/teleinfo/test.rp2040.yaml
 create mode 100644 tests/components/thermostat/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/thermostat/test.esp32-c3.yaml
 create mode 100644 tests/components/thermostat/test.esp32-idf.yaml
 create mode 100644 tests/components/thermostat/test.esp32.yaml
 create mode 100644 tests/components/thermostat/test.esp8266.yaml
 create mode 100644 tests/components/thermostat/test.rp2040.yaml
 create mode 100644 tests/components/time/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/time/test.esp32-c3.yaml
 create mode 100644 tests/components/time/test.esp32-idf.yaml
 create mode 100644 tests/components/time/test.esp32.yaml
 create mode 100644 tests/components/time/test.esp8266.yaml
 create mode 100644 tests/components/time/test.rp2040.yaml
 create mode 100644 tests/components/time_based/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/time_based/test.esp32-c3.yaml
 create mode 100644 tests/components/time_based/test.esp32-idf.yaml
 create mode 100644 tests/components/time_based/test.esp32.yaml
 create mode 100644 tests/components/time_based/test.esp8266.yaml
 create mode 100644 tests/components/time_based/test.rp2040.yaml
 create mode 100644 tests/components/tlc59208f/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tlc59208f/test.esp32-c3.yaml
 create mode 100644 tests/components/tlc59208f/test.esp32-idf.yaml
 create mode 100644 tests/components/tlc59208f/test.esp32.yaml
 create mode 100644 tests/components/tlc59208f/test.esp8266.yaml
 create mode 100644 tests/components/tlc59208f/test.rp2040.yaml
 create mode 100644 tests/components/tm1621/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tm1621/test.esp32-c3.yaml
 create mode 100644 tests/components/tm1621/test.esp32-idf.yaml
 create mode 100644 tests/components/tm1621/test.esp32.yaml
 create mode 100644 tests/components/tm1621/test.esp8266.yaml
 create mode 100644 tests/components/tm1621/test.rp2040.yaml
 create mode 100644 tests/components/tm1637/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tm1637/test.esp32-c3.yaml
 create mode 100644 tests/components/tm1637/test.esp32-idf.yaml
 create mode 100644 tests/components/tm1637/test.esp32.yaml
 create mode 100644 tests/components/tm1637/test.esp8266.yaml
 create mode 100644 tests/components/tm1637/test.rp2040.yaml
 create mode 100644 tests/components/tm1638/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tm1638/test.esp32-c3.yaml
 create mode 100644 tests/components/tm1638/test.esp32-idf.yaml
 create mode 100644 tests/components/tm1638/test.esp32.yaml
 create mode 100644 tests/components/tm1638/test.esp8266.yaml
 create mode 100644 tests/components/tm1638/test.rp2040.yaml
 create mode 100644 tests/components/tm1651/test.esp32-c3.yaml
 create mode 100644 tests/components/tm1651/test.esp32.yaml
 create mode 100644 tests/components/tm1651/test.esp8266.yaml
 create mode 100644 tests/components/tm1651/test.rp2040.yaml
 create mode 100644 tests/components/tmp102/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tmp102/test.esp32-c3.yaml
 create mode 100644 tests/components/tmp102/test.esp32-idf.yaml
 create mode 100644 tests/components/tmp102/test.esp32.yaml
 create mode 100644 tests/components/tmp102/test.esp8266.yaml
 create mode 100644 tests/components/tmp102/test.rp2040.yaml
 create mode 100644 tests/components/tmp1075/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tmp1075/test.esp32-c3.yaml
 create mode 100644 tests/components/tmp1075/test.esp32-idf.yaml
 create mode 100644 tests/components/tmp1075/test.esp32.yaml
 create mode 100644 tests/components/tmp1075/test.esp8266.yaml
 create mode 100644 tests/components/tmp1075/test.rp2040.yaml
 create mode 100644 tests/components/tmp117/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tmp117/test.esp32-c3.yaml
 create mode 100644 tests/components/tmp117/test.esp32-idf.yaml
 create mode 100644 tests/components/tmp117/test.esp32.yaml
 create mode 100644 tests/components/tmp117/test.esp8266.yaml
 create mode 100644 tests/components/tmp117/test.rp2040.yaml
 create mode 100644 tests/components/tof10120/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tof10120/test.esp32-c3.yaml
 create mode 100644 tests/components/tof10120/test.esp32-idf.yaml
 create mode 100644 tests/components/tof10120/test.esp32.yaml
 create mode 100644 tests/components/tof10120/test.esp8266.yaml
 create mode 100644 tests/components/tof10120/test.rp2040.yaml
 create mode 100644 tests/components/toshiba/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/toshiba/test.esp32-c3.yaml
 create mode 100644 tests/components/toshiba/test.esp32-idf.yaml
 create mode 100644 tests/components/toshiba/test.esp32.yaml
 create mode 100644 tests/components/toshiba/test.esp8266.yaml
 create mode 100644 tests/components/total_daily_energy/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/total_daily_energy/test.esp32-c3.yaml
 create mode 100644 tests/components/total_daily_energy/test.esp32-idf.yaml
 create mode 100644 tests/components/total_daily_energy/test.esp32.yaml
 create mode 100644 tests/components/total_daily_energy/test.esp8266.yaml
 create mode 100644 tests/components/total_daily_energy/test.rp2040.yaml
 create mode 100644 tests/components/tsl2561/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tsl2561/test.esp32-c3.yaml
 create mode 100644 tests/components/tsl2561/test.esp32-idf.yaml
 create mode 100644 tests/components/tsl2561/test.esp32.yaml
 create mode 100644 tests/components/tsl2561/test.esp8266.yaml
 create mode 100644 tests/components/tsl2561/test.rp2040.yaml
 create mode 100644 tests/components/tsl2591/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tsl2591/test.esp32-c3.yaml
 create mode 100644 tests/components/tsl2591/test.esp32-idf.yaml
 create mode 100644 tests/components/tsl2591/test.esp32.yaml
 create mode 100644 tests/components/tsl2591/test.esp8266.yaml
 create mode 100644 tests/components/tsl2591/test.rp2040.yaml
 create mode 100644 tests/components/tt21100/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tt21100/test.esp32-c3.yaml
 create mode 100644 tests/components/tt21100/test.esp32-idf.yaml
 create mode 100644 tests/components/tt21100/test.esp32.yaml
 create mode 100644 tests/components/tt21100/test.esp8266.yaml
 create mode 100644 tests/components/tt21100/test.rp2040.yaml
 create mode 100644 tests/components/ttp229_bsf/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ttp229_bsf/test.esp32-c3.yaml
 create mode 100644 tests/components/ttp229_bsf/test.esp32-idf.yaml
 create mode 100644 tests/components/ttp229_bsf/test.esp32.yaml
 create mode 100644 tests/components/ttp229_bsf/test.esp8266.yaml
 create mode 100644 tests/components/ttp229_bsf/test.rp2040.yaml
 create mode 100644 tests/components/ttp229_lsf/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ttp229_lsf/test.esp32-c3.yaml
 create mode 100644 tests/components/ttp229_lsf/test.esp32-idf.yaml
 create mode 100644 tests/components/ttp229_lsf/test.esp32.yaml
 create mode 100644 tests/components/ttp229_lsf/test.esp8266.yaml
 create mode 100644 tests/components/ttp229_lsf/test.rp2040.yaml
 create mode 100644 tests/components/tuya/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tuya/test.esp32-c3.yaml
 create mode 100644 tests/components/tuya/test.esp32-idf.yaml
 create mode 100644 tests/components/tuya/test.esp32.yaml
 create mode 100644 tests/components/tuya/test.esp8266.yaml
 create mode 100644 tests/components/tuya/test.rp2040.yaml
 create mode 100644 tests/components/tx20/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/tx20/test.esp32-c3.yaml
 create mode 100644 tests/components/tx20/test.esp32-idf.yaml
 create mode 100644 tests/components/tx20/test.esp32.yaml
 create mode 100644 tests/components/tx20/test.esp8266.yaml
 create mode 100644 tests/components/tx20/test.rp2040.yaml

diff --git a/tests/components/t6615/test.esp32-c3-idf.yaml b/tests/components/t6615/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e8690c770f
--- /dev/null
+++ b/tests/components/t6615/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/t6615/test.esp32-c3.yaml b/tests/components/t6615/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e8690c770f
--- /dev/null
+++ b/tests/components/t6615/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/t6615/test.esp32-idf.yaml b/tests/components/t6615/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2cfaa0ae5b
--- /dev/null
+++ b/tests/components/t6615/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/t6615/test.esp32.yaml b/tests/components/t6615/test.esp32.yaml
new file mode 100644
index 0000000000..2cfaa0ae5b
--- /dev/null
+++ b/tests/components/t6615/test.esp32.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/t6615/test.esp8266.yaml b/tests/components/t6615/test.esp8266.yaml
new file mode 100644
index 0000000000..e8690c770f
--- /dev/null
+++ b/tests/components/t6615/test.esp8266.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/t6615/test.rp2040.yaml b/tests/components/t6615/test.rp2040.yaml
new file mode 100644
index 0000000000..e8690c770f
--- /dev/null
+++ b/tests/components/t6615/test.rp2040.yaml
@@ -0,0 +1,10 @@
+uart:
+  - id: uart_t6615
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 19200
+
+sensor:
+  - platform: t6615
+    co2:
+      name: CO2 Sensor
diff --git a/tests/components/tca9548a/test.esp32-c3-idf.yaml b/tests/components/tca9548a/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2294530d14
--- /dev/null
+++ b/tests/components/tca9548a/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 5
+    sda: 4
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tca9548a/test.esp32-c3.yaml b/tests/components/tca9548a/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2294530d14
--- /dev/null
+++ b/tests/components/tca9548a/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 5
+    sda: 4
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tca9548a/test.esp32-idf.yaml b/tests/components/tca9548a/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7edb83c821
--- /dev/null
+++ b/tests/components/tca9548a/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 16
+    sda: 17
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tca9548a/test.esp32.yaml b/tests/components/tca9548a/test.esp32.yaml
new file mode 100644
index 0000000000..7edb83c821
--- /dev/null
+++ b/tests/components/tca9548a/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 16
+    sda: 17
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tca9548a/test.esp8266.yaml b/tests/components/tca9548a/test.esp8266.yaml
new file mode 100644
index 0000000000..2294530d14
--- /dev/null
+++ b/tests/components/tca9548a/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 5
+    sda: 4
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tca9548a/test.rp2040.yaml b/tests/components/tca9548a/test.rp2040.yaml
new file mode 100644
index 0000000000..2294530d14
--- /dev/null
+++ b/tests/components/tca9548a/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_tca9548a
+    scl: 5
+    sda: 4
+
+tca9548a:
+  - id: multiplex0
+    address: 0x70
+    channels:
+      - bus_id: multiplex0_chan0
+        channel: 0
+    i2c_id: i2c_tca9548a
+  - id: multiplex1
+    address: 0x71
+    i2c_id: multiplex0_chan0
diff --git a/tests/components/tcl112/test.esp32-c3-idf.yaml b/tests/components/tcl112/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..03c0e84fe5
--- /dev/null
+++ b/tests/components/tcl112/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+sensor:
+  - platform: template
+    id: tcl112_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: tcl112
+    name: TCL112 Climate with Sensor
+    supports_heat: true
+    supports_cool: true
+    sensor: tcl112_sensor
diff --git a/tests/components/tcl112/test.esp32-c3.yaml b/tests/components/tcl112/test.esp32-c3.yaml
new file mode 100644
index 0000000000..03c0e84fe5
--- /dev/null
+++ b/tests/components/tcl112/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+sensor:
+  - platform: template
+    id: tcl112_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: tcl112
+    name: TCL112 Climate with Sensor
+    supports_heat: true
+    supports_cool: true
+    sensor: tcl112_sensor
diff --git a/tests/components/tcl112/test.esp32-idf.yaml b/tests/components/tcl112/test.esp32-idf.yaml
new file mode 100644
index 0000000000..03c0e84fe5
--- /dev/null
+++ b/tests/components/tcl112/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+sensor:
+  - platform: template
+    id: tcl112_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: tcl112
+    name: TCL112 Climate with Sensor
+    supports_heat: true
+    supports_cool: true
+    sensor: tcl112_sensor
diff --git a/tests/components/tcl112/test.esp32.yaml b/tests/components/tcl112/test.esp32.yaml
new file mode 100644
index 0000000000..03c0e84fe5
--- /dev/null
+++ b/tests/components/tcl112/test.esp32.yaml
@@ -0,0 +1,15 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+sensor:
+  - platform: template
+    id: tcl112_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: tcl112
+    name: TCL112 Climate with Sensor
+    supports_heat: true
+    supports_cool: true
+    sensor: tcl112_sensor
diff --git a/tests/components/tcl112/test.esp8266.yaml b/tests/components/tcl112/test.esp8266.yaml
new file mode 100644
index 0000000000..0a85536928
--- /dev/null
+++ b/tests/components/tcl112/test.esp8266.yaml
@@ -0,0 +1,15 @@
+remote_transmitter:
+  pin: 5
+  carrier_duty_percent: 50%
+
+sensor:
+  - platform: template
+    id: tcl112_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: tcl112
+    name: TCL112 Climate with Sensor
+    supports_heat: true
+    supports_cool: true
+    sensor: tcl112_sensor
diff --git a/tests/components/tcs34725/test.esp32-c3-idf.yaml b/tests/components/tcs34725/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9b459c9104
--- /dev/null
+++ b/tests/components/tcs34725/test.esp32-c3-idf.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tcs34725/test.esp32-c3.yaml b/tests/components/tcs34725/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9b459c9104
--- /dev/null
+++ b/tests/components/tcs34725/test.esp32-c3.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tcs34725/test.esp32-idf.yaml b/tests/components/tcs34725/test.esp32-idf.yaml
new file mode 100644
index 0000000000..86ef82962e
--- /dev/null
+++ b/tests/components/tcs34725/test.esp32-idf.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tcs34725/test.esp32.yaml b/tests/components/tcs34725/test.esp32.yaml
new file mode 100644
index 0000000000..86ef82962e
--- /dev/null
+++ b/tests/components/tcs34725/test.esp32.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tcs34725/test.esp8266.yaml b/tests/components/tcs34725/test.esp8266.yaml
new file mode 100644
index 0000000000..9b459c9104
--- /dev/null
+++ b/tests/components/tcs34725/test.esp8266.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tcs34725/test.rp2040.yaml b/tests/components/tcs34725/test.rp2040.yaml
new file mode 100644
index 0000000000..9b459c9104
--- /dev/null
+++ b/tests/components/tcs34725/test.rp2040.yaml
@@ -0,0 +1,21 @@
+i2c:
+  - id: i2c_tcs34725
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tcs34725
+    red_channel:
+      name: Red Channel
+    green_channel:
+      name: Green Channel
+    blue_channel:
+      name: Blue Channel
+    clear_channel:
+      name: Clear Channel
+    illuminance:
+      name: Illuminance
+    color_temperature:
+      name: Color Temperature
+    integration_time: 614ms
+    gain: 60x
diff --git a/tests/components/tee501/test.esp32-c3-idf.yaml b/tests/components/tee501/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..11991a6153
--- /dev/null
+++ b/tests/components/tee501/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/tee501/test.esp32-c3.yaml b/tests/components/tee501/test.esp32-c3.yaml
new file mode 100644
index 0000000000..11991a6153
--- /dev/null
+++ b/tests/components/tee501/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/tee501/test.esp32-idf.yaml b/tests/components/tee501/test.esp32-idf.yaml
new file mode 100644
index 0000000000..acf6fed4bf
--- /dev/null
+++ b/tests/components/tee501/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/tee501/test.esp32.yaml b/tests/components/tee501/test.esp32.yaml
new file mode 100644
index 0000000000..acf6fed4bf
--- /dev/null
+++ b/tests/components/tee501/test.esp32.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/tee501/test.esp8266.yaml b/tests/components/tee501/test.esp8266.yaml
new file mode 100644
index 0000000000..11991a6153
--- /dev/null
+++ b/tests/components/tee501/test.esp8266.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/tee501/test.rp2040.yaml b/tests/components/tee501/test.rp2040.yaml
new file mode 100644
index 0000000000..11991a6153
--- /dev/null
+++ b/tests/components/tee501/test.rp2040.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tee501
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tee501
+    name: TEE501 Temperature
+    address: 0x48
diff --git a/tests/components/teleinfo/test.esp32-c3-idf.yaml b/tests/components/teleinfo/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..55641e1e01
--- /dev/null
+++ b/tests/components/teleinfo/test.esp32-c3-idf.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/teleinfo/test.esp32-c3.yaml b/tests/components/teleinfo/test.esp32-c3.yaml
new file mode 100644
index 0000000000..55641e1e01
--- /dev/null
+++ b/tests/components/teleinfo/test.esp32-c3.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/teleinfo/test.esp32-idf.yaml b/tests/components/teleinfo/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a5bd176143
--- /dev/null
+++ b/tests/components/teleinfo/test.esp32-idf.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/teleinfo/test.esp32.yaml b/tests/components/teleinfo/test.esp32.yaml
new file mode 100644
index 0000000000..a5bd176143
--- /dev/null
+++ b/tests/components/teleinfo/test.esp32.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/teleinfo/test.esp8266.yaml b/tests/components/teleinfo/test.esp8266.yaml
new file mode 100644
index 0000000000..55641e1e01
--- /dev/null
+++ b/tests/components/teleinfo/test.esp8266.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/teleinfo/test.rp2040.yaml b/tests/components/teleinfo/test.rp2040.yaml
new file mode 100644
index 0000000000..55641e1e01
--- /dev/null
+++ b/tests/components/teleinfo/test.rp2040.yaml
@@ -0,0 +1,42 @@
+uart:
+  - id: uart_teleinfo
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 1200
+    parity: EVEN
+
+button:
+  - platform: template
+    name: Poller component suspend test
+    on_press:
+      - component.suspend: test_teleinfo
+      - delay: 20s
+      - component.update: test_teleinfo
+      - delay: 20s
+      - component.resume: test_teleinfo
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: 2s
+      - delay: 20s
+      - component.resume:
+          id: test_teleinfo
+          update_interval: !lambda return 2500;
+
+teleinfo:
+  id: test_teleinfo
+  historical_mode: true
+  update_interval: 60s
+
+sensor:
+  - platform: teleinfo
+    name: hchc
+    tag_name: HCHC
+    teleinfo_id: test_teleinfo
+    unit_of_measurement: Wh
+
+text_sensor:
+  - platform: teleinfo
+    name: optarif
+    tag_name: OPTARIF
+    teleinfo_id: test_teleinfo
diff --git a/tests/components/thermostat/test.esp32-c3-idf.yaml b/tests/components/thermostat/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.esp32-c3-idf.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/thermostat/test.esp32-c3.yaml b/tests/components/thermostat/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.esp32-c3.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/thermostat/test.esp32-idf.yaml b/tests/components/thermostat/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.esp32-idf.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/thermostat/test.esp32.yaml b/tests/components/thermostat/test.esp32.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.esp32.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/thermostat/test.esp8266.yaml b/tests/components/thermostat/test.esp8266.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.esp8266.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/thermostat/test.rp2040.yaml b/tests/components/thermostat/test.rp2040.yaml
new file mode 100644
index 0000000000..d630a93efc
--- /dev/null
+++ b/tests/components/thermostat/test.rp2040.yaml
@@ -0,0 +1,93 @@
+sensor:
+  - platform: template
+    id: thermostat_sensor
+    lambda: "return 21;"
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: thermostat_sensor
+    humidity_sensor: thermostat_sensor
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
diff --git a/tests/components/time/test.esp32-c3-idf.yaml b/tests/components/time/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time/test.esp32-c3.yaml b/tests/components/time/test.esp32-c3.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time/test.esp32-idf.yaml b/tests/components/time/test.esp32-idf.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time/test.esp32.yaml b/tests/components/time/test.esp32.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.esp32.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time/test.esp8266.yaml b/tests/components/time/test.esp8266.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.esp8266.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time/test.rp2040.yaml b/tests/components/time/test.rp2040.yaml
new file mode 100644
index 0000000000..465be045db
--- /dev/null
+++ b/tests/components/time/test.rp2040.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+  - platform: sntp
+    id: sntp_time
diff --git a/tests/components/time_based/test.esp32-c3-idf.yaml b/tests/components/time_based/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/time_based/test.esp32-c3.yaml b/tests/components/time_based/test.esp32-c3.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/time_based/test.esp32-idf.yaml b/tests/components/time_based/test.esp32-idf.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/time_based/test.esp32.yaml b/tests/components/time_based/test.esp32.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.esp32.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/time_based/test.esp8266.yaml b/tests/components/time_based/test.esp8266.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.esp8266.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/time_based/test.rp2040.yaml b/tests/components/time_based/test.rp2040.yaml
new file mode 100644
index 0000000000..48c86de90f
--- /dev/null
+++ b/tests/components/time_based/test.rp2040.yaml
@@ -0,0 +1,12 @@
+cover:
+  - platform: time_based
+    name: Time Based Cover
+    id: time_based_cover
+    stop_action:
+      - logger.log: stop_action
+    open_action:
+      - logger.log: open_action
+    open_duration: 5min
+    close_action:
+      - logger.log: close_action
+    close_duration: 4.5min
diff --git a/tests/components/tlc59208f/test.esp32-c3-idf.yaml b/tests/components/tlc59208f/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..923ea4b4a4
--- /dev/null
+++ b/tests/components/tlc59208f/test.esp32-c3-idf.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 5
+    sda: 4
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tlc59208f/test.esp32-c3.yaml b/tests/components/tlc59208f/test.esp32-c3.yaml
new file mode 100644
index 0000000000..923ea4b4a4
--- /dev/null
+++ b/tests/components/tlc59208f/test.esp32-c3.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 5
+    sda: 4
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tlc59208f/test.esp32-idf.yaml b/tests/components/tlc59208f/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2639de3b3d
--- /dev/null
+++ b/tests/components/tlc59208f/test.esp32-idf.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 16
+    sda: 17
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tlc59208f/test.esp32.yaml b/tests/components/tlc59208f/test.esp32.yaml
new file mode 100644
index 0000000000..2639de3b3d
--- /dev/null
+++ b/tests/components/tlc59208f/test.esp32.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 16
+    sda: 17
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tlc59208f/test.esp8266.yaml b/tests/components/tlc59208f/test.esp8266.yaml
new file mode 100644
index 0000000000..923ea4b4a4
--- /dev/null
+++ b/tests/components/tlc59208f/test.esp8266.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 5
+    sda: 4
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tlc59208f/test.rp2040.yaml b/tests/components/tlc59208f/test.rp2040.yaml
new file mode 100644
index 0000000000..923ea4b4a4
--- /dev/null
+++ b/tests/components/tlc59208f/test.rp2040.yaml
@@ -0,0 +1,50 @@
+i2c:
+  - id: i2c_tlc59208f
+    scl: 5
+    sda: 4
+
+tlc59208f:
+  - address: 0x20
+    id: tlc59208f_1
+  - address: 0x22
+    id: tlc59208f_2
+  - address: 0x24
+    id: tlc59208f_3
+
+output:
+  - platform: tlc59208f
+    id: tlc_0
+    channel: 0
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_1
+    channel: 1
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_2
+    channel: 2
+    tlc59208f_id: tlc59208f_1
+  - platform: tlc59208f
+    id: tlc_3
+    channel: 0
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_4
+    channel: 1
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_5
+    channel: 2
+    tlc59208f_id: tlc59208f_2
+  - platform: tlc59208f
+    id: tlc_6
+    channel: 0
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_7
+    channel: 1
+    tlc59208f_id: tlc59208f_3
+  - platform: tlc59208f
+    id: tlc_8
+    channel: 2
+    tlc59208f_id: tlc59208f_3
diff --git a/tests/components/tm1621/test.esp32-c3-idf.yaml b/tests/components/tm1621/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..cddd64f31f
--- /dev/null
+++ b/tests/components/tm1621/test.esp32-c3-idf.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 7
+    data_pin: 4
+    read_pin: 5
+    write_pin: 6
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1621/test.esp32-c3.yaml b/tests/components/tm1621/test.esp32-c3.yaml
new file mode 100644
index 0000000000..cddd64f31f
--- /dev/null
+++ b/tests/components/tm1621/test.esp32-c3.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 7
+    data_pin: 4
+    read_pin: 5
+    write_pin: 6
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1621/test.esp32-idf.yaml b/tests/components/tm1621/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8eab46f000
--- /dev/null
+++ b/tests/components/tm1621/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 15
+    data_pin: 14
+    read_pin: 12
+    write_pin: 13
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1621/test.esp32.yaml b/tests/components/tm1621/test.esp32.yaml
new file mode 100644
index 0000000000..8eab46f000
--- /dev/null
+++ b/tests/components/tm1621/test.esp32.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 15
+    data_pin: 14
+    read_pin: 12
+    write_pin: 13
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1621/test.esp8266.yaml b/tests/components/tm1621/test.esp8266.yaml
new file mode 100644
index 0000000000..8eab46f000
--- /dev/null
+++ b/tests/components/tm1621/test.esp8266.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 15
+    data_pin: 14
+    read_pin: 12
+    write_pin: 13
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1621/test.rp2040.yaml b/tests/components/tm1621/test.rp2040.yaml
new file mode 100644
index 0000000000..cddd64f31f
--- /dev/null
+++ b/tests/components/tm1621/test.rp2040.yaml
@@ -0,0 +1,12 @@
+display:
+  - platform: tm1621
+    id: tm1621_display
+    cs_pin: 7
+    data_pin: 4
+    read_pin: 5
+    write_pin: 6
+    lambda: |-
+      it.printf(0, "%.1f", 20.0);
+      it.display_celsius(true);
+      it.printf(1, "%.1f", 20.0);
+      it.display_humidity(true);
diff --git a/tests/components/tm1637/test.esp32-c3-idf.yaml b/tests/components/tm1637/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fa4c95b443
--- /dev/null
+++ b/tests/components/tm1637/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 5
+    dio_pin: 4
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1637/test.esp32-c3.yaml b/tests/components/tm1637/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fa4c95b443
--- /dev/null
+++ b/tests/components/tm1637/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 5
+    dio_pin: 4
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1637/test.esp32-idf.yaml b/tests/components/tm1637/test.esp32-idf.yaml
new file mode 100644
index 0000000000..bf5f331cca
--- /dev/null
+++ b/tests/components/tm1637/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 15
+    dio_pin: 14
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1637/test.esp32.yaml b/tests/components/tm1637/test.esp32.yaml
new file mode 100644
index 0000000000..bf5f331cca
--- /dev/null
+++ b/tests/components/tm1637/test.esp32.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 15
+    dio_pin: 14
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1637/test.esp8266.yaml b/tests/components/tm1637/test.esp8266.yaml
new file mode 100644
index 0000000000..fa4c95b443
--- /dev/null
+++ b/tests/components/tm1637/test.esp8266.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 5
+    dio_pin: 4
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1637/test.rp2040.yaml b/tests/components/tm1637/test.rp2040.yaml
new file mode 100644
index 0000000000..fa4c95b443
--- /dev/null
+++ b/tests/components/tm1637/test.rp2040.yaml
@@ -0,0 +1,7 @@
+display:
+  - platform: tm1637
+    clk_pin: 5
+    dio_pin: 4
+    intensity: 3
+    lambda: |-
+      it.print("1234");
diff --git a/tests/components/tm1638/test.esp32-c3-idf.yaml b/tests/components/tm1638/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.esp32-c3-idf.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1638/test.esp32-c3.yaml b/tests/components/tm1638/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.esp32-c3.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1638/test.esp32-idf.yaml b/tests/components/tm1638/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.esp32-idf.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1638/test.esp32.yaml b/tests/components/tm1638/test.esp32.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.esp32.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1638/test.esp8266.yaml b/tests/components/tm1638/test.esp8266.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.esp8266.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1638/test.rp2040.yaml b/tests/components/tm1638/test.rp2040.yaml
new file mode 100644
index 0000000000..b0c5cef528
--- /dev/null
+++ b/tests/components/tm1638/test.rp2040.yaml
@@ -0,0 +1,118 @@
+display:
+  - platform: tm1638
+    id: tm1638_display
+    stb_pin: 2
+    clk_pin: 5
+    dio_pin: 4
+    update_interval: 5s
+    intensity: 5
+    lambda: |-
+      it.print("81818181");
+
+binary_sensor:
+  - platform: tm1638
+    id: Button0
+    key: 0
+    filters:
+      - delayed_on: 10ms
+    on_press:
+      then:
+        - switch.turn_on: Led0
+    on_release:
+      then:
+        - switch.turn_off: Led0
+  - platform: tm1638
+    id: Button1
+    key: 1
+    on_press:
+      then:
+        - switch.turn_on: Led1
+    on_release:
+      then:
+        - switch.turn_off: Led1
+  - platform: tm1638
+    id: Button2
+    key: 2
+    on_press:
+      then:
+        - switch.turn_on: Led2
+    on_release:
+      then:
+        - switch.turn_off: Led2
+  - platform: tm1638
+    id: Button3
+    key: 3
+    on_press:
+      then:
+        - switch.turn_on: Led3
+    on_release:
+      then:
+        - switch.turn_off: Led3
+  - platform: tm1638
+    id: Button4
+    key: 4
+    on_press:
+      then:
+        - output.turn_on: Led4
+    on_release:
+      then:
+        - output.turn_off: Led4
+  - platform: tm1638
+    id: Button5
+    key: 5
+    on_press:
+      then:
+        - output.turn_on: Led5
+    on_release:
+      then:
+        - output.turn_off: Led5
+  - platform: tm1638
+    id: Button6
+    key: 6
+    on_press:
+      then:
+        - output.turn_on: Led6
+    on_release:
+      then:
+        - output.turn_off: Led6
+  - platform: tm1638
+    id: Button7
+    key: 7
+    on_press:
+      then:
+        - output.turn_on: Led7
+    on_release:
+      then:
+        - output.turn_off: Led7
+
+switch:
+  - platform: tm1638
+    id: Led0
+    led: 0
+    name: TM1638Led0
+  - platform: tm1638
+    id: Led1
+    led: 1
+    name: TM1638Led1
+  - platform: tm1638
+    id: Led2
+    led: 2
+    name: TM1638Led2
+  - platform: tm1638
+    id: Led3
+    led: 3
+    name: TM1638Led3
+
+output:
+  - platform: tm1638
+    id: Led4
+    led: 4
+  - platform: tm1638
+    id: Led5
+    led: 5
+  - platform: tm1638
+    id: Led6
+    led: 6
+  - platform: tm1638
+    id: Led7
+    led: 7
diff --git a/tests/components/tm1651/test.esp32-c3.yaml b/tests/components/tm1651/test.esp32-c3.yaml
new file mode 100644
index 0000000000..667648f4d6
--- /dev/null
+++ b/tests/components/tm1651/test.esp32-c3.yaml
@@ -0,0 +1,21 @@
+tm1651:
+  id: tm1651_battery
+  clk_pin: 5
+  dio_pin: 4
+
+esphome:
+  on_boot:
+    then:
+      - tm1651.set_level_percent:
+          id: tm1651_battery
+          level_percent: 50
+      - tm1651.set_level:
+          id: tm1651_battery
+          level: 5
+      - tm1651.set_brightness:
+          id: tm1651_battery
+          brightness: 2
+      - tm1651.turn_on:
+          id: tm1651_battery
+      - tm1651.turn_off:
+          id: tm1651_battery
diff --git a/tests/components/tm1651/test.esp32.yaml b/tests/components/tm1651/test.esp32.yaml
new file mode 100644
index 0000000000..667648f4d6
--- /dev/null
+++ b/tests/components/tm1651/test.esp32.yaml
@@ -0,0 +1,21 @@
+tm1651:
+  id: tm1651_battery
+  clk_pin: 5
+  dio_pin: 4
+
+esphome:
+  on_boot:
+    then:
+      - tm1651.set_level_percent:
+          id: tm1651_battery
+          level_percent: 50
+      - tm1651.set_level:
+          id: tm1651_battery
+          level: 5
+      - tm1651.set_brightness:
+          id: tm1651_battery
+          brightness: 2
+      - tm1651.turn_on:
+          id: tm1651_battery
+      - tm1651.turn_off:
+          id: tm1651_battery
diff --git a/tests/components/tm1651/test.esp8266.yaml b/tests/components/tm1651/test.esp8266.yaml
new file mode 100644
index 0000000000..667648f4d6
--- /dev/null
+++ b/tests/components/tm1651/test.esp8266.yaml
@@ -0,0 +1,21 @@
+tm1651:
+  id: tm1651_battery
+  clk_pin: 5
+  dio_pin: 4
+
+esphome:
+  on_boot:
+    then:
+      - tm1651.set_level_percent:
+          id: tm1651_battery
+          level_percent: 50
+      - tm1651.set_level:
+          id: tm1651_battery
+          level: 5
+      - tm1651.set_brightness:
+          id: tm1651_battery
+          brightness: 2
+      - tm1651.turn_on:
+          id: tm1651_battery
+      - tm1651.turn_off:
+          id: tm1651_battery
diff --git a/tests/components/tm1651/test.rp2040.yaml b/tests/components/tm1651/test.rp2040.yaml
new file mode 100644
index 0000000000..667648f4d6
--- /dev/null
+++ b/tests/components/tm1651/test.rp2040.yaml
@@ -0,0 +1,21 @@
+tm1651:
+  id: tm1651_battery
+  clk_pin: 5
+  dio_pin: 4
+
+esphome:
+  on_boot:
+    then:
+      - tm1651.set_level_percent:
+          id: tm1651_battery
+          level_percent: 50
+      - tm1651.set_level:
+          id: tm1651_battery
+          level: 5
+      - tm1651.set_brightness:
+          id: tm1651_battery
+          brightness: 2
+      - tm1651.turn_on:
+          id: tm1651_battery
+      - tm1651.turn_off:
+          id: tm1651_battery
diff --git a/tests/components/tmp102/test.esp32-c3-idf.yaml b/tests/components/tmp102/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c1d35fca3f
--- /dev/null
+++ b/tests/components/tmp102/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp102/test.esp32-c3.yaml b/tests/components/tmp102/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c1d35fca3f
--- /dev/null
+++ b/tests/components/tmp102/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp102/test.esp32-idf.yaml b/tests/components/tmp102/test.esp32-idf.yaml
new file mode 100644
index 0000000000..840bf7edb3
--- /dev/null
+++ b/tests/components/tmp102/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp102/test.esp32.yaml b/tests/components/tmp102/test.esp32.yaml
new file mode 100644
index 0000000000..840bf7edb3
--- /dev/null
+++ b/tests/components/tmp102/test.esp32.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp102/test.esp8266.yaml b/tests/components/tmp102/test.esp8266.yaml
new file mode 100644
index 0000000000..c1d35fca3f
--- /dev/null
+++ b/tests/components/tmp102/test.esp8266.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp102/test.rp2040.yaml b/tests/components/tmp102/test.rp2040.yaml
new file mode 100644
index 0000000000..c1d35fca3f
--- /dev/null
+++ b/tests/components/tmp102/test.rp2040.yaml
@@ -0,0 +1,8 @@
+i2c:
+  - id: i2c_tmp102
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp102
+    name: TMP102 Temperature
diff --git a/tests/components/tmp1075/test.esp32-c3-idf.yaml b/tests/components/tmp1075/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..99433aa655
--- /dev/null
+++ b/tests/components/tmp1075/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp1075/test.esp32-c3.yaml b/tests/components/tmp1075/test.esp32-c3.yaml
new file mode 100644
index 0000000000..99433aa655
--- /dev/null
+++ b/tests/components/tmp1075/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp1075/test.esp32-idf.yaml b/tests/components/tmp1075/test.esp32-idf.yaml
new file mode 100644
index 0000000000..6c50d0da77
--- /dev/null
+++ b/tests/components/tmp1075/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp1075/test.esp32.yaml b/tests/components/tmp1075/test.esp32.yaml
new file mode 100644
index 0000000000..6c50d0da77
--- /dev/null
+++ b/tests/components/tmp1075/test.esp32.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp1075/test.esp8266.yaml b/tests/components/tmp1075/test.esp8266.yaml
new file mode 100644
index 0000000000..99433aa655
--- /dev/null
+++ b/tests/components/tmp1075/test.esp8266.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp1075/test.rp2040.yaml b/tests/components/tmp1075/test.rp2040.yaml
new file mode 100644
index 0000000000..99433aa655
--- /dev/null
+++ b/tests/components/tmp1075/test.rp2040.yaml
@@ -0,0 +1,16 @@
+i2c:
+  - id: i2c_tmp1075
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp1075
+    name: Temperature TMP1075
+    conversion_rate: 27.5ms
+    alert:
+      limit_low: 50
+      limit_high: 75
+      fault_count: 1
+      polarity: active_high
+      function: comparator
+    update_interval: 10s
diff --git a/tests/components/tmp117/test.esp32-c3-idf.yaml b/tests/components/tmp117/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..61fc2cc03d
--- /dev/null
+++ b/tests/components/tmp117/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tmp117/test.esp32-c3.yaml b/tests/components/tmp117/test.esp32-c3.yaml
new file mode 100644
index 0000000000..61fc2cc03d
--- /dev/null
+++ b/tests/components/tmp117/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tmp117/test.esp32-idf.yaml b/tests/components/tmp117/test.esp32-idf.yaml
new file mode 100644
index 0000000000..03e0dd4e8e
--- /dev/null
+++ b/tests/components/tmp117/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tmp117/test.esp32.yaml b/tests/components/tmp117/test.esp32.yaml
new file mode 100644
index 0000000000..03e0dd4e8e
--- /dev/null
+++ b/tests/components/tmp117/test.esp32.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tmp117/test.esp8266.yaml b/tests/components/tmp117/test.esp8266.yaml
new file mode 100644
index 0000000000..61fc2cc03d
--- /dev/null
+++ b/tests/components/tmp117/test.esp8266.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tmp117/test.rp2040.yaml b/tests/components/tmp117/test.rp2040.yaml
new file mode 100644
index 0000000000..61fc2cc03d
--- /dev/null
+++ b/tests/components/tmp117/test.rp2040.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tmp117
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tmp117
+    name: TMP117 Temperature
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.esp32-c3-idf.yaml b/tests/components/tof10120/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..01cde0df6a
--- /dev/null
+++ b/tests/components/tof10120/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.esp32-c3.yaml b/tests/components/tof10120/test.esp32-c3.yaml
new file mode 100644
index 0000000000..01cde0df6a
--- /dev/null
+++ b/tests/components/tof10120/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.esp32-idf.yaml b/tests/components/tof10120/test.esp32-idf.yaml
new file mode 100644
index 0000000000..74541ecde8
--- /dev/null
+++ b/tests/components/tof10120/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.esp32.yaml b/tests/components/tof10120/test.esp32.yaml
new file mode 100644
index 0000000000..74541ecde8
--- /dev/null
+++ b/tests/components/tof10120/test.esp32.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.esp8266.yaml b/tests/components/tof10120/test.esp8266.yaml
new file mode 100644
index 0000000000..01cde0df6a
--- /dev/null
+++ b/tests/components/tof10120/test.esp8266.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/tof10120/test.rp2040.yaml b/tests/components/tof10120/test.rp2040.yaml
new file mode 100644
index 0000000000..01cde0df6a
--- /dev/null
+++ b/tests/components/tof10120/test.rp2040.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_tof10120
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tof10120
+    name: Distance sensor
+    update_interval: 5s
diff --git a/tests/components/toshiba/test.esp32-c3-idf.yaml b/tests/components/toshiba/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c134c7f5bd
--- /dev/null
+++ b/tests/components/toshiba/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: toshiba
+    name: Toshiba Climate
diff --git a/tests/components/toshiba/test.esp32-c3.yaml b/tests/components/toshiba/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c134c7f5bd
--- /dev/null
+++ b/tests/components/toshiba/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: toshiba
+    name: Toshiba Climate
diff --git a/tests/components/toshiba/test.esp32-idf.yaml b/tests/components/toshiba/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c134c7f5bd
--- /dev/null
+++ b/tests/components/toshiba/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: toshiba
+    name: Toshiba Climate
diff --git a/tests/components/toshiba/test.esp32.yaml b/tests/components/toshiba/test.esp32.yaml
new file mode 100644
index 0000000000..c134c7f5bd
--- /dev/null
+++ b/tests/components/toshiba/test.esp32.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 2
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: toshiba
+    name: Toshiba Climate
diff --git a/tests/components/toshiba/test.esp8266.yaml b/tests/components/toshiba/test.esp8266.yaml
new file mode 100644
index 0000000000..8730a5d4ab
--- /dev/null
+++ b/tests/components/toshiba/test.esp8266.yaml
@@ -0,0 +1,7 @@
+remote_transmitter:
+  pin: 5
+  carrier_duty_percent: 50%
+
+climate:
+  - platform: toshiba
+    name: Toshiba Climate
diff --git a/tests/components/total_daily_energy/test.esp32-c3-idf.yaml b/tests/components/total_daily_energy/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..71afa45ed5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.esp32-c3-idf.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 5
+    cf_pin: 4
+    cf1_pin: 3
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/total_daily_energy/test.esp32-c3.yaml b/tests/components/total_daily_energy/test.esp32-c3.yaml
new file mode 100644
index 0000000000..71afa45ed5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.esp32-c3.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 5
+    cf_pin: 4
+    cf1_pin: 3
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/total_daily_energy/test.esp32-idf.yaml b/tests/components/total_daily_energy/test.esp32-idf.yaml
new file mode 100644
index 0000000000..34d452aae5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.esp32-idf.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 15
+    cf_pin: 14
+    cf1_pin: 13
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/total_daily_energy/test.esp32.yaml b/tests/components/total_daily_energy/test.esp32.yaml
new file mode 100644
index 0000000000..34d452aae5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.esp32.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 15
+    cf_pin: 14
+    cf1_pin: 13
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/total_daily_energy/test.esp8266.yaml b/tests/components/total_daily_energy/test.esp8266.yaml
new file mode 100644
index 0000000000..34d452aae5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.esp8266.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 15
+    cf_pin: 14
+    cf1_pin: 13
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/total_daily_energy/test.rp2040.yaml b/tests/components/total_daily_energy/test.rp2040.yaml
new file mode 100644
index 0000000000..71afa45ed5
--- /dev/null
+++ b/tests/components/total_daily_energy/test.rp2040.yaml
@@ -0,0 +1,32 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+
+sensor:
+  - platform: hlw8012
+    sel_pin: 5
+    cf_pin: 4
+    cf1_pin: 3
+    current:
+      name: HLW8012 Current
+    voltage:
+      name: HLW8012 Voltage
+    power:
+      name: HLW8012 Power
+      id: hlw8012_power
+    energy:
+      name: HLW8012 Energy
+      id: hlw8012_energy
+    update_interval: 15s
+    current_resistor: 0.001 ohm
+    voltage_divider: 2351
+    change_mode_every: "never"
+    initial_mode: VOLTAGE
+    model: hlw8012
+  - platform: total_daily_energy
+    name: HLW8012 Total Daily Energy
+    power_id: hlw8012_power
diff --git a/tests/components/tsl2561/test.esp32-c3-idf.yaml b/tests/components/tsl2561/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..1ea768c5d9
--- /dev/null
+++ b/tests/components/tsl2561/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2561/test.esp32-c3.yaml b/tests/components/tsl2561/test.esp32-c3.yaml
new file mode 100644
index 0000000000..1ea768c5d9
--- /dev/null
+++ b/tests/components/tsl2561/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2561/test.esp32-idf.yaml b/tests/components/tsl2561/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8d43c62414
--- /dev/null
+++ b/tests/components/tsl2561/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2561/test.esp32.yaml b/tests/components/tsl2561/test.esp32.yaml
new file mode 100644
index 0000000000..8d43c62414
--- /dev/null
+++ b/tests/components/tsl2561/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2561/test.esp8266.yaml b/tests/components/tsl2561/test.esp8266.yaml
new file mode 100644
index 0000000000..1ea768c5d9
--- /dev/null
+++ b/tests/components/tsl2561/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2561/test.rp2040.yaml b/tests/components/tsl2561/test.rp2040.yaml
new file mode 100644
index 0000000000..1ea768c5d9
--- /dev/null
+++ b/tests/components/tsl2561/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_tsl2561
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2561
+    name: TSL2561 Ambient Light
+    address: 0x39
+    is_cs_package: true
+    integration_time: 402ms
+    gain: 16x
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.esp32-c3-idf.yaml b/tests/components/tsl2591/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..de57ef548a
--- /dev/null
+++ b/tests/components/tsl2591/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.esp32-c3.yaml b/tests/components/tsl2591/test.esp32-c3.yaml
new file mode 100644
index 0000000000..de57ef548a
--- /dev/null
+++ b/tests/components/tsl2591/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.esp32-idf.yaml b/tests/components/tsl2591/test.esp32-idf.yaml
new file mode 100644
index 0000000000..14f9311ae6
--- /dev/null
+++ b/tests/components/tsl2591/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.esp32.yaml b/tests/components/tsl2591/test.esp32.yaml
new file mode 100644
index 0000000000..14f9311ae6
--- /dev/null
+++ b/tests/components/tsl2591/test.esp32.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.esp8266.yaml b/tests/components/tsl2591/test.esp8266.yaml
new file mode 100644
index 0000000000..de57ef548a
--- /dev/null
+++ b/tests/components/tsl2591/test.esp8266.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tsl2591/test.rp2040.yaml b/tests/components/tsl2591/test.rp2040.yaml
new file mode 100644
index 0000000000..de57ef548a
--- /dev/null
+++ b/tests/components/tsl2591/test.rp2040.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tsl2591
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: tsl2591
+    id: test_tsl2591
+    address: 0x29
+    integration_time: 600ms
+    gain: high
+    visible:
+      name: tsl2591 visible
+      id: tsl2591_vis
+      unit_of_measurement: pH
+    infrared:
+      name: tsl2591 infrared
+      id: tsl2591_ir
+    full_spectrum:
+      name: tsl2591 full_spectrum
+      id: tsl2591_fs
+    calculated_lux:
+      name: tsl2591 calculated_lux
+      id: tsl2591_cl
+    update_interval: 15s
diff --git a/tests/components/tt21100/test.esp32-c3-idf.yaml b/tests/components/tt21100/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..17b8c8065a
--- /dev/null
+++ b/tests/components/tt21100/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 3
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 6
+    reset_pin: 7
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/tt21100/test.esp32-c3.yaml b/tests/components/tt21100/test.esp32-c3.yaml
new file mode 100644
index 0000000000..17b8c8065a
--- /dev/null
+++ b/tests/components/tt21100/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 3
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 6
+    reset_pin: 7
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/tt21100/test.esp32-idf.yaml b/tests/components/tt21100/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2419b0ad6a
--- /dev/null
+++ b/tests/components/tt21100/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 13
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 14
+    reset_pin: 15
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/tt21100/test.esp32.yaml b/tests/components/tt21100/test.esp32.yaml
new file mode 100644
index 0000000000..2419b0ad6a
--- /dev/null
+++ b/tests/components/tt21100/test.esp32.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 13
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 14
+    reset_pin: 15
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/tt21100/test.esp8266.yaml b/tests/components/tt21100/test.esp8266.yaml
new file mode 100644
index 0000000000..1393019417
--- /dev/null
+++ b/tests/components/tt21100/test.esp8266.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 13
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 14
+    reset_pin: 15
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/tt21100/test.rp2040.yaml b/tests/components/tt21100/test.rp2040.yaml
new file mode 100644
index 0000000000..17b8c8065a
--- /dev/null
+++ b/tests/components/tt21100/test.rp2040.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_tt21100
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    id: ssd1306_display
+    model: SSD1306_128X64
+    reset_pin: 3
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+
+touchscreen:
+  - platform: tt21100
+    display: ssd1306_display
+    interrupt_pin: 6
+    reset_pin: 7
+
+binary_sensor:
+  - platform: tt21100
+    name: Home Button
+    index: 1
diff --git a/tests/components/ttp229_bsf/test.esp32-c3-idf.yaml b/tests/components/ttp229_bsf/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2006061c6e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.esp32-c3-idf.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 5
+  sdo_pin: 4
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_bsf/test.esp32-c3.yaml b/tests/components/ttp229_bsf/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2006061c6e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.esp32-c3.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 5
+  sdo_pin: 4
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_bsf/test.esp32-idf.yaml b/tests/components/ttp229_bsf/test.esp32-idf.yaml
new file mode 100644
index 0000000000..edee6d164e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.esp32-idf.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 16
+  sdo_pin: 17
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_bsf/test.esp32.yaml b/tests/components/ttp229_bsf/test.esp32.yaml
new file mode 100644
index 0000000000..edee6d164e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.esp32.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 16
+  sdo_pin: 17
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_bsf/test.esp8266.yaml b/tests/components/ttp229_bsf/test.esp8266.yaml
new file mode 100644
index 0000000000..2006061c6e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.esp8266.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 5
+  sdo_pin: 4
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_bsf/test.rp2040.yaml b/tests/components/ttp229_bsf/test.rp2040.yaml
new file mode 100644
index 0000000000..2006061c6e
--- /dev/null
+++ b/tests/components/ttp229_bsf/test.rp2040.yaml
@@ -0,0 +1,8 @@
+ttp229_bsf:
+  scl_pin: 5
+  sdo_pin: 4
+
+binary_sensor:
+  - platform: ttp229_bsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.esp32-c3-idf.yaml b/tests/components/ttp229_lsf/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3927aff40e
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 5
+    sda: 4
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.esp32-c3.yaml b/tests/components/ttp229_lsf/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3927aff40e
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 5
+    sda: 4
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.esp32-idf.yaml b/tests/components/ttp229_lsf/test.esp32-idf.yaml
new file mode 100644
index 0000000000..81fb965883
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 16
+    sda: 17
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.esp32.yaml b/tests/components/ttp229_lsf/test.esp32.yaml
new file mode 100644
index 0000000000..81fb965883
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.esp32.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 16
+    sda: 17
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.esp8266.yaml b/tests/components/ttp229_lsf/test.esp8266.yaml
new file mode 100644
index 0000000000..3927aff40e
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.esp8266.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 5
+    sda: 4
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/ttp229_lsf/test.rp2040.yaml b/tests/components/ttp229_lsf/test.rp2040.yaml
new file mode 100644
index 0000000000..3927aff40e
--- /dev/null
+++ b/tests/components/ttp229_lsf/test.rp2040.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_ttp229_lsf
+    scl: 5
+    sda: 4
+
+ttp229_lsf:
+
+binary_sensor:
+  - platform: ttp229_lsf
+    name: TTP229 Channel 0
+    channel: 0
diff --git a/tests/components/tuya/test.esp32-c3-idf.yaml b/tests/components/tuya/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..4892e807b1
--- /dev/null
+++ b/tests/components/tuya/test.esp32-c3-idf.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 6
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tuya/test.esp32-c3.yaml b/tests/components/tuya/test.esp32-c3.yaml
new file mode 100644
index 0000000000..4892e807b1
--- /dev/null
+++ b/tests/components/tuya/test.esp32-c3.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 6
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tuya/test.esp32-idf.yaml b/tests/components/tuya/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9105522dcd
--- /dev/null
+++ b/tests/components/tuya/test.esp32-idf.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 15
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tuya/test.esp32.yaml b/tests/components/tuya/test.esp32.yaml
new file mode 100644
index 0000000000..9105522dcd
--- /dev/null
+++ b/tests/components/tuya/test.esp32.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 15
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tuya/test.esp8266.yaml b/tests/components/tuya/test.esp8266.yaml
new file mode 100644
index 0000000000..56177fb982
--- /dev/null
+++ b/tests/components/tuya/test.esp8266.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 16
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tuya/test.rp2040.yaml b/tests/components/tuya/test.rp2040.yaml
new file mode 100644
index 0000000000..4892e807b1
--- /dev/null
+++ b/tests/components/tuya/test.rp2040.yaml
@@ -0,0 +1,78 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+uart:
+  - id: uart_tuya
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+tuya:
+  status_pin:
+    number: 6
+    inverted: true
+  on_datapoint_update:
+    - sensor_datapoint: 6
+      datapoint_type: raw
+      then:
+        - logger.log: Datapoint 6 updated
+
+binary_sensor:
+  - platform: tuya
+    id: tuya_binary_sensor
+    sensor_datapoint: 1
+
+climate:
+  - platform: tuya
+    id: tuya_climate
+    switch_datapoint: 1
+    target_temperature_datapoint: 3
+    current_temperature_multiplier: 0.5
+    target_temperature_multiplier: 0.5
+    reports_fahrenheit: true
+
+cover:
+  - platform: tuya
+    id: tuya_cover
+    position_datapoint: 2
+
+light:
+  - platform: tuya
+    id: tuya_light
+    switch_datapoint: 1
+    dimmer_datapoint: 2
+    min_value_datapoint: 3
+    color_temperature_datapoint: 4
+    min_value: 1
+    max_value: 100
+    cold_white_color_temperature: 153 mireds
+    warm_white_color_temperature: 500 mireds
+    gamma_correct: 1
+
+number:
+  - platform: tuya
+    id: tuya_number
+    number_datapoint: 102
+    min_value: 0
+    max_value: 17
+    step: 1
+
+select:
+  - platform: tuya
+    id: tuya_select
+    enum_datapoint: 42
+    options:
+      0: Internal
+      1: Floor
+      2: Both
+
+sensor:
+  - platform: tuya
+    id: tuya_sensor
+    sensor_datapoint: 1
+
+switch:
+  - platform: tuya
+    id: tuya_switch
+    switch_datapoint: 1
diff --git a/tests/components/tx20/test.esp32-c3-idf.yaml b/tests/components/tx20/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4
diff --git a/tests/components/tx20/test.esp32-c3.yaml b/tests/components/tx20/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4
diff --git a/tests/components/tx20/test.esp32-idf.yaml b/tests/components/tx20/test.esp32-idf.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4
diff --git a/tests/components/tx20/test.esp32.yaml b/tests/components/tx20/test.esp32.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.esp32.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4
diff --git a/tests/components/tx20/test.esp8266.yaml b/tests/components/tx20/test.esp8266.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.esp8266.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4
diff --git a/tests/components/tx20/test.rp2040.yaml b/tests/components/tx20/test.rp2040.yaml
new file mode 100644
index 0000000000..d826059320
--- /dev/null
+++ b/tests/components/tx20/test.rp2040.yaml
@@ -0,0 +1,7 @@
+sensor:
+  - platform: tx20
+    wind_speed:
+      name: Windspeed
+    wind_direction_degrees:
+      name: Winddirection Degrees
+    pin: 4

From 7e8ed5c391fa773ecf8f450196f05215bb5cf3d4 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Tue, 23 Apr 2024 04:49:15 -0500
Subject: [PATCH 31/81] Add some components to the new testing framework (S
 part 1) (#6224)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .../safe_mode/test.esp32-c3-idf.yaml          | 13 +++++
 tests/components/safe_mode/test.esp32-c3.yaml | 13 +++++
 .../components/safe_mode/test.esp32-idf.yaml  | 13 +++++
 tests/components/safe_mode/test.esp32.yaml    | 13 +++++
 tests/components/safe_mode/test.esp8266.yaml  | 13 +++++
 tests/components/safe_mode/test.rp2040.yaml   | 13 +++++
 tests/components/scd30/test.esp32-c3-idf.yaml | 20 ++++++++
 tests/components/scd30/test.esp32-c3.yaml     | 20 ++++++++
 tests/components/scd30/test.esp32-idf.yaml    | 20 ++++++++
 tests/components/scd30/test.esp32.yaml        | 20 ++++++++
 tests/components/scd30/test.esp8266.yaml      | 20 ++++++++
 tests/components/scd30/test.rp2040.yaml       | 20 ++++++++
 tests/components/scd4x/test.esp32-c3-idf.yaml | 20 ++++++++
 tests/components/scd4x/test.esp32-c3.yaml     | 20 ++++++++
 tests/components/scd4x/test.esp32-idf.yaml    | 20 ++++++++
 tests/components/scd4x/test.esp32.yaml        | 20 ++++++++
 tests/components/scd4x/test.esp8266.yaml      | 20 ++++++++
 tests/components/scd4x/test.rp2040.yaml       | 20 ++++++++
 .../components/script/test.esp32-c3-idf.yaml  | 26 ++++++++++
 tests/components/script/test.esp32-c3.yaml    | 26 ++++++++++
 tests/components/script/test.esp32-idf.yaml   | 26 ++++++++++
 tests/components/script/test.esp32.yaml       | 26 ++++++++++
 tests/components/script/test.esp8266.yaml     | 26 ++++++++++
 tests/components/script/test.rp2040.yaml      | 26 ++++++++++
 .../sdm_meter/test.esp32-c3-idf.yaml          | 23 +++++++++
 tests/components/sdm_meter/test.esp32-c3.yaml | 23 +++++++++
 .../components/sdm_meter/test.esp32-idf.yaml  | 23 +++++++++
 tests/components/sdm_meter/test.esp32.yaml    | 23 +++++++++
 tests/components/sdm_meter/test.esp8266.yaml  | 23 +++++++++
 tests/components/sdm_meter/test.rp2040.yaml   | 23 +++++++++
 tests/components/sdp3x/test.esp32-c3-idf.yaml | 11 +++++
 tests/components/sdp3x/test.esp32-c3.yaml     | 11 +++++
 tests/components/sdp3x/test.esp32-idf.yaml    | 11 +++++
 tests/components/sdp3x/test.esp32.yaml        | 11 +++++
 tests/components/sdp3x/test.esp8266.yaml      | 11 +++++
 tests/components/sdp3x/test.rp2040.yaml       | 11 +++++
 .../components/sds011/test.esp32-c3-idf.yaml  | 14 ++++++
 tests/components/sds011/test.esp32-c3.yaml    | 14 ++++++
 tests/components/sds011/test.esp32-idf.yaml   | 14 ++++++
 tests/components/sds011/test.esp32.yaml       | 14 ++++++
 tests/components/sds011/test.esp8266.yaml     | 14 ++++++
 tests/components/sds011/test.rp2040.yaml      | 14 ++++++
 .../selec_meter/test.esp32-c3-idf.yaml        | 45 +++++++++++++++++
 .../components/selec_meter/test.esp32-c3.yaml | 45 +++++++++++++++++
 .../selec_meter/test.esp32-idf.yaml           | 45 +++++++++++++++++
 tests/components/selec_meter/test.esp32.yaml  | 45 +++++++++++++++++
 .../components/selec_meter/test.esp8266.yaml  | 45 +++++++++++++++++
 tests/components/selec_meter/test.rp2040.yaml | 45 +++++++++++++++++
 .../components/sen0321/test.esp32-c3-idf.yaml | 10 ++++
 tests/components/sen0321/test.esp32-c3.yaml   | 10 ++++
 tests/components/sen0321/test.esp32-idf.yaml  | 10 ++++
 tests/components/sen0321/test.esp32.yaml      | 10 ++++
 tests/components/sen0321/test.esp8266.yaml    | 10 ++++
 tests/components/sen0321/test.rp2040.yaml     | 10 ++++
 .../sen21231/test.esp32-c3-idf.yaml           |  9 ++++
 tests/components/sen21231/test.esp32-c3.yaml  |  9 ++++
 tests/components/sen21231/test.esp32-idf.yaml |  9 ++++
 tests/components/sen21231/test.esp32.yaml     |  9 ++++
 tests/components/sen21231/test.esp8266.yaml   |  9 ++++
 tests/components/sen21231/test.rp2040.yaml    |  9 ++++
 tests/components/sen5x/test.esp32-c3-idf.yaml | 49 +++++++++++++++++++
 tests/components/sen5x/test.esp32-c3.yaml     | 49 +++++++++++++++++++
 tests/components/sen5x/test.esp32-idf.yaml    | 49 +++++++++++++++++++
 tests/components/sen5x/test.esp32.yaml        | 49 +++++++++++++++++++
 tests/components/sen5x/test.esp8266.yaml      | 49 +++++++++++++++++++
 tests/components/sen5x/test.rp2040.yaml       | 49 +++++++++++++++++++
 .../senseair/test.esp32-c3-idf.yaml           | 19 +++++++
 tests/components/senseair/test.esp32-c3.yaml  | 19 +++++++
 tests/components/senseair/test.esp32-idf.yaml | 19 +++++++
 tests/components/senseair/test.esp32.yaml     | 19 +++++++
 tests/components/senseair/test.esp8266.yaml   | 19 +++++++
 tests/components/senseair/test.rp2040.yaml    | 19 +++++++
 tests/components/servo/test.esp32-c3-idf.yaml | 19 +++++++
 tests/components/servo/test.esp32-c3.yaml     | 19 +++++++
 tests/components/servo/test.esp32-idf.yaml    | 19 +++++++
 tests/components/servo/test.esp32.yaml        | 19 +++++++
 tests/components/servo/test.esp8266.yaml      | 19 +++++++
 tests/components/servo/test.rp2040.yaml       | 19 +++++++
 tests/components/sfa30/test.esp32-c3-idf.yaml | 15 ++++++
 tests/components/sfa30/test.esp32-c3.yaml     | 15 ++++++
 tests/components/sfa30/test.esp32-idf.yaml    | 15 ++++++
 tests/components/sfa30/test.esp32.yaml        | 15 ++++++
 tests/components/sfa30/test.esp8266.yaml      | 15 ++++++
 tests/components/sfa30/test.rp2040.yaml       | 15 ++++++
 tests/components/sgp30/test.esp32-c3-idf.yaml | 15 ++++++
 tests/components/sgp30/test.esp32-c3.yaml     | 15 ++++++
 tests/components/sgp30/test.esp32-idf.yaml    | 15 ++++++
 tests/components/sgp30/test.esp32.yaml        | 15 ++++++
 tests/components/sgp30/test.esp8266.yaml      | 15 ++++++
 tests/components/sgp30/test.rp2040.yaml       | 15 ++++++
 tests/components/sgp4x/test.esp32-c3-idf.yaml | 27 ++++++++++
 tests/components/sgp4x/test.esp32-c3.yaml     | 27 ++++++++++
 tests/components/sgp4x/test.esp32-idf.yaml    | 27 ++++++++++
 tests/components/sgp4x/test.esp32.yaml        | 27 ++++++++++
 tests/components/sgp4x/test.esp8266.yaml      | 27 ++++++++++
 tests/components/sgp4x/test.rp2040.yaml       | 27 ++++++++++
 .../shelly_dimmer/test.esp8266.yaml           | 19 +++++++
 .../components/sht3xd/test.esp32-c3-idf.yaml  | 13 +++++
 tests/components/sht3xd/test.esp32-c3.yaml    | 13 +++++
 tests/components/sht3xd/test.esp32-idf.yaml   | 13 +++++
 tests/components/sht3xd/test.esp32.yaml       | 13 +++++
 tests/components/sht3xd/test.esp8266.yaml     | 13 +++++
 tests/components/sht3xd/test.rp2040.yaml      | 13 +++++
 tests/components/sht4x/test.esp32-c3-idf.yaml | 13 +++++
 tests/components/sht4x/test.esp32-c3.yaml     | 13 +++++
 tests/components/sht4x/test.esp32-idf.yaml    | 13 +++++
 tests/components/sht4x/test.esp32.yaml        | 13 +++++
 tests/components/sht4x/test.esp8266.yaml      | 13 +++++
 tests/components/sht4x/test.rp2040.yaml       | 13 +++++
 tests/components/shtcx/test.esp32-c3-idf.yaml | 13 +++++
 tests/components/shtcx/test.esp32-c3.yaml     | 13 +++++
 tests/components/shtcx/test.esp32-idf.yaml    | 13 +++++
 tests/components/shtcx/test.esp32.yaml        | 13 +++++
 tests/components/shtcx/test.esp8266.yaml      | 13 +++++
 tests/components/shtcx/test.rp2040.yaml       | 13 +++++
 .../shutdown/test.esp32-c3-idf.yaml           |  7 +++
 tests/components/shutdown/test.esp32-c3.yaml  |  7 +++
 tests/components/shutdown/test.esp32-idf.yaml |  7 +++
 tests/components/shutdown/test.esp32.yaml     |  7 +++
 tests/components/shutdown/test.esp8266.yaml   |  7 +++
 tests/components/shutdown/test.rp2040.yaml    |  7 +++
 .../sigma_delta_output/test.esp32-c3-idf.yaml | 16 ++++++
 .../sigma_delta_output/test.esp32-c3.yaml     | 16 ++++++
 .../sigma_delta_output/test.esp32-idf.yaml    | 16 ++++++
 .../sigma_delta_output/test.esp32.yaml        | 16 ++++++
 .../sigma_delta_output/test.esp8266.yaml      | 16 ++++++
 .../sigma_delta_output/test.rp2040.yaml       | 16 ++++++
 .../components/sim800l/test.esp32-c3-idf.yaml | 37 ++++++++++++++
 tests/components/sim800l/test.esp32-c3.yaml   | 37 ++++++++++++++
 tests/components/sim800l/test.esp32-idf.yaml  | 37 ++++++++++++++
 tests/components/sim800l/test.esp32.yaml      | 37 ++++++++++++++
 tests/components/sim800l/test.esp8266.yaml    | 37 ++++++++++++++
 tests/components/sim800l/test.rp2040.yaml     | 37 ++++++++++++++
 .../slow_pwm/test.esp32-c3-idf.yaml           |  6 +++
 tests/components/slow_pwm/test.esp32-c3.yaml  |  6 +++
 tests/components/slow_pwm/test.esp32-idf.yaml |  6 +++
 tests/components/slow_pwm/test.esp32.yaml     |  6 +++
 tests/components/slow_pwm/test.esp8266.yaml   |  6 +++
 tests/components/slow_pwm/test.rp2040.yaml    |  6 +++
 .../components/sm16716/test.esp32-c3-idf.yaml | 16 ++++++
 tests/components/sm16716/test.esp32-c3.yaml   | 16 ++++++
 tests/components/sm16716/test.esp32-idf.yaml  | 16 ++++++
 tests/components/sm16716/test.esp32.yaml      | 16 ++++++
 tests/components/sm16716/test.esp8266.yaml    | 16 ++++++
 tests/components/sm16716/test.rp2040.yaml     | 16 ++++++
 .../components/sm2135/test.esp32-c3-idf.yaml  | 22 +++++++++
 tests/components/sm2135/test.esp32-c3.yaml    | 22 +++++++++
 tests/components/sm2135/test.esp32-idf.yaml   | 22 +++++++++
 tests/components/sm2135/test.esp32.yaml       | 22 +++++++++
 tests/components/sm2135/test.esp8266.yaml     | 22 +++++++++
 tests/components/sm2135/test.rp2040.yaml      | 22 +++++++++
 .../components/sm2235/test.esp32-c3-idf.yaml  | 22 +++++++++
 tests/components/sm2235/test.esp32-c3.yaml    | 22 +++++++++
 tests/components/sm2235/test.esp32-idf.yaml   | 22 +++++++++
 tests/components/sm2235/test.esp32.yaml       | 22 +++++++++
 tests/components/sm2235/test.esp8266.yaml     | 22 +++++++++
 tests/components/sm2235/test.rp2040.yaml      | 22 +++++++++
 .../components/sm2335/test.esp32-c3-idf.yaml  | 22 +++++++++
 tests/components/sm2335/test.esp32-c3.yaml    | 22 +++++++++
 tests/components/sm2335/test.esp32-idf.yaml   | 22 +++++++++
 tests/components/sm2335/test.esp32.yaml       | 22 +++++++++
 tests/components/sm2335/test.esp8266.yaml     | 22 +++++++++
 tests/components/sm2335/test.rp2040.yaml      | 22 +++++++++
 .../components/sm300d2/test.esp32-c3-idf.yaml | 23 +++++++++
 tests/components/sm300d2/test.esp32-c3.yaml   | 23 +++++++++
 tests/components/sm300d2/test.esp32-idf.yaml  | 23 +++++++++
 tests/components/sm300d2/test.esp32.yaml      | 23 +++++++++
 tests/components/sm300d2/test.esp8266.yaml    | 23 +++++++++
 tests/components/sm300d2/test.rp2040.yaml     | 23 +++++++++
 tests/components/sml/test.esp32-c3-idf.yaml   | 31 ++++++++++++
 tests/components/sml/test.esp32-c3.yaml       | 31 ++++++++++++
 tests/components/sml/test.esp32-idf.yaml      | 31 ++++++++++++
 tests/components/sml/test.esp32.yaml          | 31 ++++++++++++
 tests/components/sml/test.esp8266.yaml        | 31 ++++++++++++
 tests/components/sml/test.rp2040.yaml         | 31 ++++++++++++
 .../components/smt100/test.esp32-c3-idf.yaml  | 19 +++++++
 tests/components/smt100/test.esp32-c3.yaml    | 19 +++++++
 tests/components/smt100/test.esp32-idf.yaml   | 19 +++++++
 tests/components/smt100/test.esp32.yaml       | 19 +++++++
 tests/components/smt100/test.esp8266.yaml     | 19 +++++++
 tests/components/smt100/test.rp2040.yaml      | 19 +++++++
 181 files changed, 3589 insertions(+)
 create mode 100644 tests/components/safe_mode/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/safe_mode/test.esp32-c3.yaml
 create mode 100644 tests/components/safe_mode/test.esp32-idf.yaml
 create mode 100644 tests/components/safe_mode/test.esp32.yaml
 create mode 100644 tests/components/safe_mode/test.esp8266.yaml
 create mode 100644 tests/components/safe_mode/test.rp2040.yaml
 create mode 100644 tests/components/scd30/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/scd30/test.esp32-c3.yaml
 create mode 100644 tests/components/scd30/test.esp32-idf.yaml
 create mode 100644 tests/components/scd30/test.esp32.yaml
 create mode 100644 tests/components/scd30/test.esp8266.yaml
 create mode 100644 tests/components/scd30/test.rp2040.yaml
 create mode 100644 tests/components/scd4x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/scd4x/test.esp32-c3.yaml
 create mode 100644 tests/components/scd4x/test.esp32-idf.yaml
 create mode 100644 tests/components/scd4x/test.esp32.yaml
 create mode 100644 tests/components/scd4x/test.esp8266.yaml
 create mode 100644 tests/components/scd4x/test.rp2040.yaml
 create mode 100644 tests/components/script/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/script/test.esp32-c3.yaml
 create mode 100644 tests/components/script/test.esp32-idf.yaml
 create mode 100644 tests/components/script/test.esp32.yaml
 create mode 100644 tests/components/script/test.esp8266.yaml
 create mode 100644 tests/components/script/test.rp2040.yaml
 create mode 100644 tests/components/sdm_meter/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sdm_meter/test.esp32-c3.yaml
 create mode 100644 tests/components/sdm_meter/test.esp32-idf.yaml
 create mode 100644 tests/components/sdm_meter/test.esp32.yaml
 create mode 100644 tests/components/sdm_meter/test.esp8266.yaml
 create mode 100644 tests/components/sdm_meter/test.rp2040.yaml
 create mode 100644 tests/components/sdp3x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sdp3x/test.esp32-c3.yaml
 create mode 100644 tests/components/sdp3x/test.esp32-idf.yaml
 create mode 100644 tests/components/sdp3x/test.esp32.yaml
 create mode 100644 tests/components/sdp3x/test.esp8266.yaml
 create mode 100644 tests/components/sdp3x/test.rp2040.yaml
 create mode 100644 tests/components/sds011/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sds011/test.esp32-c3.yaml
 create mode 100644 tests/components/sds011/test.esp32-idf.yaml
 create mode 100644 tests/components/sds011/test.esp32.yaml
 create mode 100644 tests/components/sds011/test.esp8266.yaml
 create mode 100644 tests/components/sds011/test.rp2040.yaml
 create mode 100644 tests/components/selec_meter/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/selec_meter/test.esp32-c3.yaml
 create mode 100644 tests/components/selec_meter/test.esp32-idf.yaml
 create mode 100644 tests/components/selec_meter/test.esp32.yaml
 create mode 100644 tests/components/selec_meter/test.esp8266.yaml
 create mode 100644 tests/components/selec_meter/test.rp2040.yaml
 create mode 100644 tests/components/sen0321/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sen0321/test.esp32-c3.yaml
 create mode 100644 tests/components/sen0321/test.esp32-idf.yaml
 create mode 100644 tests/components/sen0321/test.esp32.yaml
 create mode 100644 tests/components/sen0321/test.esp8266.yaml
 create mode 100644 tests/components/sen0321/test.rp2040.yaml
 create mode 100644 tests/components/sen21231/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sen21231/test.esp32-c3.yaml
 create mode 100644 tests/components/sen21231/test.esp32-idf.yaml
 create mode 100644 tests/components/sen21231/test.esp32.yaml
 create mode 100644 tests/components/sen21231/test.esp8266.yaml
 create mode 100644 tests/components/sen21231/test.rp2040.yaml
 create mode 100644 tests/components/sen5x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sen5x/test.esp32-c3.yaml
 create mode 100644 tests/components/sen5x/test.esp32-idf.yaml
 create mode 100644 tests/components/sen5x/test.esp32.yaml
 create mode 100644 tests/components/sen5x/test.esp8266.yaml
 create mode 100644 tests/components/sen5x/test.rp2040.yaml
 create mode 100644 tests/components/senseair/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/senseair/test.esp32-c3.yaml
 create mode 100644 tests/components/senseair/test.esp32-idf.yaml
 create mode 100644 tests/components/senseair/test.esp32.yaml
 create mode 100644 tests/components/senseair/test.esp8266.yaml
 create mode 100644 tests/components/senseair/test.rp2040.yaml
 create mode 100644 tests/components/servo/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/servo/test.esp32-c3.yaml
 create mode 100644 tests/components/servo/test.esp32-idf.yaml
 create mode 100644 tests/components/servo/test.esp32.yaml
 create mode 100644 tests/components/servo/test.esp8266.yaml
 create mode 100644 tests/components/servo/test.rp2040.yaml
 create mode 100644 tests/components/sfa30/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sfa30/test.esp32-c3.yaml
 create mode 100644 tests/components/sfa30/test.esp32-idf.yaml
 create mode 100644 tests/components/sfa30/test.esp32.yaml
 create mode 100644 tests/components/sfa30/test.esp8266.yaml
 create mode 100644 tests/components/sfa30/test.rp2040.yaml
 create mode 100644 tests/components/sgp30/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sgp30/test.esp32-c3.yaml
 create mode 100644 tests/components/sgp30/test.esp32-idf.yaml
 create mode 100644 tests/components/sgp30/test.esp32.yaml
 create mode 100644 tests/components/sgp30/test.esp8266.yaml
 create mode 100644 tests/components/sgp30/test.rp2040.yaml
 create mode 100644 tests/components/sgp4x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sgp4x/test.esp32-c3.yaml
 create mode 100644 tests/components/sgp4x/test.esp32-idf.yaml
 create mode 100644 tests/components/sgp4x/test.esp32.yaml
 create mode 100644 tests/components/sgp4x/test.esp8266.yaml
 create mode 100644 tests/components/sgp4x/test.rp2040.yaml
 create mode 100644 tests/components/shelly_dimmer/test.esp8266.yaml
 create mode 100644 tests/components/sht3xd/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sht3xd/test.esp32-c3.yaml
 create mode 100644 tests/components/sht3xd/test.esp32-idf.yaml
 create mode 100644 tests/components/sht3xd/test.esp32.yaml
 create mode 100644 tests/components/sht3xd/test.esp8266.yaml
 create mode 100644 tests/components/sht3xd/test.rp2040.yaml
 create mode 100644 tests/components/sht4x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sht4x/test.esp32-c3.yaml
 create mode 100644 tests/components/sht4x/test.esp32-idf.yaml
 create mode 100644 tests/components/sht4x/test.esp32.yaml
 create mode 100644 tests/components/sht4x/test.esp8266.yaml
 create mode 100644 tests/components/sht4x/test.rp2040.yaml
 create mode 100644 tests/components/shtcx/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/shtcx/test.esp32-c3.yaml
 create mode 100644 tests/components/shtcx/test.esp32-idf.yaml
 create mode 100644 tests/components/shtcx/test.esp32.yaml
 create mode 100644 tests/components/shtcx/test.esp8266.yaml
 create mode 100644 tests/components/shtcx/test.rp2040.yaml
 create mode 100644 tests/components/shutdown/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/shutdown/test.esp32-c3.yaml
 create mode 100644 tests/components/shutdown/test.esp32-idf.yaml
 create mode 100644 tests/components/shutdown/test.esp32.yaml
 create mode 100644 tests/components/shutdown/test.esp8266.yaml
 create mode 100644 tests/components/shutdown/test.rp2040.yaml
 create mode 100644 tests/components/sigma_delta_output/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sigma_delta_output/test.esp32-c3.yaml
 create mode 100644 tests/components/sigma_delta_output/test.esp32-idf.yaml
 create mode 100644 tests/components/sigma_delta_output/test.esp32.yaml
 create mode 100644 tests/components/sigma_delta_output/test.esp8266.yaml
 create mode 100644 tests/components/sigma_delta_output/test.rp2040.yaml
 create mode 100644 tests/components/sim800l/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sim800l/test.esp32-c3.yaml
 create mode 100644 tests/components/sim800l/test.esp32-idf.yaml
 create mode 100644 tests/components/sim800l/test.esp32.yaml
 create mode 100644 tests/components/sim800l/test.esp8266.yaml
 create mode 100644 tests/components/sim800l/test.rp2040.yaml
 create mode 100644 tests/components/slow_pwm/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/slow_pwm/test.esp32-c3.yaml
 create mode 100644 tests/components/slow_pwm/test.esp32-idf.yaml
 create mode 100644 tests/components/slow_pwm/test.esp32.yaml
 create mode 100644 tests/components/slow_pwm/test.esp8266.yaml
 create mode 100644 tests/components/slow_pwm/test.rp2040.yaml
 create mode 100644 tests/components/sm16716/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sm16716/test.esp32-c3.yaml
 create mode 100644 tests/components/sm16716/test.esp32-idf.yaml
 create mode 100644 tests/components/sm16716/test.esp32.yaml
 create mode 100644 tests/components/sm16716/test.esp8266.yaml
 create mode 100644 tests/components/sm16716/test.rp2040.yaml
 create mode 100644 tests/components/sm2135/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sm2135/test.esp32-c3.yaml
 create mode 100644 tests/components/sm2135/test.esp32-idf.yaml
 create mode 100644 tests/components/sm2135/test.esp32.yaml
 create mode 100644 tests/components/sm2135/test.esp8266.yaml
 create mode 100644 tests/components/sm2135/test.rp2040.yaml
 create mode 100644 tests/components/sm2235/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sm2235/test.esp32-c3.yaml
 create mode 100644 tests/components/sm2235/test.esp32-idf.yaml
 create mode 100644 tests/components/sm2235/test.esp32.yaml
 create mode 100644 tests/components/sm2235/test.esp8266.yaml
 create mode 100644 tests/components/sm2235/test.rp2040.yaml
 create mode 100644 tests/components/sm2335/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sm2335/test.esp32-c3.yaml
 create mode 100644 tests/components/sm2335/test.esp32-idf.yaml
 create mode 100644 tests/components/sm2335/test.esp32.yaml
 create mode 100644 tests/components/sm2335/test.esp8266.yaml
 create mode 100644 tests/components/sm2335/test.rp2040.yaml
 create mode 100644 tests/components/sm300d2/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sm300d2/test.esp32-c3.yaml
 create mode 100644 tests/components/sm300d2/test.esp32-idf.yaml
 create mode 100644 tests/components/sm300d2/test.esp32.yaml
 create mode 100644 tests/components/sm300d2/test.esp8266.yaml
 create mode 100644 tests/components/sm300d2/test.rp2040.yaml
 create mode 100644 tests/components/sml/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sml/test.esp32-c3.yaml
 create mode 100644 tests/components/sml/test.esp32-idf.yaml
 create mode 100644 tests/components/sml/test.esp32.yaml
 create mode 100644 tests/components/sml/test.esp8266.yaml
 create mode 100644 tests/components/sml/test.rp2040.yaml
 create mode 100644 tests/components/smt100/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/smt100/test.esp32-c3.yaml
 create mode 100644 tests/components/smt100/test.esp32-idf.yaml
 create mode 100644 tests/components/smt100/test.esp32.yaml
 create mode 100644 tests/components/smt100/test.esp8266.yaml
 create mode 100644 tests/components/smt100/test.rp2040.yaml

diff --git a/tests/components/safe_mode/test.esp32-c3-idf.yaml b/tests/components/safe_mode/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/safe_mode/test.esp32-c3.yaml b/tests/components/safe_mode/test.esp32-c3.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/safe_mode/test.esp32-idf.yaml b/tests/components/safe_mode/test.esp32-idf.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/safe_mode/test.esp32.yaml b/tests/components/safe_mode/test.esp32.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.esp32.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/safe_mode/test.esp8266.yaml b/tests/components/safe_mode/test.esp8266.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.esp8266.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/safe_mode/test.rp2040.yaml b/tests/components/safe_mode/test.rp2040.yaml
new file mode 100644
index 0000000000..df0abd9aec
--- /dev/null
+++ b/tests/components/safe_mode/test.rp2040.yaml
@@ -0,0 +1,13 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+ota:
+
+button:
+  - platform: safe_mode
+    name: Safe Mode Button
+
+switch:
+  - platform: safe_mode
+    name: Safe Mode Switch
diff --git a/tests/components/scd30/test.esp32-c3-idf.yaml b/tests/components/scd30/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..80f02a1b87
--- /dev/null
+++ b/tests/components/scd30/test.esp32-c3-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd30/test.esp32-c3.yaml b/tests/components/scd30/test.esp32-c3.yaml
new file mode 100644
index 0000000000..80f02a1b87
--- /dev/null
+++ b/tests/components/scd30/test.esp32-c3.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd30/test.esp32-idf.yaml b/tests/components/scd30/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b48f8054c8
--- /dev/null
+++ b/tests/components/scd30/test.esp32-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd30/test.esp32.yaml b/tests/components/scd30/test.esp32.yaml
new file mode 100644
index 0000000000..b48f8054c8
--- /dev/null
+++ b/tests/components/scd30/test.esp32.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd30/test.esp8266.yaml b/tests/components/scd30/test.esp8266.yaml
new file mode 100644
index 0000000000..80f02a1b87
--- /dev/null
+++ b/tests/components/scd30/test.esp8266.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd30/test.rp2040.yaml b/tests/components/scd30/test.rp2040.yaml
new file mode 100644
index 0000000000..80f02a1b87
--- /dev/null
+++ b/tests/components/scd30/test.rp2040.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd30
+    co2:
+      name: SCD30 CO2
+    temperature:
+      id: scd30_temperature
+      name: SCD30 Temperature
+    humidity:
+      name: SCD30 Humidity
+    address: 0x61
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.esp32-c3-idf.yaml b/tests/components/scd4x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..353293be65
--- /dev/null
+++ b/tests/components/scd4x/test.esp32-c3-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.esp32-c3.yaml b/tests/components/scd4x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..353293be65
--- /dev/null
+++ b/tests/components/scd4x/test.esp32-c3.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.esp32-idf.yaml b/tests/components/scd4x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..02cec921d2
--- /dev/null
+++ b/tests/components/scd4x/test.esp32-idf.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.esp32.yaml b/tests/components/scd4x/test.esp32.yaml
new file mode 100644
index 0000000000..02cec921d2
--- /dev/null
+++ b/tests/components/scd4x/test.esp32.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.esp8266.yaml b/tests/components/scd4x/test.esp8266.yaml
new file mode 100644
index 0000000000..353293be65
--- /dev/null
+++ b/tests/components/scd4x/test.esp8266.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/scd4x/test.rp2040.yaml b/tests/components/scd4x/test.rp2040.yaml
new file mode 100644
index 0000000000..353293be65
--- /dev/null
+++ b/tests/components/scd4x/test.rp2040.yaml
@@ -0,0 +1,20 @@
+i2c:
+  - id: i2c_scd4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: scd4x
+    id: scd40
+    co2:
+      name: SCD4X CO2
+    temperature:
+      id: scd4x_temperature
+      name: SCD4X Temperature
+    humidity:
+      name: SCD4X Humidity
+    automatic_self_calibration: true
+    altitude_compensation: 10m
+    ambient_pressure_compensation: 961mBar
+    temperature_offset: 4.2C
+    update_interval: 15s
diff --git a/tests/components/script/test.esp32-c3-idf.yaml b/tests/components/script/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3872c690ff
--- /dev/null
+++ b/tests/components/script/test.esp32-c3-idf.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
diff --git a/tests/components/script/test.esp32-c3.yaml b/tests/components/script/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3872c690ff
--- /dev/null
+++ b/tests/components/script/test.esp32-c3.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
diff --git a/tests/components/script/test.esp32-idf.yaml b/tests/components/script/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3872c690ff
--- /dev/null
+++ b/tests/components/script/test.esp32-idf.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
diff --git a/tests/components/script/test.esp32.yaml b/tests/components/script/test.esp32.yaml
new file mode 100644
index 0000000000..3872c690ff
--- /dev/null
+++ b/tests/components/script/test.esp32.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
diff --git a/tests/components/script/test.esp8266.yaml b/tests/components/script/test.esp8266.yaml
new file mode 100644
index 0000000000..ce0e40e7ee
--- /dev/null
+++ b/tests/components/script/test.esp8266.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD(prefix.c_str(), "Hello World! %i %i", param2, param3);'
diff --git a/tests/components/script/test.rp2040.yaml b/tests/components/script/test.rp2040.yaml
new file mode 100644
index 0000000000..3872c690ff
--- /dev/null
+++ b/tests/components/script/test.rp2040.yaml
@@ -0,0 +1,26 @@
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: int
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
diff --git a/tests/components/sdm_meter/test.esp32-c3-idf.yaml b/tests/components/sdm_meter/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0c2144f983
--- /dev/null
+++ b/tests/components/sdm_meter/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdm_meter/test.esp32-c3.yaml b/tests/components/sdm_meter/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0c2144f983
--- /dev/null
+++ b/tests/components/sdm_meter/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdm_meter/test.esp32-idf.yaml b/tests/components/sdm_meter/test.esp32-idf.yaml
new file mode 100644
index 0000000000..eb3958db19
--- /dev/null
+++ b/tests/components/sdm_meter/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdm_meter/test.esp32.yaml b/tests/components/sdm_meter/test.esp32.yaml
new file mode 100644
index 0000000000..eb3958db19
--- /dev/null
+++ b/tests/components/sdm_meter/test.esp32.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdm_meter/test.esp8266.yaml b/tests/components/sdm_meter/test.esp8266.yaml
new file mode 100644
index 0000000000..0c2144f983
--- /dev/null
+++ b/tests/components/sdm_meter/test.esp8266.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdm_meter/test.rp2040.yaml b/tests/components/sdm_meter/test.rp2040.yaml
new file mode 100644
index 0000000000..0c2144f983
--- /dev/null
+++ b/tests/components/sdm_meter/test.rp2040.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sdm_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sdm_meter
+    phase_a:
+      current:
+        name: Phase A Current
+      voltage:
+        name: Phase A Voltage
+      active_power:
+        name: Phase A Power
+      power_factor:
+        name: Phase A Power Factor
+      apparent_power:
+        name: Phase A Apparent Power
+      reactive_power:
+        name: Phase A Reactive Power
+      phase_angle:
+        name: Phase A Phase Angle
diff --git a/tests/components/sdp3x/test.esp32-c3-idf.yaml b/tests/components/sdp3x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..42b90f1b81
--- /dev/null
+++ b/tests/components/sdp3x/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sdp3x/test.esp32-c3.yaml b/tests/components/sdp3x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..42b90f1b81
--- /dev/null
+++ b/tests/components/sdp3x/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sdp3x/test.esp32-idf.yaml b/tests/components/sdp3x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..00666082eb
--- /dev/null
+++ b/tests/components/sdp3x/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sdp3x/test.esp32.yaml b/tests/components/sdp3x/test.esp32.yaml
new file mode 100644
index 0000000000..00666082eb
--- /dev/null
+++ b/tests/components/sdp3x/test.esp32.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sdp3x/test.esp8266.yaml b/tests/components/sdp3x/test.esp8266.yaml
new file mode 100644
index 0000000000..42b90f1b81
--- /dev/null
+++ b/tests/components/sdp3x/test.esp8266.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sdp3x/test.rp2040.yaml b/tests/components/sdp3x/test.rp2040.yaml
new file mode 100644
index 0000000000..42b90f1b81
--- /dev/null
+++ b/tests/components/sdp3x/test.rp2040.yaml
@@ -0,0 +1,11 @@
+i2c:
+  - id: i2c_sdp3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sdp3x
+    id: filter_pressure
+    name: HVAC Filter Pressure drop
+    accuracy_decimals: 3
+    update_interval: 5s
diff --git a/tests/components/sds011/test.esp32-c3-idf.yaml b/tests/components/sds011/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e680a62dfe
--- /dev/null
+++ b/tests/components/sds011/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/sds011/test.esp32-c3.yaml b/tests/components/sds011/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e680a62dfe
--- /dev/null
+++ b/tests/components/sds011/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/sds011/test.esp32-idf.yaml b/tests/components/sds011/test.esp32-idf.yaml
new file mode 100644
index 0000000000..275390f14c
--- /dev/null
+++ b/tests/components/sds011/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/sds011/test.esp32.yaml b/tests/components/sds011/test.esp32.yaml
new file mode 100644
index 0000000000..275390f14c
--- /dev/null
+++ b/tests/components/sds011/test.esp32.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/sds011/test.esp8266.yaml b/tests/components/sds011/test.esp8266.yaml
new file mode 100644
index 0000000000..e680a62dfe
--- /dev/null
+++ b/tests/components/sds011/test.esp8266.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/sds011/test.rp2040.yaml b/tests/components/sds011/test.rp2040.yaml
new file mode 100644
index 0000000000..e680a62dfe
--- /dev/null
+++ b/tests/components/sds011/test.rp2040.yaml
@@ -0,0 +1,14 @@
+uart:
+  - id: uart_sdm_sds011
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 115200
+
+sensor:
+  - platform: sds011
+    pm_2_5:
+      name: SDS011 PM2.5
+    pm_10_0:
+      name: SDS011 PM10.0
+    rx_only: false
+    update_interval: 5min
diff --git a/tests/components/selec_meter/test.esp32-c3-idf.yaml b/tests/components/selec_meter/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..5f6e69f96f
--- /dev/null
+++ b/tests/components/selec_meter/test.esp32-c3-idf.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/selec_meter/test.esp32-c3.yaml b/tests/components/selec_meter/test.esp32-c3.yaml
new file mode 100644
index 0000000000..5f6e69f96f
--- /dev/null
+++ b/tests/components/selec_meter/test.esp32-c3.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/selec_meter/test.esp32-idf.yaml b/tests/components/selec_meter/test.esp32-idf.yaml
new file mode 100644
index 0000000000..648adc1757
--- /dev/null
+++ b/tests/components/selec_meter/test.esp32-idf.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/selec_meter/test.esp32.yaml b/tests/components/selec_meter/test.esp32.yaml
new file mode 100644
index 0000000000..648adc1757
--- /dev/null
+++ b/tests/components/selec_meter/test.esp32.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/selec_meter/test.esp8266.yaml b/tests/components/selec_meter/test.esp8266.yaml
new file mode 100644
index 0000000000..5f6e69f96f
--- /dev/null
+++ b/tests/components/selec_meter/test.esp8266.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/selec_meter/test.rp2040.yaml b/tests/components/selec_meter/test.rp2040.yaml
new file mode 100644
index 0000000000..5f6e69f96f
--- /dev/null
+++ b/tests/components/selec_meter/test.rp2040.yaml
@@ -0,0 +1,45 @@
+uart:
+  - id: uart_selec_meter
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: selec_meter
+    total_active_energy:
+      name: SelecEM2M Total Active Energy
+    import_active_energy:
+      name: SelecEM2M Import Active Energy
+    export_active_energy:
+      name: SelecEM2M Export Active Energy
+    total_reactive_energy:
+      name: SelecEM2M Total Reactive Energy
+    import_reactive_energy:
+      name: SelecEM2M Import Reactive Energy
+    export_reactive_energy:
+      name: SelecEM2M Export Reactive Energy
+    apparent_energy:
+      name: SelecEM2M Apparent Energy
+    active_power:
+      name: SelecEM2M Active Power
+    reactive_power:
+      name: SelecEM2M Reactive Power
+    apparent_power:
+      name: SelecEM2M Apparent Power
+    voltage:
+      name: SelecEM2M Voltage
+    current:
+      name: SelecEM2M Current
+    power_factor:
+      name: SelecEM2M Power Factor
+    frequency:
+      name: SelecEM2M Frequency
+    maximum_demand_active_power:
+      name: SelecEM2M Maximum Demand Active Power
+      disabled_by_default: true
+    maximum_demand_reactive_power:
+      name: SelecEM2M Maximum Demand Reactive Power
+      disabled_by_default: true
+    maximum_demand_apparent_power:
+      name: SelecEM2M Maximum Demand Apparent Power
+      disabled_by_default: true
diff --git a/tests/components/sen0321/test.esp32-c3-idf.yaml b/tests/components/sen0321/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..7fa461a7fa
--- /dev/null
+++ b/tests/components/sen0321/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen0321/test.esp32-c3.yaml b/tests/components/sen0321/test.esp32-c3.yaml
new file mode 100644
index 0000000000..7fa461a7fa
--- /dev/null
+++ b/tests/components/sen0321/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen0321/test.esp32-idf.yaml b/tests/components/sen0321/test.esp32-idf.yaml
new file mode 100644
index 0000000000..44f76bf5e6
--- /dev/null
+++ b/tests/components/sen0321/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen0321/test.esp32.yaml b/tests/components/sen0321/test.esp32.yaml
new file mode 100644
index 0000000000..44f76bf5e6
--- /dev/null
+++ b/tests/components/sen0321/test.esp32.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen0321/test.esp8266.yaml b/tests/components/sen0321/test.esp8266.yaml
new file mode 100644
index 0000000000..7fa461a7fa
--- /dev/null
+++ b/tests/components/sen0321/test.esp8266.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen0321/test.rp2040.yaml b/tests/components/sen0321/test.rp2040.yaml
new file mode 100644
index 0000000000..7fa461a7fa
--- /dev/null
+++ b/tests/components/sen0321/test.rp2040.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sen0321
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen0321
+    name: Workshop Ozone Sensor
+    id: sen0321_ozone
+    update_interval: 10s
diff --git a/tests/components/sen21231/test.esp32-c3-idf.yaml b/tests/components/sen21231/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..efd7843f56
--- /dev/null
+++ b/tests/components/sen21231/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen21231/test.esp32-c3.yaml b/tests/components/sen21231/test.esp32-c3.yaml
new file mode 100644
index 0000000000..efd7843f56
--- /dev/null
+++ b/tests/components/sen21231/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen21231/test.esp32-idf.yaml b/tests/components/sen21231/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3173683f17
--- /dev/null
+++ b/tests/components/sen21231/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen21231/test.esp32.yaml b/tests/components/sen21231/test.esp32.yaml
new file mode 100644
index 0000000000..3173683f17
--- /dev/null
+++ b/tests/components/sen21231/test.esp32.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen21231/test.esp8266.yaml b/tests/components/sen21231/test.esp8266.yaml
new file mode 100644
index 0000000000..efd7843f56
--- /dev/null
+++ b/tests/components/sen21231/test.esp8266.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen21231/test.rp2040.yaml b/tests/components/sen21231/test.rp2040.yaml
new file mode 100644
index 0000000000..efd7843f56
--- /dev/null
+++ b/tests/components/sen21231/test.rp2040.yaml
@@ -0,0 +1,9 @@
+i2c:
+  - id: i2c_sen21231
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen21231
+    id: sen21231_sensor1
+    name: Person Sensor
diff --git a/tests/components/sen5x/test.esp32-c3-idf.yaml b/tests/components/sen5x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3352a59b17
--- /dev/null
+++ b/tests/components/sen5x/test.esp32-c3-idf.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/sen5x/test.esp32-c3.yaml b/tests/components/sen5x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3352a59b17
--- /dev/null
+++ b/tests/components/sen5x/test.esp32-c3.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/sen5x/test.esp32-idf.yaml b/tests/components/sen5x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b8f89c435f
--- /dev/null
+++ b/tests/components/sen5x/test.esp32-idf.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/sen5x/test.esp32.yaml b/tests/components/sen5x/test.esp32.yaml
new file mode 100644
index 0000000000..b8f89c435f
--- /dev/null
+++ b/tests/components/sen5x/test.esp32.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/sen5x/test.esp8266.yaml b/tests/components/sen5x/test.esp8266.yaml
new file mode 100644
index 0000000000..3352a59b17
--- /dev/null
+++ b/tests/components/sen5x/test.esp8266.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/sen5x/test.rp2040.yaml b/tests/components/sen5x/test.rp2040.yaml
new file mode 100644
index 0000000000..3352a59b17
--- /dev/null
+++ b/tests/components/sen5x/test.rp2040.yaml
@@ -0,0 +1,49 @@
+i2c:
+  - id: i2c_sen5x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sen5x
+    id: sen54
+    temperature:
+      name: Temperature
+      accuracy_decimals: 1
+    humidity:
+      name: Humidity
+      accuracy_decimals: 0
+    pm_1_0:
+      name: PM <1µm Weight concentration
+      id: pm_1_0
+      accuracy_decimals: 1
+    pm_2_5:
+      name: PM <2.5µm Weight concentration
+      id: pm_2_5
+      accuracy_decimals: 1
+    pm_4_0:
+      name: PM <4µm Weight concentration
+      id: pm_4_0
+      accuracy_decimals: 1
+    pm_10_0:
+      name: PM <10µm Weight concentration
+      id: pm_10_0
+      accuracy_decimals: 1
+    nox:
+      name: NOx
+    voc:
+      name: VOC
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    temperature_compensation:
+      offset: 0
+      normalized_offset_slope: 0
+      time_constant: 0
+    auto_cleaning_interval: 604800s
+    acceleration_mode: low
+    store_baseline: true
+    address: 0x69
diff --git a/tests/components/senseair/test.esp32-c3-idf.yaml b/tests/components/senseair/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..41a441f496
--- /dev/null
+++ b/tests/components/senseair/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/senseair/test.esp32-c3.yaml b/tests/components/senseair/test.esp32-c3.yaml
new file mode 100644
index 0000000000..41a441f496
--- /dev/null
+++ b/tests/components/senseair/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/senseair/test.esp32-idf.yaml b/tests/components/senseair/test.esp32-idf.yaml
new file mode 100644
index 0000000000..daa4645f59
--- /dev/null
+++ b/tests/components/senseair/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/senseair/test.esp32.yaml b/tests/components/senseair/test.esp32.yaml
new file mode 100644
index 0000000000..daa4645f59
--- /dev/null
+++ b/tests/components/senseair/test.esp32.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/senseair/test.esp8266.yaml b/tests/components/senseair/test.esp8266.yaml
new file mode 100644
index 0000000000..41a441f496
--- /dev/null
+++ b/tests/components/senseair/test.esp8266.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/senseair/test.rp2040.yaml b/tests/components/senseair/test.rp2040.yaml
new file mode 100644
index 0000000000..41a441f496
--- /dev/null
+++ b/tests/components/senseair/test.rp2040.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_senseair
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: senseair
+    id: senseair0
+    co2:
+      name: SenseAir CO2 Value
+      on_value:
+        then:
+          - senseair.background_calibration: senseair0
+          - senseair.background_calibration_result: senseair0
+          - senseair.abc_get_period: senseair0
+          - senseair.abc_enable: senseair0
+          - senseair.abc_disable: senseair0
+    update_interval: 15s
diff --git a/tests/components/servo/test.esp32-c3-idf.yaml b/tests/components/servo/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..29ebea3359
--- /dev/null
+++ b/tests/components/servo/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: ledc
+    id: servo_output_1
+    pin: 1
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/servo/test.esp32-c3.yaml b/tests/components/servo/test.esp32-c3.yaml
new file mode 100644
index 0000000000..29ebea3359
--- /dev/null
+++ b/tests/components/servo/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: ledc
+    id: servo_output_1
+    pin: 1
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/servo/test.esp32-idf.yaml b/tests/components/servo/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e769f055b4
--- /dev/null
+++ b/tests/components/servo/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: ledc
+    id: servo_output_1
+    pin: 12
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/servo/test.esp32.yaml b/tests/components/servo/test.esp32.yaml
new file mode 100644
index 0000000000..e769f055b4
--- /dev/null
+++ b/tests/components/servo/test.esp32.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: ledc
+    id: servo_output_1
+    pin: 12
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/servo/test.esp8266.yaml b/tests/components/servo/test.esp8266.yaml
new file mode 100644
index 0000000000..48b4421641
--- /dev/null
+++ b/tests/components/servo/test.esp8266.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: esp8266_pwm
+    id: servo_output_1
+    pin: 12
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/servo/test.rp2040.yaml b/tests/components/servo/test.rp2040.yaml
new file mode 100644
index 0000000000..75efa9407e
--- /dev/null
+++ b/tests/components/servo/test.rp2040.yaml
@@ -0,0 +1,19 @@
+esphome:
+  on_boot:
+    then:
+      - servo.write:
+          id: test_servo
+          level: -100.0%
+      - servo.detach: test_servo
+
+output:
+  - platform: rp2040_pwm
+    id: servo_output_1
+    pin: 12
+
+servo:
+  id: test_servo
+  output: servo_output_1
+  restore: true
+  min_level: 4%
+  max_level: 8%
diff --git a/tests/components/sfa30/test.esp32-c3-idf.yaml b/tests/components/sfa30/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..119059e4e2
--- /dev/null
+++ b/tests/components/sfa30/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sfa30/test.esp32-c3.yaml b/tests/components/sfa30/test.esp32-c3.yaml
new file mode 100644
index 0000000000..119059e4e2
--- /dev/null
+++ b/tests/components/sfa30/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sfa30/test.esp32-idf.yaml b/tests/components/sfa30/test.esp32-idf.yaml
new file mode 100644
index 0000000000..dc7e4988e5
--- /dev/null
+++ b/tests/components/sfa30/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sfa30/test.esp32.yaml b/tests/components/sfa30/test.esp32.yaml
new file mode 100644
index 0000000000..dc7e4988e5
--- /dev/null
+++ b/tests/components/sfa30/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sfa30/test.esp8266.yaml b/tests/components/sfa30/test.esp8266.yaml
new file mode 100644
index 0000000000..119059e4e2
--- /dev/null
+++ b/tests/components/sfa30/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sfa30/test.rp2040.yaml b/tests/components/sfa30/test.rp2040.yaml
new file mode 100644
index 0000000000..119059e4e2
--- /dev/null
+++ b/tests/components/sfa30/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sfa30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sfa30
+    formaldehyde:
+      name: "SFA30 formaldehyde"
+    temperature:
+      name: "SFA30 temperature"
+    humidity:
+      name: "SFA30 humidity"
+    address: 0x5D
+    update_interval: 30s
diff --git a/tests/components/sgp30/test.esp32-c3-idf.yaml b/tests/components/sgp30/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..45de67e94b
--- /dev/null
+++ b/tests/components/sgp30/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp30/test.esp32-c3.yaml b/tests/components/sgp30/test.esp32-c3.yaml
new file mode 100644
index 0000000000..45de67e94b
--- /dev/null
+++ b/tests/components/sgp30/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp30/test.esp32-idf.yaml b/tests/components/sgp30/test.esp32-idf.yaml
new file mode 100644
index 0000000000..6ea23c25cd
--- /dev/null
+++ b/tests/components/sgp30/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp30/test.esp32.yaml b/tests/components/sgp30/test.esp32.yaml
new file mode 100644
index 0000000000..6ea23c25cd
--- /dev/null
+++ b/tests/components/sgp30/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp30/test.esp8266.yaml b/tests/components/sgp30/test.esp8266.yaml
new file mode 100644
index 0000000000..45de67e94b
--- /dev/null
+++ b/tests/components/sgp30/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp30/test.rp2040.yaml b/tests/components/sgp30/test.rp2040.yaml
new file mode 100644
index 0000000000..45de67e94b
--- /dev/null
+++ b/tests/components/sgp30/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sgp30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp30
+    eco2:
+      name: Workshop eCO2
+      accuracy_decimals: 1
+    tvoc:
+      name: Workshop TVOC
+      accuracy_decimals: 1
+    address: 0x58
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.esp32-c3-idf.yaml b/tests/components/sgp4x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b2876478bd
--- /dev/null
+++ b/tests/components/sgp4x/test.esp32-c3-idf.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.esp32-c3.yaml b/tests/components/sgp4x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b2876478bd
--- /dev/null
+++ b/tests/components/sgp4x/test.esp32-c3.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.esp32-idf.yaml b/tests/components/sgp4x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c7380b5a10
--- /dev/null
+++ b/tests/components/sgp4x/test.esp32-idf.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.esp32.yaml b/tests/components/sgp4x/test.esp32.yaml
new file mode 100644
index 0000000000..c7380b5a10
--- /dev/null
+++ b/tests/components/sgp4x/test.esp32.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.esp8266.yaml b/tests/components/sgp4x/test.esp8266.yaml
new file mode 100644
index 0000000000..b2876478bd
--- /dev/null
+++ b/tests/components/sgp4x/test.esp8266.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/sgp4x/test.rp2040.yaml b/tests/components/sgp4x/test.rp2040.yaml
new file mode 100644
index 0000000000..b2876478bd
--- /dev/null
+++ b/tests/components/sgp4x/test.rp2040.yaml
@@ -0,0 +1,27 @@
+i2c:
+  - id: i2c_sgp4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sgp4x
+    voc:
+      name: VOC Index
+      id: sgp40_voc_index
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    nox:
+      name: NOx
+      algorithm_tuning:
+        index_offset: 100
+        learning_time_offset_hours: 12
+        learning_time_gain_hours: 12
+        gating_max_duration_minutes: 180
+        std_initial: 50
+        gain_factor: 230
+    update_interval: 5s
diff --git a/tests/components/shelly_dimmer/test.esp8266.yaml b/tests/components/shelly_dimmer/test.esp8266.yaml
new file mode 100644
index 0000000000..3acd0260d5
--- /dev/null
+++ b/tests/components/shelly_dimmer/test.esp8266.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_shelly_dimmer
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+light:
+  - platform: shelly_dimmer
+    name: Shelly Dimmer Light
+    power:
+      name: Shelly Dimmer Power
+    voltage:
+      name: Shelly Dimmer Voltage
+    current:
+      name: Shelly Dimmer Current
+    max_brightness: 500
+    firmware: "51.6"
+    nrst_pin: 13
+    boot0_pin: 14
diff --git a/tests/components/sht3xd/test.esp32-c3-idf.yaml b/tests/components/sht3xd/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0409ff65c6
--- /dev/null
+++ b/tests/components/sht3xd/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht3xd/test.esp32-c3.yaml b/tests/components/sht3xd/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0409ff65c6
--- /dev/null
+++ b/tests/components/sht3xd/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht3xd/test.esp32-idf.yaml b/tests/components/sht3xd/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2b6ee50760
--- /dev/null
+++ b/tests/components/sht3xd/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht3xd/test.esp32.yaml b/tests/components/sht3xd/test.esp32.yaml
new file mode 100644
index 0000000000..2b6ee50760
--- /dev/null
+++ b/tests/components/sht3xd/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht3xd/test.esp8266.yaml b/tests/components/sht3xd/test.esp8266.yaml
new file mode 100644
index 0000000000..0409ff65c6
--- /dev/null
+++ b/tests/components/sht3xd/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht3xd/test.rp2040.yaml b/tests/components/sht3xd/test.rp2040.yaml
new file mode 100644
index 0000000000..0409ff65c6
--- /dev/null
+++ b/tests/components/sht3xd/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht3xd
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht3xd
+    temperature:
+      name: SHT3XD Temperature
+    humidity:
+      name: SHT3XD Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.esp32-c3-idf.yaml b/tests/components/sht4x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0bcdd864f6
--- /dev/null
+++ b/tests/components/sht4x/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.esp32-c3.yaml b/tests/components/sht4x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0bcdd864f6
--- /dev/null
+++ b/tests/components/sht4x/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.esp32-idf.yaml b/tests/components/sht4x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..13ec524d7d
--- /dev/null
+++ b/tests/components/sht4x/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.esp32.yaml b/tests/components/sht4x/test.esp32.yaml
new file mode 100644
index 0000000000..13ec524d7d
--- /dev/null
+++ b/tests/components/sht4x/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.esp8266.yaml b/tests/components/sht4x/test.esp8266.yaml
new file mode 100644
index 0000000000..0bcdd864f6
--- /dev/null
+++ b/tests/components/sht4x/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/sht4x/test.rp2040.yaml b/tests/components/sht4x/test.rp2040.yaml
new file mode 100644
index 0000000000..0bcdd864f6
--- /dev/null
+++ b/tests/components/sht4x/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_sht4x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sht4x
+    temperature:
+      name: SHT4X Temperature
+    humidity:
+      name: SHT4X Humidity
+    address: 0x44
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.esp32-c3-idf.yaml b/tests/components/shtcx/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c1c7a2a63f
--- /dev/null
+++ b/tests/components/shtcx/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.esp32-c3.yaml b/tests/components/shtcx/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c1c7a2a63f
--- /dev/null
+++ b/tests/components/shtcx/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.esp32-idf.yaml b/tests/components/shtcx/test.esp32-idf.yaml
new file mode 100644
index 0000000000..619bac9548
--- /dev/null
+++ b/tests/components/shtcx/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.esp32.yaml b/tests/components/shtcx/test.esp32.yaml
new file mode 100644
index 0000000000..619bac9548
--- /dev/null
+++ b/tests/components/shtcx/test.esp32.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.esp8266.yaml b/tests/components/shtcx/test.esp8266.yaml
new file mode 100644
index 0000000000..c1c7a2a63f
--- /dev/null
+++ b/tests/components/shtcx/test.esp8266.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shtcx/test.rp2040.yaml b/tests/components/shtcx/test.rp2040.yaml
new file mode 100644
index 0000000000..c1c7a2a63f
--- /dev/null
+++ b/tests/components/shtcx/test.rp2040.yaml
@@ -0,0 +1,13 @@
+i2c:
+  - id: i2c_shtcx
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: shtcx
+    temperature:
+      name: SHTCX Temperature
+    humidity:
+      name: SHTCX Humidity
+    address: 0x70
+    update_interval: 15s
diff --git a/tests/components/shutdown/test.esp32-c3-idf.yaml b/tests/components/shutdown/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/shutdown/test.esp32-c3.yaml b/tests/components/shutdown/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/shutdown/test.esp32-idf.yaml b/tests/components/shutdown/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/shutdown/test.esp32.yaml b/tests/components/shutdown/test.esp32.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.esp32.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/shutdown/test.esp8266.yaml b/tests/components/shutdown/test.esp8266.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.esp8266.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/shutdown/test.rp2040.yaml b/tests/components/shutdown/test.rp2040.yaml
new file mode 100644
index 0000000000..f47e7da85d
--- /dev/null
+++ b/tests/components/shutdown/test.rp2040.yaml
@@ -0,0 +1,7 @@
+button:
+  - platform: shutdown
+    name: Shutdown Button
+
+switch:
+  - platform: shutdown
+    name: Shutdown Switch
diff --git a/tests/components/sigma_delta_output/test.esp32-c3-idf.yaml b/tests/components/sigma_delta_output/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sigma_delta_output/test.esp32-c3.yaml b/tests/components/sigma_delta_output/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sigma_delta_output/test.esp32-idf.yaml b/tests/components/sigma_delta_output/test.esp32-idf.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sigma_delta_output/test.esp32.yaml b/tests/components/sigma_delta_output/test.esp32.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.esp32.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sigma_delta_output/test.esp8266.yaml b/tests/components/sigma_delta_output/test.esp8266.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.esp8266.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sigma_delta_output/test.rp2040.yaml b/tests/components/sigma_delta_output/test.rp2040.yaml
new file mode 100644
index 0000000000..2a9a5d2c3b
--- /dev/null
+++ b/tests/components/sigma_delta_output/test.rp2040.yaml
@@ -0,0 +1,16 @@
+output:
+  - platform: sigma_delta_output
+    id: sddac
+    pin: 4
+    turn_on_action:
+      then:
+        - logger.log: "Turned on"
+    turn_off_action:
+      then:
+        - logger.log: "Turned off"
+    state_change_action:
+      then:
+        - logger.log:
+            format: "Changed state: %d"
+            args: ["state"]
+    update_interval: 60s
diff --git a/tests/components/sim800l/test.esp32-c3-idf.yaml b/tests/components/sim800l/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..7ff359d1e7
--- /dev/null
+++ b/tests/components/sim800l/test.esp32-c3-idf.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/sim800l/test.esp32-c3.yaml b/tests/components/sim800l/test.esp32-c3.yaml
new file mode 100644
index 0000000000..7ff359d1e7
--- /dev/null
+++ b/tests/components/sim800l/test.esp32-c3.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/sim800l/test.esp32-idf.yaml b/tests/components/sim800l/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c116548c6f
--- /dev/null
+++ b/tests/components/sim800l/test.esp32-idf.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/sim800l/test.esp32.yaml b/tests/components/sim800l/test.esp32.yaml
new file mode 100644
index 0000000000..c116548c6f
--- /dev/null
+++ b/tests/components/sim800l/test.esp32.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/sim800l/test.esp8266.yaml b/tests/components/sim800l/test.esp8266.yaml
new file mode 100644
index 0000000000..7ff359d1e7
--- /dev/null
+++ b/tests/components/sim800l/test.esp8266.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/sim800l/test.rp2040.yaml b/tests/components/sim800l/test.rp2040.yaml
new file mode 100644
index 0000000000..7ff359d1e7
--- /dev/null
+++ b/tests/components/sim800l/test.rp2040.yaml
@@ -0,0 +1,37 @@
+esphome:
+  on_boot:
+    then:
+      - sim800l.send_sms:
+          recipient: '+15551234567'
+          message: Hello there
+      - sim800l.dial:
+          recipient: '+15551234567'
+      - sim800l.connect
+      - sim800l.disconnect
+      - sim800l.send_ussd:
+          ussd: test_ussd
+
+uart:
+  - id: uart_sim800l
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sim800l:
+  on_sms_received:
+    - lambda: |-
+        std::string str;
+        str = sender;
+        str = message;
+    - sim800l.send_sms:
+        message: hello you
+        recipient: "+1234"
+    - sim800l.dial:
+        recipient: "+1234"
+  on_incoming_call:
+    - logger.log:
+        format: "Incoming call from '%s'"
+        args: ["caller_id.c_str()"]
+    - sim800l.disconnect
+  on_ussd_received:
+    - logger.log: "ussd_received"
diff --git a/tests/components/slow_pwm/test.esp32-c3-idf.yaml b/tests/components/slow_pwm/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.esp32-c3-idf.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/slow_pwm/test.esp32-c3.yaml b/tests/components/slow_pwm/test.esp32-c3.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.esp32-c3.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/slow_pwm/test.esp32-idf.yaml b/tests/components/slow_pwm/test.esp32-idf.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.esp32-idf.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/slow_pwm/test.esp32.yaml b/tests/components/slow_pwm/test.esp32.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.esp32.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/slow_pwm/test.esp8266.yaml b/tests/components/slow_pwm/test.esp8266.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.esp8266.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/slow_pwm/test.rp2040.yaml b/tests/components/slow_pwm/test.rp2040.yaml
new file mode 100644
index 0000000000..6bfb2f8ac5
--- /dev/null
+++ b/tests/components/slow_pwm/test.rp2040.yaml
@@ -0,0 +1,6 @@
+output:
+  - platform: slow_pwm
+    id: test_slow_pwm
+    pin: 4
+    period: 15s
+    restart_cycle_on_state_change: false
diff --git a/tests/components/sm16716/test.esp32-c3-idf.yaml b/tests/components/sm16716/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.esp32-c3-idf.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm16716/test.esp32-c3.yaml b/tests/components/sm16716/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.esp32-c3.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm16716/test.esp32-idf.yaml b/tests/components/sm16716/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.esp32-idf.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm16716/test.esp32.yaml b/tests/components/sm16716/test.esp32.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.esp32.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm16716/test.esp8266.yaml b/tests/components/sm16716/test.esp8266.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.esp8266.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm16716/test.rp2040.yaml b/tests/components/sm16716/test.rp2040.yaml
new file mode 100644
index 0000000000..3bf2712f4e
--- /dev/null
+++ b/tests/components/sm16716/test.rp2040.yaml
@@ -0,0 +1,16 @@
+sm16716:
+  clock_pin: 4
+  data_pin: 5
+  num_channels: 3
+  num_chips: 1
+
+output:
+  - platform: sm16716
+    id: sm16716_red
+    channel: 1
+  - platform: sm16716
+    id: sm16716_green
+    channel: 0
+  - platform: sm16716
+    id: sm16716_blue
+    channel: 2
diff --git a/tests/components/sm2135/test.esp32-c3-idf.yaml b/tests/components/sm2135/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2135/test.esp32-c3.yaml b/tests/components/sm2135/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2135/test.esp32-idf.yaml b/tests/components/sm2135/test.esp32-idf.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2135/test.esp32.yaml b/tests/components/sm2135/test.esp32.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.esp32.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2135/test.esp8266.yaml b/tests/components/sm2135/test.esp8266.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.esp8266.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2135/test.rp2040.yaml b/tests/components/sm2135/test.rp2040.yaml
new file mode 100644
index 0000000000..9a0de60839
--- /dev/null
+++ b/tests/components/sm2135/test.rp2040.yaml
@@ -0,0 +1,22 @@
+sm2135:
+  clock_pin: 4
+  data_pin: 5
+  rgb_current: 20mA
+  cw_current: 60mA
+
+output:
+  - platform: sm2135
+    id: sm2135_0
+    channel: 0
+  - platform: sm2135
+    id: sm2135_1
+    channel: 1
+  - platform: sm2135
+    id: sm2135_2
+    channel: 2
+  - platform: sm2135
+    id: sm2135_3
+    channel: 3
+  - platform: sm2135
+    id: sm2135_4
+    channel: 4
diff --git a/tests/components/sm2235/test.esp32-c3-idf.yaml b/tests/components/sm2235/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2235/test.esp32-c3.yaml b/tests/components/sm2235/test.esp32-c3.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2235/test.esp32-idf.yaml b/tests/components/sm2235/test.esp32-idf.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2235/test.esp32.yaml b/tests/components/sm2235/test.esp32.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.esp32.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2235/test.esp8266.yaml b/tests/components/sm2235/test.esp8266.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.esp8266.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2235/test.rp2040.yaml b/tests/components/sm2235/test.rp2040.yaml
new file mode 100644
index 0000000000..043d43d6f1
--- /dev/null
+++ b/tests/components/sm2235/test.rp2040.yaml
@@ -0,0 +1,22 @@
+sm2235:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2235
+    id: sm2235_red
+    channel: 1
+  - platform: sm2235
+    id: sm2235_green
+    channel: 0
+  - platform: sm2235
+    id: sm2235_blue
+    channel: 2
+  - platform: sm2235
+    id: sm2235_coldwhite
+    channel: 4
+  - platform: sm2235
+    id: sm2235_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.esp32-c3-idf.yaml b/tests/components/sm2335/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.esp32-c3-idf.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.esp32-c3.yaml b/tests/components/sm2335/test.esp32-c3.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.esp32-c3.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.esp32-idf.yaml b/tests/components/sm2335/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.esp32-idf.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.esp32.yaml b/tests/components/sm2335/test.esp32.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.esp32.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.esp8266.yaml b/tests/components/sm2335/test.esp8266.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.esp8266.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm2335/test.rp2040.yaml b/tests/components/sm2335/test.rp2040.yaml
new file mode 100644
index 0000000000..a5b2aedeb5
--- /dev/null
+++ b/tests/components/sm2335/test.rp2040.yaml
@@ -0,0 +1,22 @@
+sm2335:
+  clock_pin: 4
+  data_pin: 5
+  max_power_color_channels: 9
+  max_power_white_channels: 9
+
+output:
+  - platform: sm2335
+    id: sm2335_red
+    channel: 1
+  - platform: sm2335
+    id: sm2335_green
+    channel: 0
+  - platform: sm2335
+    id: sm2335_blue
+    channel: 2
+  - platform: sm2335
+    id: sm2335_coldwhite
+    channel: 4
+  - platform: sm2335
+    id: sm2335_warmwhite
+    channel: 3
diff --git a/tests/components/sm300d2/test.esp32-c3-idf.yaml b/tests/components/sm300d2/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..bcd0a728b2
--- /dev/null
+++ b/tests/components/sm300d2/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sm300d2/test.esp32-c3.yaml b/tests/components/sm300d2/test.esp32-c3.yaml
new file mode 100644
index 0000000000..bcd0a728b2
--- /dev/null
+++ b/tests/components/sm300d2/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sm300d2/test.esp32-idf.yaml b/tests/components/sm300d2/test.esp32-idf.yaml
new file mode 100644
index 0000000000..92dba4fb3b
--- /dev/null
+++ b/tests/components/sm300d2/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sm300d2/test.esp32.yaml b/tests/components/sm300d2/test.esp32.yaml
new file mode 100644
index 0000000000..92dba4fb3b
--- /dev/null
+++ b/tests/components/sm300d2/test.esp32.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sm300d2/test.esp8266.yaml b/tests/components/sm300d2/test.esp8266.yaml
new file mode 100644
index 0000000000..bcd0a728b2
--- /dev/null
+++ b/tests/components/sm300d2/test.esp8266.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sm300d2/test.rp2040.yaml b/tests/components/sm300d2/test.rp2040.yaml
new file mode 100644
index 0000000000..bcd0a728b2
--- /dev/null
+++ b/tests/components/sm300d2/test.rp2040.yaml
@@ -0,0 +1,23 @@
+uart:
+  - id: uart_sm300d2
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: sm300d2
+    co2:
+      name: SM300D2 CO2 Value
+    formaldehyde:
+      name: SM300D2 Formaldehyde Value
+    tvoc:
+      name: SM300D2 TVOC Value
+    pm_2_5:
+      name: SM300D2 PM2.5 Value
+    pm_10_0:
+      name: SM300D2 PM10 Value
+    temperature:
+      name: SM300D2 Temperature Value
+    humidity:
+      name: SM300D2 Humidity Value
+    update_interval: 60s
diff --git a/tests/components/sml/test.esp32-c3-idf.yaml b/tests/components/sml/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..903f968c26
--- /dev/null
+++ b/tests/components/sml/test.esp32-c3-idf.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/sml/test.esp32-c3.yaml b/tests/components/sml/test.esp32-c3.yaml
new file mode 100644
index 0000000000..903f968c26
--- /dev/null
+++ b/tests/components/sml/test.esp32-c3.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/sml/test.esp32-idf.yaml b/tests/components/sml/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7217199380
--- /dev/null
+++ b/tests/components/sml/test.esp32-idf.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/sml/test.esp32.yaml b/tests/components/sml/test.esp32.yaml
new file mode 100644
index 0000000000..7217199380
--- /dev/null
+++ b/tests/components/sml/test.esp32.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/sml/test.esp8266.yaml b/tests/components/sml/test.esp8266.yaml
new file mode 100644
index 0000000000..903f968c26
--- /dev/null
+++ b/tests/components/sml/test.esp8266.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/sml/test.rp2040.yaml b/tests/components/sml/test.rp2040.yaml
new file mode 100644
index 0000000000..903f968c26
--- /dev/null
+++ b/tests/components/sml/test.rp2040.yaml
@@ -0,0 +1,31 @@
+uart:
+  - id: uart_sml
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sml:
+  id: mysml
+  on_data:
+    - logger.log: "SML on_data"
+
+sensor:
+  - platform: sml
+    name: Total energy
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "1-0:1.8.0"
+    unit_of_measurement: kWh
+    accuracy_decimals: 1
+    device_class: energy
+    state_class: total_increasing
+    filters:
+      - multiply: 0.0001
+
+text_sensor:
+  - platform: sml
+    name: Manufacturer
+    sml_id: mysml
+    server_id: 0123456789abcdef
+    obis_code: "129-129:199.130.3"
+    format: text
diff --git a/tests/components/smt100/test.esp32-c3-idf.yaml b/tests/components/smt100/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..4277f2567b
--- /dev/null
+++ b/tests/components/smt100/test.esp32-c3-idf.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s
diff --git a/tests/components/smt100/test.esp32-c3.yaml b/tests/components/smt100/test.esp32-c3.yaml
new file mode 100644
index 0000000000..4277f2567b
--- /dev/null
+++ b/tests/components/smt100/test.esp32-c3.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s
diff --git a/tests/components/smt100/test.esp32-idf.yaml b/tests/components/smt100/test.esp32-idf.yaml
new file mode 100644
index 0000000000..7c19f4bc45
--- /dev/null
+++ b/tests/components/smt100/test.esp32-idf.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s
diff --git a/tests/components/smt100/test.esp32.yaml b/tests/components/smt100/test.esp32.yaml
new file mode 100644
index 0000000000..7c19f4bc45
--- /dev/null
+++ b/tests/components/smt100/test.esp32.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s
diff --git a/tests/components/smt100/test.esp8266.yaml b/tests/components/smt100/test.esp8266.yaml
new file mode 100644
index 0000000000..4277f2567b
--- /dev/null
+++ b/tests/components/smt100/test.esp8266.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s
diff --git a/tests/components/smt100/test.rp2040.yaml b/tests/components/smt100/test.rp2040.yaml
new file mode 100644
index 0000000000..4277f2567b
--- /dev/null
+++ b/tests/components/smt100/test.rp2040.yaml
@@ -0,0 +1,19 @@
+uart:
+  - id: uart_smt100
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+sensor:
+  - platform: smt100
+    counts:
+      name: Counts
+    dielectric_constant:
+      name: Dielectric Constant
+    temperature:
+      name: Temperature
+    moisture:
+      name: Moisture
+    voltage:
+      name: Voltage
+    update_interval: 60s

From 06829b53fe134cb74a06afd00d618c85cc189052 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Tue, 23 Apr 2024 14:40:20 -0500
Subject: [PATCH 32/81] Add some components to the new testing framework (S
 part 2) (#6227)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .../sn74hc165/test.esp32-c3-idf.yaml          | 14 ++++
 tests/components/sn74hc165/test.esp32-c3.yaml | 14 ++++
 .../components/sn74hc165/test.esp32-idf.yaml  | 14 ++++
 tests/components/sn74hc165/test.esp32.yaml    | 14 ++++
 tests/components/sn74hc165/test.esp8266.yaml  | 14 ++++
 tests/components/sn74hc165/test.rp2040.yaml   | 14 ++++
 tests/components/sntp/test.esp32-c3-idf.yaml  | 15 ++++
 tests/components/sntp/test.esp32-c3.yaml      | 15 ++++
 tests/components/sntp/test.esp32-idf.yaml     | 15 ++++
 tests/components/sntp/test.esp32.yaml         | 15 ++++
 tests/components/sntp/test.esp8266.yaml       | 15 ++++
 tests/components/sntp/test.rp2040.yaml        | 15 ++++
 .../components/sonoff_d1/test.esp32-idf.yaml  | 12 +++
 tests/components/sonoff_d1/test.esp32.yaml    | 12 +++
 tests/components/sonoff_d1/test.esp8266.yaml  | 12 +++
 .../components/speaker/test.esp32-c3-idf.yaml | 17 ++++
 tests/components/speaker/test.esp32-c3.yaml   | 17 ++++
 tests/components/speaker/test.esp32-idf.yaml  | 17 ++++
 tests/components/speaker/test.esp32.yaml      | 17 ++++
 tests/components/speed/test.esp32-c3-idf.yaml |  9 ++
 tests/components/speed/test.esp32-c3.yaml     |  9 ++
 tests/components/speed/test.esp32-idf.yaml    |  9 ++
 tests/components/speed/test.esp32.yaml        |  9 ++
 tests/components/speed/test.esp8266.yaml      |  9 ++
 tests/components/speed/test.rp2040.yaml       |  9 ++
 tests/components/spi/test.esp32-c3-idf.yaml   |  5 ++
 tests/components/spi/test.esp32-c3.yaml       |  5 ++
 tests/components/spi/test.esp32-idf.yaml      |  5 ++
 tests/components/spi/test.esp32.yaml          |  5 ++
 tests/components/spi/test.esp8266.yaml        |  5 ++
 tests/components/spi/test.rp2040.yaml         |  5 ++
 .../spi_device/test.esp32-c3-idf.yaml         | 11 +++
 .../components/spi_device/test.esp32-c3.yaml  | 11 +++
 .../components/spi_device/test.esp32-idf.yaml | 11 +++
 tests/components/spi_device/test.esp32.yaml   | 11 +++
 tests/components/spi_device/test.esp8266.yaml | 11 +++
 tests/components/spi_device/test.rp2040.yaml  | 11 +++
 .../spi_led_strip/test.esp32-c3-idf.yaml      | 13 +++
 .../spi_led_strip/test.esp32-c3.yaml          | 13 +++
 .../spi_led_strip/test.esp32-idf.yaml         | 13 +++
 .../components/spi_led_strip/test.esp32.yaml  | 13 +++
 .../spi_led_strip/test.esp8266.yaml           | 13 +++
 .../components/spi_led_strip/test.rp2040.yaml | 13 +++
 .../sprinkler/test.esp32-c3-idf.yaml          | 83 +++++++++++++++++++
 tests/components/sprinkler/test.esp32-c3.yaml | 83 +++++++++++++++++++
 .../components/sprinkler/test.esp32-idf.yaml  | 83 +++++++++++++++++++
 tests/components/sprinkler/test.esp32.yaml    | 83 +++++++++++++++++++
 tests/components/sprinkler/test.esp8266.yaml  | 83 +++++++++++++++++++
 tests/components/sprinkler/test.rp2040.yaml   | 83 +++++++++++++++++++
 tests/components/sps30/test.esp32-c3-idf.yaml | 36 ++++++++
 tests/components/sps30/test.esp32-c3.yaml     | 36 ++++++++
 tests/components/sps30/test.esp32-idf.yaml    | 36 ++++++++
 tests/components/sps30/test.esp32.yaml        | 36 ++++++++
 tests/components/sps30/test.esp8266.yaml      | 36 ++++++++
 tests/components/sps30/test.rp2040.yaml       | 36 ++++++++
 .../ssd1306_i2c/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1306_i2c/test.esp32-c3.yaml | 25 ++++++
 .../ssd1306_i2c/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1306_i2c/test.esp32.yaml  | 25 ++++++
 .../components/ssd1306_i2c/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1306_i2c/test.rp2040.yaml | 25 ++++++
 .../ssd1306_spi/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1306_spi/test.esp32-c3.yaml | 25 ++++++
 .../ssd1306_spi/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1306_spi/test.esp32.yaml  | 25 ++++++
 .../components/ssd1306_spi/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1306_spi/test.rp2040.yaml | 25 ++++++
 .../ssd1322_spi/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1322_spi/test.esp32-c3.yaml | 25 ++++++
 .../ssd1322_spi/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1322_spi/test.esp32.yaml  | 25 ++++++
 .../components/ssd1322_spi/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1322_spi/test.rp2040.yaml | 25 ++++++
 .../ssd1325_spi/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1325_spi/test.esp32-c3.yaml | 25 ++++++
 .../ssd1325_spi/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1325_spi/test.esp32.yaml  | 25 ++++++
 .../components/ssd1325_spi/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1325_spi/test.rp2040.yaml | 25 ++++++
 .../ssd1327_i2c/test.esp32-c3-idf.yaml        | 24 ++++++
 .../components/ssd1327_i2c/test.esp32-c3.yaml | 24 ++++++
 .../ssd1327_i2c/test.esp32-idf.yaml           | 24 ++++++
 tests/components/ssd1327_i2c/test.esp32.yaml  | 24 ++++++
 .../components/ssd1327_i2c/test.esp8266.yaml  | 24 ++++++
 tests/components/ssd1327_i2c/test.rp2040.yaml | 24 ++++++
 .../ssd1327_spi/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1327_spi/test.esp32-c3.yaml | 25 ++++++
 .../ssd1327_spi/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1327_spi/test.esp32.yaml  | 25 ++++++
 .../components/ssd1327_spi/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1327_spi/test.rp2040.yaml | 25 ++++++
 .../ssd1331_spi/test.esp32-c3-idf.yaml        | 24 ++++++
 .../components/ssd1331_spi/test.esp32-c3.yaml | 24 ++++++
 .../ssd1331_spi/test.esp32-idf.yaml           | 24 ++++++
 tests/components/ssd1331_spi/test.esp32.yaml  | 24 ++++++
 .../components/ssd1331_spi/test.esp8266.yaml  | 24 ++++++
 tests/components/ssd1331_spi/test.rp2040.yaml | 24 ++++++
 .../ssd1351_spi/test.esp32-c3-idf.yaml        | 25 ++++++
 .../components/ssd1351_spi/test.esp32-c3.yaml | 25 ++++++
 .../ssd1351_spi/test.esp32-idf.yaml           | 25 ++++++
 tests/components/ssd1351_spi/test.esp32.yaml  | 25 ++++++
 .../components/ssd1351_spi/test.esp8266.yaml  | 25 ++++++
 tests/components/ssd1351_spi/test.rp2040.yaml | 25 ++++++
 .../st7567_i2c/test.esp32-c3-idf.yaml         | 23 +++++
 .../components/st7567_i2c/test.esp32-c3.yaml  | 23 +++++
 .../components/st7567_i2c/test.esp32-idf.yaml | 23 +++++
 tests/components/st7567_i2c/test.esp32.yaml   | 23 +++++
 tests/components/st7567_i2c/test.esp8266.yaml | 23 +++++
 tests/components/st7567_i2c/test.rp2040.yaml  | 23 +++++
 .../st7567_spi/test.esp32-c3-idf.yaml         | 24 ++++++
 .../components/st7567_spi/test.esp32-c3.yaml  | 24 ++++++
 .../components/st7567_spi/test.esp32-idf.yaml | 24 ++++++
 tests/components/st7567_spi/test.esp32.yaml   | 24 ++++++
 tests/components/st7567_spi/test.esp8266.yaml | 24 ++++++
 tests/components/st7567_spi/test.rp2040.yaml  | 24 ++++++
 .../components/st7735/test.esp32-c3-idf.yaml  | 29 +++++++
 tests/components/st7735/test.esp32-c3.yaml    | 29 +++++++
 tests/components/st7735/test.esp32-idf.yaml   | 29 +++++++
 tests/components/st7735/test.esp32.yaml       | 29 +++++++
 tests/components/st7735/test.esp8266.yaml     | 29 +++++++
 tests/components/st7735/test.rp2040.yaml      | 29 +++++++
 .../components/st7789v/test.esp32-c3-idf.yaml | 25 ++++++
 tests/components/st7789v/test.esp32-c3.yaml   | 25 ++++++
 tests/components/st7789v/test.esp32-idf.yaml  | 25 ++++++
 tests/components/st7789v/test.esp32.yaml      | 25 ++++++
 tests/components/st7789v/test.esp8266.yaml    | 25 ++++++
 tests/components/st7789v/test.rp2040.yaml     | 25 ++++++
 .../components/st7920/test.esp32-c3-idf.yaml  | 24 ++++++
 tests/components/st7920/test.esp32-c3.yaml    | 24 ++++++
 tests/components/st7920/test.esp32-idf.yaml   | 24 ++++++
 tests/components/st7920/test.esp32.yaml       | 24 ++++++
 tests/components/st7920/test.esp8266.yaml     | 24 ++++++
 tests/components/st7920/test.rp2040.yaml      | 24 ++++++
 .../components/status/test.esp32-c3-idf.yaml  | 10 +++
 tests/components/status/test.esp32-c3.yaml    | 10 +++
 tests/components/status/test.esp32-idf.yaml   | 10 +++
 tests/components/status/test.esp32.yaml       | 10 +++
 tests/components/status/test.esp8266.yaml     | 10 +++
 tests/components/status/test.rp2040.yaml      | 10 +++
 .../status_led/test.esp32-c3-idf.yaml         | 10 +++
 .../components/status_led/test.esp32-c3.yaml  | 10 +++
 .../components/status_led/test.esp32-idf.yaml | 10 +++
 tests/components/status_led/test.esp32.yaml   | 10 +++
 tests/components/status_led/test.esp8266.yaml | 10 +++
 tests/components/status_led/test.rp2040.yaml  | 10 +++
 .../components/stepper/test.esp32-c3-idf.yaml | 27 ++++++
 tests/components/stepper/test.esp32-c3.yaml   | 27 ++++++
 tests/components/stepper/test.esp32-idf.yaml  | 27 ++++++
 tests/components/stepper/test.esp32.yaml      | 27 ++++++
 tests/components/stepper/test.esp8266.yaml    | 27 ++++++
 tests/components/stepper/test.rp2040.yaml     | 27 ++++++
 tests/components/sts3x/test.esp32-c3-idf.yaml | 10 +++
 tests/components/sts3x/test.esp32-c3.yaml     | 10 +++
 tests/components/sts3x/test.esp32-idf.yaml    | 10 +++
 tests/components/sts3x/test.esp32.yaml        | 10 +++
 tests/components/sts3x/test.esp8266.yaml      | 10 +++
 tests/components/sts3x/test.rp2040.yaml       | 10 +++
 tests/components/sun/test.esp32-c3-idf.yaml   | 38 +++++++++
 tests/components/sun/test.esp32-c3.yaml       | 38 +++++++++
 tests/components/sun/test.esp32-idf.yaml      | 38 +++++++++
 tests/components/sun/test.esp32.yaml          | 38 +++++++++
 tests/components/sun/test.esp8266.yaml        | 38 +++++++++
 tests/components/sun/test.rp2040.yaml         | 38 +++++++++
 .../components/sx1509/test.esp32-c3-idf.yaml  | 15 ++++
 tests/components/sx1509/test.esp32-c3.yaml    | 15 ++++
 tests/components/sx1509/test.esp32-idf.yaml   | 15 ++++
 tests/components/sx1509/test.esp32.yaml       | 15 ++++
 tests/components/sx1509/test.esp8266.yaml     | 15 ++++
 tests/components/sx1509/test.rp2040.yaml      | 15 ++++
 169 files changed, 3818 insertions(+)
 create mode 100644 tests/components/sn74hc165/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sn74hc165/test.esp32-c3.yaml
 create mode 100644 tests/components/sn74hc165/test.esp32-idf.yaml
 create mode 100644 tests/components/sn74hc165/test.esp32.yaml
 create mode 100644 tests/components/sn74hc165/test.esp8266.yaml
 create mode 100644 tests/components/sn74hc165/test.rp2040.yaml
 create mode 100644 tests/components/sntp/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sntp/test.esp32-c3.yaml
 create mode 100644 tests/components/sntp/test.esp32-idf.yaml
 create mode 100644 tests/components/sntp/test.esp32.yaml
 create mode 100644 tests/components/sntp/test.esp8266.yaml
 create mode 100644 tests/components/sntp/test.rp2040.yaml
 create mode 100644 tests/components/sonoff_d1/test.esp32-idf.yaml
 create mode 100644 tests/components/sonoff_d1/test.esp32.yaml
 create mode 100644 tests/components/sonoff_d1/test.esp8266.yaml
 create mode 100644 tests/components/speaker/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/speaker/test.esp32-c3.yaml
 create mode 100644 tests/components/speaker/test.esp32-idf.yaml
 create mode 100644 tests/components/speaker/test.esp32.yaml
 create mode 100644 tests/components/speed/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/speed/test.esp32-c3.yaml
 create mode 100644 tests/components/speed/test.esp32-idf.yaml
 create mode 100644 tests/components/speed/test.esp32.yaml
 create mode 100644 tests/components/speed/test.esp8266.yaml
 create mode 100644 tests/components/speed/test.rp2040.yaml
 create mode 100644 tests/components/spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/spi/test.esp32-c3.yaml
 create mode 100644 tests/components/spi/test.esp32-idf.yaml
 create mode 100644 tests/components/spi/test.esp32.yaml
 create mode 100644 tests/components/spi/test.esp8266.yaml
 create mode 100644 tests/components/spi/test.rp2040.yaml
 create mode 100644 tests/components/spi_device/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/spi_device/test.esp32-c3.yaml
 create mode 100644 tests/components/spi_device/test.esp32-idf.yaml
 create mode 100644 tests/components/spi_device/test.esp32.yaml
 create mode 100644 tests/components/spi_device/test.esp8266.yaml
 create mode 100644 tests/components/spi_device/test.rp2040.yaml
 create mode 100644 tests/components/spi_led_strip/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/spi_led_strip/test.esp32-c3.yaml
 create mode 100644 tests/components/spi_led_strip/test.esp32-idf.yaml
 create mode 100644 tests/components/spi_led_strip/test.esp32.yaml
 create mode 100644 tests/components/spi_led_strip/test.esp8266.yaml
 create mode 100644 tests/components/spi_led_strip/test.rp2040.yaml
 create mode 100644 tests/components/sprinkler/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sprinkler/test.esp32-c3.yaml
 create mode 100644 tests/components/sprinkler/test.esp32-idf.yaml
 create mode 100644 tests/components/sprinkler/test.esp32.yaml
 create mode 100644 tests/components/sprinkler/test.esp8266.yaml
 create mode 100644 tests/components/sprinkler/test.rp2040.yaml
 create mode 100644 tests/components/sps30/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sps30/test.esp32-c3.yaml
 create mode 100644 tests/components/sps30/test.esp32-idf.yaml
 create mode 100644 tests/components/sps30/test.esp32.yaml
 create mode 100644 tests/components/sps30/test.esp8266.yaml
 create mode 100644 tests/components/sps30/test.rp2040.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.esp32.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.esp8266.yaml
 create mode 100644 tests/components/ssd1306_i2c/test.rp2040.yaml
 create mode 100644 tests/components/ssd1306_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1306_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1306_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1306_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1306_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1306_spi/test.rp2040.yaml
 create mode 100644 tests/components/ssd1322_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1322_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1322_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1322_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1322_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1322_spi/test.rp2040.yaml
 create mode 100644 tests/components/ssd1325_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1325_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1325_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1325_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1325_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1325_spi/test.rp2040.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.esp32.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.esp8266.yaml
 create mode 100644 tests/components/ssd1327_i2c/test.rp2040.yaml
 create mode 100644 tests/components/ssd1327_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1327_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1327_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1327_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1327_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1327_spi/test.rp2040.yaml
 create mode 100644 tests/components/ssd1331_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1331_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1331_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1331_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1331_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1331_spi/test.rp2040.yaml
 create mode 100644 tests/components/ssd1351_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/ssd1351_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/ssd1351_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/ssd1351_spi/test.esp32.yaml
 create mode 100644 tests/components/ssd1351_spi/test.esp8266.yaml
 create mode 100644 tests/components/ssd1351_spi/test.rp2040.yaml
 create mode 100644 tests/components/st7567_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/st7567_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/st7567_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/st7567_i2c/test.esp32.yaml
 create mode 100644 tests/components/st7567_i2c/test.esp8266.yaml
 create mode 100644 tests/components/st7567_i2c/test.rp2040.yaml
 create mode 100644 tests/components/st7567_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/st7567_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/st7567_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/st7567_spi/test.esp32.yaml
 create mode 100644 tests/components/st7567_spi/test.esp8266.yaml
 create mode 100644 tests/components/st7567_spi/test.rp2040.yaml
 create mode 100644 tests/components/st7735/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/st7735/test.esp32-c3.yaml
 create mode 100644 tests/components/st7735/test.esp32-idf.yaml
 create mode 100644 tests/components/st7735/test.esp32.yaml
 create mode 100644 tests/components/st7735/test.esp8266.yaml
 create mode 100644 tests/components/st7735/test.rp2040.yaml
 create mode 100644 tests/components/st7789v/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/st7789v/test.esp32-c3.yaml
 create mode 100644 tests/components/st7789v/test.esp32-idf.yaml
 create mode 100644 tests/components/st7789v/test.esp32.yaml
 create mode 100644 tests/components/st7789v/test.esp8266.yaml
 create mode 100644 tests/components/st7789v/test.rp2040.yaml
 create mode 100644 tests/components/st7920/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/st7920/test.esp32-c3.yaml
 create mode 100644 tests/components/st7920/test.esp32-idf.yaml
 create mode 100644 tests/components/st7920/test.esp32.yaml
 create mode 100644 tests/components/st7920/test.esp8266.yaml
 create mode 100644 tests/components/st7920/test.rp2040.yaml
 create mode 100644 tests/components/status/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/status/test.esp32-c3.yaml
 create mode 100644 tests/components/status/test.esp32-idf.yaml
 create mode 100644 tests/components/status/test.esp32.yaml
 create mode 100644 tests/components/status/test.esp8266.yaml
 create mode 100644 tests/components/status/test.rp2040.yaml
 create mode 100644 tests/components/status_led/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/status_led/test.esp32-c3.yaml
 create mode 100644 tests/components/status_led/test.esp32-idf.yaml
 create mode 100644 tests/components/status_led/test.esp32.yaml
 create mode 100644 tests/components/status_led/test.esp8266.yaml
 create mode 100644 tests/components/status_led/test.rp2040.yaml
 create mode 100644 tests/components/stepper/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/stepper/test.esp32-c3.yaml
 create mode 100644 tests/components/stepper/test.esp32-idf.yaml
 create mode 100644 tests/components/stepper/test.esp32.yaml
 create mode 100644 tests/components/stepper/test.esp8266.yaml
 create mode 100644 tests/components/stepper/test.rp2040.yaml
 create mode 100644 tests/components/sts3x/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sts3x/test.esp32-c3.yaml
 create mode 100644 tests/components/sts3x/test.esp32-idf.yaml
 create mode 100644 tests/components/sts3x/test.esp32.yaml
 create mode 100644 tests/components/sts3x/test.esp8266.yaml
 create mode 100644 tests/components/sts3x/test.rp2040.yaml
 create mode 100644 tests/components/sun/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sun/test.esp32-c3.yaml
 create mode 100644 tests/components/sun/test.esp32-idf.yaml
 create mode 100644 tests/components/sun/test.esp32.yaml
 create mode 100644 tests/components/sun/test.esp8266.yaml
 create mode 100644 tests/components/sun/test.rp2040.yaml
 create mode 100644 tests/components/sx1509/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/sx1509/test.esp32-c3.yaml
 create mode 100644 tests/components/sx1509/test.esp32-idf.yaml
 create mode 100644 tests/components/sx1509/test.esp32.yaml
 create mode 100644 tests/components/sx1509/test.esp8266.yaml
 create mode 100644 tests/components/sx1509/test.rp2040.yaml

diff --git a/tests/components/sn74hc165/test.esp32-c3-idf.yaml b/tests/components/sn74hc165/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f687b23c9d
--- /dev/null
+++ b/tests/components/sn74hc165/test.esp32-c3-idf.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 3
+  data_pin: 4
+  load_pin: 5
+  clock_inhibit_pin: 6
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sn74hc165/test.esp32-c3.yaml b/tests/components/sn74hc165/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f687b23c9d
--- /dev/null
+++ b/tests/components/sn74hc165/test.esp32-c3.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 3
+  data_pin: 4
+  load_pin: 5
+  clock_inhibit_pin: 6
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sn74hc165/test.esp32-idf.yaml b/tests/components/sn74hc165/test.esp32-idf.yaml
new file mode 100644
index 0000000000..55b06aec9b
--- /dev/null
+++ b/tests/components/sn74hc165/test.esp32-idf.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 13
+  data_pin: 14
+  load_pin: 15
+  clock_inhibit_pin: 16
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sn74hc165/test.esp32.yaml b/tests/components/sn74hc165/test.esp32.yaml
new file mode 100644
index 0000000000..55b06aec9b
--- /dev/null
+++ b/tests/components/sn74hc165/test.esp32.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 13
+  data_pin: 14
+  load_pin: 15
+  clock_inhibit_pin: 16
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sn74hc165/test.esp8266.yaml b/tests/components/sn74hc165/test.esp8266.yaml
new file mode 100644
index 0000000000..55b06aec9b
--- /dev/null
+++ b/tests/components/sn74hc165/test.esp8266.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 13
+  data_pin: 14
+  load_pin: 15
+  clock_inhibit_pin: 16
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sn74hc165/test.rp2040.yaml b/tests/components/sn74hc165/test.rp2040.yaml
new file mode 100644
index 0000000000..f687b23c9d
--- /dev/null
+++ b/tests/components/sn74hc165/test.rp2040.yaml
@@ -0,0 +1,14 @@
+sn74hc165:
+  id: sn74hc165_hub
+  clock_pin: 3
+  data_pin: 4
+  load_pin: 5
+  clock_inhibit_pin: 6
+  sr_count: 2
+
+binary_sensor:
+  - platform: gpio
+    id: sn74hc165_pin_0
+    pin:
+      sn74hc165: sn74hc165_hub
+      number: 0
diff --git a/tests/components/sntp/test.esp32-c3-idf.yaml b/tests/components/sntp/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sntp/test.esp32-c3.yaml b/tests/components/sntp/test.esp32-c3.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sntp/test.esp32-idf.yaml b/tests/components/sntp/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sntp/test.esp32.yaml b/tests/components/sntp/test.esp32.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.esp32.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sntp/test.esp8266.yaml b/tests/components/sntp/test.esp8266.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.esp8266.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sntp/test.rp2040.yaml b/tests/components/sntp/test.rp2040.yaml
new file mode 100644
index 0000000000..3e9e465296
--- /dev/null
+++ b/tests/components/sntp/test.rp2040.yaml
@@ -0,0 +1,15 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+    id: sntp_time
+    servers:
+      - 0.pool.ntp.org
+      - 1.pool.ntp.org
+      - 192.168.178.1
+    on_time:
+      cron: "/30 0-30,30/5 * ? JAN-DEC MON,SAT-SUN,TUE-FRI"
+      then:
+        - lambda: 'ESP_LOGD("main", "time");'
diff --git a/tests/components/sonoff_d1/test.esp32-idf.yaml b/tests/components/sonoff_d1/test.esp32-idf.yaml
new file mode 100644
index 0000000000..dc35e3b6ac
--- /dev/null
+++ b/tests/components/sonoff_d1/test.esp32-idf.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_sonoff_d1
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+light:
+  - platform: sonoff_d1
+    id: d1_light
+    name: Sonoff D1 Dimmer
+    restore_mode: RESTORE_DEFAULT_OFF
+    use_rm433_remote: false
diff --git a/tests/components/sonoff_d1/test.esp32.yaml b/tests/components/sonoff_d1/test.esp32.yaml
new file mode 100644
index 0000000000..dc35e3b6ac
--- /dev/null
+++ b/tests/components/sonoff_d1/test.esp32.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_sonoff_d1
+    tx_pin: 17
+    rx_pin: 16
+    baud_rate: 9600
+
+light:
+  - platform: sonoff_d1
+    id: d1_light
+    name: Sonoff D1 Dimmer
+    restore_mode: RESTORE_DEFAULT_OFF
+    use_rm433_remote: false
diff --git a/tests/components/sonoff_d1/test.esp8266.yaml b/tests/components/sonoff_d1/test.esp8266.yaml
new file mode 100644
index 0000000000..c4a62f4cb3
--- /dev/null
+++ b/tests/components/sonoff_d1/test.esp8266.yaml
@@ -0,0 +1,12 @@
+uart:
+  - id: uart_sonoff_d1
+    tx_pin: 4
+    rx_pin: 5
+    baud_rate: 9600
+
+light:
+  - platform: sonoff_d1
+    id: d1_light
+    name: Sonoff D1 Dimmer
+    restore_mode: RESTORE_DEFAULT_OFF
+    use_rm433_remote: false
diff --git a/tests/components/speaker/test.esp32-c3-idf.yaml b/tests/components/speaker/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c7809baace
--- /dev/null
+++ b/tests/components/speaker/test.esp32-c3-idf.yaml
@@ -0,0 +1,17 @@
+esphome:
+  on_boot:
+    then:
+      - speaker.play: [0, 1, 2, 3]
+      - speaker.stop
+
+i2s_audio:
+  i2s_lrclk_pin: 6
+  i2s_bclk_pin: 7
+  i2s_mclk_pin: 5
+
+speaker:
+  - platform: i2s_audio
+    id: speaker_id
+    dac_type: external
+    i2s_dout_pin: 3
+    mode: mono
diff --git a/tests/components/speaker/test.esp32-c3.yaml b/tests/components/speaker/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c7809baace
--- /dev/null
+++ b/tests/components/speaker/test.esp32-c3.yaml
@@ -0,0 +1,17 @@
+esphome:
+  on_boot:
+    then:
+      - speaker.play: [0, 1, 2, 3]
+      - speaker.stop
+
+i2s_audio:
+  i2s_lrclk_pin: 6
+  i2s_bclk_pin: 7
+  i2s_mclk_pin: 5
+
+speaker:
+  - platform: i2s_audio
+    id: speaker_id
+    dac_type: external
+    i2s_dout_pin: 3
+    mode: mono
diff --git a/tests/components/speaker/test.esp32-idf.yaml b/tests/components/speaker/test.esp32-idf.yaml
new file mode 100644
index 0000000000..416e203d7b
--- /dev/null
+++ b/tests/components/speaker/test.esp32-idf.yaml
@@ -0,0 +1,17 @@
+esphome:
+  on_boot:
+    then:
+      - speaker.play: [0, 1, 2, 3]
+      - speaker.stop
+
+i2s_audio:
+  i2s_lrclk_pin: 16
+  i2s_bclk_pin: 17
+  i2s_mclk_pin: 15
+
+speaker:
+  - platform: i2s_audio
+    id: speaker_id
+    dac_type: external
+    i2s_dout_pin: 13
+    mode: mono
diff --git a/tests/components/speaker/test.esp32.yaml b/tests/components/speaker/test.esp32.yaml
new file mode 100644
index 0000000000..416e203d7b
--- /dev/null
+++ b/tests/components/speaker/test.esp32.yaml
@@ -0,0 +1,17 @@
+esphome:
+  on_boot:
+    then:
+      - speaker.play: [0, 1, 2, 3]
+      - speaker.stop
+
+i2s_audio:
+  i2s_lrclk_pin: 16
+  i2s_bclk_pin: 17
+  i2s_mclk_pin: 15
+
+speaker:
+  - platform: i2s_audio
+    id: speaker_id
+    dac_type: external
+    i2s_dout_pin: 13
+    mode: mono
diff --git a/tests/components/speed/test.esp32-c3-idf.yaml b/tests/components/speed/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fa1920676e
--- /dev/null
+++ b/tests/components/speed/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: ledc
+    id: fan_output_1
+    pin: 2
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/speed/test.esp32-c3.yaml b/tests/components/speed/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fa1920676e
--- /dev/null
+++ b/tests/components/speed/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: ledc
+    id: fan_output_1
+    pin: 2
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/speed/test.esp32-idf.yaml b/tests/components/speed/test.esp32-idf.yaml
new file mode 100644
index 0000000000..29a55e9edd
--- /dev/null
+++ b/tests/components/speed/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: ledc
+    id: fan_output_1
+    pin: 12
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/speed/test.esp32.yaml b/tests/components/speed/test.esp32.yaml
new file mode 100644
index 0000000000..29a55e9edd
--- /dev/null
+++ b/tests/components/speed/test.esp32.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: ledc
+    id: fan_output_1
+    pin: 12
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/speed/test.esp8266.yaml b/tests/components/speed/test.esp8266.yaml
new file mode 100644
index 0000000000..6ed9949cf5
--- /dev/null
+++ b/tests/components/speed/test.esp8266.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: esp8266_pwm
+    id: fan_output_1
+    pin: 12
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/speed/test.rp2040.yaml b/tests/components/speed/test.rp2040.yaml
new file mode 100644
index 0000000000..02b572db75
--- /dev/null
+++ b/tests/components/speed/test.rp2040.yaml
@@ -0,0 +1,9 @@
+output:
+  - platform: rp2040_pwm
+    id: fan_output_1
+    pin: 12
+
+fan:
+  - platform: speed
+    id: fan_speed
+    output: fan_output_1
diff --git a/tests/components/spi/test.esp32-c3-idf.yaml b/tests/components/spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f49470ad07
--- /dev/null
+++ b/tests/components/spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
diff --git a/tests/components/spi/test.esp32-c3.yaml b/tests/components/spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f49470ad07
--- /dev/null
+++ b/tests/components/spi/test.esp32-c3.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
diff --git a/tests/components/spi/test.esp32-idf.yaml b/tests/components/spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..1cdcf461dd
--- /dev/null
+++ b/tests/components/spi/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
diff --git a/tests/components/spi/test.esp32.yaml b/tests/components/spi/test.esp32.yaml
new file mode 100644
index 0000000000..1cdcf461dd
--- /dev/null
+++ b/tests/components/spi/test.esp32.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
diff --git a/tests/components/spi/test.esp8266.yaml b/tests/components/spi/test.esp8266.yaml
new file mode 100644
index 0000000000..83f110921f
--- /dev/null
+++ b/tests/components/spi/test.esp8266.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
diff --git a/tests/components/spi/test.rp2040.yaml b/tests/components/spi/test.rp2040.yaml
new file mode 100644
index 0000000000..1e39d247fe
--- /dev/null
+++ b/tests/components/spi/test.rp2040.yaml
@@ -0,0 +1,5 @@
+spi:
+  - id: spi_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
diff --git a/tests/components/spi_device/test.esp32-c3-idf.yaml b/tests/components/spi_device/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..49e2733676
--- /dev/null
+++ b/tests/components/spi_device/test.esp32-c3-idf.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_device/test.esp32-c3.yaml b/tests/components/spi_device/test.esp32-c3.yaml
new file mode 100644
index 0000000000..49e2733676
--- /dev/null
+++ b/tests/components/spi_device/test.esp32-c3.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_device/test.esp32-idf.yaml b/tests/components/spi_device/test.esp32-idf.yaml
new file mode 100644
index 0000000000..cad8ca49f8
--- /dev/null
+++ b/tests/components/spi_device/test.esp32-idf.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_device/test.esp32.yaml b/tests/components/spi_device/test.esp32.yaml
new file mode 100644
index 0000000000..cad8ca49f8
--- /dev/null
+++ b/tests/components/spi_device/test.esp32.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_device/test.esp8266.yaml b/tests/components/spi_device/test.esp8266.yaml
new file mode 100644
index 0000000000..1b191bdb6a
--- /dev/null
+++ b/tests/components/spi_device/test.esp8266.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_device/test.rp2040.yaml b/tests/components/spi_device/test.rp2040.yaml
new file mode 100644
index 0000000000..c70493c70d
--- /dev/null
+++ b/tests/components/spi_device/test.rp2040.yaml
@@ -0,0 +1,11 @@
+spi:
+  - id: spi_device1
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+spi_device:
+  id: spi_device_test
+  data_rate: 2MHz
+  mode: 3
+  bit_order: lsb_first
diff --git a/tests/components/spi_led_strip/test.esp32-c3-idf.yaml b/tests/components/spi_led_strip/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..983ad2863f
--- /dev/null
+++ b/tests/components/spi_led_strip/test.esp32-c3-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/spi_led_strip/test.esp32-c3.yaml b/tests/components/spi_led_strip/test.esp32-c3.yaml
new file mode 100644
index 0000000000..983ad2863f
--- /dev/null
+++ b/tests/components/spi_led_strip/test.esp32-c3.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/spi_led_strip/test.esp32-idf.yaml b/tests/components/spi_led_strip/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f4a760bf4c
--- /dev/null
+++ b/tests/components/spi_led_strip/test.esp32-idf.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/spi_led_strip/test.esp32.yaml b/tests/components/spi_led_strip/test.esp32.yaml
new file mode 100644
index 0000000000..f4a760bf4c
--- /dev/null
+++ b/tests/components/spi_led_strip/test.esp32.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/spi_led_strip/test.esp8266.yaml b/tests/components/spi_led_strip/test.esp8266.yaml
new file mode 100644
index 0000000000..8e76303b6a
--- /dev/null
+++ b/tests/components/spi_led_strip/test.esp8266.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/spi_led_strip/test.rp2040.yaml b/tests/components/spi_led_strip/test.rp2040.yaml
new file mode 100644
index 0000000000..9d12f1592b
--- /dev/null
+++ b/tests/components/spi_led_strip/test.rp2040.yaml
@@ -0,0 +1,13 @@
+spi:
+  - id: spi_spi_led_strip
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+light:
+  - platform: spi_led_strip
+    num_leds: 4
+    color_correct: [80%, 60%, 100%]
+    id: rgb_led
+    name: "RGB LED"
+    data_rate: 8MHz
diff --git a/tests/components/sprinkler/test.esp32-c3-idf.yaml b/tests/components/sprinkler/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.esp32-c3-idf.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sprinkler/test.esp32-c3.yaml b/tests/components/sprinkler/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.esp32-c3.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sprinkler/test.esp32-idf.yaml b/tests/components/sprinkler/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.esp32-idf.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sprinkler/test.esp32.yaml b/tests/components/sprinkler/test.esp32.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.esp32.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sprinkler/test.esp8266.yaml b/tests/components/sprinkler/test.esp8266.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.esp8266.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sprinkler/test.rp2040.yaml b/tests/components/sprinkler/test.rp2040.yaml
new file mode 100644
index 0000000000..f099f77729
--- /dev/null
+++ b/tests/components/sprinkler/test.rp2040.yaml
@@ -0,0 +1,83 @@
+esphome:
+  on_boot:
+    then:
+      - sprinkler.start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.start_from_queue: yard_sprinkler_ctrlr
+      - sprinkler.start_single_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+      - sprinkler.shutdown: yard_sprinkler_ctrlr
+      - sprinkler.next_valve: yard_sprinkler_ctrlr
+      - sprinkler.previous_valve: yard_sprinkler_ctrlr
+      - sprinkler.pause: yard_sprinkler_ctrlr
+      - sprinkler.resume: yard_sprinkler_ctrlr
+      - sprinkler.resume_or_start_full_cycle: yard_sprinkler_ctrlr
+      - sprinkler.queue_valve:
+          id: yard_sprinkler_ctrlr
+          valve_number: 2
+          run_duration: 900s
+      - sprinkler.clear_queued_valves: yard_sprinkler_ctrlr
+      - sprinkler.set_multiplier:
+          id: yard_sprinkler_ctrlr
+          multiplier: 1.5
+      - sprinkler.set_repeat:
+          id: yard_sprinkler_ctrlr
+          repeat: 2
+      - sprinkler.set_divider:
+          id: yard_sprinkler_ctrlr
+          divider: 2
+      - sprinkler.set_valve_run_duration:
+          id: yard_sprinkler_ctrlr
+          valve_number: 0
+          run_duration: 600s
+
+switch:
+  - platform: template
+    id: switch1
+    optimistic: true
+  - platform: template
+    id: switch2
+    optimistic: true
+
+sprinkler:
+  - id: yard_sprinkler_ctrlr
+    main_switch: Yard Sprinklers
+    auto_advance_switch: Yard Sprinklers Auto Advance
+    reverse_switch: Yard Sprinklers Reverse
+    pump_start_pump_delay: 2s
+    pump_stop_valve_delay: 4s
+    pump_switch_off_during_valve_open_delay: true
+    valve_open_delay: 5s
+    valves:
+      - valve_switch: Yard Valve 0
+        enable_switch: Enable Yard Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 1
+        enable_switch: Enable Yard Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Yard Valve 2
+        enable_switch: Enable Yard Valve 2
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+  - id: garden_sprinkler_ctrlr
+    main_switch: Garden Sprinklers
+    auto_advance_switch: Garden Sprinklers Auto Advance
+    reverse_switch: Garden Sprinklers Reverse
+    valve_overlap: 5s
+    valves:
+      - valve_switch: Garden Valve 0
+        enable_switch: Enable Garden Valve 0
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
+      - valve_switch: Garden Valve 1
+        enable_switch: Enable Garden Valve 1
+        pump_switch_id: switch1
+        run_duration: 10s
+        valve_switch_id: switch2
diff --git a/tests/components/sps30/test.esp32-c3-idf.yaml b/tests/components/sps30/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e071a00936
--- /dev/null
+++ b/tests/components/sps30/test.esp32-c3-idf.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/sps30/test.esp32-c3.yaml b/tests/components/sps30/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e071a00936
--- /dev/null
+++ b/tests/components/sps30/test.esp32-c3.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/sps30/test.esp32-idf.yaml b/tests/components/sps30/test.esp32-idf.yaml
new file mode 100644
index 0000000000..f9d1ee4e55
--- /dev/null
+++ b/tests/components/sps30/test.esp32-idf.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/sps30/test.esp32.yaml b/tests/components/sps30/test.esp32.yaml
new file mode 100644
index 0000000000..f9d1ee4e55
--- /dev/null
+++ b/tests/components/sps30/test.esp32.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/sps30/test.esp8266.yaml b/tests/components/sps30/test.esp8266.yaml
new file mode 100644
index 0000000000..e071a00936
--- /dev/null
+++ b/tests/components/sps30/test.esp8266.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/sps30/test.rp2040.yaml b/tests/components/sps30/test.rp2040.yaml
new file mode 100644
index 0000000000..e071a00936
--- /dev/null
+++ b/tests/components/sps30/test.rp2040.yaml
@@ -0,0 +1,36 @@
+i2c:
+  - id: i2c_sps30
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sps30
+    pm_1_0:
+      name: Workshop PM <1µm Weight concentration
+      id: workshop_PM_1_0
+    pm_2_5:
+      name: Workshop PM <2.5µm Weight concentration
+      id: workshop_PM_2_5
+    pm_4_0:
+      name: Workshop PM <4µm Weight concentration
+      id: workshop_PM_4_0
+    pm_10_0:
+      name: Workshop PM <10µm Weight concentration
+      id: workshop_PM_10_0
+    pmc_0_5:
+      name: Workshop PM <0.5µm Number concentration
+      id: workshop_PMC_0_5
+    pmc_1_0:
+      name: Workshop PM <1µm Number concentration
+      id: workshop_PMC_1_0
+    pmc_2_5:
+      name: Workshop PM <2.5µm Number concentration
+      id: workshop_PMC_2_5
+    pmc_4_0:
+      name: Workshop PM <4µm Number concentration
+      id: workshop_PMC_4_0
+    pmc_10_0:
+      name: Workshop PM <10µm Number concentration
+      id: workshop_PMC_10_0
+    address: 0x69
+    update_interval: 10s
diff --git a/tests/components/ssd1306_i2c/test.esp32-c3-idf.yaml b/tests/components/ssd1306_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..f4a301db51
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_i2c/test.esp32-c3.yaml b/tests/components/ssd1306_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..f4a301db51
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_i2c/test.esp32-idf.yaml b/tests/components/ssd1306_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..dddc67309c
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_i2c/test.esp32.yaml b/tests/components/ssd1306_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..dddc67309c
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.esp32.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_i2c/test.esp8266.yaml b/tests/components/ssd1306_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..f4a301db51
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.esp8266.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_i2c/test.rp2040.yaml b/tests/components/ssd1306_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..f4a301db51
--- /dev/null
+++ b/tests/components/ssd1306_i2c/test.rp2040.yaml
@@ -0,0 +1,25 @@
+i2c:
+  - id: i2c_ssd1306_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1306_i2c
+    model: SSD1306_128X64
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    contrast: 60%
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1306_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..01b2d0e4a8
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.esp32-c3.yaml b/tests/components/ssd1306_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..01b2d0e4a8
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.esp32-idf.yaml b/tests/components/ssd1306_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b0e5e0f1a2
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.esp32.yaml b/tests/components/ssd1306_spi/test.esp32.yaml
new file mode 100644
index 0000000000..b0e5e0f1a2
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.esp8266.yaml b/tests/components/ssd1306_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..135e364bb2
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1306_spi/test.rp2040.yaml b/tests/components/ssd1306_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..94c4b85158
--- /dev/null
+++ b/tests/components/ssd1306_spi/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1306_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1306_spi
+    model: SSD1306 128x64
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1322_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..4fa9f86594
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.esp32-c3.yaml b/tests/components/ssd1322_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..4fa9f86594
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.esp32-idf.yaml b/tests/components/ssd1322_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..aa6d0fbf01
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.esp32.yaml b/tests/components/ssd1322_spi/test.esp32.yaml
new file mode 100644
index 0000000000..aa6d0fbf01
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.esp8266.yaml b/tests/components/ssd1322_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..a5aa565c09
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1322_spi/test.rp2040.yaml b/tests/components/ssd1322_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..59544e7878
--- /dev/null
+++ b/tests/components/ssd1322_spi/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1322_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1322_spi
+    model: SSD1322 256x64
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1325_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..0fa8cb6488
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.esp32-c3.yaml b/tests/components/ssd1325_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..0fa8cb6488
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.esp32-idf.yaml b/tests/components/ssd1325_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..84d94eff28
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.esp32.yaml b/tests/components/ssd1325_spi/test.esp32.yaml
new file mode 100644
index 0000000000..84d94eff28
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.esp8266.yaml b/tests/components/ssd1325_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..9d7e483585
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1325_spi/test.rp2040.yaml b/tests/components/ssd1325_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..869663c19d
--- /dev/null
+++ b/tests/components/ssd1325_spi/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1325_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1325_spi
+    model: SSD1325 128x64
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.esp32-c3-idf.yaml b/tests/components/ssd1327_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..cd28795ff1
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.esp32-c3.yaml b/tests/components/ssd1327_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..cd28795ff1
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.esp32-c3.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.esp32-idf.yaml b/tests/components/ssd1327_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e72a9c7b7a
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.esp32-idf.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.esp32.yaml b/tests/components/ssd1327_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..e72a9c7b7a
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.esp32.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.esp8266.yaml b/tests/components/ssd1327_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..cd28795ff1
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.esp8266.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_i2c/test.rp2040.yaml b/tests/components/ssd1327_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..cd28795ff1
--- /dev/null
+++ b/tests/components/ssd1327_i2c/test.rp2040.yaml
@@ -0,0 +1,24 @@
+i2c:
+  - id: i2c_ssd1327_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: ssd1327_i2c
+    model: SSD1327_128x128
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1327_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ec5795d716
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.esp32-c3.yaml b/tests/components/ssd1327_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ec5795d716
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.esp32-idf.yaml b/tests/components/ssd1327_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e103ded187
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.esp32.yaml b/tests/components/ssd1327_spi/test.esp32.yaml
new file mode 100644
index 0000000000..e103ded187
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.esp8266.yaml b/tests/components/ssd1327_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..30455d24ee
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1327_spi/test.rp2040.yaml b/tests/components/ssd1327_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..f819ab2c41
--- /dev/null
+++ b/tests/components/ssd1327_spi/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1327_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1327_spi
+    model: SSD1327 128x128
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1331_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..9a35918faf
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.esp32-c3.yaml b/tests/components/ssd1331_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..9a35918faf
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.esp32-c3.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.esp32-idf.yaml b/tests/components/ssd1331_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e9eb8ea9ad
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.esp32-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.esp32.yaml b/tests/components/ssd1331_spi/test.esp32.yaml
new file mode 100644
index 0000000000..e9eb8ea9ad
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.esp32.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.esp8266.yaml b/tests/components/ssd1331_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..3b319ef38e
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.esp8266.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1331_spi/test.rp2040.yaml b/tests/components/ssd1331_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..947685b07a
--- /dev/null
+++ b/tests/components/ssd1331_spi/test.rp2040.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_ssd1331_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1331_spi
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.esp32-c3-idf.yaml b/tests/components/ssd1351_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2a7266f502
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.esp32-c3.yaml b/tests/components/ssd1351_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2a7266f502
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.esp32-idf.yaml b/tests/components/ssd1351_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..8342cb972b
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.esp32.yaml b/tests/components/ssd1351_spi/test.esp32.yaml
new file mode 100644
index 0000000000..8342cb972b
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.esp8266.yaml b/tests/components/ssd1351_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..7ed9a31dde
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/ssd1351_spi/test.rp2040.yaml b/tests/components/ssd1351_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..72936d046b
--- /dev/null
+++ b/tests/components/ssd1351_spi/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_ssd1351_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: ssd1351_spi
+    model: "SSD1351 128x128"
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.esp32-c3-idf.yaml b/tests/components/st7567_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..d779040500
--- /dev/null
+++ b/tests/components/st7567_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.esp32-c3.yaml b/tests/components/st7567_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..d779040500
--- /dev/null
+++ b/tests/components/st7567_i2c/test.esp32-c3.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.esp32-idf.yaml b/tests/components/st7567_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..b7aee61b68
--- /dev/null
+++ b/tests/components/st7567_i2c/test.esp32-idf.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.esp32.yaml b/tests/components/st7567_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..b7aee61b68
--- /dev/null
+++ b/tests/components/st7567_i2c/test.esp32.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 16
+    sda: 17
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.esp8266.yaml b/tests/components/st7567_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..d779040500
--- /dev/null
+++ b/tests/components/st7567_i2c/test.esp8266.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_i2c/test.rp2040.yaml b/tests/components/st7567_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..d779040500
--- /dev/null
+++ b/tests/components/st7567_i2c/test.rp2040.yaml
@@ -0,0 +1,23 @@
+i2c:
+  - id: i2c_st7567_i2c
+    scl: 5
+    sda: 4
+
+display:
+  - platform: st7567_i2c
+    reset_pin: 3
+    address: 0x3C
+    id: display1
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, 10, 10);
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.esp32-c3-idf.yaml b/tests/components/st7567_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..b799ce7302
--- /dev/null
+++ b/tests/components/st7567_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7567_spi
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.esp32-c3.yaml b/tests/components/st7567_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..b799ce7302
--- /dev/null
+++ b/tests/components/st7567_spi/test.esp32-c3.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7567_spi
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.esp32-idf.yaml b/tests/components/st7567_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..bb4530248f
--- /dev/null
+++ b/tests/components/st7567_spi/test.esp32-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7567_spi
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.esp32.yaml b/tests/components/st7567_spi/test.esp32.yaml
new file mode 100644
index 0000000000..bb4530248f
--- /dev/null
+++ b/tests/components/st7567_spi/test.esp32.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7567_spi
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.esp8266.yaml b/tests/components/st7567_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..bbc47e67f6
--- /dev/null
+++ b/tests/components/st7567_spi/test.esp8266.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: st7567_spi
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7567_spi/test.rp2040.yaml b/tests/components/st7567_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..1b491101a8
--- /dev/null
+++ b/tests/components/st7567_spi/test.rp2040.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7567_spi
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: st7567_spi
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.esp32-c3-idf.yaml b/tests/components/st7735/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fc6c2421c4
--- /dev/null
+++ b/tests/components/st7735/test.esp32-c3-idf.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.esp32-c3.yaml b/tests/components/st7735/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fc6c2421c4
--- /dev/null
+++ b/tests/components/st7735/test.esp32-c3.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 4
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.esp32-idf.yaml b/tests/components/st7735/test.esp32-idf.yaml
new file mode 100644
index 0000000000..fd3f6cade6
--- /dev/null
+++ b/tests/components/st7735/test.esp32-idf.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.esp32.yaml b/tests/components/st7735/test.esp32.yaml
new file mode 100644
index 0000000000..fd3f6cade6
--- /dev/null
+++ b/tests/components/st7735/test.esp32.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.esp8266.yaml b/tests/components/st7735/test.esp8266.yaml
new file mode 100644
index 0000000000..ea8fa93c36
--- /dev/null
+++ b/tests/components/st7735/test.esp8266.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7735/test.rp2040.yaml b/tests/components/st7735/test.rp2040.yaml
new file mode 100644
index 0000000000..828f9a3ae1
--- /dev/null
+++ b/tests/components/st7735/test.rp2040.yaml
@@ -0,0 +1,29 @@
+spi:
+  - id: spi_st7735
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: st7735
+    model: "INITR_18BLACKTAB"
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    device_width: 128
+    device_height: 160
+    col_start: 0
+    row_start: 0
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.esp32-c3-idf.yaml b/tests/components/st7789v/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..1cb8d22fcb
--- /dev/null
+++ b/tests/components/st7789v/test.esp32-c3-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 8
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.esp32-c3.yaml b/tests/components/st7789v/test.esp32-c3.yaml
new file mode 100644
index 0000000000..1cb8d22fcb
--- /dev/null
+++ b/tests/components/st7789v/test.esp32-c3.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 2
+    dc_pin: 3
+    reset_pin: 8
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.esp32-idf.yaml b/tests/components/st7789v/test.esp32-idf.yaml
new file mode 100644
index 0000000000..54a9db6da1
--- /dev/null
+++ b/tests/components/st7789v/test.esp32-idf.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.esp32.yaml b/tests/components/st7789v/test.esp32.yaml
new file mode 100644
index 0000000000..54a9db6da1
--- /dev/null
+++ b/tests/components/st7789v/test.esp32.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 12
+    dc_pin: 13
+    reset_pin: 14
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.esp8266.yaml b/tests/components/st7789v/test.esp8266.yaml
new file mode 100644
index 0000000000..deeceb8c9a
--- /dev/null
+++ b/tests/components/st7789v/test.esp8266.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 15
+    dc_pin: 16
+    reset_pin: 5
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7789v/test.rp2040.yaml b/tests/components/st7789v/test.rp2040.yaml
new file mode 100644
index 0000000000..778aa2aa55
--- /dev/null
+++ b/tests/components/st7789v/test.rp2040.yaml
@@ -0,0 +1,25 @@
+spi:
+  - id: spi_st7789v
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 8
+
+display:
+  - platform: st7789v
+    model: TTGO TDisplay 135x240
+    cs_pin: 5
+    dc_pin: 6
+    reset_pin: 7
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.esp32-c3-idf.yaml b/tests/components/st7920/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..84ae88461f
--- /dev/null
+++ b/tests/components/st7920/test.esp32-c3-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7920
+    cs_pin: 2
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.esp32-c3.yaml b/tests/components/st7920/test.esp32-c3.yaml
new file mode 100644
index 0000000000..84ae88461f
--- /dev/null
+++ b/tests/components/st7920/test.esp32-c3.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 6
+    mosi_pin: 7
+    miso_pin: 5
+
+display:
+  - platform: st7920
+    cs_pin: 2
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.esp32-idf.yaml b/tests/components/st7920/test.esp32-idf.yaml
new file mode 100644
index 0000000000..cdcbc85642
--- /dev/null
+++ b/tests/components/st7920/test.esp32-idf.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7920
+    cs_pin: 12
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.esp32.yaml b/tests/components/st7920/test.esp32.yaml
new file mode 100644
index 0000000000..cdcbc85642
--- /dev/null
+++ b/tests/components/st7920/test.esp32.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 16
+    mosi_pin: 17
+    miso_pin: 15
+
+display:
+  - platform: st7920
+    cs_pin: 12
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.esp8266.yaml b/tests/components/st7920/test.esp8266.yaml
new file mode 100644
index 0000000000..0450bf1c5e
--- /dev/null
+++ b/tests/components/st7920/test.esp8266.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 14
+    mosi_pin: 13
+    miso_pin: 12
+
+display:
+  - platform: st7920
+    cs_pin: 15
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/st7920/test.rp2040.yaml b/tests/components/st7920/test.rp2040.yaml
new file mode 100644
index 0000000000..f442820e7b
--- /dev/null
+++ b/tests/components/st7920/test.rp2040.yaml
@@ -0,0 +1,24 @@
+spi:
+  - id: spi_st7920
+    clk_pin: 2
+    mosi_pin: 3
+    miso_pin: 4
+
+display:
+  - platform: st7920
+    cs_pin: 5
+    height: 128
+    width: 64
+    pages:
+      - id: page1
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+      - id: page2
+        lambda: |-
+          it.rectangle(0, 0, it.get_width(), it.get_height());
+    on_page_change:
+      from: page1
+      to: page2
+      then:
+        lambda: |-
+          ESP_LOGD("display", "1 -> 2");
diff --git a/tests/components/status/test.esp32-c3-idf.yaml b/tests/components/status/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status/test.esp32-c3.yaml b/tests/components/status/test.esp32-c3.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status/test.esp32-idf.yaml b/tests/components/status/test.esp32-idf.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status/test.esp32.yaml b/tests/components/status/test.esp32.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.esp32.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status/test.esp8266.yaml b/tests/components/status/test.esp8266.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.esp8266.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status/test.rp2040.yaml b/tests/components/status/test.rp2040.yaml
new file mode 100644
index 0000000000..c14157566b
--- /dev/null
+++ b/tests/components/status/test.rp2040.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+binary_sensor:
+  - platform: status
+    id: node_status
+    name: Node Status
diff --git a/tests/components/status_led/test.esp32-c3-idf.yaml b/tests/components/status_led/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/status_led/test.esp32-c3.yaml b/tests/components/status_led/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/status_led/test.esp32-idf.yaml b/tests/components/status_led/test.esp32-idf.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/status_led/test.esp32.yaml b/tests/components/status_led/test.esp32.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.esp32.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/status_led/test.esp8266.yaml b/tests/components/status_led/test.esp8266.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.esp8266.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/status_led/test.rp2040.yaml b/tests/components/status_led/test.rp2040.yaml
new file mode 100644
index 0000000000..ec66c219d3
--- /dev/null
+++ b/tests/components/status_led/test.rp2040.yaml
@@ -0,0 +1,10 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+light:
+  - platform: status_led
+    name: Switch State
+    pin: 4
diff --git a/tests/components/stepper/test.esp32-c3-idf.yaml b/tests/components/stepper/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.esp32-c3-idf.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/stepper/test.esp32-c3.yaml b/tests/components/stepper/test.esp32-c3.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.esp32-c3.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/stepper/test.esp32-idf.yaml b/tests/components/stepper/test.esp32-idf.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.esp32-idf.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/stepper/test.esp32.yaml b/tests/components/stepper/test.esp32.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.esp32.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/stepper/test.esp8266.yaml b/tests/components/stepper/test.esp8266.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.esp8266.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/stepper/test.rp2040.yaml b/tests/components/stepper/test.rp2040.yaml
new file mode 100644
index 0000000000..fcf5759618
--- /dev/null
+++ b/tests/components/stepper/test.rp2040.yaml
@@ -0,0 +1,27 @@
+stepper:
+  - platform: a4988
+    id: test_stepper
+    step_pin: 3
+    dir_pin: 4
+    sleep_pin: 5
+    max_speed: 250 steps/s
+    acceleration: 100 steps/s^2
+    deceleration: 200 steps/s^2
+
+switch:
+  - platform: template
+    name: Stepper Switch
+    assumed_state: true
+    turn_on_action:
+      - stepper.set_target:
+          id: test_stepper
+          target: !lambda |-
+            static int32_t i = 0;
+            i += 1000;
+            if (i > 5000) {
+              i = -5000;
+            }
+            return i;
+      - stepper.report_position:
+          id: test_stepper
+          position: 0
diff --git a/tests/components/sts3x/test.esp32-c3-idf.yaml b/tests/components/sts3x/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..87980ce3a7
--- /dev/null
+++ b/tests/components/sts3x/test.esp32-c3-idf.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sts3x/test.esp32-c3.yaml b/tests/components/sts3x/test.esp32-c3.yaml
new file mode 100644
index 0000000000..87980ce3a7
--- /dev/null
+++ b/tests/components/sts3x/test.esp32-c3.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sts3x/test.esp32-idf.yaml b/tests/components/sts3x/test.esp32-idf.yaml
new file mode 100644
index 0000000000..a74d61e748
--- /dev/null
+++ b/tests/components/sts3x/test.esp32-idf.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sts3x/test.esp32.yaml b/tests/components/sts3x/test.esp32.yaml
new file mode 100644
index 0000000000..a74d61e748
--- /dev/null
+++ b/tests/components/sts3x/test.esp32.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 16
+    sda: 17
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sts3x/test.esp8266.yaml b/tests/components/sts3x/test.esp8266.yaml
new file mode 100644
index 0000000000..87980ce3a7
--- /dev/null
+++ b/tests/components/sts3x/test.esp8266.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sts3x/test.rp2040.yaml b/tests/components/sts3x/test.rp2040.yaml
new file mode 100644
index 0000000000..87980ce3a7
--- /dev/null
+++ b/tests/components/sts3x/test.rp2040.yaml
@@ -0,0 +1,10 @@
+i2c:
+  - id: i2c_sts3x
+    scl: 5
+    sda: 4
+
+sensor:
+  - platform: sts3x
+    id: sts3x_sensor
+    name: STS3X Temperature
+    address: 0x4A
diff --git a/tests/components/sun/test.esp32-c3-idf.yaml b/tests/components/sun/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.esp32-c3-idf.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sun/test.esp32-c3.yaml b/tests/components/sun/test.esp32-c3.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.esp32-c3.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sun/test.esp32-idf.yaml b/tests/components/sun/test.esp32-idf.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.esp32-idf.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sun/test.esp32.yaml b/tests/components/sun/test.esp32.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.esp32.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sun/test.esp8266.yaml b/tests/components/sun/test.esp8266.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.esp8266.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sun/test.rp2040.yaml b/tests/components/sun/test.rp2040.yaml
new file mode 100644
index 0000000000..e0157424a0
--- /dev/null
+++ b/tests/components/sun/test.rp2040.yaml
@@ -0,0 +1,38 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+api:
+
+time:
+  - platform: homeassistant
+    id: homeassistant_time
+
+sun:
+  latitude: 48.8584°
+  longitude: 2.2945°
+  on_sunrise:
+    - then:
+        - logger.log: Good morning
+    - elevation: 5°
+      then:
+        - logger.log: Good morning again
+  on_sunset:
+    - then:
+        - logger.log: Good evening
+
+sensor:
+  - platform: sun
+    name: Sun Elevation
+    type: elevation
+  - platform: sun
+    name: Sun Azimuth
+    type: azimuth
+
+text_sensor:
+  - platform: sun
+    name: Sun Next Sunrise
+    type: sunrise
+  - platform: sun
+    name: Sun Next Sunset
+    type: sunset
diff --git a/tests/components/sx1509/test.esp32-c3-idf.yaml b/tests/components/sx1509/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ced849b3df
--- /dev/null
+++ b/tests/components/sx1509/test.esp32-c3-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 5
+    sda: 4
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3
diff --git a/tests/components/sx1509/test.esp32-c3.yaml b/tests/components/sx1509/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ced849b3df
--- /dev/null
+++ b/tests/components/sx1509/test.esp32-c3.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 5
+    sda: 4
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3
diff --git a/tests/components/sx1509/test.esp32-idf.yaml b/tests/components/sx1509/test.esp32-idf.yaml
new file mode 100644
index 0000000000..1698f2abc4
--- /dev/null
+++ b/tests/components/sx1509/test.esp32-idf.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 16
+    sda: 17
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3
diff --git a/tests/components/sx1509/test.esp32.yaml b/tests/components/sx1509/test.esp32.yaml
new file mode 100644
index 0000000000..1698f2abc4
--- /dev/null
+++ b/tests/components/sx1509/test.esp32.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 16
+    sda: 17
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3
diff --git a/tests/components/sx1509/test.esp8266.yaml b/tests/components/sx1509/test.esp8266.yaml
new file mode 100644
index 0000000000..ced849b3df
--- /dev/null
+++ b/tests/components/sx1509/test.esp8266.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 5
+    sda: 4
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3
diff --git a/tests/components/sx1509/test.rp2040.yaml b/tests/components/sx1509/test.rp2040.yaml
new file mode 100644
index 0000000000..ced849b3df
--- /dev/null
+++ b/tests/components/sx1509/test.rp2040.yaml
@@ -0,0 +1,15 @@
+i2c:
+  - id: i2c_sx1509
+    scl: 5
+    sda: 4
+
+sx1509:
+  - id: sx1509_hub
+    address: 0x3E
+
+binary_sensor:
+  - platform: gpio
+    name: GPIO SX1509 Test
+    pin:
+      sx1509: sx1509_hub
+      number: 3

From 8027921ba3c226fd489dd8f12ccbe8f3f6f2aa80 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Wed, 24 Apr 2024 05:55:27 +1000
Subject: [PATCH 33/81] `graphical_display_menu` requires a Display, not
 DisplayBuffer (#6614)

---
 esphome/components/graphical_display_menu/__init__.py          | 2 +-
 .../graphical_display_menu/graphical_display_menu.cpp          | 3 ++-
 esphome/core/color.h                                           | 1 +
 3 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/esphome/components/graphical_display_menu/__init__.py b/esphome/components/graphical_display_menu/__init__.py
index dc49358efd..3849449523 100644
--- a/esphome/components/graphical_display_menu/__init__.py
+++ b/esphome/components/graphical_display_menu/__init__.py
@@ -38,7 +38,7 @@ CONFIG_SCHEMA = DISPLAY_MENU_BASE_SCHEMA.extend(
     cv.Schema(
         {
             cv.GenerateID(): cv.declare_id(GraphicalDisplayMenu),
-            cv.Optional(CONF_DISPLAY): cv.use_id(display.DisplayBuffer),
+            cv.Optional(CONF_DISPLAY): cv.use_id(display.Display),
             cv.Required(CONF_FONT): cv.use_id(font.Font),
             cv.Optional(CONF_MENU_ITEM_VALUE): cv.templatable(cv.string),
             cv.Optional(CONF_FOREGROUND_COLOR): cv.use_id(color.ColorStruct),
diff --git a/esphome/components/graphical_display_menu/graphical_display_menu.cpp b/esphome/components/graphical_display_menu/graphical_display_menu.cpp
index 2e4c14fb7b..fcbad41388 100644
--- a/esphome/components/graphical_display_menu/graphical_display_menu.cpp
+++ b/esphome/components/graphical_display_menu/graphical_display_menu.cpp
@@ -229,7 +229,8 @@ inline void GraphicalDisplayMenu::draw_item(display::Display *display, const dis
     label.append(this->menu_item_value_.value(&args));
   }
 
-  display->print(bounds->x, bounds->y, this->font_, foreground_color, display::TextAlign::TOP_LEFT, label.c_str());
+  display->print(bounds->x, bounds->y, this->font_, foreground_color, display::TextAlign::TOP_LEFT, label.c_str(),
+                 ~foreground_color);
 }
 
 void GraphicalDisplayMenu::draw_item(const display_menu_base::MenuItem *item, const uint8_t row, const bool selected) {
diff --git a/esphome/core/color.h b/esphome/core/color.h
index 45b2d4c871..fb72973017 100644
--- a/esphome/core/color.h
+++ b/esphome/core/color.h
@@ -62,6 +62,7 @@ struct Color {
     return Color(esp_scale8(this->red, scale), esp_scale8(this->green, scale), esp_scale8(this->blue, scale),
                  esp_scale8(this->white, scale));
   }
+  inline Color operator~() const ALWAYS_INLINE { return Color(255 - this->red, 255 - this->green, 255 - this->blue); }
   inline Color &operator*=(uint8_t scale) ALWAYS_INLINE {
     this->red = esp_scale8(this->red, scale);
     this->green = esp_scale8(this->green, scale);

From b8f0182fc5b93c45eeafb048695ac655bcf3297e Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Wed, 24 Apr 2024 06:49:14 +1000
Subject: [PATCH 34/81] Add null GPIO pin (#6611)

---
 .../cst226/touchscreen/cst226_touchscreen.cpp  | 18 +++++++-----------
 .../cst226/touchscreen/cst226_touchscreen.h    |  2 +-
 esphome/core/gpio.h                            | 18 ++++++++++++++++++
 3 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/esphome/components/cst226/touchscreen/cst226_touchscreen.cpp b/esphome/components/cst226/touchscreen/cst226_touchscreen.cpp
index d4e43d30f5..69728dc666 100644
--- a/esphome/components/cst226/touchscreen/cst226_touchscreen.cpp
+++ b/esphome/components/cst226/touchscreen/cst226_touchscreen.cpp
@@ -5,17 +5,13 @@ namespace cst226 {
 
 void CST226Touchscreen::setup() {
   esph_log_config(TAG, "Setting up CST226 Touchscreen...");
-  if (this->reset_pin_ != nullptr) {
-    this->reset_pin_->setup();
-    this->reset_pin_->digital_write(true);
-    delay(5);
-    this->reset_pin_->digital_write(false);
-    delay(5);
-    this->reset_pin_->digital_write(true);
-    this->set_timeout(30, [this] { this->continue_setup_(); });
-  } else {
-    this->continue_setup_();
-  }
+  this->reset_pin_->setup();
+  this->reset_pin_->digital_write(true);
+  delay(5);
+  this->reset_pin_->digital_write(false);
+  delay(5);
+  this->reset_pin_->digital_write(true);
+  this->set_timeout(30, [this] { this->continue_setup_(); });
 }
 
 void CST226Touchscreen::update_touches() {
diff --git a/esphome/components/cst226/touchscreen/cst226_touchscreen.h b/esphome/components/cst226/touchscreen/cst226_touchscreen.h
index 9f518e5068..1b15b952c4 100644
--- a/esphome/components/cst226/touchscreen/cst226_touchscreen.h
+++ b/esphome/components/cst226/touchscreen/cst226_touchscreen.h
@@ -35,7 +35,7 @@ class CST226Touchscreen : public touchscreen::Touchscreen, public i2c::I2CDevice
   void continue_setup_();
 
   InternalGPIOPin *interrupt_pin_{};
-  GPIOPin *reset_pin_{};
+  GPIOPin *reset_pin_{NULL_PIN};
   uint8_t chip_id_{};
   bool setup_complete_{};
 };
diff --git a/esphome/core/gpio.h b/esphome/core/gpio.h
index 1b6f2ba1e6..b3f6b00196 100644
--- a/esphome/core/gpio.h
+++ b/esphome/core/gpio.h
@@ -62,6 +62,24 @@ class GPIOPin {
   virtual bool is_internal() { return false; }
 };
 
+/**
+ * A pin to replace those that don't exist.
+ */
+class NullPin : public GPIOPin {
+ public:
+  void setup() override {}
+
+  void pin_mode(gpio::Flags _) override {}
+
+  bool digital_read() override { return false; }
+
+  void digital_write(bool _) override {}
+
+  std::string dump_summary() const override { return {"Not used"}; }
+};
+
+static GPIOPin *const NULL_PIN = new NullPin();
+
 /// Copy of GPIOPin that is safe to use from ISRs (with no virtual functions)
 class ISRInternalGPIOPin {
  public:

From f9ce35c89443b7245b889ed728f45f964d89a439 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Wed, 24 Apr 2024 09:59:19 +1200
Subject: [PATCH 35/81] Allow UART to be AUTO LOADed (#6617)

---
 esphome/components/uart/__init__.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/esphome/components/uart/__init__.py b/esphome/components/uart/__init__.py
index 82bc6caaa4..088227afe5 100644
--- a/esphome/components/uart/__init__.py
+++ b/esphome/components/uart/__init__.py
@@ -59,6 +59,7 @@ UARTWriteAction = uart_ns.class_("UARTWriteAction", automation.Action)
 UARTDebugger = uart_ns.class_("UARTDebugger", cg.Component, automation.Action)
 UARTDummyReceiver = uart_ns.class_("UARTDummyReceiver", cg.Component)
 MULTI_CONF = True
+MULTI_CONF_NO_DEFAULT = True
 
 
 def validate_raw_data(value):

From f8cdb087fc0eec5199312da94379c6407cdc3339 Mon Sep 17 00:00:00 2001
From: Jean  Louis-Guerin <DrCoolzic@hotmail.com>
Date: Wed, 24 Apr 2024 03:21:44 +0200
Subject: [PATCH 36/81] Add the WeiKai SPI/I2C UART/IO Expander components to
 esphome (#5218)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 CODEOWNERS                                    |  11 +
 esphome/components/weikai/__init__.py         | 108 +++
 esphome/components/weikai/weikai.cpp          | 615 ++++++++++++++++++
 esphome/components/weikai/weikai.h            | 443 +++++++++++++
 esphome/components/weikai/wk_reg_def.h        | 304 +++++++++
 esphome/components/weikai_i2c/__init__.py     |   1 +
 esphome/components/weikai_i2c/weikai_i2c.cpp  | 177 +++++
 esphome/components/weikai_i2c/weikai_i2c.h    |  61 ++
 esphome/components/weikai_spi/__init__.py     |   1 +
 esphome/components/weikai_spi/weikai_spi.cpp  | 189 ++++++
 esphome/components/weikai_spi/weikai_spi.h    |  54 ++
 esphome/components/wk2132_i2c/__init__.py     |  30 +
 esphome/components/wk2132_i2c/wk2132_i2c.cpp  |   4 +
 esphome/components/wk2132_spi/__init__.py     |  31 +
 esphome/components/wk2168_i2c/__init__.py     |  64 ++
 esphome/components/wk2168_spi/__init__.py     |  62 ++
 esphome/components/wk2204_i2c/__init__.py     |  30 +
 esphome/components/wk2204_spi/__init__.py     |  30 +
 esphome/components/wk2212_i2c/__init__.py     |  64 ++
 esphome/components/wk2212_spi/__init__.py     |  62 ++
 tests/components/wk2132_i2c/common.yaml       |  20 +
 .../components/wk2132_i2c/test.esp32-idf.yaml |   5 +
 .../wk2132_i2c/test.esp32-s3-idf.yaml         |   5 +
 .../components/wk2132_i2c/test.esp32-s3.yaml  |   5 +
 tests/components/wk2132_i2c/test.esp32.yaml   |   5 +
 tests/components/wk2132_spi/common.yaml       |  21 +
 .../components/wk2132_spi/test.esp32-idf.yaml |   7 +
 .../wk2132_spi/test.esp32-s3-idf.yaml         |   7 +
 .../components/wk2132_spi/test.esp32-s3.yaml  |   7 +
 tests/components/wk2132_spi/test.esp32.yaml   |   7 +
 tests/components/wk2168_i2c/common.yaml       |  63 ++
 .../components/wk2168_i2c/test.esp32-idf.yaml |   5 +
 .../wk2168_i2c/test.esp32-s3-idf.yaml         |   5 +
 .../components/wk2168_i2c/test.esp32-s3.yaml  |   5 +
 tests/components/wk2168_i2c/test.esp32.yaml   |   5 +
 tests/components/wk2168_spi/common.yaml       |  63 ++
 .../components/wk2168_spi/test.esp32-idf.yaml |   7 +
 .../wk2168_spi/test.esp32-s3-idf.yaml         |   7 +
 .../components/wk2168_spi/test.esp32-s3.yaml  |   7 +
 tests/components/wk2168_spi/test.esp32.yaml   |   7 +
 tests/components/wk2204_i2c/common.yaml       |  28 +
 .../components/wk2204_i2c/test.esp32-idf.yaml |   5 +
 .../wk2204_i2c/test.esp32-s3-idf.yaml         |   5 +
 .../components/wk2204_i2c/test.esp32-s3.yaml  |   5 +
 tests/components/wk2204_i2c/test.esp32.yaml   |   5 +
 tests/components/wk2204_spi/common.yaml       |  29 +
 .../components/wk2204_spi/test.esp32-idf.yaml |   7 +
 .../wk2204_spi/test.esp32-s3-idf.yaml         |   7 +
 .../components/wk2204_spi/test.esp32-s3.yaml  |   7 +
 tests/components/wk2204_spi/test.esp32.yaml   |   7 +
 tests/components/wk2212_i2c/common.yaml       |  59 ++
 .../components/wk2212_i2c/test.esp32-idf.yaml |   5 +
 .../wk2212_i2c/test.esp32-s3-idf.yaml         |   5 +
 .../components/wk2212_i2c/test.esp32-s3.yaml  |   5 +
 tests/components/wk2212_i2c/test.esp32.yaml   |   5 +
 tests/components/wk2212_spi/common.yaml       |  58 ++
 .../components/wk2212_spi/test.esp32-idf.yaml |   7 +
 .../wk2212_spi/test.esp32-s3-idf.yaml         |   7 +
 .../components/wk2212_spi/test.esp32-s3.yaml  |   7 +
 tests/components/wk2212_spi/test.esp32.yaml   |   7 +
 60 files changed, 2874 insertions(+)
 create mode 100644 esphome/components/weikai/__init__.py
 create mode 100644 esphome/components/weikai/weikai.cpp
 create mode 100644 esphome/components/weikai/weikai.h
 create mode 100644 esphome/components/weikai/wk_reg_def.h
 create mode 100644 esphome/components/weikai_i2c/__init__.py
 create mode 100644 esphome/components/weikai_i2c/weikai_i2c.cpp
 create mode 100644 esphome/components/weikai_i2c/weikai_i2c.h
 create mode 100644 esphome/components/weikai_spi/__init__.py
 create mode 100644 esphome/components/weikai_spi/weikai_spi.cpp
 create mode 100644 esphome/components/weikai_spi/weikai_spi.h
 create mode 100644 esphome/components/wk2132_i2c/__init__.py
 create mode 100644 esphome/components/wk2132_i2c/wk2132_i2c.cpp
 create mode 100644 esphome/components/wk2132_spi/__init__.py
 create mode 100644 esphome/components/wk2168_i2c/__init__.py
 create mode 100644 esphome/components/wk2168_spi/__init__.py
 create mode 100644 esphome/components/wk2204_i2c/__init__.py
 create mode 100644 esphome/components/wk2204_spi/__init__.py
 create mode 100644 esphome/components/wk2212_i2c/__init__.py
 create mode 100644 esphome/components/wk2212_spi/__init__.py
 create mode 100644 tests/components/wk2132_i2c/common.yaml
 create mode 100644 tests/components/wk2132_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2132_i2c/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2132_i2c/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2132_i2c/test.esp32.yaml
 create mode 100644 tests/components/wk2132_spi/common.yaml
 create mode 100644 tests/components/wk2132_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2132_spi/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2132_spi/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2132_spi/test.esp32.yaml
 create mode 100644 tests/components/wk2168_i2c/common.yaml
 create mode 100644 tests/components/wk2168_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2168_i2c/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2168_i2c/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2168_i2c/test.esp32.yaml
 create mode 100644 tests/components/wk2168_spi/common.yaml
 create mode 100644 tests/components/wk2168_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2168_spi/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2168_spi/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2168_spi/test.esp32.yaml
 create mode 100644 tests/components/wk2204_i2c/common.yaml
 create mode 100644 tests/components/wk2204_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2204_i2c/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2204_i2c/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2204_i2c/test.esp32.yaml
 create mode 100644 tests/components/wk2204_spi/common.yaml
 create mode 100644 tests/components/wk2204_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2204_spi/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2204_spi/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2204_spi/test.esp32.yaml
 create mode 100644 tests/components/wk2212_i2c/common.yaml
 create mode 100644 tests/components/wk2212_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2212_i2c/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2212_i2c/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2212_i2c/test.esp32.yaml
 create mode 100644 tests/components/wk2212_spi/common.yaml
 create mode 100644 tests/components/wk2212_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/wk2212_spi/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/wk2212_spi/test.esp32-s3.yaml
 create mode 100644 tests/components/wk2212_spi/test.esp32.yaml

diff --git a/CODEOWNERS b/CODEOWNERS
index 28ce8e7b6a..8da1618636 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -400,10 +400,21 @@ esphome/components/wake_on_lan/* @willwill2will54
 esphome/components/waveshare_epaper/* @clydebarrow
 esphome/components/web_server_base/* @OttoWinter
 esphome/components/web_server_idf/* @dentra
+esphome/components/weikai/* @DrCoolZic
+esphome/components/weikai_i2c/* @DrCoolZic
+esphome/components/weikai_spi/* @DrCoolZic
 esphome/components/whirlpool/* @glmnet
 esphome/components/whynter/* @aeonsablaze
 esphome/components/wiegand/* @ssieb
 esphome/components/wireguard/* @droscy @lhoracek @thomas0bernard
+esphome/components/wk2132_i2c/* @DrCoolZic
+esphome/components/wk2132_spi/* @DrCoolZic
+esphome/components/wk2168_i2c/* @DrCoolZic
+esphome/components/wk2168_spi/* @DrCoolZic
+esphome/components/wk2204_i2c/* @DrCoolZic
+esphome/components/wk2204_spi/* @DrCoolZic
+esphome/components/wk2212_i2c/* @DrCoolZic
+esphome/components/wk2212_spi/* @DrCoolZic
 esphome/components/wl_134/* @hobbypunk90
 esphome/components/x9c/* @EtienneMD
 esphome/components/xgzp68xx/* @gcormier
diff --git a/esphome/components/weikai/__init__.py b/esphome/components/weikai/__init__.py
new file mode 100644
index 0000000000..4248c48e35
--- /dev/null
+++ b/esphome/components/weikai/__init__.py
@@ -0,0 +1,108 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import uart
+from esphome.const import (
+    CONF_BAUD_RATE,
+    CONF_CHANNEL,
+    CONF_ID,
+    CONF_INPUT,
+    CONF_INVERTED,
+    CONF_MODE,
+    CONF_NUMBER,
+    CONF_OUTPUT,
+)
+
+CODEOWNERS = ["@DrCoolZic"]
+AUTO_LOAD = ["uart"]
+
+MULTI_CONF = True
+CONF_STOP_BITS = "stop_bits"
+CONF_PARITY = "parity"
+CONF_CRYSTAL = "crystal"
+CONF_UART = "uart"
+CONF_TEST_MODE = "test_mode"
+
+weikai_ns = cg.esphome_ns.namespace("weikai")
+WeikaiComponent = weikai_ns.class_("WeikaiComponent", cg.Component)
+WeikaiChannel = weikai_ns.class_("WeikaiChannel", uart.UARTComponent)
+
+
+def check_channel_max(value, max):
+    channel_uniq = []
+    channel_dup = []
+    for x in value[CONF_UART]:
+        if x[CONF_CHANNEL] > max - 1:
+            raise cv.Invalid(f"Invalid channel number: {x[CONF_CHANNEL]}")
+        if x[CONF_CHANNEL] not in channel_uniq:
+            channel_uniq.append(x[CONF_CHANNEL])
+        else:
+            channel_dup.append(x[CONF_CHANNEL])
+    if len(channel_dup) > 0:
+        raise cv.Invalid(f"Duplicate channel list: {channel_dup}")
+    return value
+
+
+def check_channel_max_4(value):
+    return check_channel_max(value, 4)
+
+
+def check_channel_max_2(value):
+    return check_channel_max(value, 2)
+
+
+WKBASE_SCHEMA = cv.Schema(
+    {
+        cv.GenerateID(): cv.declare_id(WeikaiComponent),
+        cv.Optional(CONF_CRYSTAL, default=14745600): cv.int_,
+        cv.Optional(CONF_TEST_MODE, default=0): cv.int_,
+        cv.Required(CONF_UART): cv.ensure_list(
+            {
+                cv.Required(CONF_ID): cv.declare_id(WeikaiChannel),
+                cv.Optional(CONF_CHANNEL, default=0): cv.int_range(min=0, max=3),
+                cv.Required(CONF_BAUD_RATE): cv.int_range(min=1),
+                cv.Optional(CONF_STOP_BITS, default=1): cv.one_of(1, 2, int=True),
+                cv.Optional(CONF_PARITY, default="NONE"): cv.enum(
+                    uart.UART_PARITY_OPTIONS, upper=True
+                ),
+            }
+        ),
+    }
+).extend(cv.COMPONENT_SCHEMA)
+
+
+async def register_weikai(var, config):
+    """Register an weikai device with the given config."""
+    cg.add(var.set_crystal(config[CONF_CRYSTAL]))
+    cg.add(var.set_test_mode(config[CONF_TEST_MODE]))
+    await cg.register_component(var, config)
+    for uart_elem in config[CONF_UART]:
+        chan = cg.new_Pvariable(uart_elem[CONF_ID])
+        cg.add(chan.set_channel_name(str(uart_elem[CONF_ID])))
+        cg.add(chan.set_parent(var))
+        cg.add(chan.set_channel(uart_elem[CONF_CHANNEL]))
+        cg.add(chan.set_baud_rate(uart_elem[CONF_BAUD_RATE]))
+        cg.add(chan.set_stop_bits(uart_elem[CONF_STOP_BITS]))
+        cg.add(chan.set_parity(uart_elem[CONF_PARITY]))
+
+
+def validate_pin_mode(value):
+    """Checks input/output mode inconsistency"""
+    if not (value[CONF_MODE][CONF_INPUT] or value[CONF_MODE][CONF_OUTPUT]):
+        raise cv.Invalid("Mode must be either input or output")
+    if value[CONF_MODE][CONF_INPUT] and value[CONF_MODE][CONF_OUTPUT]:
+        raise cv.Invalid("Mode must be either input or output")
+    return value
+
+
+WEIKAI_PIN_SCHEMA = cv.Schema(
+    {
+        cv.Required(CONF_NUMBER): cv.int_range(min=0, max=7),
+        cv.Optional(CONF_MODE, default={}): cv.All(
+            {
+                cv.Optional(CONF_INPUT, default=False): cv.boolean,
+                cv.Optional(CONF_OUTPUT, default=False): cv.boolean,
+            },
+        ),
+        cv.Optional(CONF_INVERTED, default=False): cv.boolean,
+    }
+)
diff --git a/esphome/components/weikai/weikai.cpp b/esphome/components/weikai/weikai.cpp
new file mode 100644
index 0000000000..a04bc0a574
--- /dev/null
+++ b/esphome/components/weikai/weikai.cpp
@@ -0,0 +1,615 @@
+/// @file weikai.cpp
+/// @brief  WeiKai component family - classes implementation
+/// @date Last Modified: 2024/04/06 15:13:11
+/// @details The classes declared in this file can be used by the Weikai family
+
+#include "weikai.h"
+
+namespace esphome {
+namespace weikai {
+
+/*! @mainpage Weikai source code documentation
+ This documentation provides information about the implementation of the family of WeiKai Components in ESPHome.
+ Here is the class diagram related to Weikai family of components:
+ @image html weikai_class.png
+
+  @section WKRingBuffer_ The WKRingBuffer template class
+The WKRingBuffer template class has it names implies implement a simple ring buffer helper class. This straightforward
+container implements FIFO functionality, enabling bytes to be pushed into one side and popped from the other in the
+order of entry. Implementation is classic and therefore not described in any details.
+
+  @section WeikaiRegister_ The WeikaiRegister class
+ The WeikaiRegister helper class creates objects that act as proxies to the device registers.
+ @details This is an abstract virtual class (interface) that provides all the necessary access to registers while hiding
+ the actual implementation. The access to the registers can be made through an I²C bus in for example for wk2168_i2c
+ component or through a SPI bus for example in the case of the wk2168_spi component. Derived classes will actually
+ performs the specific bus operations.
+
+ @section WeikaiRegisterI2C_ WeikaiRegisterI2C
+ The weikai_i2c::WeikaiRegisterI2C class implements the virtual methods of the WeikaiRegister class for an I2C bus.
+
+  @section WeikaiRegisterSPI_ WeikaiRegisterSPI
+ The weikai_spi::WeikaiRegisterSPI class implements the virtual methods of the WeikaiRegister class for an SPI bus.
+
+ @section WeikaiComponent_ The WeikaiComponent class
+The WeikaiComponent class stores the information global to a WeiKai family component and provides methods to set/access
+this information. It also serves as a container for WeikaiChannel instances. This is done by maintaining an array of
+references these WeikaiChannel instances. This class derives from the esphome::Component classes. This class override
+esphome::Component::loop() method to facilitate the seamless transfer of accumulated bytes from the receive
+FIFO into the ring buffer. This process ensures quick access to the stored bytes, enhancing the overall efficiency of
+the component.
+
+ @section WeikaiComponentI2C_ WeikaiComponentI2C
+ The weikai_i2c::WeikaiComponentI2C class implements the virtual methods of the WeikaiComponent class for an I2C bus.
+
+  @section WeikaiComponentSPI_ WeikaiComponentSPI
+ The weikai_spi::WeikaiComponentSPI class implements the virtual methods of the WeikaiComponent class for an SPI bus.
+
+ @section WeikaiGPIOPin_ WeikaiGPIOPin class
+ The WeikaiGPIOPin class is an helper class to expose the GPIO pins of WK family components as if they were internal
+ GPIO pins. It also provides the setup() and dump_summary() methods.
+
+ @section WeikaiChannel_ The WeikaiChannel class
+ The WeikaiChannel class is used to implement all the virtual methods of the ESPHome uart::UARTComponent class. An
+ individual instance of this class is created for each UART channel. It has a link back to the WeikaiComponent object it
+ belongs to. This class derives from the uart::UARTComponent class. It collaborates through an aggregation with
+ WeikaiComponent. This implies that WeikaiComponent acts as a container, housing several WeikaiChannel instances.
+ Furthermore, the WeikaiChannel class derives from the ESPHome uart::UARTComponent class, it also has an association
+ relationship with the WKRingBuffer and WeikaiRegister helper classes. Consequently, when a WeikaiChannel instance is
+ destroyed, the associated WKRingBuffer instance is also destroyed.
+
+*/
+
+static const char *const TAG = "weikai";
+
+/// @brief convert an int to binary representation as C++ std::string
+/// @param val integer to convert
+/// @return a std::string
+inline std::string i2s(uint8_t val) { return std::bitset<8>(val).to_string(); }
+/// Convert std::string to C string
+#define I2S2CS(val) (i2s(val).c_str())
+
+/// @brief measure the time elapsed between two calls
+/// @param last_time time of the previous call
+/// @return the elapsed time in milliseconds
+uint32_t elapsed_ms(uint32_t &last_time) {
+  uint32_t e = millis() - last_time;
+  last_time = millis();
+  return e;
+};
+
+/// @brief Converts the parity enum value to a C string
+/// @param parity enum
+/// @return the string
+const char *p2s(uart::UARTParityOptions parity) {
+  using namespace uart;
+  switch (parity) {
+    case UART_CONFIG_PARITY_NONE:
+      return "NONE";
+    case UART_CONFIG_PARITY_EVEN:
+      return "EVEN";
+    case UART_CONFIG_PARITY_ODD:
+      return "ODD";
+    default:
+      return "UNKNOWN";
+  }
+}
+
+/// @brief Display a buffer in hexadecimal format (32 hex values / line) for debug
+void print_buffer(const uint8_t *data, size_t length) {
+  char hex_buffer[100];
+  hex_buffer[(3 * 32) + 1] = 0;
+  for (size_t i = 0; i < length; i++) {
+    snprintf(&hex_buffer[3 * (i % 32)], sizeof(hex_buffer), "%02X ", data[i]);
+    if (i % 32 == 31) {
+      ESP_LOGVV(TAG, "   %s", hex_buffer);
+    }
+  }
+  if (length % 32) {
+    // null terminate if incomplete line
+    hex_buffer[3 * (length % 32) + 2] = 0;
+    ESP_LOGVV(TAG, "   %s", hex_buffer);
+  }
+}
+
+static const char *const REG_TO_STR_P0[16] = {"GENA", "GRST",  "GMUT",  "SPAGE", "SCR", "LCR",  "FCR",  "SIER",
+                                              "SIFR", "TFCNT", "RFCNT", "FSR",   "LSR", "FDAT", "FWCR", "RS485"};
+static const char *const REG_TO_STR_P1[16] = {"GENA", "GRST", "GMUT", "SPAGE", "BAUD1", "BAUD0", "PRES", "RFTL",
+                                              "TFTL", "FWTH", "FWTL", "XON1",  "XOFF1", "SADR",  "SAEN", "RTSDLY"};
+
+// method to print a register value as text: used in the log messages ...
+const char *reg_to_str(int reg, bool page1) {
+  if (reg == WKREG_GPDAT) {
+    return "GPDAT";
+  } else if (reg == WKREG_GPDIR) {
+    return "GPDIR";
+  } else {
+    return page1 ? REG_TO_STR_P1[reg & 0x0F] : REG_TO_STR_P0[reg & 0x0F];
+  }
+}
+
+enum RegType { REG = 0, FIFO = 1 };  ///< Register or FIFO
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiRegister methods
+///////////////////////////////////////////////////////////////////////////////
+WeikaiRegister &WeikaiRegister::operator=(uint8_t value) {
+  write_reg(value);
+  return *this;
+}
+
+WeikaiRegister &WeikaiRegister::operator&=(uint8_t value) {
+  value &= read_reg();
+  write_reg(value);
+  return *this;
+}
+
+WeikaiRegister &WeikaiRegister::operator|=(uint8_t value) {
+  value |= read_reg();
+  write_reg(value);
+  return *this;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiComponent methods
+///////////////////////////////////////////////////////////////////////////////
+void WeikaiComponent::loop() {
+  if ((this->component_state_ & COMPONENT_STATE_MASK) != COMPONENT_STATE_LOOP)
+    return;
+
+  // If there are some bytes in the receive FIFO we transfers them to the ring buffers
+  size_t transferred = 0;
+  for (auto *child : this->children_) {
+    // we look if some characters has been received in the fifo
+    transferred += child->xfer_fifo_to_buffer_();
+  }
+  if (transferred > 0) {
+    ESP_LOGV(TAG, "we transferred %d bytes from fifo to buffer...", transferred);
+  }
+
+#ifdef TEST_COMPONENT
+  static uint32_t loop_time = 0;
+  static uint32_t loop_count = 0;
+  uint32_t time = 0;
+
+  if (test_mode_ == 1) {  // test component in loopback
+    ESP_LOGI(TAG, "Component loop %" PRIu32 " for %s : %" PRIu32 " ms since last call ...", loop_count++,
+             this->get_name(), millis() - loop_time);
+    loop_time = millis();
+    char message[64];
+    elapsed_ms(time);  // set time to now
+    for (int i = 0; i < this->children_.size(); i++) {
+      if (i != ((loop_count - 1) % this->children_.size()))  // we do only one per loop
+        continue;
+      snprintf(message, sizeof(message), "%s:%s", this->get_name(), children_[i]->get_channel_name());
+      children_[i]->uart_send_test_(message);
+      uint32_t const start_time = millis();
+      while (children_[i]->tx_fifo_is_not_empty_()) {  // wait until buffer empty
+        if (millis() - start_time > 1500) {
+          ESP_LOGE(TAG, "timeout while flushing - %d bytes left in buffer...", children_[i]->tx_in_fifo_());
+          break;
+        }
+        yield();  // reschedule our thread to avoid blocking
+      }
+      bool status = children_[i]->uart_receive_test_(message);
+      ESP_LOGI(TAG, "Test %s => send/received %u bytes %s - execution time %" PRIu32 " ms...", message,
+               RING_BUFFER_SIZE, status ? "correctly" : "with error", elapsed_ms(time));
+    }
+  }
+
+  if (this->test_mode_ == 2) {  // test component in echo mode
+    for (auto *child : this->children_) {
+      uint8_t data = 0;
+      if (child->available()) {
+        child->read_byte(&data);
+        ESP_LOGI(TAG, "echo mode: read -> send %02X", data);
+        child->write_byte(data);
+      }
+    }
+  }
+  if (test_mode_ == 3) {
+    test_gpio_input_();
+  }
+
+  if (test_mode_ == 4) {
+    test_gpio_output_();
+  }
+#endif
+}
+
+#if defined(TEST_COMPONENT)
+void WeikaiComponent::test_gpio_input_() {
+  static bool init_input{false};
+  static uint8_t state{0};
+  uint8_t value;
+  if (!init_input) {
+    init_input = true;
+    // set all pins in input mode
+    this->reg(WKREG_GPDIR, 0) = 0x00;
+    ESP_LOGI(TAG, "initializing all pins to input mode");
+    state = this->reg(WKREG_GPDAT, 0);
+    ESP_LOGI(TAG, "initial input data state = %02X (%s)", state, I2S2CS(state));
+  }
+  value = this->reg(WKREG_GPDAT, 0);
+  if (value != state) {
+    ESP_LOGI(TAG, "Input data changed from %02X to %02X (%s)", state, value, I2S2CS(value));
+    state = value;
+  }
+}
+
+void WeikaiComponent::test_gpio_output_() {
+  static bool init_output{false};
+  static uint8_t state{0};
+  if (!init_output) {
+    init_output = true;
+    // set all pins in output mode
+    this->reg(WKREG_GPDIR, 0) = 0xFF;
+    ESP_LOGI(TAG, "initializing all pins to output mode");
+    this->reg(WKREG_GPDAT, 0) = state;
+    ESP_LOGI(TAG, "setting all outputs to 0");
+  }
+  state = ~state;
+  this->reg(WKREG_GPDAT, 0) = state;
+  ESP_LOGI(TAG, "Flipping all outputs to %02X (%s)", state, I2S2CS(state));
+  delay(100);  // NOLINT
+}
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiGPIOPin methods
+///////////////////////////////////////////////////////////////////////////////
+bool WeikaiComponent::read_pin_val_(uint8_t pin) {
+  this->input_state_ = this->reg(WKREG_GPDAT, 0);
+  ESP_LOGVV(TAG, "reading input pin %u = %u in_state %s", pin, this->input_state_ & (1 << pin), I2S2CS(input_state_));
+  return this->input_state_ & (1 << pin);
+}
+
+void WeikaiComponent::write_pin_val_(uint8_t pin, bool value) {
+  if (value) {
+    this->output_state_ |= (1 << pin);
+  } else {
+    this->output_state_ &= ~(1 << pin);
+  }
+  ESP_LOGVV(TAG, "writing output pin %d with %d out_state %s", pin, uint8_t(value), I2S2CS(this->output_state_));
+  this->reg(WKREG_GPDAT, 0) = this->output_state_;
+}
+
+void WeikaiComponent::set_pin_direction_(uint8_t pin, gpio::Flags flags) {
+  if (flags == gpio::FLAG_INPUT) {
+    this->pin_config_ &= ~(1 << pin);  // clear bit (input mode)
+  } else {
+    if (flags == gpio::FLAG_OUTPUT) {
+      this->pin_config_ |= 1 << pin;  // set bit (output mode)
+    } else {
+      ESP_LOGE(TAG, "pin %d direction invalid", pin);
+    }
+  }
+  ESP_LOGVV(TAG, "setting pin %d direction to %d pin_config=%s", pin, flags, I2S2CS(this->pin_config_));
+  this->reg(WKREG_GPDIR, 0) = this->pin_config_;  // TODO check ~
+}
+
+void WeikaiGPIOPin::setup() {
+  ESP_LOGCONFIG(TAG, "Setting GPIO pin %d mode to %s", this->pin_,
+                flags_ == gpio::FLAG_INPUT          ? "Input"
+                : this->flags_ == gpio::FLAG_OUTPUT ? "Output"
+                                                    : "NOT SPECIFIED");
+  // ESP_LOGCONFIG(TAG, "Setting GPIO pins mode to '%s' %02X", I2S2CS(this->flags_), this->flags_);
+  this->pin_mode(this->flags_);
+}
+
+std::string WeikaiGPIOPin::dump_summary() const {
+  char buffer[32];
+  snprintf(buffer, sizeof(buffer), "%u via WeiKai %s", this->pin_, this->parent_->get_name());
+  return buffer;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiChannel methods
+///////////////////////////////////////////////////////////////////////////////
+void WeikaiChannel::setup_channel() {
+  ESP_LOGCONFIG(TAG, "  Setting up UART %s:%s ...", this->parent_->get_name(), this->get_channel_name());
+  // we enable transmit and receive on this channel
+  if (this->check_channel_down()) {
+    ESP_LOGCONFIG(TAG, "  Error channel %s not working...", this->get_channel_name());
+  }
+  this->reset_fifo_();
+  this->receive_buffer_.clear();
+  this->set_line_param_();
+  this->set_baudrate_();
+}
+
+void WeikaiChannel::dump_channel() {
+  ESP_LOGCONFIG(TAG, "  UART %s ...", this->get_channel_name());
+  ESP_LOGCONFIG(TAG, "    Baud rate: %" PRIu32 " Bd", this->baud_rate_);
+  ESP_LOGCONFIG(TAG, "    Data bits: %u", this->data_bits_);
+  ESP_LOGCONFIG(TAG, "    Stop bits: %u", this->stop_bits_);
+  ESP_LOGCONFIG(TAG, "    Parity: %s", p2s(this->parity_));
+}
+
+void WeikaiChannel::reset_fifo_() {
+  // enable transmission and reception
+  this->reg(WKREG_SCR) = SCR_RXEN | SCR_TXEN;
+  // we reset and enable transmit and receive FIFO
+  this->reg(WKREG_FCR) = FCR_TFEN | FCR_RFEN | FCR_TFRST | FCR_RFRST;
+}
+
+void WeikaiChannel::set_line_param_() {
+  this->data_bits_ = 8;  // always equal to 8 for WeiKai (cant be changed)
+  uint8_t lcr = 0;
+  if (this->stop_bits_ == 2)
+    lcr |= LCR_STPL;
+  switch (this->parity_) {  // parity selection settings
+    case uart::UART_CONFIG_PARITY_ODD:
+      lcr |= (LCR_PAEN | LCR_PAR_ODD);
+      break;
+    case uart::UART_CONFIG_PARITY_EVEN:
+      lcr |= (LCR_PAEN | LCR_PAR_EVEN);
+      break;
+    default:
+      break;  // no parity 000x
+  }
+  this->reg(WKREG_LCR) = lcr;  // write LCR
+  ESP_LOGV(TAG, "    line config: %d data_bits, %d stop_bits, parity %s register [%s]", this->data_bits_,
+           this->stop_bits_, p2s(this->parity_), I2S2CS(lcr));
+}
+
+void WeikaiChannel::set_baudrate_() {
+  if (this->baud_rate_ > this->parent_->crystal_ / 16) {
+    baud_rate_ = this->parent_->crystal_ / 16;
+    ESP_LOGE(TAG, " Requested baudrate too high for crystal=%" PRIu32 " Hz. Has been reduced to %" PRIu32 " Bd",
+             this->parent_->crystal_, this->baud_rate_);
+  };
+  uint16_t const val_int = this->parent_->crystal_ / (this->baud_rate_ * 16) - 1;
+  uint16_t val_dec = (this->parent_->crystal_ % (this->baud_rate_ * 16)) / (this->baud_rate_ * 16);
+  uint8_t const baud_high = (uint8_t) (val_int >> 8);
+  uint8_t const baud_low = (uint8_t) (val_int & 0xFF);
+  while (val_dec > 0x0A)
+    val_dec /= 0x0A;
+  uint8_t const baud_dec = (uint8_t) (val_dec);
+
+  this->parent_->page1_ = true;  // switch to page 1
+  this->reg(WKREG_SPAGE) = 1;
+  this->reg(WKREG_BRH) = baud_high;
+  this->reg(WKREG_BRL) = baud_low;
+  this->reg(WKREG_BRD) = baud_dec;
+  this->parent_->page1_ = false;  // switch back to page 0
+  this->reg(WKREG_SPAGE) = 0;
+
+  ESP_LOGV(TAG, "    Crystal=%d baudrate=%d => registers [%d %d %d]", this->parent_->crystal_, this->baud_rate_,
+           baud_high, baud_low, baud_dec);
+}
+
+inline bool WeikaiChannel::tx_fifo_is_not_empty_() { return this->reg(WKREG_FSR) & FSR_TFDAT; }
+
+size_t WeikaiChannel::tx_in_fifo_() {
+  size_t tfcnt = this->reg(WKREG_TFCNT);
+  if (tfcnt == 0) {
+    uint8_t const fsr = this->reg(WKREG_FSR);
+    if (fsr & FSR_TFFULL) {
+      ESP_LOGVV(TAG, "tx FIFO full FSR=%s", I2S2CS(fsr));
+      tfcnt = FIFO_SIZE;
+    }
+  }
+  ESP_LOGVV(TAG, "tx FIFO contains %d bytes", tfcnt);
+  return tfcnt;
+}
+
+size_t WeikaiChannel::rx_in_fifo_() {
+  size_t available = this->reg(WKREG_RFCNT);
+  uint8_t const fsr = this->reg(WKREG_FSR);
+  if (fsr & (FSR_RFOE | FSR_RFLB | FSR_RFFE | FSR_RFPE)) {
+    if (fsr & FSR_RFOE)
+      ESP_LOGE(TAG, "Receive data overflow FSR=%s", I2S2CS(fsr));
+    if (fsr & FSR_RFLB)
+      ESP_LOGE(TAG, "Receive line break FSR=%s", I2S2CS(fsr));
+    if (fsr & FSR_RFFE)
+      ESP_LOGE(TAG, "Receive frame error FSR=%s", I2S2CS(fsr));
+    if (fsr & FSR_RFPE)
+      ESP_LOGE(TAG, "Receive parity error FSR=%s", I2S2CS(fsr));
+  }
+  if ((available == 0) && (fsr & FSR_RFDAT)) {
+    // here we should be very careful because we can have something like this:
+    // -  at time t0 we read RFCNT=0 because nothing yet received
+    // -  at time t0+delta we might read FIFO not empty because one byte has just been received
+    // -  so to be sure we need to do another read of RFCNT and if it is still zero -> buffer full
+    available = this->reg(WKREG_RFCNT);
+    if (available == 0) {  // still zero ?
+      ESP_LOGV(TAG, "rx FIFO is full FSR=%s", I2S2CS(fsr));
+      available = FIFO_SIZE;
+    }
+  }
+  ESP_LOGVV(TAG, "rx FIFO contain %d bytes - FSR status=%s", available, I2S2CS(fsr));
+  return available;
+}
+
+bool WeikaiChannel::check_channel_down() {
+  // to check if we channel is up we write to the LCR W/R register
+  // note that this will put a break on the tx line for few ms
+  WeikaiRegister &lcr = this->reg(WKREG_LCR);
+  lcr = 0x3F;
+  uint8_t val = lcr;
+  if (val != 0x3F) {
+    ESP_LOGE(TAG, "R/W of register failed expected 0x3F received 0x%02X", val);
+    return true;
+  }
+  lcr = 0;
+  val = lcr;
+  if (val != 0x00) {
+    ESP_LOGE(TAG, "R/W of register failed expected 0x00 received 0x%02X", val);
+    return true;
+  }
+  return false;
+}
+
+bool WeikaiChannel::peek_byte(uint8_t *buffer) {
+  auto available = this->receive_buffer_.count();
+  if (!available)
+    xfer_fifo_to_buffer_();
+  return this->receive_buffer_.peek(*buffer);
+}
+
+int WeikaiChannel::available() {
+  size_t available = this->receive_buffer_.count();
+  if (!available)
+    available = xfer_fifo_to_buffer_();
+  return available;
+}
+
+bool WeikaiChannel::read_array(uint8_t *buffer, size_t length) {
+  bool status = true;
+  auto available = this->receive_buffer_.count();
+  if (length > available) {
+    ESP_LOGW(TAG, "read_array: buffer underflow requested %d bytes only %d bytes available...", length, available);
+    length = available;
+    status = false;
+  }
+  // retrieve the bytes from ring buffer
+  for (size_t i = 0; i < length; i++) {
+    this->receive_buffer_.pop(buffer[i]);
+  }
+  ESP_LOGVV(TAG, "read_array(ch=%d buffer[0]=%02X, length=%d): status %s", this->channel_, *buffer, length,
+            status ? "OK" : "ERROR");
+  return status;
+}
+
+void WeikaiChannel::write_array(const uint8_t *buffer, size_t length) {
+  if (length > XFER_MAX_SIZE) {
+    ESP_LOGE(TAG, "Write_array: invalid call - requested %d bytes but max size %d ...", length, XFER_MAX_SIZE);
+    length = XFER_MAX_SIZE;
+  }
+  this->reg(0).write_fifo(const_cast<uint8_t *>(buffer), length);
+}
+
+void WeikaiChannel::flush() {
+  uint32_t const start_time = millis();
+  while (this->tx_fifo_is_not_empty_()) {  // wait until buffer empty
+    if (millis() - start_time > 200) {
+      ESP_LOGW(TAG, "WARNING flush timeout - still %d bytes not sent after 200 ms...", this->tx_in_fifo_());
+      return;
+    }
+    yield();  // reschedule our thread to avoid blocking
+  }
+}
+
+size_t WeikaiChannel::xfer_fifo_to_buffer_() {
+  size_t to_transfer;
+  size_t free;
+  while ((to_transfer = this->rx_in_fifo_()) && (free = this->receive_buffer_.free())) {
+    // while bytes in fifo and some room in the buffer we transfer
+    if (to_transfer > XFER_MAX_SIZE)
+      to_transfer = XFER_MAX_SIZE;  // we can only do so much
+    if (to_transfer > free)
+      to_transfer = free;  // we'll do the rest next time
+    if (to_transfer) {
+      uint8_t data[to_transfer];
+      this->reg(0).read_fifo(data, to_transfer);
+      for (size_t i = 0; i < to_transfer; i++)
+        this->receive_buffer_.push(data[i]);
+    }
+  }  // while work to do
+  return to_transfer;
+}
+
+///
+// TEST COMPONENT
+//
+#ifdef TEST_COMPONENT
+/// @addtogroup test_ Test component information
+/// @{
+
+/// @brief An increment "Functor" (i.e. a class object that acts like a method with state!)
+///
+/// Functors are objects that can be treated as though they are a function or function pointer.
+class Increment {
+ public:
+  /// @brief constructor: initialize current value to 0
+  Increment() : i_(0) {}
+  /// @brief overload of the parenthesis operator.
+  /// Returns the current value and auto increment it
+  /// @return the current value.
+  uint8_t operator()() { return i_++; }
+
+ private:
+  uint8_t i_;
+};
+
+/// @brief Hex converter to print/display a buffer in hexadecimal format (32 hex values / line).
+/// @param buffer contains the values to display
+void print_buffer(std::vector<uint8_t> buffer) {
+  char hex_buffer[100];
+  hex_buffer[(3 * 32) + 1] = 0;
+  for (size_t i = 0; i < buffer.size(); i++) {
+    snprintf(&hex_buffer[3 * (i % 32)], sizeof(hex_buffer), "%02X ", buffer[i]);
+    if (i % 32 == 31)
+      ESP_LOGI(TAG, "   %s", hex_buffer);
+  }
+  if (buffer.size() % 32) {
+    // null terminate if incomplete line
+    hex_buffer[3 * (buffer.size() % 32) + 1] = 0;
+    ESP_LOGI(TAG, "   %s", hex_buffer);
+  }
+}
+
+/// @brief test the write_array method
+void WeikaiChannel::uart_send_test_(char *message) {
+  auto start_exec = micros();
+  std::vector<uint8_t> output_buffer(XFER_MAX_SIZE);
+  generate(output_buffer.begin(), output_buffer.end(), Increment());  // fill with incrementing number
+  size_t to_send = RING_BUFFER_SIZE;
+  while (to_send) {
+    this->write_array(&output_buffer[0], XFER_MAX_SIZE);  // we send the buffer
+    this->flush();
+    to_send -= XFER_MAX_SIZE;
+  }
+  ESP_LOGV(TAG, "%s => sent %d bytes - exec time %d µs ...", message, RING_BUFFER_SIZE, micros() - start_exec);
+}
+
+/// @brief test read_array method
+bool WeikaiChannel::uart_receive_test_(char *message) {
+  auto start_exec = micros();
+  bool status = true;
+  size_t received = 0;
+  std::vector<uint8_t> buffer(RING_BUFFER_SIZE);
+
+  // we wait until we have received all the bytes
+  uint32_t const start_time = millis();
+  status = true;
+  while (received < RING_BUFFER_SIZE) {
+    while (XFER_MAX_SIZE > this->available()) {
+      this->xfer_fifo_to_buffer_();
+      if (millis() - start_time > 1500) {
+        ESP_LOGE(TAG, "uart_receive_test_() timeout: only %d bytes received...", this->available());
+        break;
+      }
+      yield();  // reschedule our thread to avoid blocking
+    }
+    status = this->read_array(&buffer[received], XFER_MAX_SIZE) && status;
+    received += XFER_MAX_SIZE;
+  }
+
+  uint8_t peek_value = 0;
+  this->peek_byte(&peek_value);
+  if (peek_value != 0) {
+    ESP_LOGE(TAG, "Peek first byte value error...");
+    status = false;
+  }
+
+  for (size_t i = 0; i < RING_BUFFER_SIZE; i++) {
+    if (buffer[i] != i % XFER_MAX_SIZE) {
+      ESP_LOGE(TAG, "Read buffer contains error...b=%x i=%x", buffer[i], i % XFER_MAX_SIZE);
+      print_buffer(buffer);
+      status = false;
+      break;
+    }
+  }
+
+  ESP_LOGV(TAG, "%s => received %d bytes  status %s - exec time %d µs ...", message, received, status ? "OK" : "ERROR",
+           micros() - start_exec);
+  return status;
+}
+
+/// @}
+#endif
+
+}  // namespace weikai
+}  // namespace esphome
diff --git a/esphome/components/weikai/weikai.h b/esphome/components/weikai/weikai.h
new file mode 100644
index 0000000000..042c729162
--- /dev/null
+++ b/esphome/components/weikai/weikai.h
@@ -0,0 +1,443 @@
+/// @file weikai.h
+/// @author DrCoolZic
+/// @brief  WeiKai component family - classes declaration
+/// @date Last Modified: 2024/04/06 14:44:17
+/// @details The classes declared in this file can be used by the Weikai family
+/// of UART and GPIO expander components. As of today it provides support for
+///     wk2124_spi, wk2132_spi, wk2168_spi, wk2204_spi, wk2212_spi,
+///                 wk2132_i2c, wk2168_i2c, wk2204_i2c, wk2212_i2c
+
+#pragma once
+#include <bitset>
+#include <memory>
+#include <cinttypes>
+#include "esphome/core/component.h"
+#include "esphome/components/uart/uart.h"
+#include "wk_reg_def.h"
+
+/// When the TEST_COMPONENT flag is defined we include some auto-test methods. Used to test the software during
+/// development but can also be used in situ to test if the component is working correctly. For release we do
+/// not set it by default but you can set it by using the following lines in you configuration file:
+/// @code
+/// esphome:
+///   platformio_options:
+///     build_flags:
+///       - -DTEST_COMPONENT
+/// @endcode
+// #define TEST_COMPONENT
+
+namespace esphome {
+namespace weikai {
+
+/// @brief XFER_MAX_SIZE defines the maximum number of bytes allowed during one transfer.
+#if defined(I2C_BUFFER_LENGTH)
+constexpr size_t XFER_MAX_SIZE = I2C_BUFFER_LENGTH;
+#else
+constexpr size_t XFER_MAX_SIZE = 128;
+#endif
+
+/// @brief size of the internal WeiKai FIFO
+constexpr size_t FIFO_SIZE = 256;
+
+/// @brief size of the ring buffer set to size of the FIFO
+constexpr size_t RING_BUFFER_SIZE = FIFO_SIZE;
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/// @brief This is an helper class that provides a simple ring buffers that works as a FIFO
+/// @details This ring buffer is used to buffer the bytes received in the FIFO of the Weika device. The best way to read
+/// characters from the device FIFO, is to first check how many bytes were received and then read them all at once.
+/// Unfortunately in all the code I have reviewed the characters are read one by one in a while loop by checking if
+/// bytes are available then reading the byte until no more byte available. This is pretty inefficient for two reasons:
+/// - Fist you need to perform a test for each byte to read
+/// - and second you call the read byte method for each character.
+/// .
+/// Assuming you need to read 100 bytes that results into 200 calls. This is to compare to 2 calls (one to find the
+/// number of bytes available plus one to read all the bytes) in the best case! If the registers you read are located on
+/// the micro-controller this is acceptable because the registers can be accessed fast. But when the registers are
+/// located on a remote device accessing them requires several cycles on a slow bus. As it it not possible to fix this
+/// problem by asking users to rewrite their code, I have implemented this ring buffer that store the bytes received
+/// locally.
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+template<typename T, size_t SIZE> class WKRingBuffer {
+ public:
+  /// @brief pushes an item at the tail of the fifo
+  /// @param item item to push
+  /// @return true if item has been pushed, false il item could not pushed (buffer full)
+  bool push(const T item) {
+    if (is_full())
+      return false;
+    this->rb_[this->head_] = item;
+    this->head_ = (this->head_ + 1) % SIZE;
+    this->count_++;
+    return true;
+  }
+
+  /// @brief return and remove the item at head of the fifo
+  /// @param item item read
+  /// @return true if an item has been retrieved, false il no item available (buffer empty)
+  bool pop(T &item) {
+    if (is_empty())
+      return false;
+    item = this->rb_[this->tail_];
+    this->tail_ = (this->tail_ + 1) % SIZE;
+    this->count_--;
+    return true;
+  }
+
+  /// @brief return the value of the item at fifo's head without removing it
+  /// @param item pointer to item to return
+  /// @return true if item has been retrieved, false il no item available (buffer empty)
+  bool peek(T &item) {
+    if (is_empty())
+      return false;
+    item = this->rb_[this->tail_];
+    return true;
+  }
+
+  /// @brief test is the Ring Buffer is empty ?
+  /// @return true if empty
+  inline bool is_empty() { return (this->count_ == 0); }
+
+  /// @brief test is the ring buffer is full ?
+  /// @return true if full
+  inline bool is_full() { return (this->count_ == SIZE); }
+
+  /// @brief return the number of item in the ring buffer
+  /// @return the number of items
+  inline size_t count() { return this->count_; }
+
+  /// @brief returns the number of free positions in the buffer
+  /// @return how many items can be added
+  inline size_t free() { return SIZE - this->count_; }
+
+  /// @brief clear the buffer content
+  inline void clear() { this->head_ = this->tail_ = this->count_ = 0; }
+
+ protected:
+  std::array<T, SIZE> rb_{0};  ///< the ring buffer
+  int tail_{0};                ///< position of the next element to read
+  int head_{0};                ///< position of the next element to write
+  size_t count_{0};            ///< count number of element in the buffer
+};
+
+class WeikaiComponent;
+// class WeikaiComponentSPI;
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+/// @brief WeikaiRegister objects acts as proxies to access remote register independently of the bus type.
+/// @details This is an abstract interface class that provides many operations to access to registers while hiding
+/// the actual implementation. This allow to accesses the registers in the Weikai component abstract class independently
+/// of the actual bus (I2C, SPI). The derived classes will actually implements the specific bus operations dependant of
+/// the bus used.
+/// @n typical usage of WeikaiRegister:
+/// @code
+///   WeikaiRegister reg_X {&WeikaiComponent, ADDR_REGISTER_X, CHANNEL_NUM}  // declaration
+///   reg_X |= 0x01;    // set bit 0 of the weikai register
+///   reg_X &= ~0x01;   // reset bit 0 of the weikai register
+///   reg_X = 10;       // Set the value of weikai register
+///   uint val = reg_X; // get the value of weikai register
+/// @endcode
+class WeikaiRegister {
+ public:
+  /// @brief WeikaiRegister constructor.
+  /// @param comp our parent WeikaiComponent
+  /// @param reg address of the register
+  /// @param channel the channel of this register
+  WeikaiRegister(WeikaiComponent *const comp, uint8_t reg, uint8_t channel)
+      : comp_(comp), register_(reg), channel_(channel) {}
+  virtual ~WeikaiRegister() {}
+
+  /// @brief overloads the = operator. This is used to set a value into the weikai register
+  /// @param value to be set
+  /// @return this object
+  WeikaiRegister &operator=(uint8_t value);
+
+  /// @brief overloads the compound &= operator. This is often used to reset bits in the weikai register
+  /// @param value performs an & operation with value and store the result
+  /// @return this object
+  WeikaiRegister &operator&=(uint8_t value);
+
+  /// @brief overloads the compound |= operator. This is often used to set bits in the weikai register
+  /// @param value performs an | operation with value and store the result
+  /// @return this object
+  WeikaiRegister &operator|=(uint8_t value);
+
+  /// @brief cast operator that returns the content of the weikai register
+  operator uint8_t() const { return read_reg(); }
+
+  /// @brief reads the register
+  /// @return the value read from the register
+  virtual uint8_t read_reg() const = 0;
+
+  /// @brief writes the register
+  /// @param value to write in the register
+  virtual void write_reg(uint8_t value) = 0;
+
+  /// @brief read an array of bytes from the receiver fifo
+  /// @param data pointer to data buffer
+  /// @param length number of bytes to read
+  virtual void read_fifo(uint8_t *data, size_t length) const = 0;
+
+  /// @brief write an array of bytes to the transmitter fifo
+  /// @param data pointer to data buffer
+  /// @param length number of bytes to write
+  virtual void write_fifo(uint8_t *data, size_t length) = 0;
+
+  WeikaiComponent *const comp_;  ///< pointer to our parent (aggregation)
+  uint8_t register_;             ///< address of the register
+  uint8_t channel_;              ///< channel for this register
+};
+
+class WeikaiChannel;  // forward declaration
+////////////////////////////////////////////////////////////////////////////////////
+/// @brief The WeikaiComponent class stores the information global to the WeiKai component
+/// and provides methods to set/access this information. It is also the container of
+/// the WeikaiChannel children objects. This class is derived from esphome::Component
+/// class.
+////////////////////////////////////////////////////////////////////////////////////
+class WeikaiComponent : public Component {
+ public:
+  /// @brief virtual destructor
+  virtual ~WeikaiComponent() {}
+
+  /// @brief store crystal frequency
+  /// @param crystal frequency
+  void set_crystal(uint32_t crystal) { this->crystal_ = crystal; }
+
+  /// @brief store if the component is in test mode
+  /// @param test_mode 0=normal mode any other values mean component in test mode
+  void set_test_mode(int test_mode) { this->test_mode_ = test_mode; }
+
+  /// @brief store the name for the component
+  /// @param name the name as defined by the python code generator
+  void set_name(std::string name) { this->name_ = std::move(name); }
+
+  /// @brief Get the name of the component
+  /// @return the name
+  const char *get_name() { return this->name_.c_str(); }
+
+  /// @brief override the Component loop()
+  void loop() override;
+
+  bool page1() { return page1_; }
+
+  /// @brief Factory method to create a Register object
+  /// @param reg address of the register
+  /// @param channel channel associated with this register
+  /// @return a reference to WeikaiRegister
+  virtual WeikaiRegister &reg(uint8_t reg, uint8_t channel) = 0;
+
+ protected:
+  friend class WeikaiChannel;
+
+  /// @brief Get the priority of the component
+  /// @return the priority
+  /// @details The priority is set  below setup_priority::BUS because we use
+  /// the spi/i2c busses (which has a priority of BUS) to communicate and the WeiKai
+  /// therefore it is seen by our client almost as if it was a bus.
+  float get_setup_priority() const override { return setup_priority::BUS - 0.1F; }
+
+  friend class WeikaiGPIOPin;
+  /// Helper method to read the value of a pin.
+  bool read_pin_val_(uint8_t pin);
+
+  /// Helper method to write the value of a pin.
+  void write_pin_val_(uint8_t pin, bool value);
+
+  /// Helper method to set the pin mode of a pin.
+  void set_pin_direction_(uint8_t pin, gpio::Flags flags);
+
+#ifdef TEST_COMPONENT
+  /// @defgroup test_ Test component information
+  /// @brief Contains information about the auto-tests of the component
+  /// @{
+  void test_gpio_input_();
+  void test_gpio_output_();
+  /// @}
+#endif
+
+  uint8_t pin_config_{0x00};                 ///< pin config mask: 1 means OUTPUT, 0 means INPUT
+  uint8_t output_state_{0x00};               ///< output state: 1 means HIGH, 0 means LOW
+  uint8_t input_state_{0x00};                ///< input pin states: 1 means HIGH, 0 means LOW
+  uint32_t crystal_;                         ///< crystal value;
+  int test_mode_;                            ///< test mode value (0 -> no tests)
+  bool page1_{false};                        ///< set to true when in "page1 mode"
+  std::vector<WeikaiChannel *> children_{};  ///< the list of WeikaiChannel UART children
+  std::string name_;                         ///< name of entity
+};
+
+///////////////////////////////////////////////////////////////////////////////
+/// @brief Helper class to expose a WeiKai family IO pin as an internal GPIO pin.
+///////////////////////////////////////////////////////////////////////////////
+class WeikaiGPIOPin : public GPIOPin {
+ public:
+  void set_parent(WeikaiComponent *parent) { this->parent_ = parent; }
+  void set_pin(uint8_t pin) { this->pin_ = pin; }
+  void set_inverted(bool inverted) { this->inverted_ = inverted; }
+  void set_flags(gpio::Flags flags) { this->flags_ = flags; }
+
+  void setup() override;
+  std::string dump_summary() const override;
+  void pin_mode(gpio::Flags flags) override { this->parent_->set_pin_direction_(this->pin_, flags); }
+  bool digital_read() override { return this->parent_->read_pin_val_(this->pin_) != this->inverted_; }
+  void digital_write(bool value) override { this->parent_->write_pin_val_(this->pin_, value != this->inverted_); }
+
+ protected:
+  WeikaiComponent *parent_{nullptr};
+  uint8_t pin_;
+  bool inverted_;
+  gpio::Flags flags_;
+};
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+/// @brief The WeikaiChannel class is used to implement all the virtual methods of the ESPHome
+/// uart::UARTComponent virtual class. This class is common to the different members of the Weikai
+/// components family and therefore avoid code duplication.
+///////////////////////////////////////////////////////////////////////////////////////////////////
+class WeikaiChannel : public uart::UARTComponent {
+ public:
+  /// @brief We belongs to this WeikaiComponent
+  /// @param parent pointer to the component we belongs to
+  void set_parent(WeikaiComponent *parent) {
+    this->parent_ = parent;
+    this->parent_->children_.push_back(this);  // add ourself to the list (vector)
+  }
+
+  /// @brief Sets the channel number
+  /// @param channel number
+  void set_channel(uint8_t channel) { this->channel_ = channel; }
+
+  /// @brief The name as generated by the Python code generator
+  /// @param name of the channel
+  void set_channel_name(std::string name) { this->name_ = std::move(name); }
+
+  /// @brief Get the channel name
+  /// @return the name
+  const char *get_channel_name() { return this->name_.c_str(); }
+
+  /// @brief Setup the channel
+  void virtual setup_channel();
+
+  /// @brief dump channel information
+  void virtual dump_channel();
+
+  /// @brief Factory method to create a WeikaiRegister proxy object
+  /// @param reg address of the register
+  /// @return a reference to WeikaiRegister
+  WeikaiRegister &reg(uint8_t reg) { return this->parent_->reg(reg, channel_); }
+
+  //
+  // we implements/overrides the virtual class from UARTComponent
+  //
+
+  /// @brief Writes a specified number of bytes to a serial port
+  /// @param buffer pointer to the buffer
+  /// @param length number of bytes to write
+  /// @details This method sends 'length' characters from the buffer to the serial line. Unfortunately (unlike the
+  /// Arduino equivalent) this method does not return any flag and therefore it is not possible to know if any/all bytes
+  /// have been transmitted correctly. Another problem is that it is not possible to know ahead of time how many bytes
+  /// we can safely send as there is no tx_available() method provided! To avoid overrun when using the write method you
+  /// can use the flush() method to wait until the transmit fifo is empty.
+  /// @n Typical usage could be:
+  /// @code
+  ///   // ...
+  ///   uint8_t buffer[128];
+  ///   // ...
+  ///   write_array(&buffer, length);
+  ///   flush();
+  ///   // ...
+  /// @endcode
+  void write_array(const uint8_t *buffer, size_t length) override;
+
+  /// @brief Reads a specified number of bytes from a serial port
+  /// @param buffer buffer to store the bytes
+  /// @param length number of bytes to read
+  /// @return true if succeed, false otherwise
+  /// @details Typical usage:
+  /// @code
+  ///   // ...
+  ///   auto length = available();
+  ///   uint8_t buffer[128];
+  ///   if (length > 0) {
+  ///     auto status = read_array(&buffer, length)
+  ///     // test status ...
+  ///   }
+  /// @endcode
+  bool read_array(uint8_t *buffer, size_t length) override;
+
+  /// @brief Reads the first byte in FIFO without removing it
+  /// @param buffer pointer to the byte
+  /// @return true if succeed reading one byte, false if no character available
+  /// @details This method returns the next byte from receiving buffer without removing it from the internal fifo. It
+  /// returns true if a character is available and has been read, false otherwise.\n
+  bool peek_byte(uint8_t *buffer) override;
+
+  /// @brief Returns the number of bytes in the receive buffer
+  /// @return the number of bytes available in the receiver fifo
+  int available() override;
+
+  /// @brief Flush the output fifo.
+  /// @details If we refer to Serial.flush() in Arduino it says: ** Waits for the transmission of outgoing serial data
+  /// to complete. (Prior to Arduino 1.0, this the method was removing any buffered incoming serial data.). ** Therefore
+  /// we wait until all bytes are gone with a timeout of 100 ms
+  void flush() override;
+
+ protected:
+  friend class WeikaiComponent;
+
+  /// @brief this cannot happen with external uart therefore we do nothing
+  void check_logger_conflict() override {}
+
+  /// @brief reset the weikai internal FIFO
+  void reset_fifo_();
+
+  /// @brief set the line parameters
+  void set_line_param_();
+
+  /// @brief set the baud rate
+  void set_baudrate_();
+
+  /// @brief Returns the number of bytes in the receive fifo
+  /// @return the number of bytes in the fifo
+  size_t rx_in_fifo_();
+
+  /// @brief Returns the number of bytes in the transmit fifo
+  /// @return the number of bytes in the fifo
+  size_t tx_in_fifo_();
+
+  /// @brief test if transmit buffer is not empty in the status register (optimization)
+  /// @return true if not emptygroup test_
+  bool tx_fifo_is_not_empty_();
+
+  /// @brief transfer bytes from the weikai internal FIFO to the buffer (if any)
+  /// @return number of bytes transferred
+  size_t xfer_fifo_to_buffer_();
+
+  /// @brief check if channel is alive
+  /// @return true if OK
+  bool virtual check_channel_down();
+
+#ifdef TEST_COMPONENT
+  /// @ingroup test_
+  /// @{
+
+  /// @brief Test the write_array() method
+  /// @param message to display
+  void uart_send_test_(char *message);
+
+  /// @brief Test the read_array() method
+  /// @param message to display
+  /// @return true if success
+  bool uart_receive_test_(char *message);
+  /// @}
+#endif
+
+  /// @brief the buffer where we store temporarily the bytes received
+  WKRingBuffer<uint8_t, RING_BUFFER_SIZE> receive_buffer_;
+  WeikaiComponent *parent_;  ///< our WK2168component parent
+  uint8_t channel_;          ///< our Channel number
+  uint8_t data_;             ///< a one byte buffer for register read storage
+  std::string name_;         ///< name of the entity
+};
+
+}  // namespace weikai
+}  // namespace esphome
diff --git a/esphome/components/weikai/wk_reg_def.h b/esphome/components/weikai/wk_reg_def.h
new file mode 100644
index 0000000000..f3c90b196a
--- /dev/null
+++ b/esphome/components/weikai/wk_reg_def.h
@@ -0,0 +1,304 @@
+/// @file wk_reg_def.h
+/// @author DrCoolZic
+/// @brief  WeiKai component family - registers' definition
+/// @date Last Modified: 2024/02/18 15:49:18
+#pragma once
+
+namespace esphome {
+namespace weikai {
+
+////////////////////////////////////////////////////////////////////////////////////////
+/// Definition of the WeiKai registers
+////////////////////////////////////////////////////////////////////////////////////////
+
+/// @defgroup wk2168_gr_ WeiKai Global Registers
+/// This section groups all **Global Registers**: these registers are global to the
+/// the WeiKai chip (i.e. independent of the UART channel used)
+/// @note only registers and parameters used have been fully documented
+/// @{
+
+/// @brief Global Control Register - 00 0000
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  |   M0   |   M1   |       RSV       |  C4EN  |  C3EN  |  C2EN  |  C1EN  | name
+///  -------------------------------------------------------------------------
+///  |    R   |    R   |    R   |    R   |   W/R  |   W/R  |   W/R  |   W/R  | type
+///  -------------------------------------------------------------------------
+///  |    1   |    1   |    1   |    1   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_GENA = 0x00;
+/// @brief Channel 4 enable clock (0: disable, 1: enable)
+constexpr uint8_t GENA_C4EN = 1 << 3;
+/// @brief Channel 3 enable clock (0: disable, 1: enable)
+constexpr uint8_t GENA_C3EN = 1 << 2;
+/// @brief Channel 2 enable clock (0: disable, 1: enable)
+constexpr uint8_t GENA_C2EN = 1 << 1;
+/// @brief Channel 1 enable clock (0: disable, 1: enable)
+constexpr uint8_t GENA_C1EN = 1 << 0;
+
+/// @brief Global Reset Register - 00 0001
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  | C4SLEEP| C3SLEEP| C2SLEEP| C1SLEEP|  C4RST |  C3RST |  C2RST |  C1RST | name
+///  -------------------------------------------------------------------------
+///  |    R   |    R   |    R   |    R   |  W1/R0 |  W1/R0 |  W1/R0 |  W1/R0 | type
+///  -------------------------------------------------------------------------
+///  |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_GRST = 0x01;
+/// @brief Channel 4 soft reset (0: not reset, 1: reset)
+constexpr uint8_t GRST_C4RST = 1 << 3;
+/// @brief Channel 3 soft reset (0: not reset, 1: reset)
+constexpr uint8_t GRST_C3RST = 1 << 2;
+/// @brief Channel 2 soft reset (0: not reset, 1: reset)
+constexpr uint8_t GRST_C2RST = 1 << 1;
+/// @brief Channel 1 soft reset (0: not reset, 1: reset)
+constexpr uint8_t GRST_C1RST = 1 << 0;
+
+/// @brief Global Master channel control register (not used) - 000010
+constexpr uint8_t WKREG_GMUT = 0x02;
+
+/// Global interrupt register (not used) - 01 0000
+constexpr uint8_t WKREG_GIER = 0x10;
+
+/// Global interrupt flag register (not used) 01 0001
+constexpr uint8_t WKREG_GIFR = 0x11;
+
+/// @brief Global GPIO direction register - 10 0001
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  |   PD7  |   PD6  |   PD5  |   PD4  |   PD3  |   PD2  |   PD1  |   PD0  | name
+///  -------------------------------------------------------------------------
+///  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  | type
+///  -------------------------------------------------------------------------
+///  |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_GPDIR = 0x21;
+
+/// @brief Global GPIO data register - 11 0001
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  |   PV7  |   PV6  |   PV5  |   PV4  |   PV3  |   PV2  |   PV1  |   PV0  | name
+///  -------------------------------------------------------------------------
+///  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  | type
+///  -------------------------------------------------------------------------
+///  |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_GPDAT = 0x31;
+
+/// @}
+/// @defgroup WeiKai_cr_ WeiKai Channel Registers
+/// @brief Definition of the register linked to a particular channel
+/// @details This topic groups all the **Channel Registers**: these registers are specific
+/// to the a specific channel i.e. each channel has its own set of registers
+/// @note only registers and parameters used have been documented
+/// @{
+
+/// @defgroup cr_p0 Channel registers when SPAGE=0
+/// @brief Definition of the register linked to a particular channel when SPAGE=0
+/// @details The channel registers are further splitted into two groups.
+/// This first group is defined when the Global register WKREG_SPAGE is 0
+/// @{
+
+/// @brief Global Page register c0/c1 0011
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+/// -------------------------------------------------------------------------
+/// |                             RSV                              |  PAGE  | name
+/// -------------------------------------------------------------------------
+/// |    R   |    R   |    R   |    R   |    R   |    R   |    R   |   W/R  | type
+/// -------------------------------------------------------------------------
+/// |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_SPAGE = 0x03;
+
+/// @brief Serial Control Register - c0/c1 0100
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  |                     RSV                    | SLPEN  |  TXEN  |  RXEN  | name
+///  -------------------------------------------------------------------------
+///  |    R   |    R   |    R   |    R   |    R   |   R/W  |   R/W  |   W/R  | type
+///  -------------------------------------------------------------------------
+///  |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_SCR = 0x04;
+/// @brief transmission control (0: enable, 1: disable)
+constexpr uint8_t SCR_TXEN = 1 << 1;
+/// @brief receiving control (0: enable, 1: disable)
+constexpr uint8_t SCR_RXEN = 1 << 0;
+
+/// @brief Line Configuration Register - c0/c1 0101
+/// @details @code
+///  -------------------------------------------------------------------------
+///  |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+///  -------------------------------------------------------------------------
+///  |        RSV      |  BREAK |  IREN  |  PAEN  |      PARITY     |  STPL  | name
+///  -------------------------------------------------------------------------
+///  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  | type
+///  -------------------------------------------------------------------------
+///  |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+///  -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_LCR = 0x05;
+/// @brief Parity enable (0: no check, 1: check)
+constexpr uint8_t LCR_PAEN = 1 << 3;
+/// @brief Parity force 0
+constexpr uint8_t LCR_PAR_F0 = 0 << 1;
+/// @brief Parity odd
+constexpr uint8_t LCR_PAR_ODD = 1 << 1;
+/// @brief Parity even
+constexpr uint8_t LCR_PAR_EVEN = 2 << 1;
+/// @brief Parity force 1
+constexpr uint8_t LCR_PAR_F1 = 3 << 1;
+/// @brief Stop length (0: 1 bit, 1: 2 bits)
+constexpr uint8_t LCR_STPL = 1 << 0;
+
+/// @brief FIFO Control Register - c0/c1 0110
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+/// -------------------------------------------------------------------------
+/// |      TFTRIG     |      RFTRIG     |  TFEN  |  RFEN  |  TFRST |  RFRST | name
+/// -------------------------------------------------------------------------
+/// |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  | type
+/// -------------------------------------------------------------------------
+/// |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_FCR = 0x06;
+/// @brief Transmitter FIFO enable
+constexpr uint8_t FCR_TFEN = 1 << 3;
+/// @brief Receiver FIFO enable
+constexpr uint8_t FCR_RFEN = 1 << 2;
+/// @brief Transmitter FIFO reset
+constexpr uint8_t FCR_TFRST = 1 << 1;
+/// @brief Receiver FIFO reset
+constexpr uint8_t FCR_RFRST = 1 << 0;
+
+/// @brief Serial Interrupt Enable Register (not used)  - c0/c1 0111
+constexpr uint8_t WKREG_SIER = 0x07;
+
+/// @brief Serial Interrupt Flag Register (not used) - c0/c1 1000
+constexpr uint8_t WKREG_SIFR = 0x08;
+
+/// @brief Transmitter FIFO Count - c0/c1 1001
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   |
+/// -------------------------------------------------------------------------
+/// |                  NUMBER OF DATA IN TRANSMITTER FIFO                   |
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_TFCNT = 0x09;
+
+/// @brief Receiver FIFO count - c0/c1 1010
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   |
+/// -------------------------------------------------------------------------
+/// |                    NUMBER OF DATA IN RECEIVER FIFO                    |
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_RFCNT = 0x0A;
+
+/// @brief FIFO Status Register - c0/c1 1011
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   | bit
+/// -------------------------------------------------------------------------
+/// |  RFOE  |  RFLB  |  RFFE  |  RFPE  | RFDAT  | TFDAT  | TFFULL |  TBUSY | name
+/// -------------------------------------------------------------------------
+/// |    R   |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  |   W/R  | type
+/// -------------------------------------------------------------------------
+/// |    0   |    0   |    0   |    0   |    0   |    0   |    0   |    0   | reset
+/// -------------------------------------------------------------------------
+/// @endcode
+/// @warning The received buffer can hold 256 bytes. However, as the RFCNT reg
+/// is 8 bits, if we have 256 byte in the register this is reported as 0 ! Therefore
+/// RFCNT=0 can indicate that there are 0 **or** 256 bytes in the buffer. If we
+/// have RFDAT = 1 and RFCNT = 0 it should be interpreted as 256 bytes in the FIFO.
+/// @note Note that in case of overflow the RFOE goes to one **but** as soon as you read
+/// the FSR this bit is cleared. Therefore Overflow can be read only once.
+/// @n The same problem applies to the transmit buffer but here we have to check the
+/// TFFULL flag. So if TFFULL is set and TFCNT is 0 this should be interpreted as 256
+constexpr uint8_t WKREG_FSR = 0x0B;
+/// @brief Receiver FIFO Overflow Error (0: no OE, 1: OE)
+constexpr uint8_t FSR_RFOE = 1 << 7;
+/// @brief Receiver FIFO Line Break (0: no LB, 1: LB)
+constexpr uint8_t FSR_RFLB = 1 << 6;
+/// @brief Receiver FIFO Frame Error (0: no FE, 1: FE)
+constexpr uint8_t FSR_RFFE = 1 << 5;
+/// @brief Receiver Parity Error (0: no PE, 1: PE)
+constexpr uint8_t FSR_RFPE = 1 << 4;
+/// @brief Receiver FIFO count (0: empty, 1: not empty)
+constexpr uint8_t FSR_RFDAT = 1 << 3;
+/// @brief Transmitter FIFO count (0: empty, 1: not empty)
+constexpr uint8_t FSR_TFDAT = 1 << 2;
+/// @brief Transmitter FIFO full (0: not full, 1: full)
+constexpr uint8_t FSR_TFFULL = 1 << 1;
+/// @brief Transmitter busy (0 nothing to transmit, 1: transmitter busy sending)
+constexpr uint8_t FSR_TBUSY = 1 << 0;
+
+/// @brief Line Status Register (not used - using FIFO)
+constexpr uint8_t WKREG_LSR = 0x0C;
+
+/// @brief FIFO Data Register (not used - does not seems to work)
+constexpr uint8_t WKREG_FDAT = 0x0D;
+
+/// @}
+/// @defgroup cr_p1 Channel registers for SPAGE=1
+/// @brief Definition of the register linked to a particular channel when SPAGE=1
+/// @details The channel registers are further splitted into two groups.
+/// This second group is defined when the Global register WKREG_SPAGE is 1
+/// @{
+
+/// @brief Baud rate configuration register: high byte - c0/c1 0100
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   |
+/// -------------------------------------------------------------------------
+/// |                      High byte of the baud rate                       |
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_BRH = 0x04;
+
+/// @brief Baud rate configuration register: low byte - c0/c1 0101
+/// @details @code
+/// -------------------------------------------------------------------------
+/// |   b7   |   b6   |   b5   |   b4   |   b3   |   b2   |   b1   |   b0   |
+/// -------------------------------------------------------------------------
+/// |                       Low byte of the baud rate                       |
+/// -------------------------------------------------------------------------
+/// @endcode
+constexpr uint8_t WKREG_BRL = 0x05;
+
+/// @brief Baud rate configuration register decimal part - c0/c1 0110
+constexpr uint8_t WKREG_BRD = 0x06;
+
+/// @brief Receive FIFO Interrupt trigger configuration (not used) - c0/c1 0111
+constexpr uint8_t WKREG_RFI = 0x07;
+
+/// @brief Transmit FIFO interrupt trigger configuration (not used) - c0/c1 1000
+constexpr uint8_t WKREG_TFI = 0x08;
+
+/// @}
+/// @}
+}  // namespace weikai
+}  // namespace esphome
diff --git a/esphome/components/weikai_i2c/__init__.py b/esphome/components/weikai_i2c/__init__.py
new file mode 100644
index 0000000000..2c6a421a0a
--- /dev/null
+++ b/esphome/components/weikai_i2c/__init__.py
@@ -0,0 +1 @@
+CODEOWNERS = ["@DrCoolZic"]
diff --git a/esphome/components/weikai_i2c/weikai_i2c.cpp b/esphome/components/weikai_i2c/weikai_i2c.cpp
new file mode 100644
index 0000000000..9d0c9446ec
--- /dev/null
+++ b/esphome/components/weikai_i2c/weikai_i2c.cpp
@@ -0,0 +1,177 @@
+/// @file weikai_i2c.cpp
+/// @brief  WeiKai component family - classes implementation
+/// @date Last Modified: 2024/04/06 14:43:31
+/// @details The classes declared in this file can be used by the Weikai family
+
+#include "weikai_i2c.h"
+
+namespace esphome {
+namespace weikai_i2c {
+static const char *const TAG = "weikai_i2c";
+
+/// @brief Display a buffer in hexadecimal format (32 hex values / line).
+void print_buffer(const uint8_t *data, size_t length) {
+  char hex_buffer[100];
+  hex_buffer[(3 * 32) + 1] = 0;
+  for (size_t i = 0; i < length; i++) {
+    snprintf(&hex_buffer[3 * (i % 32)], sizeof(hex_buffer), "%02X ", data[i]);
+    if (i % 32 == 31) {
+      ESP_LOGVV(TAG, "   %s", hex_buffer);
+    }
+  }
+  if (length % 32) {
+    // null terminate if incomplete line
+    hex_buffer[3 * (length % 32) + 2] = 0;
+    ESP_LOGVV(TAG, "   %s", hex_buffer);
+  }
+}
+
+static const char *const REG_TO_STR_P0[16] = {"GENA", "GRST",  "GMUT",  "SPAGE", "SCR", "LCR",  "FCR",  "SIER",
+                                              "SIFR", "TFCNT", "RFCNT", "FSR",   "LSR", "FDAT", "FWCR", "RS485"};
+static const char *const REG_TO_STR_P1[16] = {"GENA", "GRST", "GMUT", "SPAGE", "BAUD1", "BAUD0", "PRES", "RFTL",
+                                              "TFTL", "FWTH", "FWTL", "XON1",  "XOFF1", "SADR",  "SAEN", "RTSDLY"};
+using namespace weikai;
+// method to print a register value as text: used in the log messages ...
+const char *reg_to_str(int reg, bool page1) {
+  if (reg == WKREG_GPDAT) {
+    return "GPDAT";
+  } else if (reg == WKREG_GPDIR) {
+    return "GPDIR";
+  } else {
+    return page1 ? REG_TO_STR_P1[reg & 0x0F] : REG_TO_STR_P0[reg & 0x0F];
+  }
+}
+enum RegType { REG = 0, FIFO = 1 };  ///< Register or FIFO
+
+/// @brief Computes the I²C bus's address used to access the component
+/// @param base_address the base address of the component - set by the A1 A0 pins
+/// @param channel (0-3) the UART channel
+/// @param fifo (0-1) 0 = access to internal register, 1 = direct access to fifo
+/// @return the i2c address to use
+inline uint8_t i2c_address(uint8_t base_address, uint8_t channel, RegType fifo) {
+  // the address of the device is:
+  // +----+----+----+----+----+----+----+----+
+  // |  0 | A1 | A0 |  1 |  0 | C1 | C0 |  F |
+  // +----+----+----+----+----+----+----+----+
+  // where:
+  // - A1,A0 is the address read from A1,A0 switch
+  // - C1,C0 is the channel number (in practice only 00 or 01)
+  // - F is: 0 when accessing register, one when accessing FIFO
+  uint8_t const addr = base_address | channel << 1 | fifo << 0;
+  return addr;
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiRegisterI2C methods
+///////////////////////////////////////////////////////////////////////////////
+uint8_t WeikaiRegisterI2C::read_reg() const {
+  uint8_t value = 0x00;
+  WeikaiComponentI2C *comp_i2c = static_cast<WeikaiComponentI2C *>(this->comp_);
+  uint8_t address = i2c_address(comp_i2c->base_address_, this->channel_, REG);
+  comp_i2c->set_i2c_address(address);
+  auto error = comp_i2c->read_register(this->register_, &value, 1);
+  if (error == i2c::NO_ERROR) {
+    this->comp_->status_clear_warning();
+    ESP_LOGVV(TAG, "WeikaiRegisterI2C::read_reg() @%02X reg=%s ch=%u I2C_code:%d, buf=%02X", address,
+              reg_to_str(this->register_, comp_i2c->page1()), this->channel_, (int) error, value);
+  } else {  // error
+    this->comp_->status_set_warning();
+    ESP_LOGE(TAG, "WeikaiRegisterI2C::read_reg() @%02X reg=%s ch=%u I2C_code:%d, buf=%02X", address,
+             reg_to_str(this->register_, comp_i2c->page1()), this->channel_, (int) error, value);
+  }
+  return value;
+}
+
+void WeikaiRegisterI2C::read_fifo(uint8_t *data, size_t length) const {
+  WeikaiComponentI2C *comp_i2c = static_cast<WeikaiComponentI2C *>(this->comp_);
+  uint8_t address = i2c_address(comp_i2c->base_address_, this->channel_, FIFO);
+  comp_i2c->set_i2c_address(address);
+  auto error = comp_i2c->read(data, length);
+  if (error == i2c::NO_ERROR) {
+    this->comp_->status_clear_warning();
+#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
+    ESP_LOGVV(TAG, "WeikaiRegisterI2C::read_fifo() @%02X ch=%d I2C_code:%d len=%d buffer", address, this->channel_,
+              (int) error, length);
+    print_buffer(data, length);
+#endif
+  } else {  // error
+    this->comp_->status_set_warning();
+    ESP_LOGE(TAG, "WeikaiRegisterI2C::read_fifo() @%02X reg=N/A ch=%d I2C_code:%d len=%d buf=%02X...", address,
+             this->channel_, (int) error, length, data[0]);
+  }
+}
+
+void WeikaiRegisterI2C::write_reg(uint8_t value) {
+  WeikaiComponentI2C *comp_i2c = static_cast<WeikaiComponentI2C *>(this->comp_);
+  uint8_t address = i2c_address(comp_i2c->base_address_, this->channel_, REG);  // update the i2c bus
+  comp_i2c->set_i2c_address(address);
+  auto error = comp_i2c->write_register(this->register_, &value, 1);
+  if (error == i2c::NO_ERROR) {
+    this->comp_->status_clear_warning();
+    ESP_LOGVV(TAG, "WK2168Reg::write_reg() @%02X reg=%s ch=%d I2C_code:%d buf=%02X", address,
+              reg_to_str(this->register_, comp_i2c->page1()), this->channel_, (int) error, value);
+  } else {  // error
+    this->comp_->status_set_warning();
+    ESP_LOGE(TAG, "WK2168Reg::write_reg() @%02X reg=%s ch=%d I2C_code:%d buf=%d", address,
+             reg_to_str(this->register_, comp_i2c->page1()), this->channel_, (int) error, value);
+  }
+}
+
+void WeikaiRegisterI2C::write_fifo(uint8_t *data, size_t length) {
+  WeikaiComponentI2C *comp_i2c = static_cast<WeikaiComponentI2C *>(this->comp_);
+  uint8_t address = i2c_address(comp_i2c->base_address_, this->channel_, FIFO);  // set fifo flag
+  comp_i2c->set_i2c_address(address);
+  auto error = comp_i2c->write(data, length);
+  if (error == i2c::NO_ERROR) {
+    this->comp_->status_clear_warning();
+#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
+    ESP_LOGVV(TAG, "WK2168Reg::write_fifo() @%02X ch=%d I2C_code:%d len=%d buffer", address, this->channel_,
+              (int) error, length);
+    print_buffer(data, length);
+#endif
+  } else {  // error
+    this->comp_->status_set_warning();
+    ESP_LOGE(TAG, "WK2168Reg::write_fifo() @%02X reg=N/A, ch=%d I2C_code:%d len=%d, buf=%02X...", address,
+             this->channel_, (int) error, length, data[0]);
+  }
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiComponentI2C methods
+///////////////////////////////////////////////////////////////////////////////
+void WeikaiComponentI2C::setup() {
+  // before any manipulation we store the address to base_address_ for future use
+  this->base_address_ = this->address_;
+  ESP_LOGCONFIG(TAG, "Setting up wk2168_i2c: %s with %d UARTs at @%02X ...", this->get_name(), this->children_.size(),
+                this->base_address_);
+
+  // enable all channels
+  this->reg(WKREG_GENA, 0) = GENA_C1EN | GENA_C2EN | GENA_C3EN | GENA_C4EN;
+  // reset all channels
+  this->reg(WKREG_GRST, 0) = GRST_C1RST | GRST_C2RST | GRST_C3RST | GRST_C4RST;
+  // initialize the spage register to page 0
+  this->reg(WKREG_SPAGE, 0) = 0;
+  this->page1_ = false;
+
+  // we setup our children channels
+  for (auto *child : this->children_) {
+    child->setup_channel();
+  }
+}
+
+void WeikaiComponentI2C::dump_config() {
+  ESP_LOGCONFIG(TAG, "Initialization of %s with %d UARTs completed", this->get_name(), this->children_.size());
+  ESP_LOGCONFIG(TAG, "  Crystal: %" PRIu32, this->crystal_);
+  if (test_mode_)
+    ESP_LOGCONFIG(TAG, "  Test mode: %d", test_mode_);
+  ESP_LOGCONFIG(TAG, "  Transfer buffer size: %d", XFER_MAX_SIZE);
+  this->address_ = this->base_address_;  // we restore the base_address before display (less confusing)
+  LOG_I2C_DEVICE(this);
+
+  for (auto *child : this->children_) {
+    child->dump_channel();
+  }
+}
+
+}  // namespace weikai_i2c
+}  // namespace esphome
diff --git a/esphome/components/weikai_i2c/weikai_i2c.h b/esphome/components/weikai_i2c/weikai_i2c.h
new file mode 100644
index 0000000000..0da9ed9cde
--- /dev/null
+++ b/esphome/components/weikai_i2c/weikai_i2c.h
@@ -0,0 +1,61 @@
+/// @file weikai_i2c.h
+/// @author DrCoolZic
+/// @brief  WeiKai component family - classes declaration
+/// @date Last Modified: 2024/03/01 13:31:57
+/// @details The classes declared in this file can be used by the Weikai family
+///          wk2132_i2c, wk2168_i2c, wk2204_i2c, wk2212_i2c
+
+#pragma once
+#include <bitset>
+#include <memory>
+#include "esphome/core/component.h"
+#include "esphome/components/uart/uart.h"
+#include "esphome/components/i2c/i2c.h"
+#include "esphome/components/weikai/weikai.h"
+
+namespace esphome {
+namespace weikai_i2c {
+
+class WeikaiComponentI2C;
+
+// using namespace weikai;
+////////////////////////////////////////////////////////////////////////////////////
+/// @brief WeikaiRegisterI2C objects acts as proxies to access remote register through an I2C Bus
+////////////////////////////////////////////////////////////////////////////////////
+class WeikaiRegisterI2C : public weikai::WeikaiRegister {
+ public:
+  uint8_t read_reg() const override;
+  void write_reg(uint8_t value) override;
+  void read_fifo(uint8_t *data, size_t length) const override;
+  void write_fifo(uint8_t *data, size_t length) override;
+
+ protected:
+  friend WeikaiComponentI2C;
+  WeikaiRegisterI2C(weikai::WeikaiComponent *const comp, uint8_t reg, uint8_t channel)
+      : weikai::WeikaiRegister(comp, reg, channel) {}
+};
+
+////////////////////////////////////////////////////////////////////////////////////
+/// @brief The WeikaiComponentI2C class stores the information to the WeiKai component
+/// connected through an I2C bus.
+////////////////////////////////////////////////////////////////////////////////////
+class WeikaiComponentI2C : public weikai::WeikaiComponent, public i2c::I2CDevice {
+ public:
+  weikai::WeikaiRegister &reg(uint8_t reg, uint8_t channel) override {
+    reg_i2c_.register_ = reg;
+    reg_i2c_.channel_ = channel;
+    return reg_i2c_;
+  }
+
+  //
+  // override Component methods
+  //
+  void setup() override;
+  void dump_config() override;
+
+  uint8_t base_address_;                   ///< base address of I2C device
+  WeikaiRegisterI2C reg_i2c_{this, 0, 0};  ///< init to this component
+};
+
+}  // namespace weikai_i2c
+}  // namespace esphome
diff --git a/esphome/components/weikai_spi/__init__.py b/esphome/components/weikai_spi/__init__.py
new file mode 100644
index 0000000000..2c6a421a0a
--- /dev/null
+++ b/esphome/components/weikai_spi/__init__.py
@@ -0,0 +1 @@
+CODEOWNERS = ["@DrCoolZic"]
diff --git a/esphome/components/weikai_spi/weikai_spi.cpp b/esphome/components/weikai_spi/weikai_spi.cpp
new file mode 100644
index 0000000000..22c63bbd2d
--- /dev/null
+++ b/esphome/components/weikai_spi/weikai_spi.cpp
@@ -0,0 +1,189 @@
+/// @file weikai_spi.cpp
+/// @brief  WeiKai component family - classes implementation
+/// @date Last Modified: 2024/04/06 14:46:09
+/// @details The classes declared in this file can be used by the Weikai family
+
+#include "weikai_spi.h"
+
+namespace esphome {
+namespace weikai_spi {
+using namespace weikai;
+static const char *const TAG = "weikai_spi";
+
+/// @brief convert an int to binary representation as C++ std::string
+/// @param val integer to convert
+/// @return a std::string
+inline std::string i2s(uint8_t val) { return std::bitset<8>(val).to_string(); }
+/// Convert std::string to C string
+#define I2S2CS(val) (i2s(val).c_str())
+
+/// @brief measure the time elapsed between two calls
+/// @param last_time time of the previous call
+/// @return the elapsed time in microseconds
+uint32_t elapsed_ms(uint32_t &last_time) {
+  uint32_t e = millis() - last_time;
+  last_time = millis();
+  return e;
+};
+
+/// @brief Converts the parity enum value to a C string
+/// @param parity enum
+/// @return the string
+const char *p2s(uart::UARTParityOptions parity) {
+  using namespace uart;
+  switch (parity) {
+    case UART_CONFIG_PARITY_NONE:
+      return "NONE";
+    case UART_CONFIG_PARITY_EVEN:
+      return "EVEN";
+    case UART_CONFIG_PARITY_ODD:
+      return "ODD";
+    default:
+      return "UNKNOWN";
+  }
+}
+
+/// @brief Display a buffer in hexadecimal format (32 hex values / line).
+void print_buffer(const uint8_t *data, size_t length) {
+  char hex_buffer[100];
+  hex_buffer[(3 * 32) + 1] = 0;
+  for (size_t i = 0; i < length; i++) {
+    snprintf(&hex_buffer[3 * (i % 32)], sizeof(hex_buffer), "%02X ", data[i]);
+    if (i % 32 == 31) {
+      ESP_LOGVV(TAG, "   %s", hex_buffer);
+    }
+  }
+  if (length % 32) {
+    // null terminate if incomplete line
+    hex_buffer[3 * (length % 32) + 2] = 0;
+    ESP_LOGVV(TAG, "   %s", hex_buffer);
+  }
+}
+
+static const char *const REG_TO_STR_P0[16] = {"GENA", "GRST",  "GMUT",  "SPAGE", "SCR", "LCR",  "FCR",  "SIER",
+                                              "SIFR", "TFCNT", "RFCNT", "FSR",   "LSR", "FDAT", "FWCR", "RS485"};
+static const char *const REG_TO_STR_P1[16] = {"GENA", "GRST", "GMUT", "SPAGE", "BAUD1", "BAUD0", "PRES", "RFTL",
+                                              "TFTL", "FWTH", "FWTL", "XON1",  "XOFF1", "SADR",  "SAEN", "RTSDLY"};
+
+// method to print a register value as text: used in the log messages ...
+const char *reg_to_str(int reg, bool page1) {
+  if (reg == WKREG_GPDAT) {
+    return "GPDAT";
+  } else if (reg == WKREG_GPDIR) {
+    return "GPDIR";
+  } else {
+    return page1 ? REG_TO_STR_P1[reg & 0x0F] : REG_TO_STR_P0[reg & 0x0F];
+  }
+}
+
+enum RegType { REG = 0, FIFO = 1 };            ///< Register or FIFO
+enum CmdType { WRITE_CMD = 0, READ_CMD = 1 };  ///< Read or Write transfer
+
+/// @brief Computes the SPI command byte
+/// @param transfer_type read or write command
+/// @param reg (0-15) the address of the register
+/// @param channel (0-3) the UART channel
+/// @param fifo (0-1) 0 = access to internal register, 1 = direct access to fifo
+/// @return the spi command byte
+/// @details
+/// +------+------+------+------+------+------+------+------+
+/// | FIFO | R/W  |    C1-C0    |           A3-A0           |
+/// +------+------+-------------+---------------------------+
+/// FIFO: 0 = register, 1 = FIFO
+/// R/W: 0 = write, 1 = read
+/// C1-C0: Channel (0-1)
+/// A3-A0: Address (0-F)
+inline static uint8_t cmd_byte(RegType fifo, CmdType transfer_type, uint8_t channel, uint8_t reg) {
+  return (fifo << 7 | transfer_type << 6 | channel << 4 | reg << 0);
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiRegisterSPI methods
+///////////////////////////////////////////////////////////////////////////////
+uint8_t WeikaiRegisterSPI::read_reg() const {
+  auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
+  uint8_t cmd = cmd_byte(REG, READ_CMD, this->channel_, this->register_);
+  spi_comp->enable();
+  spi_comp->write_byte(cmd);
+  uint8_t val = spi_comp->read_byte();
+  spi_comp->disable();
+  ESP_LOGVV(TAG, "WeikaiRegisterSPI::read_reg() cmd=%s(%02X) reg=%s ch=%d buf=%02X", I2S2CS(cmd), cmd,
+            reg_to_str(this->register_, this->comp_->page1()), this->channel_, val);
+  return val;
+}
+
+void WeikaiRegisterSPI::read_fifo(uint8_t *data, size_t length) const {
+  auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
+  uint8_t cmd = cmd_byte(FIFO, READ_CMD, this->channel_, this->register_);
+  spi_comp->enable();
+  spi_comp->write_byte(cmd);
+  spi_comp->read_array(data, length);
+  spi_comp->disable();
+#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
+  ESP_LOGVV(TAG, "WeikaiRegisterSPI::read_fifo() cmd=%s(%02X) ch=%d len=%d buffer", I2S2CS(cmd), cmd, this->channel_,
+            length);
+  print_buffer(data, length);
+#endif
+}
+
+void WeikaiRegisterSPI::write_reg(uint8_t value) {
+  auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
+  uint8_t buf[2]{cmd_byte(REG, WRITE_CMD, this->channel_, this->register_), value};
+  spi_comp->enable();
+  spi_comp->write_array(buf, 2);
+  spi_comp->disable();
+  ESP_LOGVV(TAG, "WeikaiRegisterSPI::write_reg() cmd=%s(%02X) reg=%s ch=%d buf=%02X", I2S2CS(buf[0]), buf[0],
+            reg_to_str(this->register_, this->comp_->page1()), this->channel_, buf[1]);
+}
+
+void WeikaiRegisterSPI::write_fifo(uint8_t *data, size_t length) {
+  auto *spi_comp = static_cast<WeikaiComponentSPI *>(this->comp_);
+  uint8_t cmd = cmd_byte(FIFO, WRITE_CMD, this->channel_, this->register_);
+  spi_comp->enable();
+  spi_comp->write_byte(cmd);
+  spi_comp->write_array(data, length);
+  spi_comp->disable();
+
+#ifdef ESPHOME_LOG_HAS_VERY_VERBOSE
+  ESP_LOGVV(TAG, "WeikaiRegisterSPI::write_fifo() cmd=%s(%02X) ch=%d len=%d buffer", I2S2CS(cmd), cmd, this->channel_,
+            length);
+  print_buffer(data, length);
+#endif
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// The WeikaiComponentSPI methods
+///////////////////////////////////////////////////////////////////////////////
+void WeikaiComponentSPI::setup() {
+  using namespace weikai;
+  ESP_LOGCONFIG(TAG, "Setting up wk2168_spi: %s with %d UARTs...", this->get_name(), this->children_.size());
+  this->spi_setup();
+  // enable all channels
+  this->reg(WKREG_GENA, 0) = GENA_C1EN | GENA_C2EN | GENA_C3EN | GENA_C4EN;
+  // reset all channels
+  this->reg(WKREG_GRST, 0) = GRST_C1RST | GRST_C2RST | GRST_C3RST | GRST_C4RST;
+  // initialize the spage register to page 0
+  this->reg(WKREG_SPAGE, 0) = 0;
+  this->page1_ = false;
+
+  // we setup our children channels
+  for (auto *child : this->children_) {
+    child->setup_channel();
+  }
+}
+
+void WeikaiComponentSPI::dump_config() {
+  ESP_LOGCONFIG(TAG, "Initialization of %s with %d UARTs completed", this->get_name(), this->children_.size());
+  ESP_LOGCONFIG(TAG, "  Crystal: %" PRIu32 "", this->crystal_);
+  if (test_mode_)
+    ESP_LOGCONFIG(TAG, "  Test mode: %d", test_mode_);
+  ESP_LOGCONFIG(TAG, "  Transfer buffer size: %d", XFER_MAX_SIZE);
+  LOG_PIN("  CS Pin: ", this->cs_);
+
+  for (auto *child : this->children_) {
+    child->dump_channel();
+  }
+}
+
+}  // namespace weikai_spi
+}  // namespace esphome
diff --git a/esphome/components/weikai_spi/weikai_spi.h b/esphome/components/weikai_spi/weikai_spi.h
new file mode 100644
index 0000000000..dd0dc8d495
--- /dev/null
+++ b/esphome/components/weikai_spi/weikai_spi.h
@@ -0,0 +1,54 @@
+/// @file weikai.h
+/// @author DrCoolZic
+/// @brief  WeiKai component family - classes declaration
+/// @date Last Modified: 2024/02/29 17:20:32
+/// @details The classes declared in this file can be used by the Weikai family
+///          wk2124_spi, wk2132_spi, wk2168_spi, wk2204_spi, wk2212_spi,
+
+#pragma once
+#include <bitset>
+#include <memory>
+#include "esphome/core/component.h"
+#include "esphome/components/uart/uart.h"
+#include "esphome/components/spi/spi.h"
+#include "esphome/components/weikai/weikai.h"
+
+namespace esphome {
+namespace weikai_spi {
+////////////////////////////////////////////////////////////////////////////////////
+/// @brief WeikaiRegisterSPI objects acts as proxies to access remote register through an SPI Bus
+////////////////////////////////////////////////////////////////////////////////////
+class WeikaiRegisterSPI : public weikai::WeikaiRegister {
+ public:
+  WeikaiRegisterSPI(weikai::WeikaiComponent *const comp, uint8_t reg, uint8_t channel)
+      : weikai::WeikaiRegister(comp, reg, channel) {}
+
+  uint8_t read_reg() const override;
+  void write_reg(uint8_t value) override;
+  void read_fifo(uint8_t *data, size_t length) const override;
+  void write_fifo(uint8_t *data, size_t length) override;
+};
+
+////////////////////////////////////////////////////////////////////////////////////
+/// @brief The WeikaiComponentSPI class stores the information to the WeiKai component
+/// connected through an SPI bus.
+////////////////////////////////////////////////////////////////////////////////////
+class WeikaiComponentSPI : public weikai::WeikaiComponent,
+                           public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
+                                                 spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1MHZ> {
+ public:
+  weikai::WeikaiRegister &reg(uint8_t reg, uint8_t channel) override {
+    reg_spi_.register_ = reg;
+    reg_spi_.channel_ = channel;
+    return reg_spi_;
+  }
+
+  void setup() override;
+  void dump_config() override;
+
+ protected:
+  WeikaiRegisterSPI reg_spi_{this, 0, 0};  ///< init to this component
+};
+
+}  // namespace weikai_spi
+}  // namespace esphome
diff --git a/esphome/components/wk2132_i2c/__init__.py b/esphome/components/wk2132_i2c/__init__.py
new file mode 100644
index 0000000000..912ab04236
--- /dev/null
+++ b/esphome/components/wk2132_i2c/__init__.py
@@ -0,0 +1,30 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import i2c, weikai
+from esphome.const import CONF_ID
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["i2c"]
+AUTO_LOAD = ["weikai", "weikai_i2c"]
+MULTI_CONF = True
+
+weikai_i2c_ns = cg.esphome_ns.namespace("weikai_i2c")
+WeikaiComponentI2C = weikai_i2c_ns.class_(
+    "WeikaiComponentI2C", weikai.WeikaiComponent, i2c.I2CDevice
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentI2C),
+        }
+    ).extend(i2c.i2c_device_schema(0x2C)),
+    weikai.check_channel_max_2,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await i2c.register_i2c_device(var, config)
diff --git a/esphome/components/wk2132_i2c/wk2132_i2c.cpp b/esphome/components/wk2132_i2c/wk2132_i2c.cpp
new file mode 100644
index 0000000000..aaefae6f97
--- /dev/null
+++ b/esphome/components/wk2132_i2c/wk2132_i2c.cpp
@@ -0,0 +1,4 @@
+/* compiling with esp-idf framework requires a .cpp file for some reason ? */
+namespace esphome {
+namespace wk2132_i2c {}
+}  // namespace esphome
diff --git a/esphome/components/wk2132_spi/__init__.py b/esphome/components/wk2132_spi/__init__.py
new file mode 100644
index 0000000000..02c5fd9604
--- /dev/null
+++ b/esphome/components/wk2132_spi/__init__.py
@@ -0,0 +1,31 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import spi, weikai
+
+from esphome.const import CONF_ID
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["spi"]
+AUTO_LOAD = ["weikai", "weikai_spi"]
+MULTI_CONF = True
+
+weikai_spi_ns = cg.esphome_ns.namespace("weikai_spi")
+WeikaiComponentSPI = weikai_spi_ns.class_(
+    "WeikaiComponentSPI", weikai.WeikaiComponent, spi.SPIDevice
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentSPI),
+        }
+    ).extend(spi.spi_device_schema()),
+    weikai.check_channel_max_2,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await spi.register_spi_device(var, config)
diff --git a/esphome/components/wk2168_i2c/__init__.py b/esphome/components/wk2168_i2c/__init__.py
new file mode 100644
index 0000000000..93a8161e8e
--- /dev/null
+++ b/esphome/components/wk2168_i2c/__init__.py
@@ -0,0 +1,64 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import pins
+from esphome.components import i2c, weikai
+from esphome.const import (
+    CONF_ID,
+    CONF_INVERTED,
+    CONF_MODE,
+    CONF_NUMBER,
+)
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["i2c"]
+AUTO_LOAD = ["weikai", "weikai_i2c"]
+MULTI_CONF = True
+CONF_WK2168_I2C = "wk2168_i2c"
+
+weikai_ns = cg.esphome_ns.namespace("weikai")
+weikai_i2c_ns = cg.esphome_ns.namespace("weikai_i2c")
+WeikaiComponentI2C = weikai_i2c_ns.class_(
+    "WeikaiComponentI2C", weikai.WeikaiComponent, i2c.I2CDevice
+)
+WeikaiGPIOPin = weikai_ns.class_(
+    "WeikaiGPIOPin", cg.GPIOPin, cg.Parented.template(WeikaiComponentI2C)
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentI2C),
+        }
+    ).extend(i2c.i2c_device_schema(0x2C)),
+    weikai.check_channel_max_4,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await i2c.register_i2c_device(var, config)
+
+
+WK2168_PIN_SCHEMA = cv.All(
+    weikai.WEIKAI_PIN_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiGPIOPin),
+            cv.Required(CONF_WK2168_I2C): cv.use_id(WeikaiComponentI2C),
+        }
+    ),
+    weikai.validate_pin_mode,
+)
+
+
+@pins.PIN_SCHEMA_REGISTRY.register(CONF_WK2168_I2C, WK2168_PIN_SCHEMA)
+async def sc16is75x_pin_to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    parent = await cg.get_variable(config[CONF_WK2168_I2C])
+    cg.add(var.set_parent(parent))
+    num = config[CONF_NUMBER]
+    cg.add(var.set_pin(num))
+    cg.add(var.set_inverted(config[CONF_INVERTED]))
+    cg.add(var.set_flags(pins.gpio_flags_expr(config[CONF_MODE])))
+    return var
diff --git a/esphome/components/wk2168_spi/__init__.py b/esphome/components/wk2168_spi/__init__.py
new file mode 100644
index 0000000000..8861a6738c
--- /dev/null
+++ b/esphome/components/wk2168_spi/__init__.py
@@ -0,0 +1,62 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import pins
+from esphome.components import spi, weikai
+from esphome.const import (
+    CONF_ID,
+    CONF_INVERTED,
+    CONF_MODE,
+    CONF_NUMBER,
+)
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["spi"]
+AUTO_LOAD = ["weikai", "weikai_spi"]
+MULTI_CONF = True
+CONF_WK2168_SPI = "wk2168_spi"
+
+weikai_spi_ns = cg.esphome_ns.namespace("weikai_spi")
+weikai_ns = cg.esphome_ns.namespace("weikai")
+WeikaiComponentSPI = weikai_spi_ns.class_(
+    "WeikaiComponentSPI", weikai.WeikaiComponent, spi.SPIDevice
+)
+WeikaiGPIOPin = weikai_ns.class_(
+    "WeikaiGPIOPin", cg.GPIOPin, cg.Parented.template(WeikaiComponentSPI)
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {cv.GenerateID(): cv.declare_id(WeikaiComponentSPI)}
+    ).extend(spi.spi_device_schema()),
+    weikai.check_channel_max_4,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await spi.register_spi_device(var, config)
+
+
+WK2168_PIN_SCHEMA = cv.All(
+    weikai.WEIKAI_PIN_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiGPIOPin),
+            cv.Required(CONF_WK2168_SPI): cv.use_id(WeikaiComponentSPI),
+        },
+    ),
+    weikai.validate_pin_mode,
+)
+
+
+@pins.PIN_SCHEMA_REGISTRY.register(CONF_WK2168_SPI, WK2168_PIN_SCHEMA)
+async def sc16is75x_pin_to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    parent = await cg.get_variable(config[CONF_WK2168_SPI])
+    cg.add(var.set_parent(parent))
+    num = config[CONF_NUMBER]
+    cg.add(var.set_pin(num))
+    cg.add(var.set_inverted(config[CONF_INVERTED]))
+    cg.add(var.set_flags(pins.gpio_flags_expr(config[CONF_MODE])))
+    return var
diff --git a/esphome/components/wk2204_i2c/__init__.py b/esphome/components/wk2204_i2c/__init__.py
new file mode 100644
index 0000000000..98eca56c4d
--- /dev/null
+++ b/esphome/components/wk2204_i2c/__init__.py
@@ -0,0 +1,30 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import i2c, weikai
+from esphome.const import CONF_ID
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["i2c"]
+AUTO_LOAD = ["weikai", "weikai_i2c"]
+MULTI_CONF = True
+
+weikai_i2c_ns = cg.esphome_ns.namespace("weikai_i2c")
+WeikaiComponentI2C = weikai_i2c_ns.class_(
+    "WeikaiComponentI2C", weikai.WeikaiComponent, i2c.I2CDevice
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentI2C),
+        }
+    ).extend(i2c.i2c_device_schema(0x2C)),
+    weikai.check_channel_max_4,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await i2c.register_i2c_device(var, config)
diff --git a/esphome/components/wk2204_spi/__init__.py b/esphome/components/wk2204_spi/__init__.py
new file mode 100644
index 0000000000..447805375d
--- /dev/null
+++ b/esphome/components/wk2204_spi/__init__.py
@@ -0,0 +1,30 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import spi, weikai
+from esphome.const import CONF_ID
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["spi"]
+AUTO_LOAD = ["weikai", "weikai_spi"]
+MULTI_CONF = True
+
+weikai_spi_ns = cg.esphome_ns.namespace("weikai_spi")
+WeikaiComponentSPI = weikai_spi_ns.class_(
+    "WeikaiComponentSPI", weikai.WeikaiComponent, spi.SPIDevice
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentSPI),
+        }
+    ).extend(spi.spi_device_schema()),
+    weikai.check_channel_max_4,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await spi.register_spi_device(var, config)
diff --git a/esphome/components/wk2212_i2c/__init__.py b/esphome/components/wk2212_i2c/__init__.py
new file mode 100644
index 0000000000..fd4d717b31
--- /dev/null
+++ b/esphome/components/wk2212_i2c/__init__.py
@@ -0,0 +1,64 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import pins
+from esphome.components import i2c, weikai
+from esphome.const import (
+    CONF_ID,
+    CONF_INVERTED,
+    CONF_MODE,
+    CONF_NUMBER,
+)
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["i2c"]
+AUTO_LOAD = ["weikai", "weikai_i2c"]
+MULTI_CONF = True
+CONF_WK2212_I2C = "wk2212_i2c"
+
+weikai_ns = cg.esphome_ns.namespace("weikai")
+weikai_i2c_ns = cg.esphome_ns.namespace("weikai_i2c")
+WeikaiComponentI2C = weikai_i2c_ns.class_(
+    "WeikaiComponentI2C", weikai.WeikaiComponent, i2c.I2CDevice
+)
+WeikaiGPIOPin = weikai_ns.class_(
+    "WeikaiGPIOPin", cg.GPIOPin, cg.Parented.template(WeikaiComponentI2C)
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiComponentI2C),
+        }
+    ).extend(i2c.i2c_device_schema(0x2C)),
+    weikai.check_channel_max_2,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await i2c.register_i2c_device(var, config)
+
+
+WK2212_PIN_SCHEMA = cv.All(
+    weikai.WEIKAI_PIN_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiGPIOPin),
+            cv.Required(CONF_WK2212_I2C): cv.use_id(WeikaiComponentI2C),
+        }
+    ),
+    weikai.validate_pin_mode,
+)
+
+
+@pins.PIN_SCHEMA_REGISTRY.register(CONF_WK2212_I2C, WK2212_PIN_SCHEMA)
+async def sc16is75x_pin_to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    parent = await cg.get_variable(config[CONF_WK2212_I2C])
+    cg.add(var.set_parent(parent))
+    num = config[CONF_NUMBER]
+    cg.add(var.set_pin(num))
+    cg.add(var.set_inverted(config[CONF_INVERTED]))
+    cg.add(var.set_flags(pins.gpio_flags_expr(config[CONF_MODE])))
+    return var
diff --git a/esphome/components/wk2212_spi/__init__.py b/esphome/components/wk2212_spi/__init__.py
new file mode 100644
index 0000000000..bfeca87c22
--- /dev/null
+++ b/esphome/components/wk2212_spi/__init__.py
@@ -0,0 +1,62 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import pins
+from esphome.components import spi, weikai
+from esphome.const import (
+    CONF_ID,
+    CONF_INVERTED,
+    CONF_MODE,
+    CONF_NUMBER,
+)
+
+CODEOWNERS = ["@DrCoolZic"]
+DEPENDENCIES = ["spi"]
+AUTO_LOAD = ["weikai", "weikai_spi"]
+MULTI_CONF = True
+CONF_WK2212_SPI = "wk2212_spi"
+
+weikai_ns = cg.esphome_ns.namespace("weikai")
+weikai_spi_ns = cg.esphome_ns.namespace("weikai_spi")
+WeikaiComponentSPI = weikai_spi_ns.class_(
+    "WeikaiComponentSPI", weikai.WeikaiComponent, spi.SPIDevice
+)
+WeikaiGPIOPin = weikai_ns.class_(
+    "WeikaiGPIOPin", cg.GPIOPin, cg.Parented.template(WeikaiComponentSPI)
+)
+
+CONFIG_SCHEMA = cv.All(
+    weikai.WKBASE_SCHEMA.extend(
+        {cv.GenerateID(): cv.declare_id(WeikaiComponentSPI)}
+    ).extend(spi.spi_device_schema()),
+    weikai.check_channel_max_2,
+)
+
+
+async def to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    cg.add(var.set_name(str(config[CONF_ID])))
+    await weikai.register_weikai(var, config)
+    await spi.register_spi_device(var, config)
+
+
+WK2212_PIN_SCHEMA = cv.All(
+    weikai.WEIKAI_PIN_SCHEMA.extend(
+        {
+            cv.GenerateID(): cv.declare_id(WeikaiGPIOPin),
+            cv.Required(CONF_WK2212_SPI): cv.use_id(WeikaiComponentSPI),
+        },
+    ),
+    weikai.validate_pin_mode,
+)
+
+
+@pins.PIN_SCHEMA_REGISTRY.register(CONF_WK2212_SPI, WK2212_PIN_SCHEMA)
+async def sc16is75x_pin_to_code(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    parent = await cg.get_variable(config[CONF_WK2212_SPI])
+    cg.add(var.set_parent(parent))
+    num = config[CONF_NUMBER]
+    cg.add(var.set_pin(num))
+    cg.add(var.set_inverted(config[CONF_INVERTED]))
+    cg.add(var.set_flags(pins.gpio_flags_expr(config[CONF_MODE])))
+    return var
diff --git a/tests/components/wk2132_i2c/common.yaml b/tests/components/wk2132_i2c/common.yaml
new file mode 100644
index 0000000000..f9c8ab756d
--- /dev/null
+++ b/tests/components/wk2132_i2c/common.yaml
@@ -0,0 +1,20 @@
+i2c:
+  id: i2c_bus
+  scl: ${scl_pin}
+  sda: ${sda_pin}
+  scan: true
+  frequency: 600kHz
+
+wk2132_i2c:
+  - id: wk2132_i2c_id
+    address: 0x70
+    i2c_id: i2c_bus
+    uart:
+      - id: wk2132_id_0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2132_id_1
+        channel: 1
+        baud_rate: 19200
diff --git a/tests/components/wk2132_i2c/test.esp32-idf.yaml b/tests/components/wk2132_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2132_i2c/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_i2c/test.esp32-s3-idf.yaml b/tests/components/wk2132_i2c/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2132_i2c/test.esp32-s3-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_i2c/test.esp32-s3.yaml b/tests/components/wk2132_i2c/test.esp32-s3.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2132_i2c/test.esp32-s3.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_i2c/test.esp32.yaml b/tests/components/wk2132_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2132_i2c/test.esp32.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_spi/common.yaml b/tests/components/wk2132_spi/common.yaml
new file mode 100644
index 0000000000..b21e89120c
--- /dev/null
+++ b/tests/components/wk2132_spi/common.yaml
@@ -0,0 +1,21 @@
+spi:
+  id: spi_bus
+  clk_pin: ${clk_pin}
+  mosi_pin: ${mosi_pin}
+  miso_pin: ${miso_pin}
+
+wk2132_spi:
+  - id: wk2132_spi_id
+    cs_pin: ${cs_pin}
+    spi_id: spi_bus
+    crystal: 11059200
+    data_rate: 1MHz
+    uart:
+      - id: wk2132_spi_id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2132_spi_id1
+        channel: 1
+        baud_rate: 921600
diff --git a/tests/components/wk2132_spi/test.esp32-idf.yaml b/tests/components/wk2132_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2132_spi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_spi/test.esp32-s3-idf.yaml b/tests/components/wk2132_spi/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2132_spi/test.esp32-s3-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_spi/test.esp32-s3.yaml b/tests/components/wk2132_spi/test.esp32-s3.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2132_spi/test.esp32-s3.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2132_spi/test.esp32.yaml b/tests/components/wk2132_spi/test.esp32.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2132_spi/test.esp32.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_i2c/common.yaml b/tests/components/wk2168_i2c/common.yaml
new file mode 100644
index 0000000000..fe4689d6db
--- /dev/null
+++ b/tests/components/wk2168_i2c/common.yaml
@@ -0,0 +1,63 @@
+i2c:
+  id: i2c_bus
+  scl: ${scl_pin}
+  sda: ${sda_pin}
+  scan: true
+  frequency: 600kHz
+
+#  component declaration
+wk2168_i2c:
+  - id: bridge_i2c
+    i2c_id: i2c_bus
+    address: 0x70
+    uart:
+      - id: id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: id1
+        channel: 1
+        baud_rate: 115200
+      - id: id2
+        channel: 2
+        baud_rate: 115200
+      - id: id3
+        channel: 3
+        baud_rate: 115200
+
+# individual binary_sensor inputs
+binary_sensor:
+  - platform: gpio
+    name: "pin_0"
+    pin:
+      wk2168_i2c: bridge_i2c
+      number: 0
+      mode:
+        input: true
+  - platform: gpio
+    name: "pin_1"
+    pin:
+      wk2168_i2c: bridge_i2c
+      number: 1
+      mode:
+        input: true
+      inverted: true
+
+# Individual binary outputs
+switch:
+  - platform: gpio
+    name: "pin_2"
+    pin:
+      wk2168_i2c: bridge_i2c
+      number: 2
+      mode:
+        output: true
+  - platform: gpio
+    name: "pin_3"
+    pin:
+      wk2168_i2c: bridge_i2c
+      number: 3
+      mode:
+        output: true
+      inverted: true
diff --git a/tests/components/wk2168_i2c/test.esp32-idf.yaml b/tests/components/wk2168_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2168_i2c/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_i2c/test.esp32-s3-idf.yaml b/tests/components/wk2168_i2c/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2168_i2c/test.esp32-s3-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_i2c/test.esp32-s3.yaml b/tests/components/wk2168_i2c/test.esp32-s3.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2168_i2c/test.esp32-s3.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_i2c/test.esp32.yaml b/tests/components/wk2168_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2168_i2c/test.esp32.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_spi/common.yaml b/tests/components/wk2168_spi/common.yaml
new file mode 100644
index 0000000000..7626e18df6
--- /dev/null
+++ b/tests/components/wk2168_spi/common.yaml
@@ -0,0 +1,63 @@
+spi:
+  id: spi_bus
+  clk_pin: ${clk_pin}
+  mosi_pin: ${mosi_pin}
+  miso_pin: ${miso_pin}
+
+wk2168_spi:
+  - id: bridge_spi
+    cs_pin: ${cs_pin}
+    spi_id: spi_bus
+    crystal: 11059200
+    data_rate: 1MHz
+    uart:
+      - id: id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: id1
+        channel: 1
+        baud_rate: 115200
+      - id: id2
+        channel: 2
+        baud_rate: 115200
+      - id: id3
+        channel: 3
+        baud_rate: 115200
+
+# individual binary_sensor inputs
+binary_sensor:
+  - platform: gpio
+    name: "pin_0"
+    pin:
+      wk2168_spi: bridge_spi
+      number: 0
+      mode:
+        input: true
+  - platform: gpio
+    name: "pin_1"
+    pin:
+      wk2168_spi: bridge_spi
+      number: 1
+      mode:
+        input: true
+      inverted: true
+
+# Individual binary outputs
+switch:
+  - platform: gpio
+    name: "pin_2"
+    pin:
+      wk2168_spi: bridge_spi
+      number: 2
+      mode:
+        output: true
+  - platform: gpio
+    name: "pin_3"
+    pin:
+      wk2168_spi: bridge_spi
+      number: 3
+      mode:
+        output: true
+      inverted: true
diff --git a/tests/components/wk2168_spi/test.esp32-idf.yaml b/tests/components/wk2168_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2168_spi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_spi/test.esp32-s3-idf.yaml b/tests/components/wk2168_spi/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2168_spi/test.esp32-s3-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_spi/test.esp32-s3.yaml b/tests/components/wk2168_spi/test.esp32-s3.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2168_spi/test.esp32-s3.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2168_spi/test.esp32.yaml b/tests/components/wk2168_spi/test.esp32.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2168_spi/test.esp32.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_i2c/common.yaml b/tests/components/wk2204_i2c/common.yaml
new file mode 100644
index 0000000000..80f636c690
--- /dev/null
+++ b/tests/components/wk2204_i2c/common.yaml
@@ -0,0 +1,28 @@
+i2c:
+  id: i2c_bus
+  scl: ${scl_pin}
+  sda: ${sda_pin}
+  scan: true
+  frequency: 600kHz
+
+wk2204_i2c:
+  - id: wk2204_i2c_id
+    i2c_id: i2c_bus
+    address: 0x70
+    uart:
+      - id: wk2204_id_0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2204_id_1
+        channel: 1
+        baud_rate: 19200
+      - id: wk2204_id_2
+        channel: 2
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2204_id_3
+        channel: 3
+        baud_rate: 19200
diff --git a/tests/components/wk2204_i2c/test.esp32-idf.yaml b/tests/components/wk2204_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2204_i2c/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_i2c/test.esp32-s3-idf.yaml b/tests/components/wk2204_i2c/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2204_i2c/test.esp32-s3-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_i2c/test.esp32-s3.yaml b/tests/components/wk2204_i2c/test.esp32-s3.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2204_i2c/test.esp32-s3.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_i2c/test.esp32.yaml b/tests/components/wk2204_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2204_i2c/test.esp32.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_spi/common.yaml b/tests/components/wk2204_spi/common.yaml
new file mode 100644
index 0000000000..3bae9c9a6d
--- /dev/null
+++ b/tests/components/wk2204_spi/common.yaml
@@ -0,0 +1,29 @@
+spi:
+  id: spi_bus
+  clk_pin: ${clk_pin}
+  mosi_pin: ${mosi_pin}
+  miso_pin: ${miso_pin}
+
+wk2204_spi:
+  - id: wk2204_spi_id
+    cs_pin: ${cs_pin}
+    spi_id: spi_bus
+    crystal: 11059200
+    data_rate: 1MHz
+    uart:
+      - id: wk2204_spi_id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2204_spi_id1
+        channel: 1
+        baud_rate: 921600
+      - id: wk2204_spi_id2
+        channel: 2
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: wk2204_spi_id3
+        channel: 3
+        baud_rate: 921600
diff --git a/tests/components/wk2204_spi/test.esp32-idf.yaml b/tests/components/wk2204_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2204_spi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_spi/test.esp32-s3-idf.yaml b/tests/components/wk2204_spi/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2204_spi/test.esp32-s3-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_spi/test.esp32-s3.yaml b/tests/components/wk2204_spi/test.esp32-s3.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2204_spi/test.esp32-s3.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2204_spi/test.esp32.yaml b/tests/components/wk2204_spi/test.esp32.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2204_spi/test.esp32.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_i2c/common.yaml b/tests/components/wk2212_i2c/common.yaml
new file mode 100644
index 0000000000..2e891c5520
--- /dev/null
+++ b/tests/components/wk2212_i2c/common.yaml
@@ -0,0 +1,59 @@
+i2c:
+  id: i2c_bus
+  scl: ${scl_pin}
+  sda: ${sda_pin}
+  scan: true
+  frequency: 600kHz
+
+#  component declaration
+wk2212_i2c:
+  - id: bridge_i2c
+    i2c_id: i2c_bus
+    address: 0x70
+    uart:
+      - id: uart_i2c_id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: uart_i2c_id1
+        channel: 1
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+
+# individual binary_sensor inputs
+binary_sensor:
+  - platform: gpio
+    name: "pin_0"
+    pin:
+      wk2212_i2c: bridge_i2c
+      number: 0
+      mode:
+        input: true
+  - platform: gpio
+    name: "pin_1"
+    pin:
+      wk2212_i2c: bridge_i2c
+      number: 1
+      mode:
+        input: true
+      inverted: true
+
+# Individual binary outputs
+switch:
+  - platform: gpio
+    name: "pin_2"
+    pin:
+      wk2212_i2c: bridge_i2c
+      number: 2
+      mode:
+        output: true
+  - platform: gpio
+    name: "pin_3"
+    pin:
+      wk2212_i2c: bridge_i2c
+      number: 3
+      mode:
+        output: true
+      inverted: true
diff --git a/tests/components/wk2212_i2c/test.esp32-idf.yaml b/tests/components/wk2212_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2212_i2c/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_i2c/test.esp32-s3-idf.yaml b/tests/components/wk2212_i2c/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2212_i2c/test.esp32-s3-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_i2c/test.esp32-s3.yaml b/tests/components/wk2212_i2c/test.esp32-s3.yaml
new file mode 100644
index 0000000000..4942e3c2b3
--- /dev/null
+++ b/tests/components/wk2212_i2c/test.esp32-s3.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO40
+  sda_pin: GPIO41
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_i2c/test.esp32.yaml b/tests/components/wk2212_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..3b761d3fc1
--- /dev/null
+++ b/tests/components/wk2212_i2c/test.esp32.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO22
+  sda_pin: GPIO21
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_spi/common.yaml b/tests/components/wk2212_spi/common.yaml
new file mode 100644
index 0000000000..ad9f11d9e8
--- /dev/null
+++ b/tests/components/wk2212_spi/common.yaml
@@ -0,0 +1,58 @@
+spi:
+  id: spi_bus
+  clk_pin: ${clk_pin}
+  mosi_pin: ${mosi_pin}
+  miso_pin: ${miso_pin}
+
+wk2212_spi:
+  - id: bridge_spi
+    cs_pin: ${cs_pin}
+    spi_id: spi_bus
+    crystal: 11059200
+    data_rate: 1MHz
+    uart:
+      - id: id0
+        channel: 0
+        baud_rate: 115200
+        stop_bits: 1
+        parity: none
+      - id: id1
+        channel: 1
+        baud_rate: 115200
+
+# individual binary_sensor inputs
+binary_sensor:
+  - platform: gpio
+    name: "pin_0"
+    pin:
+      wk2212_spi: bridge_spi
+      number: 0
+      mode:
+        input: true
+  - platform: gpio
+    name: "pin_1"
+    pin:
+      wk2212_spi: bridge_spi
+      number: 1
+      mode:
+        input: true
+      inverted: true
+
+# Individual binary outputs
+switch:
+  - platform: gpio
+    name: "pin_2"
+    pin:
+      wk2212_spi: bridge_spi
+      number: 2
+      mode:
+        output: true
+  - platform: gpio
+    name: "pin_3"
+    pin:
+      wk2212_spi: bridge_spi
+      number: 3
+      mode:
+        output: true
+      inverted: true
+
diff --git a/tests/components/wk2212_spi/test.esp32-idf.yaml b/tests/components/wk2212_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2212_spi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_spi/test.esp32-s3-idf.yaml b/tests/components/wk2212_spi/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2212_spi/test.esp32-s3-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_spi/test.esp32-s3.yaml b/tests/components/wk2212_spi/test.esp32-s3.yaml
new file mode 100644
index 0000000000..b0aadf620a
--- /dev/null
+++ b/tests/components/wk2212_spi/test.esp32-s3.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO40
+  miso_pin: GPIO41
+  mosi_pin: GPIO6
+  cs_pin: GPIO19
+
+<<: !include common.yaml
diff --git a/tests/components/wk2212_spi/test.esp32.yaml b/tests/components/wk2212_spi/test.esp32.yaml
new file mode 100644
index 0000000000..76e7138ab0
--- /dev/null
+++ b/tests/components/wk2212_spi/test.esp32.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO18
+  miso_pin: GPIO19
+  mosi_pin: GPIO23
+  cs_pin: GPIO5
+
+<<: !include common.yaml

From 217988fd9937b44257794bd10ab304c72039903f Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Wed, 24 Apr 2024 13:49:08 +1200
Subject: [PATCH 37/81] Sort mqtt_const alphabetically (#6619)

---
 esphome/components/mqtt/mqtt_const.h | 257 +++++++++++++--------------
 1 file changed, 128 insertions(+), 129 deletions(-)

diff --git a/esphome/components/mqtt/mqtt_const.h b/esphome/components/mqtt/mqtt_const.h
index 3d9e0b4c00..2209f96e7a 100644
--- a/esphome/components/mqtt/mqtt_const.h
+++ b/esphome/components/mqtt/mqtt_const.h
@@ -9,8 +9,8 @@ namespace mqtt {
 
 #ifdef USE_MQTT_ABBREVIATIONS
 
-constexpr const char *const MQTT_ACTION_TOPIC = "act_t";
 constexpr const char *const MQTT_ACTION_TEMPLATE = "act_tpl";
+constexpr const char *const MQTT_ACTION_TOPIC = "act_t";
 constexpr const char *const MQTT_AUTOMATION_TYPE = "atype";
 constexpr const char *const MQTT_AUX_COMMAND_TOPIC = "aux_cmd_t";
 constexpr const char *const MQTT_AUX_STATE_TEMPLATE = "aux_stat_tpl";
@@ -21,60 +21,68 @@ constexpr const char *const MQTT_AVAILABILITY_TOPIC = "avty_t";
 constexpr const char *const MQTT_AWAY_MODE_COMMAND_TOPIC = "away_mode_cmd_t";
 constexpr const char *const MQTT_AWAY_MODE_STATE_TEMPLATE = "away_mode_stat_tpl";
 constexpr const char *const MQTT_AWAY_MODE_STATE_TOPIC = "away_mode_stat_t";
+constexpr const char *const MQTT_BATTERY_LEVEL_TEMPLATE = "bat_lev_tpl";
+constexpr const char *const MQTT_BATTERY_LEVEL_TOPIC = "bat_lev_t";
 constexpr const char *const MQTT_BLUE_TEMPLATE = "b_tpl";
 constexpr const char *const MQTT_BRIGHTNESS_COMMAND_TOPIC = "bri_cmd_t";
 constexpr const char *const MQTT_BRIGHTNESS_SCALE = "bri_scl";
 constexpr const char *const MQTT_BRIGHTNESS_STATE_TOPIC = "bri_stat_t";
 constexpr const char *const MQTT_BRIGHTNESS_TEMPLATE = "bri_tpl";
 constexpr const char *const MQTT_BRIGHTNESS_VALUE_TEMPLATE = "bri_val_tpl";
-constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TEMPLATE = "clr_temp_cmd_tpl";
-constexpr const char *const MQTT_BATTERY_LEVEL_TOPIC = "bat_lev_t";
-constexpr const char *const MQTT_BATTERY_LEVEL_TEMPLATE = "bat_lev_tpl";
-constexpr const char *const MQTT_CONFIGURATION_URL = "cu";
-constexpr const char *const MQTT_CHARGING_TOPIC = "chrg_t";
 constexpr const char *const MQTT_CHARGING_TEMPLATE = "chrg_tpl";
+constexpr const char *const MQTT_CHARGING_TOPIC = "chrg_t";
+constexpr const char *const MQTT_CLEANING_TEMPLATE = "cln_tpl";
+constexpr const char *const MQTT_CLEANING_TOPIC = "cln_t";
+constexpr const char *const MQTT_CODE_ARM_REQUIRED = "cod_arm_req";
+constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "cod_dis_req";
 constexpr const char *const MQTT_COLOR_MODE = "clrm";
 constexpr const char *const MQTT_COLOR_MODE_STATE_TOPIC = "clrm_stat_t";
 constexpr const char *const MQTT_COLOR_MODE_VALUE_TEMPLATE = "clrm_val_tpl";
+constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TEMPLATE = "clr_temp_cmd_tpl";
 constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TOPIC = "clr_temp_cmd_t";
 constexpr const char *const MQTT_COLOR_TEMP_STATE_TOPIC = "clr_temp_stat_t";
 constexpr const char *const MQTT_COLOR_TEMP_TEMPLATE = "clr_temp_tpl";
 constexpr const char *const MQTT_COLOR_TEMP_VALUE_TEMPLATE = "clr_temp_val_tpl";
-constexpr const char *const MQTT_CLEANING_TOPIC = "cln_t";
-constexpr const char *const MQTT_CLEANING_TEMPLATE = "cln_tpl";
 constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "cmd_off_tpl";
 constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "cmd_on_tpl";
-constexpr const char *const MQTT_COMMAND_TOPIC = "cmd_t";
 constexpr const char *const MQTT_COMMAND_RETAIN = "ret";
 constexpr const char *const MQTT_COMMAND_TEMPLATE = "cmd_tpl";
-constexpr const char *const MQTT_CODE_ARM_REQUIRED = "cod_arm_req";
-constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "cod_dis_req";
-constexpr const char *const MQTT_CURRENT_TEMPERATURE_TOPIC = "curr_temp_t";
-constexpr const char *const MQTT_CURRENT_TEMPERATURE_TEMPLATE = "curr_temp_tpl";
-constexpr const char *const MQTT_CURRENT_HUMIDITY_TOPIC = "curr_hum_t";
+constexpr const char *const MQTT_COMMAND_TOPIC = "cmd_t";
+constexpr const char *const MQTT_CONFIGURATION_URL = "cu";
 constexpr const char *const MQTT_CURRENT_HUMIDITY_TEMPLATE = "curr_hum_tpl";
+constexpr const char *const MQTT_CURRENT_HUMIDITY_TOPIC = "curr_hum_t";
+constexpr const char *const MQTT_CURRENT_TEMPERATURE_TEMPLATE = "curr_temp_tpl";
+constexpr const char *const MQTT_CURRENT_TEMPERATURE_TOPIC = "curr_temp_t";
 constexpr const char *const MQTT_DEVICE = "dev";
 constexpr const char *const MQTT_DEVICE_CLASS = "dev_cla";
-constexpr const char *const MQTT_DOCKED_TOPIC = "dock_t";
+constexpr const char *const MQTT_DEVICE_CONNECTIONS = "cns";
+constexpr const char *const MQTT_DEVICE_IDENTIFIERS = "ids";
+constexpr const char *const MQTT_DEVICE_MANUFACTURER = "mf";
+constexpr const char *const MQTT_DEVICE_MODEL = "mdl";
+constexpr const char *const MQTT_DEVICE_NAME = "name";
+constexpr const char *const MQTT_DEVICE_SUGGESTED_AREA = "sa";
+constexpr const char *const MQTT_DEVICE_SW_VERSION = "sw";
 constexpr const char *const MQTT_DOCKED_TEMPLATE = "dock_tpl";
-constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "en";
-constexpr const char *const MQTT_ERROR_TOPIC = "err_t";
-constexpr const char *const MQTT_ERROR_TEMPLATE = "err_tpl";
-constexpr const char *const MQTT_FAN_SPEED_TOPIC = "fanspd_t";
-constexpr const char *const MQTT_FAN_SPEED_TEMPLATE = "fanspd_tpl";
-constexpr const char *const MQTT_FAN_SPEED_LIST = "fanspd_lst";
-constexpr const char *const MQTT_FLASH_TIME_LONG = "flsh_tlng";
-constexpr const char *const MQTT_FLASH_TIME_SHORT = "flsh_tsht";
+constexpr const char *const MQTT_DOCKED_TOPIC = "dock_t";
 constexpr const char *const MQTT_EFFECT_COMMAND_TOPIC = "fx_cmd_t";
 constexpr const char *const MQTT_EFFECT_LIST = "fx_list";
 constexpr const char *const MQTT_EFFECT_STATE_TOPIC = "fx_stat_t";
 constexpr const char *const MQTT_EFFECT_TEMPLATE = "fx_tpl";
 constexpr const char *const MQTT_EFFECT_VALUE_TEMPLATE = "fx_val_tpl";
+constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "en";
+constexpr const char *const MQTT_ENTITY_CATEGORY = "ent_cat";
+constexpr const char *const MQTT_ERROR_TEMPLATE = "err_tpl";
+constexpr const char *const MQTT_ERROR_TOPIC = "err_t";
 constexpr const char *const MQTT_EXPIRE_AFTER = "exp_aft";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TEMPLATE = "fan_mode_cmd_tpl";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TOPIC = "fan_mode_cmd_t";
 constexpr const char *const MQTT_FAN_MODE_STATE_TEMPLATE = "fan_mode_stat_tpl";
 constexpr const char *const MQTT_FAN_MODE_STATE_TOPIC = "fan_mode_stat_t";
+constexpr const char *const MQTT_FAN_SPEED_LIST = "fanspd_lst";
+constexpr const char *const MQTT_FAN_SPEED_TEMPLATE = "fanspd_tpl";
+constexpr const char *const MQTT_FAN_SPEED_TOPIC = "fanspd_t";
+constexpr const char *const MQTT_FLASH_TIME_LONG = "flsh_tlng";
+constexpr const char *const MQTT_FLASH_TIME_SHORT = "flsh_tsht";
 constexpr const char *const MQTT_FORCE_UPDATE = "frc_upd";
 constexpr const char *const MQTT_GREEN_TEMPLATE = "g_tpl";
 constexpr const char *const MQTT_HOLD_COMMAND_TEMPLATE = "hold_cmd_tpl";
@@ -86,56 +94,49 @@ constexpr const char *const MQTT_HS_STATE_TOPIC = "hs_stat_t";
 constexpr const char *const MQTT_HS_VALUE_TEMPLATE = "hs_val_tpl";
 constexpr const char *const MQTT_ICON = "ic";
 constexpr const char *const MQTT_INITIAL = "init";
-constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TOPIC = "hum_cmd_t";
-constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TEMPLATE = "hum_cmd_tpl";
-constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TOPIC = "hum_stat_t";
-constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TEMPLATE = "hum_state_tpl";
 constexpr const char *const MQTT_JSON_ATTRIBUTES = "json_attr";
-constexpr const char *const MQTT_JSON_ATTRIBUTES_TOPIC = "json_attr_t";
 constexpr const char *const MQTT_JSON_ATTRIBUTES_TEMPLATE = "json_attr_tpl";
+constexpr const char *const MQTT_JSON_ATTRIBUTES_TOPIC = "json_attr_t";
 constexpr const char *const MQTT_LAST_RESET_TOPIC = "lrst_t";
 constexpr const char *const MQTT_LAST_RESET_VALUE_TEMPLATE = "lrst_val_tpl";
 constexpr const char *const MQTT_MAX = "max";
-constexpr const char *const MQTT_MIN = "min";
 constexpr const char *const MQTT_MAX_HUMIDITY = "max_hum";
-constexpr const char *const MQTT_MIN_HUMIDITY = "min_hum";
 constexpr const char *const MQTT_MAX_MIREDS = "max_mirs";
-constexpr const char *const MQTT_MIN_MIREDS = "min_mirs";
 constexpr const char *const MQTT_MAX_TEMP = "max_temp";
+constexpr const char *const MQTT_MIN = "min";
+constexpr const char *const MQTT_MIN_HUMIDITY = "min_hum";
+constexpr const char *const MQTT_MIN_MIREDS = "min_mirs";
 constexpr const char *const MQTT_MIN_TEMP = "min_temp";
+constexpr const char *const MQTT_MODE = "mode";
 constexpr const char *const MQTT_MODE_COMMAND_TEMPLATE = "mode_cmd_tpl";
 constexpr const char *const MQTT_MODE_COMMAND_TOPIC = "mode_cmd_t";
-constexpr const char *const MQTT_MODE_STATE_TOPIC = "mode_stat_t";
 constexpr const char *const MQTT_MODE_STATE_TEMPLATE = "mode_stat_tpl";
+constexpr const char *const MQTT_MODE_STATE_TOPIC = "mode_stat_t";
 constexpr const char *const MQTT_MODES = "modes";
 constexpr const char *const MQTT_NAME = "name";
 constexpr const char *const MQTT_OBJECT_ID = "obj_id";
 constexpr const char *const MQTT_OFF_DELAY = "off_dly";
 constexpr const char *const MQTT_ON_COMMAND_TYPE = "on_cmd_type";
-constexpr const char *const MQTT_OPTIONS = "ops";
 constexpr const char *const MQTT_OPTIMISTIC = "opt";
-constexpr const char *const MQTT_OSCILLATION_COMMAND_TOPIC = "osc_cmd_t";
+constexpr const char *const MQTT_OPTIONS = "ops";
 constexpr const char *const MQTT_OSCILLATION_COMMAND_TEMPLATE = "osc_cmd_tpl";
+constexpr const char *const MQTT_OSCILLATION_COMMAND_TOPIC = "osc_cmd_t";
 constexpr const char *const MQTT_OSCILLATION_STATE_TOPIC = "osc_stat_t";
 constexpr const char *const MQTT_OSCILLATION_VALUE_TEMPLATE = "osc_val_tpl";
-constexpr const char *const MQTT_PERCENTAGE_COMMAND_TOPIC = "pct_cmd_t";
-constexpr const char *const MQTT_PERCENTAGE_COMMAND_TEMPLATE = "pct_cmd_tpl";
-constexpr const char *const MQTT_PERCENTAGE_STATE_TOPIC = "pct_stat_t";
-constexpr const char *const MQTT_PERCENTAGE_VALUE_TEMPLATE = "pct_val_tpl";
 constexpr const char *const MQTT_PAYLOAD = "pl";
 constexpr const char *const MQTT_PAYLOAD_ARM_AWAY = "pl_arm_away";
+constexpr const char *const MQTT_PAYLOAD_ARM_CUSTOM_BYPASS = "pl_arm_custom_b";
 constexpr const char *const MQTT_PAYLOAD_ARM_HOME = "pl_arm_home";
 constexpr const char *const MQTT_PAYLOAD_ARM_NIGHT = "pl_arm_nite";
 constexpr const char *const MQTT_PAYLOAD_ARM_VACATION = "pl_arm_vacation";
-constexpr const char *const MQTT_PAYLOAD_ARM_CUSTOM_BYPASS = "pl_arm_custom_b";
 constexpr const char *const MQTT_PAYLOAD_AVAILABLE = "pl_avail";
 constexpr const char *const MQTT_PAYLOAD_CLEAN_SPOT = "pl_cln_sp";
 constexpr const char *const MQTT_PAYLOAD_CLOSE = "pl_cls";
 constexpr const char *const MQTT_PAYLOAD_DISARM = "pl_disarm";
 constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "pl_hi_spd";
 constexpr const char *const MQTT_PAYLOAD_HOME = "pl_home";
-constexpr const char *const MQTT_PAYLOAD_LOCK = "pl_lock";
 constexpr const char *const MQTT_PAYLOAD_LOCATE = "pl_loc";
+constexpr const char *const MQTT_PAYLOAD_LOCK = "pl_lock";
 constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "pl_lo_spd";
 constexpr const char *const MQTT_PAYLOAD_MEDIUM_SPEED = "pl_med_spd";
 constexpr const char *const MQTT_PAYLOAD_NOT_AVAILABLE = "pl_not_avail";
@@ -152,20 +153,26 @@ constexpr const char *const MQTT_PAYLOAD_RESET_HUMIDITY = "pl_rst_hum";
 constexpr const char *const MQTT_PAYLOAD_RESET_MODE = "pl_rst_mode";
 constexpr const char *const MQTT_PAYLOAD_RESET_PERCENTAGE = "pl_rst_pct";
 constexpr const char *const MQTT_PAYLOAD_RESET_PRESET_MODE = "pl_rst_pr_mode";
-constexpr const char *const MQTT_PAYLOAD_STOP = "pl_stop";
+constexpr const char *const MQTT_PAYLOAD_RETURN_TO_BASE = "pl_ret";
 constexpr const char *const MQTT_PAYLOAD_START = "pl_strt";
 constexpr const char *const MQTT_PAYLOAD_START_PAUSE = "pl_stpa";
-constexpr const char *const MQTT_PAYLOAD_RETURN_TO_BASE = "pl_ret";
+constexpr const char *const MQTT_PAYLOAD_STOP = "pl_stop";
 constexpr const char *const MQTT_PAYLOAD_TURN_OFF = "pl_toff";
 constexpr const char *const MQTT_PAYLOAD_TURN_ON = "pl_ton";
 constexpr const char *const MQTT_PAYLOAD_UNLOCK = "pl_unlk";
+constexpr const char *const MQTT_PERCENTAGE_COMMAND_TEMPLATE = "pct_cmd_tpl";
+constexpr const char *const MQTT_PERCENTAGE_COMMAND_TOPIC = "pct_cmd_t";
+constexpr const char *const MQTT_PERCENTAGE_STATE_TOPIC = "pct_stat_t";
+constexpr const char *const MQTT_PERCENTAGE_VALUE_TEMPLATE = "pct_val_tpl";
 constexpr const char *const MQTT_POSITION_CLOSED = "pos_clsd";
 constexpr const char *const MQTT_POSITION_OPEN = "pos_open";
+constexpr const char *const MQTT_POSITION_TEMPLATE = "pos_tpl";
+constexpr const char *const MQTT_POSITION_TOPIC = "pos_t";
 constexpr const char *const MQTT_POWER_COMMAND_TOPIC = "pow_cmd_t";
-constexpr const char *const MQTT_POWER_STATE_TOPIC = "pow_stat_t";
 constexpr const char *const MQTT_POWER_STATE_TEMPLATE = "pow_stat_tpl";
-constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "pr_mode_cmd_t";
+constexpr const char *const MQTT_POWER_STATE_TOPIC = "pow_stat_t";
 constexpr const char *const MQTT_PRESET_MODE_COMMAND_TEMPLATE = "pr_mode_cmd_tpl";
+constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "pr_mode_cmd_t";
 constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "pr_mode_stat_t";
 constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "pr_mode_val_tpl";
 constexpr const char *const MQTT_PRESET_MODES = "pr_modes";
@@ -188,36 +195,38 @@ constexpr const char *const MQTT_SEND_IF_OFF = "send_if_off";
 constexpr const char *const MQTT_SET_FAN_SPEED_TOPIC = "set_fan_spd_t";
 constexpr const char *const MQTT_SET_POSITION_TEMPLATE = "set_pos_tpl";
 constexpr const char *const MQTT_SET_POSITION_TOPIC = "set_pos_t";
-constexpr const char *const MQTT_POSITION_TOPIC = "pos_t";
-constexpr const char *const MQTT_POSITION_TEMPLATE = "pos_tpl";
+constexpr const char *const MQTT_SOURCE_TYPE = "src_type";
 constexpr const char *const MQTT_SPEED_COMMAND_TOPIC = "spd_cmd_t";
-constexpr const char *const MQTT_SPEED_STATE_TOPIC = "spd_stat_t";
-constexpr const char *const MQTT_SPEED_RANGE_MIN = "spd_rng_min";
 constexpr const char *const MQTT_SPEED_RANGE_MAX = "spd_rng_max";
+constexpr const char *const MQTT_SPEED_RANGE_MIN = "spd_rng_min";
+constexpr const char *const MQTT_SPEED_STATE_TOPIC = "spd_stat_t";
 constexpr const char *const MQTT_SPEED_VALUE_TEMPLATE = "spd_val_tpl";
 constexpr const char *const MQTT_SPEEDS = "spds";
-constexpr const char *const MQTT_SOURCE_TYPE = "src_type";
 constexpr const char *const MQTT_STATE_CLASS = "stat_cla";
 constexpr const char *const MQTT_STATE_CLOSED = "stat_clsd";
 constexpr const char *const MQTT_STATE_CLOSING = "stat_closing";
+constexpr const char *const MQTT_STATE_LOCKED = "stat_locked";
 constexpr const char *const MQTT_STATE_OFF = "stat_off";
 constexpr const char *const MQTT_STATE_ON = "stat_on";
 constexpr const char *const MQTT_STATE_OPEN = "stat_open";
 constexpr const char *const MQTT_STATE_OPENING = "stat_opening";
 constexpr const char *const MQTT_STATE_STOPPED = "stat_stopped";
-constexpr const char *const MQTT_STATE_LOCKED = "stat_locked";
-constexpr const char *const MQTT_STATE_UNLOCKED = "stat_unlocked";
-constexpr const char *const MQTT_STATE_TOPIC = "stat_t";
 constexpr const char *const MQTT_STATE_TEMPLATE = "stat_tpl";
+constexpr const char *const MQTT_STATE_TOPIC = "stat_t";
+constexpr const char *const MQTT_STATE_UNLOCKED = "stat_unlocked";
 constexpr const char *const MQTT_STATE_VALUE_TEMPLATE = "stat_val_tpl";
 constexpr const char *const MQTT_STEP = "step";
 constexpr const char *const MQTT_SUBTYPE = "stype";
-constexpr const char *const MQTT_SUPPORTED_FEATURES = "sup_feat";
 constexpr const char *const MQTT_SUPPORTED_COLOR_MODES = "sup_clrm";
+constexpr const char *const MQTT_SUPPORTED_FEATURES = "sup_feat";
 constexpr const char *const MQTT_SWING_MODE_COMMAND_TEMPLATE = "swing_mode_cmd_tpl";
 constexpr const char *const MQTT_SWING_MODE_COMMAND_TOPIC = "swing_mode_cmd_t";
 constexpr const char *const MQTT_SWING_MODE_STATE_TEMPLATE = "swing_mode_stat_tpl";
 constexpr const char *const MQTT_SWING_MODE_STATE_TOPIC = "swing_mode_stat_t";
+constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TEMPLATE = "hum_cmd_tpl";
+constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TOPIC = "hum_cmd_t";
+constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TEMPLATE = "hum_state_tpl";
+constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TOPIC = "hum_stat_t";
 constexpr const char *const MQTT_TEMPERATURE_COMMAND_TEMPLATE = "temp_cmd_tpl";
 constexpr const char *const MQTT_TEMPERATURE_COMMAND_TOPIC = "temp_cmd_t";
 constexpr const char *const MQTT_TEMPERATURE_HIGH_COMMAND_TEMPLATE = "temp_hi_cmd_tpl";
@@ -232,15 +241,15 @@ constexpr const char *const MQTT_TEMPERATURE_STATE_TEMPLATE = "temp_stat_tpl";
 constexpr const char *const MQTT_TEMPERATURE_STATE_TOPIC = "temp_stat_t";
 constexpr const char *const MQTT_TEMPERATURE_UNIT = "temp_unit";
 constexpr const char *const MQTT_TILT_CLOSED_VALUE = "tilt_clsd_val";
-constexpr const char *const MQTT_TILT_COMMAND_TOPIC = "tilt_cmd_t";
 constexpr const char *const MQTT_TILT_COMMAND_TEMPLATE = "tilt_cmd_tpl";
+constexpr const char *const MQTT_TILT_COMMAND_TOPIC = "tilt_cmd_t";
 constexpr const char *const MQTT_TILT_INVERT_STATE = "tilt_inv_stat";
 constexpr const char *const MQTT_TILT_MAX = "tilt_max";
 constexpr const char *const MQTT_TILT_MIN = "tilt_min";
 constexpr const char *const MQTT_TILT_OPENED_VALUE = "tilt_opnd_val";
 constexpr const char *const MQTT_TILT_OPTIMISTIC = "tilt_opt";
-constexpr const char *const MQTT_TILT_STATUS_TOPIC = "tilt_status_t";
 constexpr const char *const MQTT_TILT_STATUS_TEMPLATE = "tilt_status_tpl";
+constexpr const char *const MQTT_TILT_STATUS_TOPIC = "tilt_status_t";
 constexpr const char *const MQTT_TOPIC = "t";
 constexpr const char *const MQTT_UNIQUE_ID = "uniq_id";
 constexpr const char *const MQTT_UNIT_OF_MEASUREMENT = "unit_of_meas";
@@ -255,18 +264,10 @@ constexpr const char *const MQTT_XY_COMMAND_TOPIC = "xy_cmd_t";
 constexpr const char *const MQTT_XY_STATE_TOPIC = "xy_stat_t";
 constexpr const char *const MQTT_XY_VALUE_TEMPLATE = "xy_val_tpl";
 
-constexpr const char *const MQTT_DEVICE_CONNECTIONS = "cns";
-constexpr const char *const MQTT_DEVICE_IDENTIFIERS = "ids";
-constexpr const char *const MQTT_DEVICE_NAME = "name";
-constexpr const char *const MQTT_DEVICE_MANUFACTURER = "mf";
-constexpr const char *const MQTT_DEVICE_MODEL = "mdl";
-constexpr const char *const MQTT_DEVICE_SW_VERSION = "sw";
-constexpr const char *const MQTT_DEVICE_SUGGESTED_AREA = "sa";
-
 #else
 
-constexpr const char *const MQTT_ACTION_TOPIC = "action_topic";
 constexpr const char *const MQTT_ACTION_TEMPLATE = "action_template";
+constexpr const char *const MQTT_ACTION_TOPIC = "action_topic";
 constexpr const char *const MQTT_AUTOMATION_TYPE = "automation_type";
 constexpr const char *const MQTT_AUX_COMMAND_TOPIC = "aux_command_topic";
 constexpr const char *const MQTT_AUX_STATE_TEMPLATE = "aux_state_template";
@@ -277,60 +278,68 @@ constexpr const char *const MQTT_AVAILABILITY_TOPIC = "availability_topic";
 constexpr const char *const MQTT_AWAY_MODE_COMMAND_TOPIC = "away_mode_command_topic";
 constexpr const char *const MQTT_AWAY_MODE_STATE_TEMPLATE = "away_mode_state_template";
 constexpr const char *const MQTT_AWAY_MODE_STATE_TOPIC = "away_mode_state_topic";
+constexpr const char *const MQTT_BATTERY_LEVEL_TEMPLATE = "battery_level_template";
+constexpr const char *const MQTT_BATTERY_LEVEL_TOPIC = "battery_level_topic";
 constexpr const char *const MQTT_BLUE_TEMPLATE = "blue_template";
 constexpr const char *const MQTT_BRIGHTNESS_COMMAND_TOPIC = "brightness_command_topic";
 constexpr const char *const MQTT_BRIGHTNESS_SCALE = "brightness_scale";
 constexpr const char *const MQTT_BRIGHTNESS_STATE_TOPIC = "brightness_state_topic";
 constexpr const char *const MQTT_BRIGHTNESS_TEMPLATE = "brightness_template";
 constexpr const char *const MQTT_BRIGHTNESS_VALUE_TEMPLATE = "brightness_value_template";
-constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TEMPLATE = "color_temp_command_template";
-constexpr const char *const MQTT_BATTERY_LEVEL_TOPIC = "battery_level_topic";
-constexpr const char *const MQTT_BATTERY_LEVEL_TEMPLATE = "battery_level_template";
-constexpr const char *const MQTT_CONFIGURATION_URL = "configuration_url";
-constexpr const char *const MQTT_CHARGING_TOPIC = "charging_topic";
 constexpr const char *const MQTT_CHARGING_TEMPLATE = "charging_template";
+constexpr const char *const MQTT_CHARGING_TOPIC = "charging_topic";
+constexpr const char *const MQTT_CLEANING_TEMPLATE = "cleaning_template";
+constexpr const char *const MQTT_CLEANING_TOPIC = "cleaning_topic";
+constexpr const char *const MQTT_CODE_ARM_REQUIRED = "code_arm_required";
+constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "code_disarm_required";
 constexpr const char *const MQTT_COLOR_MODE = "color_mode";
 constexpr const char *const MQTT_COLOR_MODE_STATE_TOPIC = "color_mode_state_topic";
 constexpr const char *const MQTT_COLOR_MODE_VALUE_TEMPLATE = "color_mode_value_template";
+constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TEMPLATE = "color_temp_command_template";
 constexpr const char *const MQTT_COLOR_TEMP_COMMAND_TOPIC = "color_temp_command_topic";
 constexpr const char *const MQTT_COLOR_TEMP_STATE_TOPIC = "color_temp_state_topic";
 constexpr const char *const MQTT_COLOR_TEMP_TEMPLATE = "color_temp_template";
 constexpr const char *const MQTT_COLOR_TEMP_VALUE_TEMPLATE = "color_temp_value_template";
-constexpr const char *const MQTT_CLEANING_TOPIC = "cleaning_topic";
-constexpr const char *const MQTT_CLEANING_TEMPLATE = "cleaning_template";
 constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "command_off_template";
 constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "command_on_template";
-constexpr const char *const MQTT_COMMAND_TOPIC = "command_topic";
 constexpr const char *const MQTT_COMMAND_RETAIN = "retain";
 constexpr const char *const MQTT_COMMAND_TEMPLATE = "command_template";
-constexpr const char *const MQTT_CODE_ARM_REQUIRED = "code_arm_required";
-constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "code_disarm_required";
-constexpr const char *const MQTT_CURRENT_TEMPERATURE_TOPIC = "current_temperature_topic";
-constexpr const char *const MQTT_CURRENT_TEMPERATURE_TEMPLATE = "current_temperature_template";
-constexpr const char *const MQTT_CURRENT_HUMIDITY_TOPIC = "current_humidity_topic";
+constexpr const char *const MQTT_COMMAND_TOPIC = "command_topic";
+constexpr const char *const MQTT_CONFIGURATION_URL = "configuration_url";
 constexpr const char *const MQTT_CURRENT_HUMIDITY_TEMPLATE = "current_humidity_template";
+constexpr const char *const MQTT_CURRENT_HUMIDITY_TOPIC = "current_humidity_topic";
+constexpr const char *const MQTT_CURRENT_TEMPERATURE_TEMPLATE = "current_temperature_template";
+constexpr const char *const MQTT_CURRENT_TEMPERATURE_TOPIC = "current_temperature_topic";
 constexpr const char *const MQTT_DEVICE = "device";
 constexpr const char *const MQTT_DEVICE_CLASS = "device_class";
-constexpr const char *const MQTT_DOCKED_TOPIC = "docked_topic";
+constexpr const char *const MQTT_DEVICE_CONNECTIONS = "connections";
+constexpr const char *const MQTT_DEVICE_IDENTIFIERS = "identifiers";
+constexpr const char *const MQTT_DEVICE_MANUFACTURER = "manufacturer";
+constexpr const char *const MQTT_DEVICE_MODEL = "model";
+constexpr const char *const MQTT_DEVICE_NAME = "name";
+constexpr const char *const MQTT_DEVICE_SUGGESTED_AREA = "suggested_area";
+constexpr const char *const MQTT_DEVICE_SW_VERSION = "sw_version";
 constexpr const char *const MQTT_DOCKED_TEMPLATE = "docked_template";
-constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "enabled_by_default";
-constexpr const char *const MQTT_ERROR_TOPIC = "error_topic";
-constexpr const char *const MQTT_ERROR_TEMPLATE = "error_template";
-constexpr const char *const MQTT_FAN_SPEED_TOPIC = "fan_speed_topic";
-constexpr const char *const MQTT_FAN_SPEED_TEMPLATE = "fan_speed_template";
-constexpr const char *const MQTT_FAN_SPEED_LIST = "fan_speed_list";
-constexpr const char *const MQTT_FLASH_TIME_LONG = "flash_time_long";
-constexpr const char *const MQTT_FLASH_TIME_SHORT = "flash_time_short";
+constexpr const char *const MQTT_DOCKED_TOPIC = "docked_topic";
 constexpr const char *const MQTT_EFFECT_COMMAND_TOPIC = "effect_command_topic";
 constexpr const char *const MQTT_EFFECT_LIST = "effect_list";
 constexpr const char *const MQTT_EFFECT_STATE_TOPIC = "effect_state_topic";
 constexpr const char *const MQTT_EFFECT_TEMPLATE = "effect_template";
 constexpr const char *const MQTT_EFFECT_VALUE_TEMPLATE = "effect_value_template";
+constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "enabled_by_default";
+constexpr const char *const MQTT_ENTITY_CATEGORY = "entity_category";
+constexpr const char *const MQTT_ERROR_TEMPLATE = "error_template";
+constexpr const char *const MQTT_ERROR_TOPIC = "error_topic";
 constexpr const char *const MQTT_EXPIRE_AFTER = "expire_after";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TEMPLATE = "fan_mode_command_template";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TOPIC = "fan_mode_command_topic";
 constexpr const char *const MQTT_FAN_MODE_STATE_TEMPLATE = "fan_mode_state_template";
 constexpr const char *const MQTT_FAN_MODE_STATE_TOPIC = "fan_mode_state_topic";
+constexpr const char *const MQTT_FAN_SPEED_LIST = "fan_speed_list";
+constexpr const char *const MQTT_FAN_SPEED_TEMPLATE = "fan_speed_template";
+constexpr const char *const MQTT_FAN_SPEED_TOPIC = "fan_speed_topic";
+constexpr const char *const MQTT_FLASH_TIME_LONG = "flash_time_long";
+constexpr const char *const MQTT_FLASH_TIME_SHORT = "flash_time_short";
 constexpr const char *const MQTT_FORCE_UPDATE = "force_update";
 constexpr const char *const MQTT_GREEN_TEMPLATE = "green_template";
 constexpr const char *const MQTT_HOLD_COMMAND_TEMPLATE = "hold_command_template";
@@ -342,56 +351,49 @@ constexpr const char *const MQTT_HS_STATE_TOPIC = "hs_state_topic";
 constexpr const char *const MQTT_HS_VALUE_TEMPLATE = "hs_value_template";
 constexpr const char *const MQTT_ICON = "icon";
 constexpr const char *const MQTT_INITIAL = "initial";
-constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TOPIC = "target_humidity_command_topic";
-constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TEMPLATE = "target_humidity_command_template";
-constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TOPIC = "target_humidity_state_topic";
-constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TEMPLATE = "target_humidity_state_template";
 constexpr const char *const MQTT_JSON_ATTRIBUTES = "json_attributes";
-constexpr const char *const MQTT_JSON_ATTRIBUTES_TOPIC = "json_attributes_topic";
 constexpr const char *const MQTT_JSON_ATTRIBUTES_TEMPLATE = "json_attributes_template";
+constexpr const char *const MQTT_JSON_ATTRIBUTES_TOPIC = "json_attributes_topic";
 constexpr const char *const MQTT_LAST_RESET_TOPIC = "last_reset_topic";
 constexpr const char *const MQTT_LAST_RESET_VALUE_TEMPLATE = "last_reset_value_template";
 constexpr const char *const MQTT_MAX = "max";
-constexpr const char *const MQTT_MIN = "min";
 constexpr const char *const MQTT_MAX_HUMIDITY = "max_humidity";
-constexpr const char *const MQTT_MIN_HUMIDITY = "min_humidity";
 constexpr const char *const MQTT_MAX_MIREDS = "max_mireds";
-constexpr const char *const MQTT_MIN_MIREDS = "min_mireds";
 constexpr const char *const MQTT_MAX_TEMP = "max_temp";
+constexpr const char *const MQTT_MIN = "min";
+constexpr const char *const MQTT_MIN_HUMIDITY = "min_humidity";
+constexpr const char *const MQTT_MIN_MIREDS = "min_mireds";
 constexpr const char *const MQTT_MIN_TEMP = "min_temp";
+constexpr const char *const MQTT_MODE = "mode";
 constexpr const char *const MQTT_MODE_COMMAND_TEMPLATE = "mode_command_template";
 constexpr const char *const MQTT_MODE_COMMAND_TOPIC = "mode_command_topic";
-constexpr const char *const MQTT_MODE_STATE_TOPIC = "mode_state_topic";
 constexpr const char *const MQTT_MODE_STATE_TEMPLATE = "mode_state_template";
+constexpr const char *const MQTT_MODE_STATE_TOPIC = "mode_state_topic";
 constexpr const char *const MQTT_MODES = "modes";
 constexpr const char *const MQTT_NAME = "name";
 constexpr const char *const MQTT_OBJECT_ID = "object_id";
 constexpr const char *const MQTT_OFF_DELAY = "off_delay";
 constexpr const char *const MQTT_ON_COMMAND_TYPE = "on_command_type";
-constexpr const char *const MQTT_OPTIONS = "options";
 constexpr const char *const MQTT_OPTIMISTIC = "optimistic";
-constexpr const char *const MQTT_OSCILLATION_COMMAND_TOPIC = "oscillation_command_topic";
+constexpr const char *const MQTT_OPTIONS = "options";
 constexpr const char *const MQTT_OSCILLATION_COMMAND_TEMPLATE = "oscillation_command_template";
+constexpr const char *const MQTT_OSCILLATION_COMMAND_TOPIC = "oscillation_command_topic";
 constexpr const char *const MQTT_OSCILLATION_STATE_TOPIC = "oscillation_state_topic";
 constexpr const char *const MQTT_OSCILLATION_VALUE_TEMPLATE = "oscillation_value_template";
-constexpr const char *const MQTT_PERCENTAGE_COMMAND_TOPIC = "percentage_command_topic";
-constexpr const char *const MQTT_PERCENTAGE_COMMAND_TEMPLATE = "percentage_command_template";
-constexpr const char *const MQTT_PERCENTAGE_STATE_TOPIC = "percentage_state_topic";
-constexpr const char *const MQTT_PERCENTAGE_VALUE_TEMPLATE = "percentage_value_template";
 constexpr const char *const MQTT_PAYLOAD = "payload";
 constexpr const char *const MQTT_PAYLOAD_ARM_AWAY = "payload_arm_away";
+constexpr const char *const MQTT_PAYLOAD_ARM_CUSTOM_BYPASS = "payload_arm_custom_bypass";
 constexpr const char *const MQTT_PAYLOAD_ARM_HOME = "payload_arm_home";
 constexpr const char *const MQTT_PAYLOAD_ARM_NIGHT = "payload_arm_night";
 constexpr const char *const MQTT_PAYLOAD_ARM_VACATION = "payload_arm_vacation";
-constexpr const char *const MQTT_PAYLOAD_ARM_CUSTOM_BYPASS = "payload_arm_custom_bypass";
 constexpr const char *const MQTT_PAYLOAD_AVAILABLE = "payload_available";
 constexpr const char *const MQTT_PAYLOAD_CLEAN_SPOT = "payload_clean_spot";
 constexpr const char *const MQTT_PAYLOAD_CLOSE = "payload_close";
 constexpr const char *const MQTT_PAYLOAD_DISARM = "payload_disarm";
 constexpr const char *const MQTT_PAYLOAD_HIGH_SPEED = "payload_high_speed";
 constexpr const char *const MQTT_PAYLOAD_HOME = "payload_home";
-constexpr const char *const MQTT_PAYLOAD_LOCK = "payload_lock";
 constexpr const char *const MQTT_PAYLOAD_LOCATE = "payload_locate";
+constexpr const char *const MQTT_PAYLOAD_LOCK = "payload_lock";
 constexpr const char *const MQTT_PAYLOAD_LOW_SPEED = "payload_low_speed";
 constexpr const char *const MQTT_PAYLOAD_MEDIUM_SPEED = "payload_medium_speed";
 constexpr const char *const MQTT_PAYLOAD_NOT_AVAILABLE = "payload_not_available";
@@ -408,20 +410,26 @@ constexpr const char *const MQTT_PAYLOAD_RESET_HUMIDITY = "payload_reset_humidit
 constexpr const char *const MQTT_PAYLOAD_RESET_MODE = "payload_reset_mode";
 constexpr const char *const MQTT_PAYLOAD_RESET_PERCENTAGE = "payload_reset_percentage";
 constexpr const char *const MQTT_PAYLOAD_RESET_PRESET_MODE = "payload_reset_preset_mode";
-constexpr const char *const MQTT_PAYLOAD_STOP = "payload_stop";
+constexpr const char *const MQTT_PAYLOAD_RETURN_TO_BASE = "payload_return_to_base";
 constexpr const char *const MQTT_PAYLOAD_START = "payload_start";
 constexpr const char *const MQTT_PAYLOAD_START_PAUSE = "payload_start_pause";
-constexpr const char *const MQTT_PAYLOAD_RETURN_TO_BASE = "payload_return_to_base";
+constexpr const char *const MQTT_PAYLOAD_STOP = "payload_stop";
 constexpr const char *const MQTT_PAYLOAD_TURN_OFF = "payload_turn_off";
 constexpr const char *const MQTT_PAYLOAD_TURN_ON = "payload_turn_on";
 constexpr const char *const MQTT_PAYLOAD_UNLOCK = "payload_unlock";
+constexpr const char *const MQTT_PERCENTAGE_COMMAND_TEMPLATE = "percentage_command_template";
+constexpr const char *const MQTT_PERCENTAGE_COMMAND_TOPIC = "percentage_command_topic";
+constexpr const char *const MQTT_PERCENTAGE_STATE_TOPIC = "percentage_state_topic";
+constexpr const char *const MQTT_PERCENTAGE_VALUE_TEMPLATE = "percentage_value_template";
 constexpr const char *const MQTT_POSITION_CLOSED = "position_closed";
 constexpr const char *const MQTT_POSITION_OPEN = "position_open";
+constexpr const char *const MQTT_POSITION_TEMPLATE = "position_template";
+constexpr const char *const MQTT_POSITION_TOPIC = "position_topic";
 constexpr const char *const MQTT_POWER_COMMAND_TOPIC = "power_command_topic";
-constexpr const char *const MQTT_POWER_STATE_TOPIC = "power_state_topic";
 constexpr const char *const MQTT_POWER_STATE_TEMPLATE = "power_state_template";
-constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "preset_mode_command_topic";
+constexpr const char *const MQTT_POWER_STATE_TOPIC = "power_state_topic";
 constexpr const char *const MQTT_PRESET_MODE_COMMAND_TEMPLATE = "preset_mode_command_template";
+constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "preset_mode_command_topic";
 constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "preset_mode_state_topic";
 constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "preset_mode_value_template";
 constexpr const char *const MQTT_PRESET_MODES = "preset_modes";
@@ -444,36 +452,38 @@ constexpr const char *const MQTT_SEND_IF_OFF = "send_if_off";
 constexpr const char *const MQTT_SET_FAN_SPEED_TOPIC = "set_fan_speed_topic";
 constexpr const char *const MQTT_SET_POSITION_TEMPLATE = "set_position_template";
 constexpr const char *const MQTT_SET_POSITION_TOPIC = "set_position_topic";
-constexpr const char *const MQTT_POSITION_TOPIC = "position_topic";
-constexpr const char *const MQTT_POSITION_TEMPLATE = "position_template";
+constexpr const char *const MQTT_SOURCE_TYPE = "source_type";
 constexpr const char *const MQTT_SPEED_COMMAND_TOPIC = "speed_command_topic";
-constexpr const char *const MQTT_SPEED_STATE_TOPIC = "speed_state_topic";
-constexpr const char *const MQTT_SPEED_RANGE_MIN = "speed_range_min";
 constexpr const char *const MQTT_SPEED_RANGE_MAX = "speed_range_max";
+constexpr const char *const MQTT_SPEED_RANGE_MIN = "speed_range_min";
+constexpr const char *const MQTT_SPEED_STATE_TOPIC = "speed_state_topic";
 constexpr const char *const MQTT_SPEED_VALUE_TEMPLATE = "speed_value_template";
 constexpr const char *const MQTT_SPEEDS = "speeds";
-constexpr const char *const MQTT_SOURCE_TYPE = "source_type";
 constexpr const char *const MQTT_STATE_CLASS = "state_class";
 constexpr const char *const MQTT_STATE_CLOSED = "state_closed";
 constexpr const char *const MQTT_STATE_CLOSING = "state_closing";
+constexpr const char *const MQTT_STATE_LOCKED = "state_locked";
 constexpr const char *const MQTT_STATE_OFF = "state_off";
 constexpr const char *const MQTT_STATE_ON = "state_on";
 constexpr const char *const MQTT_STATE_OPEN = "state_open";
 constexpr const char *const MQTT_STATE_OPENING = "state_opening";
 constexpr const char *const MQTT_STATE_STOPPED = "state_stopped";
-constexpr const char *const MQTT_STATE_LOCKED = "state_locked";
-constexpr const char *const MQTT_STATE_UNLOCKED = "state_unlocked";
-constexpr const char *const MQTT_STATE_TOPIC = "state_topic";
 constexpr const char *const MQTT_STATE_TEMPLATE = "state_template";
+constexpr const char *const MQTT_STATE_TOPIC = "state_topic";
+constexpr const char *const MQTT_STATE_UNLOCKED = "state_unlocked";
 constexpr const char *const MQTT_STATE_VALUE_TEMPLATE = "state_value_template";
 constexpr const char *const MQTT_STEP = "step";
 constexpr const char *const MQTT_SUBTYPE = "subtype";
-constexpr const char *const MQTT_SUPPORTED_FEATURES = "supported_features";
 constexpr const char *const MQTT_SUPPORTED_COLOR_MODES = "supported_color_modes";
+constexpr const char *const MQTT_SUPPORTED_FEATURES = "supported_features";
 constexpr const char *const MQTT_SWING_MODE_COMMAND_TEMPLATE = "swing_mode_command_template";
 constexpr const char *const MQTT_SWING_MODE_COMMAND_TOPIC = "swing_mode_command_topic";
 constexpr const char *const MQTT_SWING_MODE_STATE_TEMPLATE = "swing_mode_state_template";
 constexpr const char *const MQTT_SWING_MODE_STATE_TOPIC = "swing_mode_state_topic";
+constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TEMPLATE = "target_humidity_command_template";
+constexpr const char *const MQTT_TARGET_HUMIDITY_COMMAND_TOPIC = "target_humidity_command_topic";
+constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TEMPLATE = "target_humidity_state_template";
+constexpr const char *const MQTT_TARGET_HUMIDITY_STATE_TOPIC = "target_humidity_state_topic";
 constexpr const char *const MQTT_TEMPERATURE_COMMAND_TEMPLATE = "temperature_command_template";
 constexpr const char *const MQTT_TEMPERATURE_COMMAND_TOPIC = "temperature_command_topic";
 constexpr const char *const MQTT_TEMPERATURE_HIGH_COMMAND_TEMPLATE = "temperature_high_command_template";
@@ -488,15 +498,15 @@ constexpr const char *const MQTT_TEMPERATURE_STATE_TEMPLATE = "temperature_state
 constexpr const char *const MQTT_TEMPERATURE_STATE_TOPIC = "temperature_state_topic";
 constexpr const char *const MQTT_TEMPERATURE_UNIT = "temperature_unit";
 constexpr const char *const MQTT_TILT_CLOSED_VALUE = "tilt_closed_value";
-constexpr const char *const MQTT_TILT_COMMAND_TOPIC = "tilt_command_topic";
 constexpr const char *const MQTT_TILT_COMMAND_TEMPLATE = "tilt_command_template";
+constexpr const char *const MQTT_TILT_COMMAND_TOPIC = "tilt_command_topic";
 constexpr const char *const MQTT_TILT_INVERT_STATE = "tilt_invert_state";
 constexpr const char *const MQTT_TILT_MAX = "tilt_max";
 constexpr const char *const MQTT_TILT_MIN = "tilt_min";
 constexpr const char *const MQTT_TILT_OPENED_VALUE = "tilt_opened_value";
 constexpr const char *const MQTT_TILT_OPTIMISTIC = "tilt_optimistic";
-constexpr const char *const MQTT_TILT_STATUS_TOPIC = "tilt_status_topic";
 constexpr const char *const MQTT_TILT_STATUS_TEMPLATE = "tilt_status_template";
+constexpr const char *const MQTT_TILT_STATUS_TOPIC = "tilt_status_topic";
 constexpr const char *const MQTT_TOPIC = "topic";
 constexpr const char *const MQTT_UNIQUE_ID = "unique_id";
 constexpr const char *const MQTT_UNIT_OF_MEASUREMENT = "unit_of_measurement";
@@ -511,19 +521,8 @@ constexpr const char *const MQTT_XY_COMMAND_TOPIC = "xy_command_topic";
 constexpr const char *const MQTT_XY_STATE_TOPIC = "xy_state_topic";
 constexpr const char *const MQTT_XY_VALUE_TEMPLATE = "xy_value_template";
 
-constexpr const char *const MQTT_DEVICE_CONNECTIONS = "connections";
-constexpr const char *const MQTT_DEVICE_IDENTIFIERS = "identifiers";
-constexpr const char *const MQTT_DEVICE_NAME = "name";
-constexpr const char *const MQTT_DEVICE_MANUFACTURER = "manufacturer";
-constexpr const char *const MQTT_DEVICE_MODEL = "model";
-constexpr const char *const MQTT_DEVICE_SW_VERSION = "sw_version";
-constexpr const char *const MQTT_DEVICE_SUGGESTED_AREA = "suggested_area";
 #endif
 
-// Additional MQTT fields where no abbreviation is defined in HA source
-constexpr const char *const MQTT_ENTITY_CATEGORY = "entity_category";
-constexpr const char *const MQTT_MODE = "mode";
-
 }  // namespace mqtt
 }  // namespace esphome
 

From b03d0f37a43e177174316f786586623629efe749 Mon Sep 17 00:00:00 2001
From: Mike La Spina <mike.laspina@shaw.ca>
Date: Tue, 23 Apr 2024 21:01:28 -0500
Subject: [PATCH 38/81] Limit Rx wait loop time to 3 seconds. (#6594)

Co-authored-by: descipher <mike.laspina@gelidus.ca>
---
 esphome/components/ld2420/ld2420.cpp | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/esphome/components/ld2420/ld2420.cpp b/esphome/components/ld2420/ld2420.cpp
index 58c9a289a3..e57fdbc84e 100644
--- a/esphome/components/ld2420/ld2420.cpp
+++ b/esphome/components/ld2420/ld2420.cpp
@@ -493,19 +493,16 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
 }
 
 int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
+  uint32_t start_millis = millis();
   uint8_t error = 0;
   uint8_t ack_buffer[64];
   uint8_t cmd_buffer[64];
-  uint16_t loop_count;
   this->cmd_reply_.ack = false;
   if (frame.command != CMD_RESTART)
     this->set_cmd_active_(true);  // Restart does not reply, thus no ack state required.
   uint8_t retry = 3;
   while (retry) {
-    // TODO setup a dynamic method e.g. millis time count etc. to tune for non ESP32 240Mhz devices
-    // this is ok for now since the module firmware is changing like the weather atm
     frame.length = 0;
-    loop_count = 1250;
     uint16_t frame_data_bytes = frame.data_length + 2;  // Always add two bytes for the cmd size
 
     memcpy(&cmd_buffer[frame.length], &frame.header, sizeof(frame.header));
@@ -538,12 +535,13 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
         this->readline_(read(), ack_buffer, sizeof(ack_buffer));
       }
       delay_microseconds_safe(1450);
-      if (loop_count <= 0) {
+      // Wait on an Rx from the LD2420 for up to 3 1 second loops, otherwise it could trigger a WDT.
+      if ((millis() - start_millis) > 1000) {
+        start_millis = millis();
         error = LD2420_ERROR_TIMEOUT;
         retry--;
         break;
       }
-      loop_count--;
     }
     if (this->cmd_reply_.ack)
       retry = 0;

From c531a528f0fd56d0778921aad96a01df80062222 Mon Sep 17 00:00:00 2001
From: David Friedland <david.friedland@abovelending.com>
Date: Tue, 23 Apr 2024 19:35:26 -0700
Subject: [PATCH 39/81] Event entity support (#6451)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 CODEOWNERS                                    |   2 +
 esphome/components/api/api.proto              |  26 +++
 esphome/components/api/api_connection.cpp     |  24 +++
 esphome/components/api/api_connection.h       |   5 +
 esphome/components/api/api_pb2.cpp            | 151 ++++++++++++++++++
 esphome/components/api/api_pb2.h              |  34 ++++
 esphome/components/api/api_pb2_service.cpp    |  16 ++
 esphome/components/api/api_pb2_service.h      |   6 +
 esphome/components/api/api_server.cpp         |   7 +
 esphome/components/api/api_server.h           |   3 +
 esphome/components/api/list_entities.cpp      |   3 +
 esphome/components/api/list_entities.h        |   3 +
 esphome/components/api/subscribe_state.h      |   3 +
 esphome/components/event/__init__.py          | 134 ++++++++++++++++
 esphome/components/event/automation.h         |  25 +++
 esphome/components/event/event.cpp            |  24 +++
 esphome/components/event/event.h              |  37 +++++
 esphome/components/mqtt/__init__.py           |   1 +
 esphome/components/mqtt/mqtt_const.h          |   4 +
 esphome/components/mqtt/mqtt_event.cpp        |  54 +++++++
 esphome/components/mqtt/mqtt_event.h          |  39 +++++
 esphome/components/template/event/__init__.py |  24 +++
 .../template/event/template_event.h           |  12 ++
 .../components/web_server/list_entities.cpp   |   9 ++
 esphome/components/web_server/list_entities.h |   3 +
 esphome/components/web_server/web_server.cpp  |  22 +++
 esphome/components/web_server/web_server.h    |   7 +
 esphome/const.py                              |   5 +
 esphome/core/application.h                    |  20 +++
 esphome/core/component_iterator.cpp           |  15 ++
 esphome/core/component_iterator.h             |   6 +
 esphome/core/controller.cpp                   |   6 +
 esphome/core/controller.h                     |   6 +
 esphome/core/defines.h                        |   1 +
 script/ci-custom.py                           |   1 +
 tests/components/event/test.esp32-c3-idf.yaml |   9 ++
 tests/components/event/test.esp32-c3.yaml     |   9 ++
 tests/components/event/test.esp32-idf.yaml    |   9 ++
 tests/components/event/test.esp32.yaml        |   9 ++
 tests/components/event/test.esp8266.yaml      |   9 ++
 tests/components/event/test.rp2040.yaml       |   9 ++
 41 files changed, 792 insertions(+)
 create mode 100644 esphome/components/event/__init__.py
 create mode 100644 esphome/components/event/automation.h
 create mode 100644 esphome/components/event/event.cpp
 create mode 100644 esphome/components/event/event.h
 create mode 100644 esphome/components/mqtt/mqtt_event.cpp
 create mode 100644 esphome/components/mqtt/mqtt_event.h
 create mode 100644 esphome/components/template/event/__init__.py
 create mode 100644 esphome/components/template/event/template_event.h
 create mode 100644 tests/components/event/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/event/test.esp32-c3.yaml
 create mode 100644 tests/components/event/test.esp32-idf.yaml
 create mode 100644 tests/components/event/test.esp32.yaml
 create mode 100644 tests/components/event/test.esp8266.yaml
 create mode 100644 tests/components/event/test.rp2040.yaml

diff --git a/CODEOWNERS b/CODEOWNERS
index 8da1618636..a60a5c3099 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -119,6 +119,7 @@ esphome/components/esp32_rmt/* @jesserockz
 esphome/components/esp32_rmt_led_strip/* @jesserockz
 esphome/components/esp8266/* @esphome/core
 esphome/components/ethernet_info/* @gtjadsonsantos
+esphome/components/event/* @nohat
 esphome/components/exposure_notifications/* @OttoWinter
 esphome/components/ezo/* @ssieb
 esphome/components/ezo_pmp/* @carlos-sarmiento
@@ -359,6 +360,7 @@ esphome/components/tee501/* @Stock-M
 esphome/components/teleinfo/* @0hax
 esphome/components/template/alarm_control_panel/* @grahambrown11 @hwstar
 esphome/components/template/datetime/* @rfdarter
+esphome/components/template/event/* @nohat
 esphome/components/template/fan/* @ssieb
 esphome/components/text/* @mauritskorse
 esphome/components/thermostat/* @kbx81
diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto
index 12b7ef0958..17826ea7ed 100644
--- a/esphome/components/api/api.proto
+++ b/esphome/components/api/api.proto
@@ -1702,6 +1702,32 @@ message TimeCommandRequest {
   uint32 second = 4;
 }
 
+// ==================== EVENT ====================
+message ListEntitiesEventResponse {
+  option (id) = 107;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_EVENT";
+
+  string object_id = 1;
+  fixed32 key = 2;
+  string name = 3;
+  string unique_id = 4;
+
+  string icon = 5;
+  bool disabled_by_default = 6;
+  EntityCategory entity_category = 7;
+  string device_class = 8;
+
+  repeated string event_types = 9;
+}
+message EventResponse {
+  option (id) = 108;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_EVENT";
+
+  fixed32 key = 1;
+  string event_type = 2;
+}
 
 // ==================== VALVE ====================
 message ListEntitiesValveResponse {
diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp
index 47136fff98..ec09604d95 100644
--- a/esphome/components/api/api_connection.cpp
+++ b/esphome/components/api/api_connection.cpp
@@ -1209,6 +1209,30 @@ void APIConnection::alarm_control_panel_command(const AlarmControlPanelCommandRe
 }
 #endif
 
+#ifdef USE_EVENT
+bool APIConnection::send_event(event::Event *event, std::string event_type) {
+  EventResponse resp{};
+  resp.key = event->get_object_id_hash();
+  resp.event_type = std::move(event_type);
+  return this->send_event_response(resp);
+}
+bool APIConnection::send_event_info(event::Event *event) {
+  ListEntitiesEventResponse msg;
+  msg.key = event->get_object_id_hash();
+  msg.object_id = event->get_object_id();
+  if (event->has_own_name())
+    msg.name = event->get_name();
+  msg.unique_id = get_default_unique_id("event", event);
+  msg.icon = event->get_icon();
+  msg.disabled_by_default = event->is_disabled_by_default();
+  msg.entity_category = static_cast<enums::EntityCategory>(event->get_entity_category());
+  msg.device_class = event->get_device_class();
+  for (const auto &event_type : event->get_event_types())
+    msg.event_types.push_back(event_type);
+  return this->send_list_entities_event_response(msg);
+}
+#endif
+
 bool APIConnection::send_log_message(int level, const char *tag, const char *line) {
   if (this->log_subscription_ < level)
     return false;
diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h
index af2dd9e681..2c1d733d3e 100644
--- a/esphome/components/api/api_connection.h
+++ b/esphome/components/api/api_connection.h
@@ -153,6 +153,11 @@ class APIConnection : public APIServerConnection {
   void alarm_control_panel_command(const AlarmControlPanelCommandRequest &msg) override;
 #endif
 
+#ifdef USE_EVENT
+  bool send_event(event::Event *event, std::string event_type);
+  bool send_event_info(event::Event *event);
+#endif
+
   void on_disconnect_response(const DisconnectResponse &value) override;
   void on_ping_response(const PingResponse &value) override {
     // we initiated ping
diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp
index 508947ba24..3f01d88c58 100644
--- a/esphome/components/api/api_pb2.cpp
+++ b/esphome/components/api/api_pb2.cpp
@@ -7709,6 +7709,157 @@ void TimeCommandRequest::dump_to(std::string &out) const {
   out.append("}");
 }
 #endif
+bool ListEntitiesEventResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 6: {
+      this->disabled_by_default = value.as_bool();
+      return true;
+    }
+    case 7: {
+      this->entity_category = value.as_enum<enums::EntityCategory>();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesEventResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
+  switch (field_id) {
+    case 1: {
+      this->object_id = value.as_string();
+      return true;
+    }
+    case 3: {
+      this->name = value.as_string();
+      return true;
+    }
+    case 4: {
+      this->unique_id = value.as_string();
+      return true;
+    }
+    case 5: {
+      this->icon = value.as_string();
+      return true;
+    }
+    case 8: {
+      this->device_class = value.as_string();
+      return true;
+    }
+    case 9: {
+      this->event_types.push_back(value.as_string());
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesEventResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 2: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void ListEntitiesEventResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_string(1, this->object_id);
+  buffer.encode_fixed32(2, this->key);
+  buffer.encode_string(3, this->name);
+  buffer.encode_string(4, this->unique_id);
+  buffer.encode_string(5, this->icon);
+  buffer.encode_bool(6, this->disabled_by_default);
+  buffer.encode_enum<enums::EntityCategory>(7, this->entity_category);
+  buffer.encode_string(8, this->device_class);
+  for (auto &it : this->event_types) {
+    buffer.encode_string(9, it, true);
+  }
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void ListEntitiesEventResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("ListEntitiesEventResponse {\n");
+  out.append("  object_id: ");
+  out.append("'").append(this->object_id).append("'");
+  out.append("\n");
+
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  name: ");
+  out.append("'").append(this->name).append("'");
+  out.append("\n");
+
+  out.append("  unique_id: ");
+  out.append("'").append(this->unique_id).append("'");
+  out.append("\n");
+
+  out.append("  icon: ");
+  out.append("'").append(this->icon).append("'");
+  out.append("\n");
+
+  out.append("  disabled_by_default: ");
+  out.append(YESNO(this->disabled_by_default));
+  out.append("\n");
+
+  out.append("  entity_category: ");
+  out.append(proto_enum_to_string<enums::EntityCategory>(this->entity_category));
+  out.append("\n");
+
+  out.append("  device_class: ");
+  out.append("'").append(this->device_class).append("'");
+  out.append("\n");
+
+  for (const auto &it : this->event_types) {
+    out.append("  event_types: ");
+    out.append("'").append(it).append("'");
+    out.append("\n");
+  }
+  out.append("}");
+}
+#endif
+bool EventResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
+  switch (field_id) {
+    case 2: {
+      this->event_type = value.as_string();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool EventResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 1: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void EventResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_fixed32(1, this->key);
+  buffer.encode_string(2, this->event_type);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void EventResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("EventResponse {\n");
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  event_type: ");
+  out.append("'").append(this->event_type).append("'");
+  out.append("\n");
+  out.append("}");
+}
+#endif
 bool ListEntitiesValveResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
   switch (field_id) {
     case 6: {
diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h
index 950ffcdc88..9a6aab254d 100644
--- a/esphome/components/api/api_pb2.h
+++ b/esphome/components/api/api_pb2.h
@@ -1974,6 +1974,40 @@ class TimeCommandRequest : public ProtoMessage {
   bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
   bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
 };
+class ListEntitiesEventResponse : public ProtoMessage {
+ public:
+  std::string object_id{};
+  uint32_t key{0};
+  std::string name{};
+  std::string unique_id{};
+  std::string icon{};
+  bool disabled_by_default{false};
+  enums::EntityCategory entity_category{};
+  std::string device_class{};
+  std::vector<std::string> event_types{};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
+class EventResponse : public ProtoMessage {
+ public:
+  uint32_t key{0};
+  std::string event_type{};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
+};
 class ListEntitiesValveResponse : public ProtoMessage {
  public:
   std::string object_id{};
diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp
index 4b8b8cf5ae..ced81fa643 100644
--- a/esphome/components/api/api_pb2_service.cpp
+++ b/esphome/components/api/api_pb2_service.cpp
@@ -557,6 +557,22 @@ bool APIServerConnectionBase::send_time_state_response(const TimeStateResponse &
 #endif
 #ifdef USE_DATETIME_TIME
 #endif
+#ifdef USE_EVENT
+bool APIServerConnectionBase::send_list_entities_event_response(const ListEntitiesEventResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_list_entities_event_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<ListEntitiesEventResponse>(msg, 107);
+}
+#endif
+#ifdef USE_EVENT
+bool APIServerConnectionBase::send_event_response(const EventResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_event_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<EventResponse>(msg, 108);
+}
+#endif
 #ifdef USE_VALVE
 bool APIServerConnectionBase::send_list_entities_valve_response(const ListEntitiesValveResponse &msg) {
 #ifdef HAS_PROTO_MESSAGE_DUMP
diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h
index 9f1d711257..c8b2bc5789 100644
--- a/esphome/components/api/api_pb2_service.h
+++ b/esphome/components/api/api_pb2_service.h
@@ -280,6 +280,12 @@ class APIServerConnectionBase : public ProtoService {
 #ifdef USE_DATETIME_TIME
   virtual void on_time_command_request(const TimeCommandRequest &value){};
 #endif
+#ifdef USE_EVENT
+  bool send_list_entities_event_response(const ListEntitiesEventResponse &msg);
+#endif
+#ifdef USE_EVENT
+  bool send_event_response(const EventResponse &msg);
+#endif
 #ifdef USE_VALVE
   bool send_list_entities_valve_response(const ListEntitiesValveResponse &msg);
 #endif
diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp
index 457eeb1229..6d4e4db1e8 100644
--- a/esphome/components/api/api_server.cpp
+++ b/esphome/components/api/api_server.cpp
@@ -318,6 +318,13 @@ void APIServer::on_media_player_update(media_player::MediaPlayer *obj) {
 }
 #endif
 
+#ifdef USE_EVENT
+void APIServer::on_event(event::Event *obj, const std::string &event_type) {
+  for (auto &c : this->clients_)
+    c->send_event(obj, event_type);
+}
+#endif
+
 float APIServer::get_setup_priority() const { return setup_priority::AFTER_WIFI; }
 void APIServer::set_port(uint16_t port) { this->port_ = port; }
 APIServer *global_api_server = nullptr;  // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h
index d64643b961..e9e03cde0d 100644
--- a/esphome/components/api/api_server.h
+++ b/esphome/components/api/api_server.h
@@ -96,6 +96,9 @@ class APIServer : public Component, public Controller {
 #ifdef USE_ALARM_CONTROL_PANEL
   void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj) override;
 #endif
+#ifdef USE_EVENT
+  void on_event(event::Event *obj, const std::string &event_type) override;
+#endif
 
   bool is_connected() const;
 
diff --git a/esphome/components/api/list_entities.cpp b/esphome/components/api/list_entities.cpp
index d6ff8e5557..82bfd45333 100644
--- a/esphome/components/api/list_entities.cpp
+++ b/esphome/components/api/list_entities.cpp
@@ -89,6 +89,9 @@ bool ListEntitiesIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont
   return this->client_->send_alarm_control_panel_info(a_alarm_control_panel);
 }
 #endif
+#ifdef USE_EVENT
+bool ListEntitiesIterator::on_event(event::Event *event) { return this->client_->send_event_info(event); }
+#endif
 
 }  // namespace api
 }  // namespace esphome
diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h
index 5d0c243f4a..19cd99ea01 100644
--- a/esphome/components/api/list_entities.h
+++ b/esphome/components/api/list_entities.h
@@ -69,6 +69,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #endif
 #ifdef USE_ALARM_CONTROL_PANEL
   bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) override;
+#endif
+#ifdef USE_EVENT
+  bool on_event(event::Event *event) override;
 #endif
   bool on_end() override;
 
diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h
index 8d50e0d89a..17d444c441 100644
--- a/esphome/components/api/subscribe_state.h
+++ b/esphome/components/api/subscribe_state.h
@@ -66,6 +66,9 @@ class InitialStateIterator : public ComponentIterator {
 #endif
 #ifdef USE_ALARM_CONTROL_PANEL
   bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) override;
+#endif
+#ifdef USE_EVENT
+  bool on_event(event::Event *event) override { return true; };
 #endif
  protected:
   APIConnection *client_;
diff --git a/esphome/components/event/__init__.py b/esphome/components/event/__init__.py
new file mode 100644
index 0000000000..789f121cf3
--- /dev/null
+++ b/esphome/components/event/__init__.py
@@ -0,0 +1,134 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome import automation
+from esphome.components import mqtt
+from esphome.const import (
+    CONF_DEVICE_CLASS,
+    CONF_ENTITY_CATEGORY,
+    CONF_ICON,
+    CONF_ID,
+    CONF_ON_EVENT,
+    CONF_TRIGGER_ID,
+    CONF_MQTT_ID,
+    CONF_EVENT_TYPE,
+    DEVICE_CLASS_BUTTON,
+    DEVICE_CLASS_DOORBELL,
+    DEVICE_CLASS_EMPTY,
+    DEVICE_CLASS_MOTION,
+)
+from esphome.core import CORE, coroutine_with_priority
+from esphome.cpp_helpers import setup_entity
+from esphome.cpp_generator import MockObjClass
+
+CODEOWNERS = ["@nohat"]
+IS_PLATFORM_COMPONENT = True
+
+DEVICE_CLASSES = [
+    DEVICE_CLASS_BUTTON,
+    DEVICE_CLASS_EMPTY,
+    DEVICE_CLASS_DOORBELL,
+    DEVICE_CLASS_MOTION,
+]
+
+event_ns = cg.esphome_ns.namespace("event")
+Event = event_ns.class_("Event", cg.EntityBase)
+EventPtr = Event.operator("ptr")
+
+TriggerEventAction = event_ns.class_("TriggerEventAction", automation.Action)
+
+EventTrigger = event_ns.class_("EventTrigger", automation.Trigger.template())
+
+validate_device_class = cv.one_of(*DEVICE_CLASSES, lower=True, space="_")
+
+EVENT_SCHEMA = cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMPONENT_SCHEMA).extend(
+    {
+        cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTEventComponent),
+        cv.GenerateID(): cv.declare_id(Event),
+        cv.Optional(CONF_DEVICE_CLASS): validate_device_class,
+        cv.Optional(CONF_ON_EVENT): automation.validate_automation(
+            {
+                cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(EventTrigger),
+            }
+        ),
+    }
+)
+
+_UNDEF = object()
+
+
+def event_schema(
+    class_: MockObjClass = _UNDEF,
+    *,
+    icon: str = _UNDEF,
+    entity_category: str = _UNDEF,
+    device_class: str = _UNDEF,
+) -> cv.Schema:
+    schema = {}
+
+    if class_ is not _UNDEF:
+        schema[cv.GenerateID()] = cv.declare_id(class_)
+
+    for key, default, validator in [
+        (CONF_ICON, icon, cv.icon),
+        (CONF_ENTITY_CATEGORY, entity_category, cv.entity_category),
+        (CONF_DEVICE_CLASS, device_class, validate_device_class),
+    ]:
+        if default is not _UNDEF:
+            schema[cv.Optional(key, default=default)] = validator
+
+    return EVENT_SCHEMA.extend(schema)
+
+
+async def setup_event_core_(var, config, *, event_types: list[str]):
+    await setup_entity(var, config)
+
+    for conf in config.get(CONF_ON_EVENT, []):
+        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
+        await automation.build_automation(
+            trigger, [(cg.std_string, "event_type")], conf
+        )
+
+    cg.add(var.set_event_types(event_types))
+
+    if (device_class := config.get(CONF_DEVICE_CLASS)) is not None:
+        cg.add(var.set_device_class(device_class))
+
+    if mqtt_id := config.get(CONF_MQTT_ID):
+        mqtt_ = cg.new_Pvariable(mqtt_id, var)
+        await mqtt.register_mqtt_component(mqtt_, config)
+
+
+async def register_event(var, config, *, event_types: list[str]):
+    if not CORE.has_id(config[CONF_ID]):
+        var = cg.Pvariable(config[CONF_ID], var)
+    cg.add(cg.App.register_event(var))
+    await setup_event_core_(var, config, event_types=event_types)
+
+
+async def new_event(config, *, event_types: list[str]):
+    var = cg.new_Pvariable(config[CONF_ID])
+    await register_event(var, config, event_types=event_types)
+    return var
+
+
+TRIGGER_EVENT_SCHEMA = cv.Schema(
+    {
+        cv.Required(CONF_ID): cv.use_id(Event),
+        cv.Required(CONF_EVENT_TYPE): cv.templatable(cv.string_strict),
+    }
+)
+
+
+@automation.register_action("event.trigger", TriggerEventAction, TRIGGER_EVENT_SCHEMA)
+async def event_fire_to_code(config, action_id, template_arg, args):
+    var = cg.new_Pvariable(action_id, template_arg)
+    await cg.register_parented(var, config[CONF_ID])
+    templ = await cg.templatable(config[CONF_EVENT_TYPE], args, cg.std_string)
+    cg.add(var.set_event_type(templ))
+    return var
+
+
+@coroutine_with_priority(100.0)
+async def to_code(config):
+    cg.add_define("USE_EVENT")
+    cg.add_global(event_ns.using)
diff --git a/esphome/components/event/automation.h b/esphome/components/event/automation.h
new file mode 100644
index 0000000000..9ebcb654a0
--- /dev/null
+++ b/esphome/components/event/automation.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include "esphome/components/event/event.h"
+#include "esphome/core/automation.h"
+#include "esphome/core/component.h"
+
+namespace esphome {
+namespace event {
+
+template<typename... Ts> class TriggerEventAction : public Action<Ts...>, public Parented<Event> {
+ public:
+  TEMPLATABLE_VALUE(std::string, event_type)
+
+  void play(Ts... x) override { this->parent_->trigger(this->event_type_.value(x...)); }
+};
+
+class EventTrigger : public Trigger<std::string> {
+ public:
+  EventTrigger(Event *event) {
+    event->add_on_event_callback([this](const std::string &event_type) { this->trigger(event_type); });
+  }
+};
+
+}  // namespace event
+}  // namespace esphome
diff --git a/esphome/components/event/event.cpp b/esphome/components/event/event.cpp
new file mode 100644
index 0000000000..061afcb026
--- /dev/null
+++ b/esphome/components/event/event.cpp
@@ -0,0 +1,24 @@
+#include "event.h"
+
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace event {
+
+static const char *const TAG = "event";
+
+void Event::trigger(const std::string &event_type) {
+  if (types_.find(event_type) == types_.end()) {
+    ESP_LOGE(TAG, "'%s': invalid event type for trigger(): %s", this->get_name().c_str(), event_type.c_str());
+    return;
+  }
+  ESP_LOGD(TAG, "'%s' Triggered event '%s'", this->get_name().c_str(), event_type.c_str());
+  this->event_callback_.call(event_type);
+}
+
+void Event::add_on_event_callback(std::function<void(const std::string &event_type)> &&callback) {
+  this->event_callback_.add(std::move(callback));
+}
+
+}  // namespace event
+}  // namespace esphome
diff --git a/esphome/components/event/event.h b/esphome/components/event/event.h
new file mode 100644
index 0000000000..067a867360
--- /dev/null
+++ b/esphome/components/event/event.h
@@ -0,0 +1,37 @@
+#pragma once
+
+#include <set>
+#include <string>
+
+#include "esphome/core/component.h"
+#include "esphome/core/entity_base.h"
+#include "esphome/core/helpers.h"
+
+namespace esphome {
+namespace event {
+
+#define LOG_EVENT(prefix, type, obj) \
+  if ((obj) != nullptr) { \
+    ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
+    if (!(obj)->get_icon().empty()) { \
+      ESP_LOGCONFIG(TAG, "%s  Icon: '%s'", prefix, (obj)->get_icon().c_str()); \
+    } \
+    if (!(obj)->get_device_class().empty()) { \
+      ESP_LOGCONFIG(TAG, "%s  Device Class: '%s'", prefix, (obj)->get_device_class().c_str()); \
+    } \
+  }
+
+class Event : public EntityBase, public EntityBase_DeviceClass {
+ public:
+  void trigger(const std::string &event_type);
+  void set_event_types(const std::set<std::string> &event_types) { this->types_ = event_types; }
+  std::set<std::string> get_event_types() const { return this->types_; }
+  void add_on_event_callback(std::function<void(const std::string &event_type)> &&callback);
+
+ protected:
+  CallbackManager<void(const std::string &event_type)> event_callback_;
+  std::set<std::string> types_;
+};
+
+}  // namespace event
+}  // namespace esphome
diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py
index 72ee81dbbc..7a42140ef6 100644
--- a/esphome/components/mqtt/__init__.py
+++ b/esphome/components/mqtt/__init__.py
@@ -119,6 +119,7 @@ MQTTTextComponent = mqtt_ns.class_("MQTTTextComponent", MQTTComponent)
 MQTTSelectComponent = mqtt_ns.class_("MQTTSelectComponent", MQTTComponent)
 MQTTButtonComponent = mqtt_ns.class_("MQTTButtonComponent", MQTTComponent)
 MQTTLockComponent = mqtt_ns.class_("MQTTLockComponent", MQTTComponent)
+MQTTEventComponent = mqtt_ns.class_("MQTTEventComponent", MQTTComponent)
 MQTTValveComponent = mqtt_ns.class_("MQTTValveComponent", MQTTComponent)
 
 MQTTDiscoveryUniqueIdGenerator = mqtt_ns.enum("MQTTDiscoveryUniqueIdGenerator")
diff --git a/esphome/components/mqtt/mqtt_const.h b/esphome/components/mqtt/mqtt_const.h
index 2209f96e7a..66872680bb 100644
--- a/esphome/components/mqtt/mqtt_const.h
+++ b/esphome/components/mqtt/mqtt_const.h
@@ -73,6 +73,8 @@ constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "en";
 constexpr const char *const MQTT_ENTITY_CATEGORY = "ent_cat";
 constexpr const char *const MQTT_ERROR_TEMPLATE = "err_tpl";
 constexpr const char *const MQTT_ERROR_TOPIC = "err_t";
+constexpr const char *const MQTT_EVENT_TYPE = "event_type";
+constexpr const char *const MQTT_EVENT_TYPES = "evt_typ";
 constexpr const char *const MQTT_EXPIRE_AFTER = "exp_aft";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TEMPLATE = "fan_mode_cmd_tpl";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TOPIC = "fan_mode_cmd_t";
@@ -330,6 +332,8 @@ constexpr const char *const MQTT_ENABLED_BY_DEFAULT = "enabled_by_default";
 constexpr const char *const MQTT_ENTITY_CATEGORY = "entity_category";
 constexpr const char *const MQTT_ERROR_TEMPLATE = "error_template";
 constexpr const char *const MQTT_ERROR_TOPIC = "error_topic";
+constexpr const char *const MQTT_EVENT_TYPE = "event_type";
+constexpr const char *const MQTT_EVENT_TYPES = "event_types";
 constexpr const char *const MQTT_EXPIRE_AFTER = "expire_after";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TEMPLATE = "fan_mode_command_template";
 constexpr const char *const MQTT_FAN_MODE_COMMAND_TOPIC = "fan_mode_command_topic";
diff --git a/esphome/components/mqtt/mqtt_event.cpp b/esphome/components/mqtt/mqtt_event.cpp
new file mode 100644
index 0000000000..cf0b90e3d6
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_event.cpp
@@ -0,0 +1,54 @@
+#include "mqtt_event.h"
+#include "esphome/core/log.h"
+
+#include "mqtt_const.h"
+
+#ifdef USE_MQTT
+#ifdef USE_EVENT
+
+namespace esphome {
+namespace mqtt {
+
+static const char *const TAG = "mqtt.event";
+
+using namespace esphome::event;
+
+MQTTEventComponent::MQTTEventComponent(event::Event *event) : event_(event) {}
+
+void MQTTEventComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) {
+  JsonArray event_types = root.createNestedArray(MQTT_EVENT_TYPES);
+  for (const auto &event_type : this->event_->get_event_types())
+    event_types.add(event_type);
+
+  if (!this->event_->get_device_class().empty())
+    root[MQTT_DEVICE_CLASS] = this->event_->get_device_class();
+
+  config.command_topic = false;
+}
+
+void MQTTEventComponent::setup() {
+  this->event_->add_on_event_callback([this](const std::string &event_type) { this->publish_event_(event_type); });
+}
+
+void MQTTEventComponent::dump_config() {
+  ESP_LOGCONFIG(TAG, "MQTT Event '%s': ", this->event_->get_name().c_str());
+  ESP_LOGCONFIG(TAG, "Event Types: ");
+  for (const auto &event_type : this->event_->get_event_types()) {
+    ESP_LOGCONFIG(TAG, "- %s", event_type.c_str());
+  }
+  LOG_MQTT_COMPONENT(true, true);
+}
+
+bool MQTTEventComponent::publish_event_(const std::string &event_type) {
+  return this->publish_json(this->get_state_topic_(),
+                            [event_type](JsonObject root) { root[MQTT_EVENT_TYPE] = event_type; });
+}
+
+std::string MQTTEventComponent::component_type() const { return "event"; }
+const EntityBase *MQTTEventComponent::get_entity() const { return this->event_; }
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif
+#endif  // USE_MQTT
diff --git a/esphome/components/mqtt/mqtt_event.h b/esphome/components/mqtt/mqtt_event.h
new file mode 100644
index 0000000000..4335820e53
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_event.h
@@ -0,0 +1,39 @@
+#pragma once
+
+#include "esphome/core/defines.h"
+
+#ifdef USE_MQTT
+#ifdef USE_EVENT
+
+#include "esphome/components/event/event.h"
+#include "mqtt_component.h"
+
+namespace esphome {
+namespace mqtt {
+
+class MQTTEventComponent : public mqtt::MQTTComponent {
+ public:
+  explicit MQTTEventComponent(event::Event *event);
+
+  void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override;
+
+  void setup() override;
+
+  void dump_config() override;
+
+  /// Events do not send a state so just return true.
+  bool send_initial_state() override { return true; }
+
+ protected:
+  bool publish_event_(const std::string &event_type);
+  std::string component_type() const override;
+  const EntityBase *get_entity() const override;
+
+  event::Event *event_;
+};
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif
+#endif  // USE_MQTT
diff --git a/esphome/components/template/event/__init__.py b/esphome/components/template/event/__init__.py
new file mode 100644
index 0000000000..2a948cfdfd
--- /dev/null
+++ b/esphome/components/template/event/__init__.py
@@ -0,0 +1,24 @@
+import esphome.config_validation as cv
+
+from esphome.components import event
+
+import esphome.codegen as cg
+
+from esphome.const import CONF_EVENT_TYPES
+
+from .. import template_ns
+
+CODEOWNERS = ["@nohat"]
+
+TemplateEvent = template_ns.class_("TemplateEvent", event.Event, cg.Component)
+
+CONFIG_SCHEMA = event.event_schema(TemplateEvent).extend(
+    {
+        cv.Required(CONF_EVENT_TYPES): cv.ensure_list(cv.string_strict),
+    }
+)
+
+
+async def to_code(config):
+    var = await event.new_event(config, event_types=config[CONF_EVENT_TYPES])
+    await cg.register_component(var, config)
diff --git a/esphome/components/template/event/template_event.h b/esphome/components/template/event/template_event.h
new file mode 100644
index 0000000000..251ae9299b
--- /dev/null
+++ b/esphome/components/template/event/template_event.h
@@ -0,0 +1,12 @@
+#pragma once
+
+#include "esphome/core/component.h"
+#include "esphome/components/event/event.h"
+
+namespace esphome {
+namespace template_ {
+
+class TemplateEvent : public Component, public event::Event {};
+
+}  // namespace template_
+}  // namespace esphome
diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp
index 13e396dc82..8d08783c8c 100644
--- a/esphome/components/web_server/list_entities.cpp
+++ b/esphome/components/web_server/list_entities.cpp
@@ -159,5 +159,14 @@ bool ListEntitiesIterator::on_alarm_control_panel(alarm_control_panel::AlarmCont
 }
 #endif
 
+#ifdef USE_EVENT
+bool ListEntitiesIterator::on_event(event::Event *event) {
+  // Null event type, since we are just iterating over entities
+  const std::string null_event_type = "";
+  this->web_server_->events_.send(this->web_server_->event_json(event, null_event_type, DETAIL_ALL).c_str(), "state");
+  return true;
+}
+#endif
+
 }  // namespace web_server
 }  // namespace esphome
diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h
index d0b8dda233..af84cb1d2b 100644
--- a/esphome/components/web_server/list_entities.h
+++ b/esphome/components/web_server/list_entities.h
@@ -62,6 +62,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #ifdef USE_ALARM_CONTROL_PANEL
   bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) override;
 #endif
+#ifdef USE_EVENT
+  bool on_event(event::Event *event) override;
+#endif
 
  protected:
   WebServer *web_server_;
diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp
index 412f8816ee..0202038ffc 100644
--- a/esphome/components/web_server/web_server.cpp
+++ b/esphome/components/web_server/web_server.cpp
@@ -1352,6 +1352,28 @@ void WebServer::handle_alarm_control_panel_request(AsyncWebServerRequest *reques
 }
 #endif
 
+#ifdef USE_EVENT
+void WebServer::on_event(event::Event *obj, const std::string &event_type) {
+  this->events_.send(this->event_json(obj, event_type, DETAIL_STATE).c_str(), "state");
+}
+
+std::string WebServer::event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config) {
+  return json::build_json([obj, event_type, start_config](JsonObject root) {
+    set_json_id(root, obj, "event-" + obj->get_object_id(), start_config);
+    if (!event_type.empty()) {
+      root["event_type"] = event_type;
+    }
+    if (start_config == DETAIL_ALL) {
+      JsonArray event_types = root.createNestedArray("event_types");
+      for (auto const &event_type : obj->get_event_types()) {
+        event_types.add(event_type);
+      }
+      root["device_class"] = obj->get_device_class();
+    }
+  });
+}
+#endif
+
 bool WebServer::canHandle(AsyncWebServerRequest *request) {
   if (request->url() == "/")
     return true;
diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h
index 9f807efc43..5e8f3f8236 100644
--- a/esphome/components/web_server/web_server.h
+++ b/esphome/components/web_server/web_server.h
@@ -297,6 +297,13 @@ class WebServer : public Controller, public Component, public AsyncWebHandler {
                                        alarm_control_panel::AlarmControlPanelState value, JsonDetail start_config);
 #endif
 
+#ifdef USE_EVENT
+  void on_event(event::Event *obj, const std::string &event_type) override;
+
+  /// Dump the event details with its value as a JSON string.
+  std::string event_json(event::Event *obj, const std::string &event_type, JsonDetail start_config);
+#endif
+
   /// Override the web handler's canHandle method.
   bool canHandle(AsyncWebServerRequest *request) override;
   /// Override the web handler's handleRequest method.
diff --git a/esphome/const.py b/esphome/const.py
index 8410d36708..dfb7fe464c 100644
--- a/esphome/const.py
+++ b/esphome/const.py
@@ -251,6 +251,8 @@ CONF_ESP8266_DISABLE_SSL_SUPPORT = "esp8266_disable_ssl_support"
 CONF_ESPHOME = "esphome"
 CONF_ETHERNET = "ethernet"
 CONF_EVENT = "event"
+CONF_EVENT_TYPE = "event_type"
+CONF_EVENT_TYPES = "event_types"
 CONF_EXPIRE_AFTER = "expire_after"
 CONF_EXPORT_ACTIVE_ENERGY = "export_active_energy"
 CONF_EXPORT_REACTIVE_ENERGY = "export_reactive_energy"
@@ -517,6 +519,7 @@ CONF_ON_DOUBLE_CLICK = "on_double_click"
 CONF_ON_ENROLLMENT_DONE = "on_enrollment_done"
 CONF_ON_ENROLLMENT_FAILED = "on_enrollment_failed"
 CONF_ON_ENROLLMENT_SCAN = "on_enrollment_scan"
+CONF_ON_EVENT = "on_event"
 CONF_ON_FINGER_SCAN_INVALID = "on_finger_scan_invalid"
 CONF_ON_FINGER_SCAN_MATCHED = "on_finger_scan_matched"
 CONF_ON_FINGER_SCAN_MISPLACED = "on_finger_scan_misplaced"
@@ -1024,6 +1027,7 @@ DEVICE_CLASS_AWNING = "awning"
 DEVICE_CLASS_BATTERY = "battery"
 DEVICE_CLASS_BATTERY_CHARGING = "battery_charging"
 DEVICE_CLASS_BLIND = "blind"
+DEVICE_CLASS_BUTTON = "button"
 DEVICE_CLASS_CARBON_DIOXIDE = "carbon_dioxide"
 DEVICE_CLASS_CARBON_MONOXIDE = "carbon_monoxide"
 DEVICE_CLASS_COLD = "cold"
@@ -1036,6 +1040,7 @@ DEVICE_CLASS_DATA_SIZE = "data_size"
 DEVICE_CLASS_DATE = "date"
 DEVICE_CLASS_DISTANCE = "distance"
 DEVICE_CLASS_DOOR = "door"
+DEVICE_CLASS_DOORBELL = "doorbell"
 DEVICE_CLASS_DURATION = "duration"
 DEVICE_CLASS_EMPTY = ""
 DEVICE_CLASS_ENERGY = "energy"
diff --git a/esphome/core/application.h b/esphome/core/application.h
index ee931282a6..35df350ec3 100644
--- a/esphome/core/application.h
+++ b/esphome/core/application.h
@@ -63,6 +63,9 @@
 #ifdef USE_ALARM_CONTROL_PANEL
 #include "esphome/components/alarm_control_panel/alarm_control_panel.h"
 #endif
+#ifdef USE_EVENT
+#include "esphome/components/event/event.h"
+#endif
 
 namespace esphome {
 
@@ -164,6 +167,10 @@ class Application {
   }
 #endif
 
+#ifdef USE_EVENT
+  void register_event(event::Event *event) { this->events_.push_back(event); }
+#endif
+
   /// Register the component in this Application instance.
   template<class C> C *register_component(C *c) {
     static_assert(std::is_base_of<Component, C>::value, "Only Component subclasses can be registered");
@@ -386,6 +393,16 @@ class Application {
   }
 #endif
 
+#ifdef USE_EVENT
+  const std::vector<event::Event *> &get_events() { return this->events_; }
+  event::Event *get_event_by_key(uint32_t key, bool include_internal = false) {
+    for (auto *obj : this->events_)
+      if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
+        return obj;
+    return nullptr;
+  }
+#endif
+
   Scheduler scheduler;
 
  protected:
@@ -409,6 +426,9 @@ class Application {
 #ifdef USE_BUTTON
   std::vector<button::Button *> buttons_{};
 #endif
+#ifdef USE_EVENT
+  std::vector<event::Event *> events_{};
+#endif
 #ifdef USE_SENSOR
   std::vector<sensor::Sensor *> sensors_{};
 #endif
diff --git a/esphome/core/component_iterator.cpp b/esphome/core/component_iterator.cpp
index b00154c685..687f1f6e23 100644
--- a/esphome/core/component_iterator.cpp
+++ b/esphome/core/component_iterator.cpp
@@ -321,6 +321,21 @@ void ComponentIterator::advance() {
         }
       }
       break;
+#endif
+#ifdef USE_EVENT
+    case IteratorState::EVENT:
+      if (this->at_ >= App.get_events().size()) {
+        advance_platform = true;
+      } else {
+        auto *event = App.get_events()[this->at_];
+        if (event->is_internal() && !this->include_internal_) {
+          success = true;
+          break;
+        } else {
+          success = this->on_event(event);
+        }
+      }
+      break;
 #endif
     case IteratorState::MAX:
       if (this->on_end()) {
diff --git a/esphome/core/component_iterator.h b/esphome/core/component_iterator.h
index 3fbbc0bc19..8f0398cbb3 100644
--- a/esphome/core/component_iterator.h
+++ b/esphome/core/component_iterator.h
@@ -80,6 +80,9 @@ class ComponentIterator {
 #endif
 #ifdef USE_ALARM_CONTROL_PANEL
   virtual bool on_alarm_control_panel(alarm_control_panel::AlarmControlPanel *a_alarm_control_panel) = 0;
+#endif
+#ifdef USE_EVENT
+  virtual bool on_event(event::Event *event) = 0;
 #endif
   virtual bool on_end();
 
@@ -146,6 +149,9 @@ class ComponentIterator {
 #endif
 #ifdef USE_ALARM_CONTROL_PANEL
     ALARM_CONTROL_PANEL,
+#endif
+#ifdef USE_EVENT
+    EVENT,
 #endif
     MAX,
   } state_{IteratorState::NONE};
diff --git a/esphome/core/controller.cpp b/esphome/core/controller.cpp
index eab818bdb4..eb975eaf6f 100644
--- a/esphome/core/controller.cpp
+++ b/esphome/core/controller.cpp
@@ -109,6 +109,12 @@ void Controller::setup_controller(bool include_internal) {
       obj->add_on_state_callback([this, obj]() { this->on_alarm_control_panel_update(obj); });
   }
 #endif
+#ifdef USE_EVENT
+  for (auto *obj : App.get_events()) {
+    if (include_internal || !obj->is_internal())
+      obj->add_on_event_callback([this, obj](const std::string &event_type) { this->on_event(obj, event_type); });
+  }
+#endif
 }
 
 }  // namespace esphome
diff --git a/esphome/core/controller.h b/esphome/core/controller.h
index 94a4acb7c7..da9dbc00a6 100644
--- a/esphome/core/controller.h
+++ b/esphome/core/controller.h
@@ -55,6 +55,9 @@
 #ifdef USE_ALARM_CONTROL_PANEL
 #include "esphome/components/alarm_control_panel/alarm_control_panel.h"
 #endif
+#ifdef USE_EVENT
+#include "esphome/components/event/event.h"
+#endif
 
 namespace esphome {
 
@@ -112,6 +115,9 @@ class Controller {
 #ifdef USE_ALARM_CONTROL_PANEL
   virtual void on_alarm_control_panel_update(alarm_control_panel::AlarmControlPanel *obj){};
 #endif
+#ifdef USE_EVENT
+  virtual void on_event(event::Event *obj, const std::string &event_type){};
+#endif
 };
 
 }  // namespace esphome
diff --git a/esphome/core/defines.h b/esphome/core/defines.h
index 2064ca1356..fed73098d2 100644
--- a/esphome/core/defines.h
+++ b/esphome/core/defines.h
@@ -24,6 +24,7 @@
 #define USE_CLIMATE
 #define USE_COVER
 #define USE_DEEP_SLEEP
+#define USE_EVENT
 #define USE_FAN
 #define USE_GRAPH
 #define USE_HOMEASSISTANT_TIME
diff --git a/script/ci-custom.py b/script/ci-custom.py
index c591bfe5c3..27fcd480f5 100755
--- a/script/ci-custom.py
+++ b/script/ci-custom.py
@@ -624,6 +624,7 @@ def lint_trailing_whitespace(fname, match):
         "esphome/components/datetime/date_entity.h",
         "esphome/components/datetime/time_entity.h",
         "esphome/components/display/display.h",
+        "esphome/components/event/event.h",
         "esphome/components/fan/fan.h",
         "esphome/components/i2c/i2c.h",
         "esphome/components/lock/lock.h",
diff --git a/tests/components/event/test.esp32-c3-idf.yaml b/tests/components/event/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.esp32-c3-idf.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired
diff --git a/tests/components/event/test.esp32-c3.yaml b/tests/components/event/test.esp32-c3.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.esp32-c3.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired
diff --git a/tests/components/event/test.esp32-idf.yaml b/tests/components/event/test.esp32-idf.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.esp32-idf.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired
diff --git a/tests/components/event/test.esp32.yaml b/tests/components/event/test.esp32.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.esp32.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired
diff --git a/tests/components/event/test.esp8266.yaml b/tests/components/event/test.esp8266.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.esp8266.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired
diff --git a/tests/components/event/test.rp2040.yaml b/tests/components/event/test.rp2040.yaml
new file mode 100644
index 0000000000..71cc19a6b0
--- /dev/null
+++ b/tests/components/event/test.rp2040.yaml
@@ -0,0 +1,9 @@
+event:
+  - platform: template
+    name: Event
+    id: some_event
+    event_types:
+      - template_event_type1
+      - template_event_type2
+    on_event:
+      - logger.log: Event fired

From 1ac855f2e0d38564678ffddeb4a8182e2fea5721 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Wed, 24 Apr 2024 14:49:16 +1200
Subject: [PATCH 40/81] Only check c/c++ files with clang-format (#6620)

---
 .pre-commit-config.yaml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 15e59b7eb7..6f4bb52104 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -39,4 +39,4 @@ repos:
     rev: v13.0.1
     hooks:
       - id: clang-format
-
+        types_or: [c, c++]

From a7079f8fba599da736a033885dcb112f2dc8ee05 Mon Sep 17 00:00:00 2001
From: Evgeny <iam@freekode.org>
Date: Wed, 24 Apr 2024 05:07:07 +0200
Subject: [PATCH 41/81] Added base64 helper (#4866)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/core/helpers.cpp | 97 ++++++++++++++++++++++++++++++++++++++++
 esphome/core/helpers.h   | 10 +++++
 2 files changed, 107 insertions(+)

diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp
index 0f7afc6a4e..4368576301 100644
--- a/esphome/core/helpers.cpp
+++ b/esphome/core/helpers.cpp
@@ -433,6 +433,103 @@ int8_t step_to_accuracy_decimals(float step) {
   return str.length() - dot_pos - 1;
 }
 
+static inline bool is_base64(char c) { return (isalnum(c) || (c == '+') || (c == '/')); }
+
+std::string base64_encode(const std::vector<uint8_t> &buf) { return base64_encode(buf.data(), buf.size()); }
+
+std::string base64_encode(const char *buf, unsigned int buf_len) {
+  std::string ret;
+  int i = 0;
+  int j = 0;
+  char char_array_3[3];
+  char char_array_4[4];
+
+  while (buf_len--) {
+    char_array_3[i++] = *(buf++);
+    if (i == 3) {
+      char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+      char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+      char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+      char_array_4[3] = char_array_3[2] & 0x3f;
+
+      for (i = 0; (i < 4); i++)
+        ret += BASE64_CHARS[char_array_4[i]];
+      i = 0;
+    }
+  }
+
+  if (i) {
+    for (j = i; j < 3; j++)
+      char_array_3[j] = '\0';
+
+    char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
+    char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
+    char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
+    char_array_4[3] = char_array_3[2] & 0x3f;
+
+    for (j = 0; (j < i + 1); j++)
+      ret += BASE64_CHARS[char_array_4[j]];
+
+    while ((i++ < 3))
+      ret += '=';
+  }
+
+  return ret;
+}
+
+size_t base64_decode(const std::string &encoded_string, uint8_t *buf, size_t buf_len) {
+  std::vector<uint8_t> decoded = base64_decode(encoded_string);
+  if (decoded.size() > buf_len) {
+    ESP_LOGW(TAG, "Base64 decode: buffer too small, truncating");
+    decoded.resize(buf_len);
+  }
+  memcpy(buf, decoded.data(), decoded.size());
+  return decoded.size();
+}
+
+std::vector<uint8_t> base64_decode(const std::string &encoded_string) {
+  int in_len = encoded_string.size();
+  int i = 0;
+  int j = 0;
+  int in = 0;
+  uint8_t char_array_4[4], char_array_3[3];
+  std::vector<uint8_t> ret;
+
+  while (in_len-- && (encoded_string[in] != '=') && is_base64(encoded_string[in])) {
+    char_array_4[i++] = encoded_string[in];
+    in++;
+    if (i == 4) {
+      for (i = 0; i < 4; i++)
+        char_array_4[i] = BASE64_CHARS.find(char_array_4[i]);
+
+      char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+      char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+      char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+      for (i = 0; (i < 3); i++)
+        ret.push_back(char_array_3[i]);
+      i = 0;
+    }
+  }
+
+  if (i) {
+    for (j = i; j < 4; j++)
+      char_array_4[j] = 0;
+
+    for (j = 0; j < 4; j++)
+      char_array_4[j] = BASE64_CHARS.find(char_array_4[j]);
+
+    char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
+    char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
+    char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
+
+    for (j = 0; (j < i - 1); j++)
+      ret.push_back(char_array_3[j]);
+  }
+
+  return ret;
+}
+
 // Colors
 
 float gamma_correct(float value, float gamma) {
diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h
index c3ed443bf0..b2d72b0fab 100644
--- a/esphome/core/helpers.h
+++ b/esphome/core/helpers.h
@@ -435,6 +435,16 @@ std::string value_accuracy_to_string(float value, int8_t accuracy_decimals);
 /// Derive accuracy in decimals from an increment step.
 int8_t step_to_accuracy_decimals(float step);
 
+static const std::string BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+                                        "abcdefghijklmnopqrstuvwxyz"
+                                        "0123456789+/";
+
+std::string base64_encode(const uint8_t *buf, size_t buf_len);
+std::string base64_encode(const std::vector<uint8_t> &buf);
+
+std::vector<uint8_t> base64_decode(const std::string &encoded_string);
+size_t base64_decode(std::string const &encoded_string, uint8_t *buf, size_t buf_len);
+
 ///@}
 
 /// @name Colors

From e2b0d561bc02c9b9707cb06aeae46bba522145a7 Mon Sep 17 00:00:00 2001
From: rforro <kiko39@protonmail.com>
Date: Wed, 24 Apr 2024 05:21:08 +0200
Subject: [PATCH 42/81] Add Roomba IR protocol (#4595)

Co-authored-by: Richard Forro <r@f.rf>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/remote_base/__init__.py    | 39 +++++++++++++
 .../remote_base/roomba_protocol.cpp           | 56 +++++++++++++++++++
 .../components/remote_base/roomba_protocol.h  | 35 ++++++++++++
 3 files changed, 130 insertions(+)
 create mode 100644 esphome/components/remote_base/roomba_protocol.cpp
 create mode 100644 esphome/components/remote_base/roomba_protocol.h

diff --git a/esphome/components/remote_base/__init__.py b/esphome/components/remote_base/__init__.py
index 6deab63c60..8a1d50d1c6 100644
--- a/esphome/components/remote_base/__init__.py
+++ b/esphome/components/remote_base/__init__.py
@@ -881,6 +881,45 @@ async def pronto_action(var, config, args):
     cg.add(var.set_data(template_))
 
 
+# Roomba
+(
+    RoombaData,
+    RoombaBinarySensor,
+    RoombaTrigger,
+    RoombaAction,
+    RoombaDumper,
+) = declare_protocol("Roomba")
+ROOMBA_SCHEMA = cv.Schema({cv.Required(CONF_DATA): cv.hex_uint8_t})
+
+
+@register_binary_sensor("roomba", RoombaBinarySensor, ROOMBA_SCHEMA)
+def roomba_binary_sensor(var, config):
+    cg.add(
+        var.set_data(
+            cg.StructInitializer(
+                RoombaData,
+                ("data", config[CONF_DATA]),
+            )
+        )
+    )
+
+
+@register_trigger("roomba", RoombaTrigger, RoombaData)
+def roomba_trigger(var, config):
+    pass
+
+
+@register_dumper("roomba", RoombaDumper)
+def roomba_dumper(var, config):
+    pass
+
+
+@register_action("roomba", RoombaAction, ROOMBA_SCHEMA)
+async def roomba_action(var, config, args):
+    template_ = await cg.templatable(config[CONF_DATA], args, cg.uint8)
+    cg.add(var.set_data(template_))
+
+
 # Sony
 SonyData, SonyBinarySensor, SonyTrigger, SonyAction, SonyDumper = declare_protocol(
     "Sony"
diff --git a/esphome/components/remote_base/roomba_protocol.cpp b/esphome/components/remote_base/roomba_protocol.cpp
new file mode 100644
index 0000000000..2d2dde114a
--- /dev/null
+++ b/esphome/components/remote_base/roomba_protocol.cpp
@@ -0,0 +1,56 @@
+#include "roomba_protocol.h"
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace remote_base {
+
+static const char *const TAG = "remote.roomba";
+
+static const uint8_t NBITS = 8;
+static const uint32_t BIT_ONE_HIGH_US = 3000;
+static const uint32_t BIT_ONE_LOW_US = 1000;
+static const uint32_t BIT_ZERO_HIGH_US = BIT_ONE_LOW_US;
+static const uint32_t BIT_ZERO_LOW_US = BIT_ONE_HIGH_US;
+
+void RoombaProtocol::encode(RemoteTransmitData *dst, const RoombaData &data) {
+  dst->set_carrier_frequency(38000);
+  dst->reserve(NBITS * 2u);
+
+  for (uint32_t mask = 1UL << (NBITS - 1); mask != 0; mask >>= 1) {
+    if (data.data & mask) {
+      dst->item(BIT_ONE_HIGH_US, BIT_ONE_LOW_US);
+    } else {
+      dst->item(BIT_ZERO_HIGH_US, BIT_ZERO_LOW_US);
+    }
+  }
+}
+optional<RoombaData> RoombaProtocol::decode(RemoteReceiveData src) {
+  RoombaData out{.data = 0};
+
+  for (uint8_t i = 0; i < (NBITS - 1); i++) {
+    out.data <<= 1UL;
+    if (src.expect_item(BIT_ONE_HIGH_US, BIT_ONE_LOW_US)) {
+      out.data |= 1UL;
+    } else if (src.expect_item(BIT_ZERO_HIGH_US, BIT_ZERO_LOW_US)) {
+      out.data |= 0UL;
+    } else {
+      return {};
+    }
+  }
+
+  // not possible to measure space on last bit, check only mark
+  out.data <<= 1UL;
+  if (src.expect_mark(BIT_ONE_HIGH_US)) {
+    out.data |= 1UL;
+  } else if (src.expect_mark(BIT_ZERO_HIGH_US)) {
+    out.data |= 0UL;
+  } else {
+    return {};
+  }
+
+  return out;
+}
+void RoombaProtocol::dump(const RoombaData &data) { ESP_LOGD(TAG, "Received Roomba: data=0x%02X", data.data); }
+
+}  // namespace remote_base
+}  // namespace esphome
diff --git a/esphome/components/remote_base/roomba_protocol.h b/esphome/components/remote_base/roomba_protocol.h
new file mode 100644
index 0000000000..f94cb7df1b
--- /dev/null
+++ b/esphome/components/remote_base/roomba_protocol.h
@@ -0,0 +1,35 @@
+#pragma once
+
+#include "remote_base.h"
+
+namespace esphome {
+namespace remote_base {
+
+struct RoombaData {
+  uint8_t data;
+
+  bool operator==(const RoombaData &rhs) const { return data == rhs.data; }
+};
+
+class RoombaProtocol : public RemoteProtocol<RoombaData> {
+ public:
+  void encode(RemoteTransmitData *dst, const RoombaData &data) override;
+  optional<RoombaData> decode(RemoteReceiveData src) override;
+  void dump(const RoombaData &data) override;
+};
+
+DECLARE_REMOTE_PROTOCOL(Roomba)
+
+template<typename... Ts> class RoombaAction : public RemoteTransmitterActionBase<Ts...> {
+ public:
+  TEMPLATABLE_VALUE(uint8_t, data)
+
+  void encode(RemoteTransmitData *dst, Ts... x) override {
+    RoombaData data{};
+    data.data = this->data_.value(x...);
+    RoombaProtocol().encode(dst, data);
+  }
+};
+
+}  // namespace remote_base
+}  // namespace esphome

From 1775c73e53f991194fdb318022ece516255c5ce6 Mon Sep 17 00:00:00 2001
From: Patrick <info@patagona.dev>
Date: Wed, 24 Apr 2024 05:56:56 +0200
Subject: [PATCH 43/81] Fix issue when setting cw/ww brightness via temperature
 (#5976)

---
 esphome/components/light/light_call.cpp | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/esphome/components/light/light_call.cpp b/esphome/components/light/light_call.cpp
index 8dc5d4fbe7..c2600d05c2 100644
--- a/esphome/components/light/light_call.cpp
+++ b/esphome/components/light/light_call.cpp
@@ -337,9 +337,12 @@ LightColorValues LightCall::validate_() {
 void LightCall::transform_parameters_() {
   auto traits = this->parent_->get_traits();
 
-  // Allow CWWW modes to be set with a white value and/or color temperature. This is used by HA,
-  // which doesn't support CWWW modes (yet?), and for compatibility with the pre-colormode model,
-  // as CWWW and RGBWW lights used to represent their values as white + color temperature.
+  // Allow CWWW modes to be set with a white value and/or color temperature.
+  // This is used in three cases in HA:
+  // - CW/WW lights, which set the "brightness" and "color_temperature"
+  // - RGBWW lights with color_interlock=true, which also sets "brightness" and
+  //   "color_temperature" (without color_interlock, CW/WW are set directly)
+  // - Legacy Home Assistant (pre-colormode), which sets "white" and "color_temperature"
   if (((this->white_.has_value() && *this->white_ > 0.0f) || this->color_temperature_.has_value()) &&  //
       (*this->color_mode_ & ColorCapability::COLD_WARM_WHITE) &&                                       //
       !(*this->color_mode_ & ColorCapability::WHITE) &&                                                //
@@ -347,21 +350,17 @@ void LightCall::transform_parameters_() {
       traits.get_min_mireds() > 0.0f && traits.get_max_mireds() > 0.0f) {
     ESP_LOGD(TAG, "'%s' - Setting cold/warm white channels using white/color temperature values.",
              this->parent_->get_name().c_str());
-    auto current_values = this->parent_->remote_values;
     if (this->color_temperature_.has_value()) {
-      const float white =
-          this->white_.value_or(fmaxf(current_values.get_cold_white(), current_values.get_warm_white()));
       const float color_temp = clamp(*this->color_temperature_, traits.get_min_mireds(), traits.get_max_mireds());
       const float ww_fraction =
           (color_temp - traits.get_min_mireds()) / (traits.get_max_mireds() - traits.get_min_mireds());
       const float cw_fraction = 1.0f - ww_fraction;
       const float max_cw_ww = std::max(ww_fraction, cw_fraction);
-      this->cold_white_ = white * gamma_uncorrect(cw_fraction / max_cw_ww, this->parent_->get_gamma_correct());
-      this->warm_white_ = white * gamma_uncorrect(ww_fraction / max_cw_ww, this->parent_->get_gamma_correct());
-    } else {
-      const float max_cw_ww = std::max(current_values.get_warm_white(), current_values.get_cold_white());
-      this->cold_white_ = *this->white_ * current_values.get_cold_white() / max_cw_ww;
-      this->warm_white_ = *this->white_ * current_values.get_warm_white() / max_cw_ww;
+      this->cold_white_ = gamma_uncorrect(cw_fraction / max_cw_ww, this->parent_->get_gamma_correct());
+      this->warm_white_ = gamma_uncorrect(ww_fraction / max_cw_ww, this->parent_->get_gamma_correct());
+    }
+    if (this->white_.has_value()) {
+      this->brightness_ = *this->white_;
     }
   }
 }

From 41b19504bc8490e318f3e35bb7e10386fd44ab0b Mon Sep 17 00:00:00 2001
From: Daniel Kent <129895318+danielkent-net@users.noreply.github.com>
Date: Wed, 24 Apr 2024 00:18:54 -0400
Subject: [PATCH 44/81] Add get/set color temperature functions in Kelvin
 (#5006)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/light/light_color_values.h | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/esphome/components/light/light_color_values.h b/esphome/components/light/light_color_values.h
index 10a3c2f335..bad180ce6d 100644
--- a/esphome/components/light/light_color_values.h
+++ b/esphome/components/light/light_color_values.h
@@ -266,6 +266,21 @@ class LightColorValues {
   /// Set the color temperature property of these light color values in mired.
   void set_color_temperature(float color_temperature) { this->color_temperature_ = color_temperature; }
 
+  /// Get the color temperature property of these light color values in kelvin.
+  float get_color_temperature_kelvin() const {
+    if (this->color_temperature_ <= 0) {
+      return this->color_temperature_;
+    }
+    return 1000000.0 / this->color_temperature_;
+  }
+  /// Set the color temperature property of these light color values in kelvin.
+  void set_color_temperature_kelvin(float color_temperature) {
+    if (color_temperature <= 0) {
+      return;
+    }
+    this->color_temperature_ = 1000000.0 / color_temperature;
+  }
+
   /// Get the cold white property of these light color values. In range 0.0 to 1.0.
   float get_cold_white() const { return this->cold_white_; }
   /// Set the cold white property of these light color values. In range 0.0 to 1.0.

From bdc9c66f7e781d431cc507393877944313b80046 Mon Sep 17 00:00:00 2001
From: tomaszduda23 <tomaszduda23@gmail.com>
Date: Thu, 25 Apr 2024 11:50:41 +0200
Subject: [PATCH 45/81] Move CONF_PLATFORM_VERSION to global const.py (#6629)

* remove duplicated definition

* format
---
 esphome/components/esp32/__init__.py   | 3 +--
 esphome/components/esp8266/__init__.py | 2 +-
 esphome/components/rp2040/__init__.py  | 3 +--
 esphome/const.py                       | 1 +
 4 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/esphome/components/esp32/__init__.py b/esphome/components/esp32/__init__.py
index 8ae6262f2f..5d74838daa 100644
--- a/esphome/components/esp32/__init__.py
+++ b/esphome/components/esp32/__init__.py
@@ -32,6 +32,7 @@ from esphome.const import (
     TYPE_GIT,
     TYPE_LOCAL,
     __version__,
+    CONF_PLATFORM_VERSION,
 )
 from esphome.core import CORE, HexInt, TimePeriod
 import esphome.config_validation as cv
@@ -365,8 +366,6 @@ def final_validate(config):
     return config
 
 
-CONF_PLATFORM_VERSION = "platform_version"
-
 ARDUINO_FRAMEWORK_SCHEMA = cv.All(
     cv.Schema(
         {
diff --git a/esphome/components/esp8266/__init__.py b/esphome/components/esp8266/__init__.py
index 00729921a3..64b127bda3 100644
--- a/esphome/components/esp8266/__init__.py
+++ b/esphome/components/esp8266/__init__.py
@@ -12,6 +12,7 @@ from esphome.const import (
     KEY_TARGET_FRAMEWORK,
     KEY_TARGET_PLATFORM,
     PLATFORM_ESP8266,
+    CONF_PLATFORM_VERSION,
 )
 from esphome.core import CORE, coroutine_with_priority
 import esphome.config_validation as cv
@@ -146,7 +147,6 @@ def _parse_platform_version(value):
         return value
 
 
-CONF_PLATFORM_VERSION = "platform_version"
 ARDUINO_FRAMEWORK_SCHEMA = cv.All(
     cv.Schema(
         {
diff --git a/esphome/components/rp2040/__init__.py b/esphome/components/rp2040/__init__.py
index b262a068fb..ace455add7 100644
--- a/esphome/components/rp2040/__init__.py
+++ b/esphome/components/rp2040/__init__.py
@@ -15,6 +15,7 @@ from esphome.const import (
     KEY_TARGET_FRAMEWORK,
     KEY_TARGET_PLATFORM,
     PLATFORM_RP2040,
+    CONF_PLATFORM_VERSION,
 )
 from esphome.core import CORE, coroutine_with_priority, EsphomeError
 from esphome.helpers import mkdir_p, write_file, copy_file_if_changed
@@ -125,8 +126,6 @@ def _parse_platform_version(value):
         return value
 
 
-CONF_PLATFORM_VERSION = "platform_version"
-
 ARDUINO_FRAMEWORK_SCHEMA = cv.All(
     cv.Schema(
         {
diff --git a/esphome/const.py b/esphome/const.py
index dfb7fe464c..a64bc73f59 100644
--- a/esphome/const.py
+++ b/esphome/const.py
@@ -597,6 +597,7 @@ CONF_PIN_D = "pin_d"
 CONF_PINS = "pins"
 CONF_PIXEL_MAPPER = "pixel_mapper"
 CONF_PLATFORM = "platform"
+CONF_PLATFORM_VERSION = "platform_version"
 CONF_PLATFORMIO_OPTIONS = "platformio_options"
 CONF_PM_0_3UM = "pm_0_3um"
 CONF_PM_0_5UM = "pm_0_5um"

From 2fa58468939b1319b072f7fc3f123dcc1f916605 Mon Sep 17 00:00:00 2001
From: Joakim Plate <elupus@ecce.se>
Date: Thu, 25 Apr 2024 12:05:30 +0200
Subject: [PATCH 46/81] Ble client fixes for proxy (#6596)

---
 esphome/components/alpha3/alpha3.cpp          |  8 +++--
 .../components/am43/sensor/am43_sensor.cpp    |  4 ++-
 .../bluetooth_proxy/bluetooth_connection.cpp  | 33 +++++--------------
 .../esp32_ble_client/ble_client_base.cpp      |  2 +-
 .../display/pvvx_display.cpp                  |  6 ++--
 5 files changed, 21 insertions(+), 32 deletions(-)

diff --git a/esphome/components/alpha3/alpha3.cpp b/esphome/components/alpha3/alpha3.cpp
index 17899c31cb..344f2d5a03 100644
--- a/esphome/components/alpha3/alpha3.cpp
+++ b/esphome/components/alpha3/alpha3.cpp
@@ -97,9 +97,11 @@ void Alpha3::handle_geni_response_(const uint8_t *response, uint16_t length) {
 void Alpha3::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) {
   switch (event) {
     case ESP_GATTC_OPEN_EVT: {
-      this->response_offset_ = 0;
-      this->response_length_ = 0;
-      ESP_LOGI(TAG, "[%s] connection open", this->parent_->address_str().c_str());
+      if (param->open.status == ESP_GATT_OK) {
+        this->response_offset_ = 0;
+        this->response_length_ = 0;
+        ESP_LOGI(TAG, "[%s] connection open", this->parent_->address_str().c_str());
+      }
       break;
     }
     case ESP_GATTC_CONNECT_EVT: {
diff --git a/esphome/components/am43/sensor/am43_sensor.cpp b/esphome/components/am43/sensor/am43_sensor.cpp
index 008c7768ed..4cc99001ae 100644
--- a/esphome/components/am43/sensor/am43_sensor.cpp
+++ b/esphome/components/am43/sensor/am43_sensor.cpp
@@ -26,7 +26,9 @@ void Am43::setup() {
 void Am43::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if, esp_ble_gattc_cb_param_t *param) {
   switch (event) {
     case ESP_GATTC_OPEN_EVT: {
-      this->logged_in_ = false;
+      if (param->open.status == ESP_GATT_OK) {
+        this->logged_in_ = false;
+      }
       break;
     }
     case ESP_GATTC_DISCONNECT_EVT: {
diff --git a/esphome/components/bluetooth_proxy/bluetooth_connection.cpp b/esphome/components/bluetooth_proxy/bluetooth_connection.cpp
index 97a25262cb..543752853e 100644
--- a/esphome/components/bluetooth_proxy/bluetooth_connection.cpp
+++ b/esphome/components/bluetooth_proxy/bluetooth_connection.cpp
@@ -25,9 +25,13 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga
       this->proxy_->send_connections_free();
       break;
     }
+    case ESP_GATTC_CLOSE_EVT: {
+      this->proxy_->send_device_connection(this->address_, false, 0, param->close.reason);
+      this->set_address(0);
+      this->proxy_->send_connections_free();
+      break;
+    }
     case ESP_GATTC_OPEN_EVT: {
-      if (param->open.conn_id != this->conn_id_)
-        break;
       if (param->open.status != ESP_GATT_OK && param->open.status != ESP_GATT_ALREADY_OPEN) {
         this->proxy_->send_device_connection(this->address_, false, 0, param->open.status);
         this->set_address(0);
@@ -39,9 +43,8 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga
       this->seen_mtu_or_services_ = false;
       break;
     }
-    case ESP_GATTC_CFG_MTU_EVT: {
-      if (param->cfg_mtu.conn_id != this->conn_id_)
-        break;
+    case ESP_GATTC_CFG_MTU_EVT:
+    case ESP_GATTC_SEARCH_CMPL_EVT: {
       if (!this->seen_mtu_or_services_) {
         // We don't know if we will get the MTU or the services first, so
         // only send the device connection true if we have already received
@@ -53,24 +56,8 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga
       this->proxy_->send_connections_free();
       break;
     }
-    case ESP_GATTC_SEARCH_CMPL_EVT: {
-      if (param->search_cmpl.conn_id != this->conn_id_)
-        break;
-      if (!this->seen_mtu_or_services_) {
-        // We don't know if we will get the MTU or the services first, so
-        // only send the device connection true if we have already received
-        // the mtu.
-        this->seen_mtu_or_services_ = true;
-        break;
-      }
-      this->proxy_->send_device_connection(this->address_, true, this->mtu_);
-      this->proxy_->send_connections_free();
-      break;
-    }
     case ESP_GATTC_READ_DESCR_EVT:
     case ESP_GATTC_READ_CHAR_EVT: {
-      if (param->read.conn_id != this->conn_id_)
-        break;
       if (param->read.status != ESP_GATT_OK) {
         ESP_LOGW(TAG, "[%d] [%s] Error reading char/descriptor at handle 0x%2X, status=%d", this->connection_index_,
                  this->address_str_.c_str(), param->read.handle, param->read.status);
@@ -89,8 +76,6 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga
     }
     case ESP_GATTC_WRITE_CHAR_EVT:
     case ESP_GATTC_WRITE_DESCR_EVT: {
-      if (param->write.conn_id != this->conn_id_)
-        break;
       if (param->write.status != ESP_GATT_OK) {
         ESP_LOGW(TAG, "[%d] [%s] Error writing char/descriptor at handle 0x%2X, status=%d", this->connection_index_,
                  this->address_str_.c_str(), param->write.handle, param->write.status);
@@ -131,8 +116,6 @@ bool BluetoothConnection::gattc_event_handler(esp_gattc_cb_event_t event, esp_ga
       break;
     }
     case ESP_GATTC_NOTIFY_EVT: {
-      if (param->notify.conn_id != this->conn_id_)
-        break;
       ESP_LOGV(TAG, "[%d] [%s] ESP_GATTC_NOTIFY_EVT: handle=0x%2X", this->connection_index_, this->address_str_.c_str(),
                param->notify.handle);
       api::BluetoothGATTNotifyDataResponse resp;
diff --git a/esphome/components/esp32_ble_client/ble_client_base.cpp b/esphome/components/esp32_ble_client/ble_client_base.cpp
index ae83715aea..98e7792792 100644
--- a/esphome/components/esp32_ble_client/ble_client_base.cpp
+++ b/esphome/components/esp32_ble_client/ble_client_base.cpp
@@ -142,7 +142,7 @@ bool BLEClientBase::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_
         ESP_LOGW(TAG, "[%d] [%s] Connection failed, status=%d", this->connection_index_, this->address_str_.c_str(),
                  param->open.status);
         this->set_state(espbt::ClientState::IDLE);
-        return false;
+        break;
       }
       auto ret = esp_ble_gattc_send_mtu_req(this->gattc_if_, param->open.conn_id);
       if (ret) {
diff --git a/esphome/components/pvvx_mithermometer/display/pvvx_display.cpp b/esphome/components/pvvx_mithermometer/display/pvvx_display.cpp
index d192e62430..1856a023cc 100644
--- a/esphome/components/pvvx_mithermometer/display/pvvx_display.cpp
+++ b/esphome/components/pvvx_mithermometer/display/pvvx_display.cpp
@@ -24,8 +24,10 @@ void PVVXDisplay::gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t
                                       esp_ble_gattc_cb_param_t *param) {
   switch (event) {
     case ESP_GATTC_OPEN_EVT:
-      ESP_LOGV(TAG, "[%s] Connected successfully!", this->parent_->address_str().c_str());
-      this->delayed_disconnect_();
+      if (param->open.status == ESP_GATT_OK) {
+        ESP_LOGV(TAG, "[%s] Connected successfully!", this->parent_->address_str().c_str());
+        this->delayed_disconnect_();
+      }
       break;
     case ESP_GATTC_DISCONNECT_EVT:
       ESP_LOGV(TAG, "[%s] Disconnected", this->parent_->address_str().c_str());

From 0662c5e0fb3e760fe488b80ab4cc312e6bd1011c Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Fri, 26 Apr 2024 07:00:01 +1000
Subject: [PATCH 47/81] Fix for #6614- use background_color, improve
 anti-aliasing (#6618)

---
 esphome/components/font/font.cpp                | 17 ++++++++++-------
 .../graphical_display_menu.cpp                  | 15 ++++++++-------
 2 files changed, 18 insertions(+), 14 deletions(-)

diff --git a/esphome/components/font/font.cpp b/esphome/components/font/font.cpp
index 5a18429789..3b62b8ca66 100644
--- a/esphome/components/font/font.cpp
+++ b/esphome/components/font/font.cpp
@@ -129,7 +129,13 @@ void Font::print(int x_start, int y_start, display::Display *display, Color colo
 
     uint8_t bitmask = 0;
     uint8_t pixel_data = 0;
-    float bpp_max = (1 << this->bpp_) - 1;
+    uint8_t bpp_max = (1 << this->bpp_) - 1;
+    auto diff_r = (float) color.r - (float) background.r;
+    auto diff_g = (float) color.g - (float) background.g;
+    auto diff_b = (float) color.b - (float) background.b;
+    auto b_r = (float) background.r;
+    auto b_g = (float) background.g;
+    auto b_b = (float) background.g;
     for (int glyph_y = y_start + scan_y1; glyph_y != max_y; glyph_y++) {
       for (int glyph_x = x_at + scan_x1; glyph_x != max_x; glyph_x++) {
         uint8_t pixel = 0;
@@ -146,12 +152,9 @@ void Font::print(int x_start, int y_start, display::Display *display, Color colo
         if (pixel == bpp_max) {
           display->draw_pixel_at(glyph_x, glyph_y, color);
         } else if (pixel != 0) {
-          float on = (float) pixel / bpp_max;
-          float off = 1.0 - on;
-          Color blended;
-          blended.r = color.r * on + background.r * off;
-          blended.g = color.r * on + background.g * off;
-          blended.b = color.r * on + background.b * off;
+          auto on = (float) pixel / (float) bpp_max;
+          auto blended =
+              Color((uint8_t) (diff_r * on + b_r), (uint8_t) (diff_g * on + b_g), (uint8_t) (diff_b * on + b_b));
           display->draw_pixel_at(glyph_x, glyph_y, blended);
         }
       }
diff --git a/esphome/components/graphical_display_menu/graphical_display_menu.cpp b/esphome/components/graphical_display_menu/graphical_display_menu.cpp
index fcbad41388..4a4e519009 100644
--- a/esphome/components/graphical_display_menu/graphical_display_menu.cpp
+++ b/esphome/components/graphical_display_menu/graphical_display_menu.cpp
@@ -104,7 +104,8 @@ void GraphicalDisplayMenu::draw(display::Display *display, const display::Rect *
 }
 
 void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const display::Rect *bounds) {
-  int total_height = 0;
+  int16_t total_height = 0;
+  int16_t max_width = 0;
   int y_padding = 2;
   bool scroll_menu_items = false;
   std::vector<display::Rect> menu_dimensions;
@@ -118,6 +119,7 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
 
     menu_dimensions.push_back(item_dimensions);
     total_height += item_dimensions.h + (i == 0 ? 0 : y_padding);
+    max_width = std::max(max_width, item_dimensions.w);
 
     if (total_height <= bounds->h) {
       number_items_fit_to_screen++;
@@ -166,7 +168,8 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
   // Render the items into the view port
   display->start_clipping(*bounds);
 
-  int y_offset = bounds->y;
+  display->filled_rectangle(bounds->x, bounds->y, max_width, total_height, this->background_color_);
+  auto y_offset = bounds->y;
   for (size_t i = first_item_index; i <= last_item_index; i++) {
     const auto *item = this->displayed_item_->get_item(i);
     const bool selected = i == this->cursor_index_;
@@ -176,7 +179,7 @@ void GraphicalDisplayMenu::draw_menu_internal_(display::Display *display, const
     dimensions.x = bounds->x;
     this->draw_item(display, item, &dimensions, selected);
 
-    y_offset = dimensions.y + dimensions.h + y_padding;
+    y_offset += dimensions.h + y_padding;
   }
 
   display->end_clipping();
@@ -219,9 +222,7 @@ inline void GraphicalDisplayMenu::draw_item(display::Display *display, const dis
   // int background_width = std::max(bounds->width, available_width);
   int background_width = bounds->w;
 
-  if (selected) {
-    display->filled_rectangle(bounds->x, bounds->y, background_width, bounds->h, background_color);
-  }
+  display->filled_rectangle(bounds->x, bounds->y, background_width, bounds->h, background_color);
 
   std::string label = item->get_text();
   if (item->has_value()) {
@@ -230,7 +231,7 @@ inline void GraphicalDisplayMenu::draw_item(display::Display *display, const dis
   }
 
   display->print(bounds->x, bounds->y, this->font_, foreground_color, display::TextAlign::TOP_LEFT, label.c_str(),
-                 ~foreground_color);
+                 background_color);
 }
 
 void GraphicalDisplayMenu::draw_item(const display_menu_base::MenuItem *item, const uint8_t row, const bool selected) {

From de2a92e45de9444b7bcc88e8a0c8984c6240b53b Mon Sep 17 00:00:00 2001
From: chiahsing <chiahsing@gmail.com>
Date: Fri, 26 Apr 2024 05:01:51 +0800
Subject: [PATCH 48/81] Fix graph hangs when y <= 0 (#6593)

---
 esphome/components/graph/graph.cpp | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/esphome/components/graph/graph.cpp b/esphome/components/graph/graph.cpp
index 0e437a3425..1178af911d 100644
--- a/esphome/components/graph/graph.cpp
+++ b/esphome/components/graph/graph.cpp
@@ -164,7 +164,7 @@ void Graph::draw(Display *buff, uint16_t x_offset, uint16_t y_offset, Color colo
   ESP_LOGV(TAG, "Updating graph. ymin %f, ymax %f", ymin, ymax);
   for (auto *trace : traces_) {
     Color c = trace->get_line_color();
-    uint16_t thick = trace->get_line_thickness();
+    int16_t thick = trace->get_line_thickness();
     bool continuous = trace->get_continuous();
     bool has_prev = false;
     bool prev_b = false;
@@ -178,20 +178,20 @@ void Graph::draw(Display *buff, uint16_t x_offset, uint16_t y_offset, Color colo
         if (b) {
           int16_t y = (int16_t) roundf((this->height_ - 1) * (1.0 - v)) - thick / 2 + y_offset;
           if (!continuous || !has_prev || !prev_b || (abs(y - prev_y) <= thick)) {
-            for (uint16_t t = 0; t < thick; t++) {
+            for (int16_t t = 0; t < thick; t++) {
               buff->draw_pixel_at(x, y + t, c);
             }
           } else {
             int16_t mid_y = (y + prev_y + thick) / 2;
             if (y > prev_y) {
-              for (uint16_t t = prev_y + thick; t <= mid_y; t++)
+              for (int16_t t = prev_y + thick; t <= mid_y; t++)
                 buff->draw_pixel_at(x + 1, t, c);
-              for (uint16_t t = mid_y + 1; t < y + thick; t++)
+              for (int16_t t = mid_y + 1; t < y + thick; t++)
                 buff->draw_pixel_at(x, t, c);
             } else {
-              for (uint16_t t = prev_y - 1; t >= mid_y; t--)
+              for (int16_t t = prev_y - 1; t >= mid_y; t--)
                 buff->draw_pixel_at(x + 1, t, c);
-              for (uint16_t t = mid_y - 1; t >= y; t--)
+              for (int16_t t = mid_y - 1; t >= y; t--)
                 buff->draw_pixel_at(x, t, c);
             }
           }

From 5288d5ac9539cbb1d8e67e6094c7aeb35844c66e Mon Sep 17 00:00:00 2001
From: Nico Peter <nicopeter85@gmail.com>
Date: Thu, 25 Apr 2024 23:04:20 +0200
Subject: [PATCH 49/81] Feature add last_operation to time based cover (#6084)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/time_based/time_based_cover.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/esphome/components/time_based/time_based_cover.h b/esphome/components/time_based/time_based_cover.h
index b7a826d237..42cf66c2ab 100644
--- a/esphome/components/time_based/time_based_cover.h
+++ b/esphome/components/time_based/time_based_cover.h
@@ -23,6 +23,7 @@ class TimeBasedCover : public cover::Cover, public Component {
   void set_has_built_in_endstop(bool value) { this->has_built_in_endstop_ = value; }
   void set_manual_control(bool value) { this->manual_control_ = value; }
   void set_assumed_state(bool value) { this->assumed_state_ = value; }
+  cover::CoverOperation get_last_operation() const { return this->last_operation_; }
 
  protected:
   void control(const cover::CoverCall &call) override;

From bcef64a6fa67e8c85ae0a03f4f2986361be3e58d Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Thu, 25 Apr 2024 16:04:48 -0500
Subject: [PATCH 50/81] Add `event`, `text_sensor` and `valve` device classes
 to sync script (#6624)

---
 script/sync-device_class.py | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/script/sync-device_class.py b/script/sync-device_class.py
index 8f91b97997..26d271535f 100755
--- a/script/sync-device_class.py
+++ b/script/sync-device_class.py
@@ -6,9 +6,12 @@ import re
 from homeassistant.components.binary_sensor import BinarySensorDeviceClass
 from homeassistant.components.button import ButtonDeviceClass
 from homeassistant.components.cover import CoverDeviceClass
+from homeassistant.components.event import EventDeviceClass
 from homeassistant.components.number import NumberDeviceClass
 from homeassistant.components.sensor import SensorDeviceClass
 from homeassistant.components.switch import SwitchDeviceClass
+from homeassistant.components.text_sensor import TextSensorDeviceClass
+from homeassistant.components.valve import ValveDeviceClass
 
 # pylint: enable=import-error
 
@@ -21,9 +24,12 @@ DOMAINS = {
     "binary_sensor": BinarySensorDeviceClass,
     "button": ButtonDeviceClass,
     "cover": CoverDeviceClass,
+    "event": EventDeviceClass,
     "number": NumberDeviceClass,
     "sensor": SensorDeviceClass,
     "switch": SwitchDeviceClass,
+    "text_sensor": TextSensorDeviceClass,
+    "valve": ValveDeviceClass,
 }
 
 

From 8ef7b41c91deefe9514cf6c6130e0fcbb99ecb6d Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Fri, 26 Apr 2024 09:19:54 +1200
Subject: [PATCH 51/81] Add datetime entities (#6513)

---
 esphome/components/api/api.proto              |  38 +++
 esphome/components/api/api_connection.cpp     |  38 +++
 esphome/components/api/api_connection.h       |   5 +
 esphome/components/api/api_pb2.cpp            | 173 ++++++++++++
 esphome/components/api/api_pb2.h              |  45 ++++
 esphome/components/api/api_pb2_service.cpp    |  42 +++
 esphome/components/api/api_pb2_service.h      |  15 ++
 esphome/components/api/api_server.cpp         |   9 +
 esphome/components/api/api_server.h           |   3 +
 esphome/components/api/list_entities.cpp      |   6 +
 esphome/components/api/list_entities.h        |   3 +
 esphome/components/api/subscribe_state.cpp    |   5 +
 esphome/components/api/subscribe_state.h      |   3 +
 esphome/components/datetime/__init__.py       | 129 ++++++---
 esphome/components/datetime/date_entity.cpp   |   3 +
 esphome/components/datetime/datetime_base.h   |   7 +
 .../components/datetime/datetime_entity.cpp   | 252 ++++++++++++++++++
 esphome/components/datetime/datetime_entity.h | 150 +++++++++++
 esphome/components/datetime/time_entity.cpp   |   6 +-
 esphome/components/datetime/time_entity.h     |  12 +-
 esphome/components/mqtt/__init__.py           |   1 +
 esphome/components/mqtt/mqtt_datetime.cpp     |  84 ++++++
 esphome/components/mqtt/mqtt_datetime.h       |  45 ++++
 .../components/template/datetime/__init__.py  |  22 ++
 .../template/datetime/template_datetime.cpp   | 150 +++++++++++
 .../template/datetime/template_datetime.h     |  46 ++++
 esphome/components/time/real_time_clock.cpp   |   2 +
 .../components/web_server/list_entities.cpp   |   9 +
 esphome/components/web_server/list_entities.h |   3 +
 esphome/components/web_server/web_server.cpp  |  63 +++++
 esphome/components/web_server/web_server.h    |   9 +
 esphome/const.py                              |   1 +
 esphome/core/application.h                    |  19 ++
 esphome/core/component_iterator.cpp           |  15 ++
 esphome/core/component_iterator.h             |   6 +
 esphome/core/controller.cpp                   |   6 +
 esphome/core/controller.h                     |   6 +
 esphome/core/defines.h                        |   1 +
 esphome/core/time.cpp                         |   9 +
 esphome/core/time.h                           |   3 +
 script/ci-custom.py                           |   1 +
 tests/components/datetime/test.all.yaml       |   2 +
 .../template/{test.all.yaml => common.yaml}   |  22 ++
 tests/components/template/test.bk72xx.yaml    |   2 +
 .../template/test.esp32-c3-idf.yaml           |   2 +
 tests/components/template/test.esp32-c3.yaml  |   2 +
 tests/components/template/test.esp32-idf.yaml |   2 +
 .../template/test.esp32-s3-idf.yaml           |   2 +
 tests/components/template/test.esp32.yaml     |   2 +
 tests/components/template/test.esp8266.yaml   |   2 +
 tests/components/template/test.rp2040.yaml    |   2 +
 51 files changed, 1430 insertions(+), 55 deletions(-)
 create mode 100644 esphome/components/datetime/datetime_entity.cpp
 create mode 100644 esphome/components/datetime/datetime_entity.h
 create mode 100644 esphome/components/mqtt/mqtt_datetime.cpp
 create mode 100644 esphome/components/mqtt/mqtt_datetime.h
 create mode 100644 esphome/components/template/datetime/template_datetime.cpp
 create mode 100644 esphome/components/template/datetime/template_datetime.h
 rename tests/components/template/{test.all.yaml => common.yaml} (88%)
 create mode 100644 tests/components/template/test.bk72xx.yaml
 create mode 100644 tests/components/template/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/template/test.esp32-c3.yaml
 create mode 100644 tests/components/template/test.esp32-idf.yaml
 create mode 100644 tests/components/template/test.esp32-s3-idf.yaml
 create mode 100644 tests/components/template/test.esp32.yaml
 create mode 100644 tests/components/template/test.esp8266.yaml
 create mode 100644 tests/components/template/test.rp2040.yaml

diff --git a/esphome/components/api/api.proto b/esphome/components/api/api.proto
index 17826ea7ed..b8073abc19 100644
--- a/esphome/components/api/api.proto
+++ b/esphome/components/api/api.proto
@@ -47,6 +47,7 @@ service APIConnection {
   rpc media_player_command (MediaPlayerCommandRequest) returns (void) {}
   rpc date_command (DateCommandRequest) returns (void) {}
   rpc time_command (TimeCommandRequest) returns (void) {}
+  rpc datetime_command (DateTimeCommandRequest) returns (void) {}
 
   rpc subscribe_bluetooth_le_advertisements(SubscribeBluetoothLEAdvertisementsRequest) returns (void) {}
   rpc bluetooth_device_request(BluetoothDeviceRequest) returns (void) {}
@@ -1777,3 +1778,40 @@ message ValveCommandRequest {
   float position = 3;
   bool stop = 4;
 }
+
+// ==================== DATETIME DATETIME ====================
+message ListEntitiesDateTimeResponse {
+  option (id) = 112;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_DATETIME_DATETIME";
+
+  string object_id = 1;
+  fixed32 key = 2;
+  string name = 3;
+  string unique_id = 4;
+
+  string icon = 5;
+  bool disabled_by_default = 6;
+  EntityCategory entity_category = 7;
+}
+message DateTimeStateResponse {
+  option (id) = 113;
+  option (source) = SOURCE_SERVER;
+  option (ifdef) = "USE_DATETIME_DATETIME";
+  option (no_delay) = true;
+
+  fixed32 key = 1;
+  // If the datetime does not have a valid state yet.
+  // Equivalent to `!obj->has_state()` - inverse logic to make state packets smaller
+  bool missing_state = 2;
+  fixed32 epoch_seconds = 3;
+}
+message DateTimeCommandRequest {
+  option (id) = 114;
+  option (source) = SOURCE_CLIENT;
+  option (ifdef) = "USE_DATETIME_DATETIME";
+  option (no_delay) = true;
+
+  fixed32 key = 1;
+  fixed32 epoch_seconds = 2;
+}
diff --git a/esphome/components/api/api_connection.cpp b/esphome/components/api/api_connection.cpp
index ec09604d95..b31212bbdb 100644
--- a/esphome/components/api/api_connection.cpp
+++ b/esphome/components/api/api_connection.cpp
@@ -772,6 +772,44 @@ void APIConnection::time_command(const TimeCommandRequest &msg) {
 }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+bool APIConnection::send_datetime_state(datetime::DateTimeEntity *datetime) {
+  if (!this->state_subscription_)
+    return false;
+
+  DateTimeStateResponse resp{};
+  resp.key = datetime->get_object_id_hash();
+  resp.missing_state = !datetime->has_state();
+  if (datetime->has_state()) {
+    ESPTime state = datetime->state_as_esptime();
+    resp.epoch_seconds = state.timestamp;
+  }
+  return this->send_date_time_state_response(resp);
+}
+bool APIConnection::send_datetime_info(datetime::DateTimeEntity *datetime) {
+  ListEntitiesDateTimeResponse msg;
+  msg.key = datetime->get_object_id_hash();
+  msg.object_id = datetime->get_object_id();
+  if (datetime->has_own_name())
+    msg.name = datetime->get_name();
+  msg.unique_id = get_default_unique_id("datetime", datetime);
+  msg.icon = datetime->get_icon();
+  msg.disabled_by_default = datetime->is_disabled_by_default();
+  msg.entity_category = static_cast<enums::EntityCategory>(datetime->get_entity_category());
+
+  return this->send_list_entities_date_time_response(msg);
+}
+void APIConnection::datetime_command(const DateTimeCommandRequest &msg) {
+  datetime::DateTimeEntity *datetime = App.get_datetime_by_key(msg.key);
+  if (datetime == nullptr)
+    return;
+
+  auto call = datetime->make_call();
+  call.set_datetime(msg.epoch_seconds);
+  call.perform();
+}
+#endif
+
 #ifdef USE_TEXT
 bool APIConnection::send_text_state(text::Text *text, std::string state) {
   if (!this->state_subscription_)
diff --git a/esphome/components/api/api_connection.h b/esphome/components/api/api_connection.h
index 2c1d733d3e..ee466c5d10 100644
--- a/esphome/components/api/api_connection.h
+++ b/esphome/components/api/api_connection.h
@@ -82,6 +82,11 @@ class APIConnection : public APIServerConnection {
   bool send_time_info(datetime::TimeEntity *time);
   void time_command(const TimeCommandRequest &msg) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  bool send_datetime_state(datetime::DateTimeEntity *datetime);
+  bool send_datetime_info(datetime::DateTimeEntity *datetime);
+  void datetime_command(const DateTimeCommandRequest &msg) override;
+#endif
 #ifdef USE_TEXT
   bool send_text_state(text::Text *text, std::string state);
   bool send_text_info(text::Text *text);
diff --git a/esphome/components/api/api_pb2.cpp b/esphome/components/api/api_pb2.cpp
index 3f01d88c58..6ec1870d72 100644
--- a/esphome/components/api/api_pb2.cpp
+++ b/esphome/components/api/api_pb2.cpp
@@ -8093,6 +8093,179 @@ void ValveCommandRequest::dump_to(std::string &out) const {
   out.append("}");
 }
 #endif
+bool ListEntitiesDateTimeResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 6: {
+      this->disabled_by_default = value.as_bool();
+      return true;
+    }
+    case 7: {
+      this->entity_category = value.as_enum<enums::EntityCategory>();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesDateTimeResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
+  switch (field_id) {
+    case 1: {
+      this->object_id = value.as_string();
+      return true;
+    }
+    case 3: {
+      this->name = value.as_string();
+      return true;
+    }
+    case 4: {
+      this->unique_id = value.as_string();
+      return true;
+    }
+    case 5: {
+      this->icon = value.as_string();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool ListEntitiesDateTimeResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 2: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void ListEntitiesDateTimeResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_string(1, this->object_id);
+  buffer.encode_fixed32(2, this->key);
+  buffer.encode_string(3, this->name);
+  buffer.encode_string(4, this->unique_id);
+  buffer.encode_string(5, this->icon);
+  buffer.encode_bool(6, this->disabled_by_default);
+  buffer.encode_enum<enums::EntityCategory>(7, this->entity_category);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void ListEntitiesDateTimeResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("ListEntitiesDateTimeResponse {\n");
+  out.append("  object_id: ");
+  out.append("'").append(this->object_id).append("'");
+  out.append("\n");
+
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  name: ");
+  out.append("'").append(this->name).append("'");
+  out.append("\n");
+
+  out.append("  unique_id: ");
+  out.append("'").append(this->unique_id).append("'");
+  out.append("\n");
+
+  out.append("  icon: ");
+  out.append("'").append(this->icon).append("'");
+  out.append("\n");
+
+  out.append("  disabled_by_default: ");
+  out.append(YESNO(this->disabled_by_default));
+  out.append("\n");
+
+  out.append("  entity_category: ");
+  out.append(proto_enum_to_string<enums::EntityCategory>(this->entity_category));
+  out.append("\n");
+  out.append("}");
+}
+#endif
+bool DateTimeStateResponse::decode_varint(uint32_t field_id, ProtoVarInt value) {
+  switch (field_id) {
+    case 2: {
+      this->missing_state = value.as_bool();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+bool DateTimeStateResponse::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 1: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    case 3: {
+      this->epoch_seconds = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void DateTimeStateResponse::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_fixed32(1, this->key);
+  buffer.encode_bool(2, this->missing_state);
+  buffer.encode_fixed32(3, this->epoch_seconds);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void DateTimeStateResponse::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("DateTimeStateResponse {\n");
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  missing_state: ");
+  out.append(YESNO(this->missing_state));
+  out.append("\n");
+
+  out.append("  epoch_seconds: ");
+  sprintf(buffer, "%" PRIu32, this->epoch_seconds);
+  out.append(buffer);
+  out.append("\n");
+  out.append("}");
+}
+#endif
+bool DateTimeCommandRequest::decode_32bit(uint32_t field_id, Proto32Bit value) {
+  switch (field_id) {
+    case 1: {
+      this->key = value.as_fixed32();
+      return true;
+    }
+    case 2: {
+      this->epoch_seconds = value.as_fixed32();
+      return true;
+    }
+    default:
+      return false;
+  }
+}
+void DateTimeCommandRequest::encode(ProtoWriteBuffer buffer) const {
+  buffer.encode_fixed32(1, this->key);
+  buffer.encode_fixed32(2, this->epoch_seconds);
+}
+#ifdef HAS_PROTO_MESSAGE_DUMP
+void DateTimeCommandRequest::dump_to(std::string &out) const {
+  __attribute__((unused)) char buffer[64];
+  out.append("DateTimeCommandRequest {\n");
+  out.append("  key: ");
+  sprintf(buffer, "%" PRIu32, this->key);
+  out.append(buffer);
+  out.append("\n");
+
+  out.append("  epoch_seconds: ");
+  sprintf(buffer, "%" PRIu32, this->epoch_seconds);
+  out.append(buffer);
+  out.append("\n");
+  out.append("}");
+}
+#endif
 
 }  // namespace api
 }  // namespace esphome
diff --git a/esphome/components/api/api_pb2.h b/esphome/components/api/api_pb2.h
index 9a6aab254d..14fd95df37 100644
--- a/esphome/components/api/api_pb2.h
+++ b/esphome/components/api/api_pb2.h
@@ -2060,6 +2060,51 @@ class ValveCommandRequest : public ProtoMessage {
   bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
   bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
 };
+class ListEntitiesDateTimeResponse : public ProtoMessage {
+ public:
+  std::string object_id{};
+  uint32_t key{0};
+  std::string name{};
+  std::string unique_id{};
+  std::string icon{};
+  bool disabled_by_default{false};
+  enums::EntityCategory entity_category{};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
+class DateTimeStateResponse : public ProtoMessage {
+ public:
+  uint32_t key{0};
+  bool missing_state{false};
+  uint32_t epoch_seconds{0};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+  bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
+};
+class DateTimeCommandRequest : public ProtoMessage {
+ public:
+  uint32_t key{0};
+  uint32_t epoch_seconds{0};
+  void encode(ProtoWriteBuffer buffer) const override;
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  void dump_to(std::string &out) const override;
+#endif
+
+ protected:
+  bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
+};
 
 }  // namespace api
 }  // namespace esphome
diff --git a/esphome/components/api/api_pb2_service.cpp b/esphome/components/api/api_pb2_service.cpp
index ced81fa643..093fe917e0 100644
--- a/esphome/components/api/api_pb2_service.cpp
+++ b/esphome/components/api/api_pb2_service.cpp
@@ -591,6 +591,24 @@ bool APIServerConnectionBase::send_valve_state_response(const ValveStateResponse
 #endif
 #ifdef USE_VALVE
 #endif
+#ifdef USE_DATETIME_DATETIME
+bool APIServerConnectionBase::send_list_entities_date_time_response(const ListEntitiesDateTimeResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_list_entities_date_time_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<ListEntitiesDateTimeResponse>(msg, 112);
+}
+#endif
+#ifdef USE_DATETIME_DATETIME
+bool APIServerConnectionBase::send_date_time_state_response(const DateTimeStateResponse &msg) {
+#ifdef HAS_PROTO_MESSAGE_DUMP
+  ESP_LOGVV(TAG, "send_date_time_state_response: %s", msg.dump().c_str());
+#endif
+  return this->send_message_<DateTimeStateResponse>(msg, 113);
+}
+#endif
+#ifdef USE_DATETIME_DATETIME
+#endif
 bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) {
   switch (msg_type) {
     case 1: {
@@ -1064,6 +1082,17 @@ bool APIServerConnectionBase::read_message(uint32_t msg_size, uint32_t msg_type,
       ESP_LOGVV(TAG, "on_valve_command_request: %s", msg.dump().c_str());
 #endif
       this->on_valve_command_request(msg);
+#endif
+      break;
+    }
+    case 114: {
+#ifdef USE_DATETIME_DATETIME
+      DateTimeCommandRequest msg;
+      msg.decode(msg_data, msg_size);
+#ifdef HAS_PROTO_MESSAGE_DUMP
+      ESP_LOGVV(TAG, "on_date_time_command_request: %s", msg.dump().c_str());
+#endif
+      this->on_date_time_command_request(msg);
 #endif
       break;
     }
@@ -1379,6 +1408,19 @@ void APIServerConnection::on_time_command_request(const TimeCommandRequest &msg)
   this->time_command(msg);
 }
 #endif
+#ifdef USE_DATETIME_DATETIME
+void APIServerConnection::on_date_time_command_request(const DateTimeCommandRequest &msg) {
+  if (!this->is_connection_setup()) {
+    this->on_no_setup_connection();
+    return;
+  }
+  if (!this->is_authenticated()) {
+    this->on_unauthenticated_access();
+    return;
+  }
+  this->datetime_command(msg);
+}
+#endif
 #ifdef USE_BLUETOOTH_PROXY
 void APIServerConnection::on_subscribe_bluetooth_le_advertisements_request(
     const SubscribeBluetoothLEAdvertisementsRequest &msg) {
diff --git a/esphome/components/api/api_pb2_service.h b/esphome/components/api/api_pb2_service.h
index c8b2bc5789..196d904aca 100644
--- a/esphome/components/api/api_pb2_service.h
+++ b/esphome/components/api/api_pb2_service.h
@@ -294,6 +294,15 @@ class APIServerConnectionBase : public ProtoService {
 #endif
 #ifdef USE_VALVE
   virtual void on_valve_command_request(const ValveCommandRequest &value){};
+#endif
+#ifdef USE_DATETIME_DATETIME
+  bool send_list_entities_date_time_response(const ListEntitiesDateTimeResponse &msg);
+#endif
+#ifdef USE_DATETIME_DATETIME
+  bool send_date_time_state_response(const DateTimeStateResponse &msg);
+#endif
+#ifdef USE_DATETIME_DATETIME
+  virtual void on_date_time_command_request(const DateTimeCommandRequest &value){};
 #endif
  protected:
   bool read_message(uint32_t msg_size, uint32_t msg_type, uint8_t *msg_data) override;
@@ -358,6 +367,9 @@ class APIServerConnection : public APIServerConnectionBase {
 #ifdef USE_DATETIME_TIME
   virtual void time_command(const TimeCommandRequest &msg) = 0;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  virtual void datetime_command(const DateTimeCommandRequest &msg) = 0;
+#endif
 #ifdef USE_BLUETOOTH_PROXY
   virtual void subscribe_bluetooth_le_advertisements(const SubscribeBluetoothLEAdvertisementsRequest &msg) = 0;
 #endif
@@ -453,6 +465,9 @@ class APIServerConnection : public APIServerConnectionBase {
 #ifdef USE_DATETIME_TIME
   void on_time_command_request(const TimeCommandRequest &msg) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  void on_date_time_command_request(const DateTimeCommandRequest &msg) override;
+#endif
 #ifdef USE_BLUETOOTH_PROXY
   void on_subscribe_bluetooth_le_advertisements_request(const SubscribeBluetoothLEAdvertisementsRequest &msg) override;
 #endif
diff --git a/esphome/components/api/api_server.cpp b/esphome/components/api/api_server.cpp
index 6d4e4db1e8..0725547771 100644
--- a/esphome/components/api/api_server.cpp
+++ b/esphome/components/api/api_server.cpp
@@ -273,6 +273,15 @@ void APIServer::on_time_update(datetime::TimeEntity *obj) {
 }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+void APIServer::on_datetime_update(datetime::DateTimeEntity *obj) {
+  if (obj->is_internal())
+    return;
+  for (auto &c : this->clients_)
+    c->send_datetime_state(obj);
+}
+#endif
+
 #ifdef USE_TEXT
 void APIServer::on_text_update(text::Text *obj, const std::string &state) {
   if (obj->is_internal())
diff --git a/esphome/components/api/api_server.h b/esphome/components/api/api_server.h
index e9e03cde0d..2e1fbdf67c 100644
--- a/esphome/components/api/api_server.h
+++ b/esphome/components/api/api_server.h
@@ -72,6 +72,9 @@ class APIServer : public Component, public Controller {
 #ifdef USE_DATETIME_TIME
   void on_time_update(datetime::TimeEntity *obj) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  void on_datetime_update(datetime::DateTimeEntity *obj) override;
+#endif
 #ifdef USE_TEXT
   void on_text_update(text::Text *obj, const std::string &state) override;
 #endif
diff --git a/esphome/components/api/list_entities.cpp b/esphome/components/api/list_entities.cpp
index 82bfd45333..a7dbf9a6e7 100644
--- a/esphome/components/api/list_entities.cpp
+++ b/esphome/components/api/list_entities.cpp
@@ -71,6 +71,12 @@ bool ListEntitiesIterator::on_date(datetime::DateEntity *date) { return this->cl
 bool ListEntitiesIterator::on_time(datetime::TimeEntity *time) { return this->client_->send_time_info(time); }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+bool ListEntitiesIterator::on_datetime(datetime::DateTimeEntity *datetime) {
+  return this->client_->send_datetime_info(datetime);
+}
+#endif
+
 #ifdef USE_TEXT
 bool ListEntitiesIterator::on_text(text::Text *text) { return this->client_->send_text_info(text); }
 #endif
diff --git a/esphome/components/api/list_entities.h b/esphome/components/api/list_entities.h
index 19cd99ea01..c1fd8b82c4 100644
--- a/esphome/components/api/list_entities.h
+++ b/esphome/components/api/list_entities.h
@@ -52,6 +52,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #ifdef USE_DATETIME_TIME
   bool on_time(datetime::TimeEntity *time) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  bool on_datetime(datetime::DateTimeEntity *datetime) override;
+#endif
 #ifdef USE_TEXT
   bool on_text(text::Text *text) override;
 #endif
diff --git a/esphome/components/api/subscribe_state.cpp b/esphome/components/api/subscribe_state.cpp
index 7aa8e8ffac..005ab0e6da 100644
--- a/esphome/components/api/subscribe_state.cpp
+++ b/esphome/components/api/subscribe_state.cpp
@@ -48,6 +48,11 @@ bool InitialStateIterator::on_date(datetime::DateEntity *date) { return this->cl
 #ifdef USE_DATETIME_TIME
 bool InitialStateIterator::on_time(datetime::TimeEntity *time) { return this->client_->send_time_state(time); }
 #endif
+#ifdef USE_DATETIME_DATETIME
+bool InitialStateIterator::on_datetime(datetime::DateTimeEntity *datetime) {
+  return this->client_->send_datetime_state(datetime);
+}
+#endif
 #ifdef USE_TEXT
 bool InitialStateIterator::on_text(text::Text *text) { return this->client_->send_text_state(text, text->state); }
 #endif
diff --git a/esphome/components/api/subscribe_state.h b/esphome/components/api/subscribe_state.h
index 17d444c441..8c725e422e 100644
--- a/esphome/components/api/subscribe_state.h
+++ b/esphome/components/api/subscribe_state.h
@@ -49,6 +49,9 @@ class InitialStateIterator : public ComponentIterator {
 #ifdef USE_DATETIME_TIME
   bool on_time(datetime::TimeEntity *time) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  bool on_datetime(datetime::DateTimeEntity *datetime) override;
+#endif
 #ifdef USE_TEXT
   bool on_text(text::Text *text) override;
 #endif
diff --git a/esphome/components/datetime/__init__.py b/esphome/components/datetime/__init__.py
index a22c60aae9..639a035159 100644
--- a/esphome/components/datetime/__init__.py
+++ b/esphome/components/datetime/__init__.py
@@ -1,6 +1,5 @@
 import esphome.codegen as cg
 
-# import cpp_generator as cpp
 import esphome.config_validation as cv
 from esphome import automation
 from esphome.components import mqtt, time
@@ -13,6 +12,7 @@ from esphome.const import (
     CONF_TYPE,
     CONF_MQTT_ID,
     CONF_DATE,
+    CONF_DATETIME,
     CONF_TIME,
     CONF_YEAR,
     CONF_MONTH,
@@ -27,6 +27,7 @@ from esphome.cpp_helpers import setup_entity
 
 
 CODEOWNERS = ["@rfdarter", "@jesserockz"]
+DEPENDENCIES = ["time"]
 
 IS_PLATFORM_COMPONENT = True
 
@@ -34,10 +35,12 @@ datetime_ns = cg.esphome_ns.namespace("datetime")
 DateTimeBase = datetime_ns.class_("DateTimeBase", cg.EntityBase)
 DateEntity = datetime_ns.class_("DateEntity", DateTimeBase)
 TimeEntity = datetime_ns.class_("TimeEntity", DateTimeBase)
+DateTimeEntity = datetime_ns.class_("DateTimeEntity", DateTimeBase)
 
 # Actions
 DateSetAction = datetime_ns.class_("DateSetAction", automation.Action)
 TimeSetAction = datetime_ns.class_("TimeSetAction", automation.Action)
+DateTimeSetAction = datetime_ns.class_("DateTimeSetAction", automation.Action)
 
 DateTimeStateTrigger = datetime_ns.class_(
     "DateTimeStateTrigger", automation.Trigger.template(cg.ESPTime)
@@ -46,6 +49,12 @@ DateTimeStateTrigger = datetime_ns.class_(
 OnTimeTrigger = datetime_ns.class_(
     "OnTimeTrigger", automation.Trigger, cg.Component, cg.Parented.template(TimeEntity)
 )
+OnDateTimeTrigger = datetime_ns.class_(
+    "OnDateTimeTrigger",
+    automation.Trigger,
+    cg.Component,
+    cg.Parented.template(DateTimeEntity),
+)
 
 DATETIME_MODES = [
     "DATE",
@@ -61,45 +70,55 @@ _DATETIME_SCHEMA = cv.Schema(
                 cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(DateTimeStateTrigger),
             }
         ),
+        cv.GenerateID(CONF_TIME_ID): cv.use_id(time.RealTimeClock),
     }
 ).extend(cv.ENTITY_BASE_SCHEMA.extend(cv.MQTT_COMMAND_COMPONENT_SCHEMA))
 
 
 def date_schema(class_: MockObjClass) -> cv.Schema:
-    schema = {
-        cv.GenerateID(): cv.declare_id(class_),
-        cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTDateComponent),
-        cv.Optional(CONF_TYPE, default="DATE"): cv.one_of("DATE", upper=True),
-    }
+    schema = cv.Schema(
+        {
+            cv.GenerateID(): cv.declare_id(class_),
+            cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTDateComponent),
+            cv.Optional(CONF_TYPE, default="DATE"): cv.one_of("DATE", upper=True),
+        }
+    )
     return _DATETIME_SCHEMA.extend(schema)
 
 
 def time_schema(class_: MockObjClass) -> cv.Schema:
-    schema = {
-        cv.GenerateID(): cv.declare_id(class_),
-        cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTTimeComponent),
-        cv.Optional(CONF_TYPE, default="TIME"): cv.one_of("TIME", upper=True),
-        cv.Inclusive(
-            CONF_ON_TIME,
-            group_of_inclusion=CONF_ON_TIME,
-            msg="`on_time` and `time_id` must both be specified",
-        ): automation.validate_automation(
-            {
-                cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(OnTimeTrigger),
-            }
-        ),
-        cv.Inclusive(CONF_TIME_ID, group_of_inclusion=CONF_ON_TIME): cv.use_id(
-            time.RealTimeClock
-        ),
-    }
+    schema = cv.Schema(
+        {
+            cv.GenerateID(): cv.declare_id(class_),
+            cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(mqtt.MQTTTimeComponent),
+            cv.Optional(CONF_TYPE, default="TIME"): cv.one_of("TIME", upper=True),
+            cv.Optional(CONF_ON_TIME): automation.validate_automation(
+                {
+                    cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(OnTimeTrigger),
+                }
+            ),
+        }
+    )
     return _DATETIME_SCHEMA.extend(schema)
 
 
 def datetime_schema(class_: MockObjClass) -> cv.Schema:
-    schema = {
-        cv.GenerateID(): cv.declare_id(class_),
-        cv.Optional(CONF_TYPE, default="DATETIME"): cv.one_of("DATETIME", upper=True),
-    }
+    schema = cv.Schema(
+        {
+            cv.GenerateID(): cv.declare_id(class_),
+            cv.OnlyWith(CONF_MQTT_ID, "mqtt"): cv.declare_id(
+                mqtt.MQTTDateTimeComponent
+            ),
+            cv.Optional(CONF_TYPE, default="DATETIME"): cv.one_of(
+                "DATETIME", upper=True
+            ),
+            cv.Optional(CONF_ON_TIME): automation.validate_automation(
+                {
+                    cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(OnDateTimeTrigger),
+                }
+            ),
+        }
+    )
     return _DATETIME_SCHEMA.extend(schema)
 
 
@@ -113,13 +132,11 @@ async def setup_datetime_core_(var, config):
         trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
         await automation.build_automation(trigger, [(cg.ESPTime, "x")], conf)
 
-    rtc_id = config.get(CONF_TIME_ID)
-    rtc = None
-    if rtc_id is not None:
-        rtc = await cg.get_variable(rtc_id)
+    rtc = await cg.get_variable(config[CONF_TIME_ID])
+    cg.add(var.set_rtc(rtc))
+
     for conf in config.get(CONF_ON_TIME, []):
-        assert rtc is not None
-        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], rtc)
+        trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID])
         await automation.build_automation(trigger, [], conf)
         await cg.register_component(trigger, conf)
         await cg.register_parented(trigger, var)
@@ -161,16 +178,16 @@ async def datetime_date_set_to_code(config, action_id, template_arg, args):
     action_var = cg.new_Pvariable(action_id, template_arg)
     await cg.register_parented(action_var, config[CONF_ID])
 
-    date = config[CONF_DATE]
-    if cg.is_template(date):
-        template_ = await cg.templatable(config[CONF_DATE], [], cg.ESPTime)
+    date_config = config[CONF_DATE]
+    if cg.is_template(date_config):
+        template_ = await cg.templatable(date_config, [], cg.ESPTime)
         cg.add(action_var.set_date(template_))
     else:
         date_struct = cg.StructInitializer(
             cg.ESPTime,
-            ("day_of_month", date[CONF_DAY]),
-            ("month", date[CONF_MONTH]),
-            ("year", date[CONF_YEAR]),
+            ("day_of_month", date_config[CONF_DAY]),
+            ("month", date_config[CONF_MONTH]),
+            ("year", date_config[CONF_YEAR]),
         )
         cg.add(action_var.set_date(date_struct))
     return action_var
@@ -194,7 +211,7 @@ async def datetime_time_set_to_code(config, action_id, template_arg, args):
 
     time_config = config[CONF_TIME]
     if cg.is_template(time_config):
-        template_ = await cg.templatable(config[CONF_TIME], [], cg.ESPTime)
+        template_ = await cg.templatable(time_config, [], cg.ESPTime)
         cg.add(action_var.set_time(template_))
     else:
         time_struct = cg.StructInitializer(
@@ -205,3 +222,35 @@ async def datetime_time_set_to_code(config, action_id, template_arg, args):
         )
         cg.add(action_var.set_time(time_struct))
     return action_var
+
+
+@automation.register_action(
+    "datetime.datetime.set",
+    DateTimeSetAction,
+    cv.Schema(
+        {
+            cv.Required(CONF_ID): cv.use_id(DateTimeEntity),
+            cv.Required(CONF_DATETIME): cv.Any(cv.returning_lambda, cv.date_time()),
+        },
+    ),
+)
+async def datetime_datetime_set_to_code(config, action_id, template_arg, args):
+    action_var = cg.new_Pvariable(action_id, template_arg)
+    await cg.register_parented(action_var, config[CONF_ID])
+
+    datetime_config = config[CONF_DATETIME]
+    if cg.is_template(datetime_config):
+        template_ = await cg.templatable(datetime_config, [], cg.ESPTime)
+        cg.add(action_var.set_datetime(template_))
+    else:
+        datetime_struct = cg.StructInitializer(
+            cg.ESPTime,
+            ("second", datetime_config[CONF_SECOND]),
+            ("minute", datetime_config[CONF_MINUTE]),
+            ("hour", datetime_config[CONF_HOUR]),
+            ("day_of_month", datetime_config[CONF_DAY]),
+            ("month", datetime_config[CONF_MONTH]),
+            ("year", datetime_config[CONF_YEAR]),
+        )
+        cg.add(action_var.set_datetime(datetime_struct))
+    return action_var
diff --git a/esphome/components/datetime/date_entity.cpp b/esphome/components/datetime/date_entity.cpp
index 8b58a8faf7..19399c1e59 100644
--- a/esphome/components/datetime/date_entity.cpp
+++ b/esphome/components/datetime/date_entity.cpp
@@ -40,10 +40,13 @@ void DateCall::validate_() {
   if (this->year_.has_value() && (this->year_ < 1970 || this->year_ > 3000)) {
     ESP_LOGE(TAG, "Year must be between 1970 and 3000");
     this->year_.reset();
+    this->month_.reset();
+    this->day_.reset();
   }
   if (this->month_.has_value() && (this->month_ < 1 || this->month_ > 12)) {
     ESP_LOGE(TAG, "Month must be between 1 and 12");
     this->month_.reset();
+    this->day_.reset();
   }
   if (this->day_.has_value()) {
     uint16_t year = 0;
diff --git a/esphome/components/datetime/datetime_base.h b/esphome/components/datetime/datetime_base.h
index 2f2d27e102..c8240390e3 100644
--- a/esphome/components/datetime/datetime_base.h
+++ b/esphome/components/datetime/datetime_base.h
@@ -5,6 +5,8 @@
 #include "esphome/core/entity_base.h"
 #include "esphome/core/time.h"
 
+#include "esphome/components/time/real_time_clock.h"
+
 namespace esphome {
 namespace datetime {
 
@@ -17,9 +19,14 @@ class DateTimeBase : public EntityBase {
 
   void add_on_state_callback(std::function<void()> &&callback) { this->state_callback_.add(std::move(callback)); }
 
+  void set_rtc(time::RealTimeClock *rtc) { this->rtc_ = rtc; }
+  time::RealTimeClock *get_rtc() const { return this->rtc_; }
+
  protected:
   CallbackManager<void()> state_callback_;
 
+  time::RealTimeClock *rtc_;
+
   bool has_state_{false};
 };
 
diff --git a/esphome/components/datetime/datetime_entity.cpp b/esphome/components/datetime/datetime_entity.cpp
new file mode 100644
index 0000000000..9a61d341e4
--- /dev/null
+++ b/esphome/components/datetime/datetime_entity.cpp
@@ -0,0 +1,252 @@
+#include "datetime_entity.h"
+
+#ifdef USE_DATETIME_DATETIME
+
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace datetime {
+
+static const char *const TAG = "datetime.datetime_entity";
+
+void DateTimeEntity::publish_state() {
+  if (this->year_ == 0 || this->month_ == 0 || this->day_ == 0) {
+    this->has_state_ = false;
+    return;
+  }
+  if (this->year_ < 1970 || this->year_ > 3000) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Year must be between 1970 and 3000");
+    return;
+  }
+  if (this->month_ < 1 || this->month_ > 12) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Month must be between 1 and 12");
+    return;
+  }
+  if (this->day_ > days_in_month(this->month_, this->year_)) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Day must be between 1 and %d for month %d", days_in_month(this->month_, this->year_), this->month_);
+    return;
+  }
+  if (this->hour_ > 23) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Hour must be between 0 and 23");
+    return;
+  }
+  if (this->minute_ > 59) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Minute must be between 0 and 59");
+    return;
+  }
+  if (this->second_ > 59) {
+    this->has_state_ = false;
+    ESP_LOGE(TAG, "Second must be between 0 and 59");
+    return;
+  }
+  this->has_state_ = true;
+  ESP_LOGD(TAG, "'%s': Sending datetime %04u-%02u-%02u %02d:%02d:%02d", this->get_name().c_str(), this->year_,
+           this->month_, this->day_, this->hour_, this->minute_, this->second_);
+  this->state_callback_.call();
+}
+
+DateTimeCall DateTimeEntity::make_call() { return DateTimeCall(this); }
+
+ESPTime DateTimeEntity::state_as_esptime() const {
+  ESPTime obj;
+  obj.year = this->year_;
+  obj.month = this->month_;
+  obj.day_of_month = this->day_;
+  obj.hour = this->hour_;
+  obj.minute = this->minute_;
+  obj.second = this->second_;
+  obj.day_of_week = 1;  // Required to be valid for recalc_timestamp_local but not used.
+  obj.day_of_year = 1;  // Required to be valid for recalc_timestamp_local but not used.
+  obj.recalc_timestamp_local(false);
+  return obj;
+}
+
+void DateTimeCall::validate_() {
+  if (this->year_.has_value() && (this->year_ < 1970 || this->year_ > 3000)) {
+    ESP_LOGE(TAG, "Year must be between 1970 and 3000");
+    this->year_.reset();
+    this->month_.reset();
+    this->day_.reset();
+  }
+  if (this->month_.has_value() && (this->month_ < 1 || this->month_ > 12)) {
+    ESP_LOGE(TAG, "Month must be between 1 and 12");
+    this->month_.reset();
+    this->day_.reset();
+  }
+  if (this->day_.has_value()) {
+    uint16_t year = 0;
+    uint8_t month = 0;
+    if (this->month_.has_value()) {
+      month = *this->month_;
+    } else {
+      if (this->parent_->month != 0) {
+        month = this->parent_->month;
+      } else {
+        ESP_LOGE(TAG, "Month must be set to validate day");
+        this->day_.reset();
+      }
+    }
+    if (this->year_.has_value()) {
+      year = *this->year_;
+    } else {
+      if (this->parent_->year != 0) {
+        year = this->parent_->year;
+      } else {
+        ESP_LOGE(TAG, "Year must be set to validate day");
+        this->day_.reset();
+      }
+    }
+    if (this->day_.has_value() && *this->day_ > days_in_month(month, year)) {
+      ESP_LOGE(TAG, "Day must be between 1 and %d for month %d", days_in_month(month, year), month);
+      this->day_.reset();
+    }
+  }
+
+  if (this->hour_.has_value() && this->hour_ > 23) {
+    ESP_LOGE(TAG, "Hour must be between 0 and 23");
+    this->hour_.reset();
+  }
+  if (this->minute_.has_value() && this->minute_ > 59) {
+    ESP_LOGE(TAG, "Minute must be between 0 and 59");
+    this->minute_.reset();
+  }
+  if (this->second_.has_value() && this->second_ > 59) {
+    ESP_LOGE(TAG, "Second must be between 0 and 59");
+    this->second_.reset();
+  }
+}
+
+void DateTimeCall::perform() {
+  this->validate_();
+  ESP_LOGD(TAG, "'%s' - Setting", this->parent_->get_name().c_str());
+
+  if (this->year_.has_value()) {
+    ESP_LOGD(TAG, " Year: %d", *this->year_);
+  }
+  if (this->month_.has_value()) {
+    ESP_LOGD(TAG, " Month: %d", *this->month_);
+  }
+  if (this->day_.has_value()) {
+    ESP_LOGD(TAG, " Day: %d", *this->day_);
+  }
+  if (this->hour_.has_value()) {
+    ESP_LOGD(TAG, " Hour: %d", *this->hour_);
+  }
+  if (this->minute_.has_value()) {
+    ESP_LOGD(TAG, " Minute: %d", *this->minute_);
+  }
+  if (this->second_.has_value()) {
+    ESP_LOGD(TAG, " Second: %d", *this->second_);
+  }
+  this->parent_->control(*this);
+}
+
+DateTimeCall &DateTimeCall::set_datetime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute,
+                                         uint8_t second) {
+  this->year_ = year;
+  this->month_ = month;
+  this->day_ = day;
+  this->hour_ = hour;
+  this->minute_ = minute;
+  this->second_ = second;
+  return *this;
+};
+
+DateTimeCall &DateTimeCall::set_datetime(ESPTime datetime) {
+  return this->set_datetime(datetime.year, datetime.month, datetime.day_of_month, datetime.hour, datetime.minute,
+                            datetime.second);
+};
+
+DateTimeCall &DateTimeCall::set_datetime(const std::string &datetime) {
+  ESPTime val{};
+  if (!ESPTime::strptime(datetime, val)) {
+    ESP_LOGE(TAG, "Could not convert the time string to an ESPTime object");
+    return *this;
+  }
+  return this->set_datetime(val);
+}
+
+DateTimeCall &DateTimeCall::set_datetime(time_t epoch_seconds) {
+  ESPTime val = ESPTime::from_epoch_local(epoch_seconds);
+  return this->set_datetime(val);
+}
+
+DateTimeCall DateTimeEntityRestoreState::to_call(DateTimeEntity *datetime) {
+  DateTimeCall call = datetime->make_call();
+  call.set_datetime(this->year, this->month, this->day, this->hour, this->minute, this->second);
+  return call;
+}
+
+void DateTimeEntityRestoreState::apply(DateTimeEntity *time) {
+  time->year_ = this->year;
+  time->month_ = this->month;
+  time->day_ = this->day;
+  time->hour_ = this->hour;
+  time->minute_ = this->minute;
+  time->second_ = this->second;
+  time->publish_state();
+}
+
+static const int MAX_TIMESTAMP_DRIFT = 900;  // how far can the clock drift before we consider
+                                             // there has been a drastic time synchronization
+
+void OnDateTimeTrigger::loop() {
+  if (!this->parent_->has_state()) {
+    return;
+  }
+  ESPTime time = this->parent_->rtc_->now();
+  if (!time.is_valid()) {
+    return;
+  }
+  if (this->last_check_.has_value()) {
+    if (*this->last_check_ > time && this->last_check_->timestamp - time.timestamp > MAX_TIMESTAMP_DRIFT) {
+      // We went back in time (a lot), probably caused by time synchronization
+      ESP_LOGW(TAG, "Time has jumped back!");
+    } else if (*this->last_check_ >= time) {
+      // already handled this one
+      return;
+    } else if (time > *this->last_check_ && time.timestamp - this->last_check_->timestamp > MAX_TIMESTAMP_DRIFT) {
+      // We went ahead in time (a lot), probably caused by time synchronization
+      ESP_LOGW(TAG, "Time has jumped ahead!");
+      this->last_check_ = time;
+      return;
+    }
+
+    while (true) {
+      this->last_check_->increment_second();
+      if (*this->last_check_ >= time)
+        break;
+
+      if (this->matches_(*this->last_check_)) {
+        this->trigger();
+        break;
+      }
+    }
+  }
+
+  this->last_check_ = time;
+  if (!time.fields_in_range()) {
+    ESP_LOGW(TAG, "Time is out of range!");
+    ESP_LOGD(TAG, "Second=%02u Minute=%02u Hour=%02u Day=%02u Month=%02u Year=%04u", time.second, time.minute,
+             time.hour, time.day_of_month, time.month, time.year);
+  }
+
+  if (this->matches_(time))
+    this->trigger();
+}
+
+bool OnDateTimeTrigger::matches_(const ESPTime &time) const {
+  return time.is_valid() && time.year == this->parent_->year && time.month == this->parent_->month &&
+         time.day_of_month == this->parent_->day && time.hour == this->parent_->hour &&
+         time.minute == this->parent_->minute && time.second == this->parent_->second;
+}
+
+}  // namespace datetime
+}  // namespace esphome
+
+#endif  // USE_DATETIME_TIME
diff --git a/esphome/components/datetime/datetime_entity.h b/esphome/components/datetime/datetime_entity.h
new file mode 100644
index 0000000000..d541fa96b1
--- /dev/null
+++ b/esphome/components/datetime/datetime_entity.h
@@ -0,0 +1,150 @@
+#pragma once
+
+#include "esphome/core/defines.h"
+
+#ifdef USE_DATETIME_DATETIME
+
+#include "esphome/core/automation.h"
+#include "esphome/core/helpers.h"
+#include "esphome/core/time.h"
+
+#include "datetime_base.h"
+
+namespace esphome {
+namespace datetime {
+
+#define LOG_DATETIME_DATETIME(prefix, type, obj) \
+  if ((obj) != nullptr) { \
+    ESP_LOGCONFIG(TAG, "%s%s '%s'", prefix, LOG_STR_LITERAL(type), (obj)->get_name().c_str()); \
+    if (!(obj)->get_icon().empty()) { \
+      ESP_LOGCONFIG(TAG, "%s  Icon: '%s'", prefix, (obj)->get_icon().c_str()); \
+    } \
+  }
+
+class DateTimeCall;
+class DateTimeEntity;
+
+struct DateTimeEntityRestoreState {
+  uint16_t year;
+  uint8_t month;
+  uint8_t day;
+  uint8_t hour;
+  uint8_t minute;
+  uint8_t second;
+
+  DateTimeCall to_call(DateTimeEntity *datetime);
+  void apply(DateTimeEntity *datetime);
+} __attribute__((packed));
+
+class DateTimeEntity : public DateTimeBase {
+ protected:
+  uint16_t year_;
+  uint8_t month_;
+  uint8_t day_;
+  uint8_t hour_;
+  uint8_t minute_;
+  uint8_t second_;
+
+ public:
+  void publish_state();
+  DateTimeCall make_call();
+
+  ESPTime state_as_esptime() const override;
+
+  const uint16_t &year = year_;
+  const uint8_t &month = month_;
+  const uint8_t &day = day_;
+  const uint8_t &hour = hour_;
+  const uint8_t &minute = minute_;
+  const uint8_t &second = second_;
+
+ protected:
+  friend class DateTimeCall;
+  friend struct DateTimeEntityRestoreState;
+  friend class OnDateTimeTrigger;
+
+  virtual void control(const DateTimeCall &call) = 0;
+};
+
+class DateTimeCall {
+ public:
+  explicit DateTimeCall(DateTimeEntity *parent) : parent_(parent) {}
+  void perform();
+  DateTimeCall &set_datetime(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second);
+  DateTimeCall &set_datetime(ESPTime datetime);
+  DateTimeCall &set_datetime(const std::string &datetime);
+  DateTimeCall &set_datetime(time_t epoch_seconds);
+
+  DateTimeCall &set_year(uint16_t year) {
+    this->year_ = year;
+    return *this;
+  }
+  DateTimeCall &set_month(uint8_t month) {
+    this->month_ = month;
+    return *this;
+  }
+  DateTimeCall &set_day(uint8_t day) {
+    this->day_ = day;
+    return *this;
+  }
+  DateTimeCall &set_hour(uint8_t hour) {
+    this->hour_ = hour;
+    return *this;
+  }
+  DateTimeCall &set_minute(uint8_t minute) {
+    this->minute_ = minute;
+    return *this;
+  }
+  DateTimeCall &set_second(uint8_t second) {
+    this->second_ = second;
+    return *this;
+  }
+
+  optional<uint16_t> get_year() const { return this->year_; }
+  optional<uint8_t> get_month() const { return this->month_; }
+  optional<uint8_t> get_day() const { return this->day_; }
+  optional<uint8_t> get_hour() const { return this->hour_; }
+  optional<uint8_t> get_minute() const { return this->minute_; }
+  optional<uint8_t> get_second() const { return this->second_; }
+
+ protected:
+  void validate_();
+
+  DateTimeEntity *parent_;
+
+  optional<uint16_t> year_;
+  optional<uint8_t> month_;
+  optional<uint8_t> day_;
+  optional<uint8_t> hour_;
+  optional<uint8_t> minute_;
+  optional<uint8_t> second_;
+};
+
+template<typename... Ts> class DateTimeSetAction : public Action<Ts...>, public Parented<DateTimeEntity> {
+ public:
+  TEMPLATABLE_VALUE(ESPTime, datetime)
+
+  void play(Ts... x) override {
+    auto call = this->parent_->make_call();
+
+    if (this->datetime_.has_value()) {
+      call.set_datetime(this->datetime_.value(x...));
+    }
+    call.perform();
+  }
+};
+
+class OnDateTimeTrigger : public Trigger<>, public Component, public Parented<DateTimeEntity> {
+ public:
+  void loop() override;
+
+ protected:
+  bool matches_(const ESPTime &time) const;
+
+  optional<ESPTime> last_check_;
+};
+
+}  // namespace datetime
+}  // namespace esphome
+
+#endif  // USE_DATETIME_DATETIME
diff --git a/esphome/components/datetime/time_entity.cpp b/esphome/components/datetime/time_entity.cpp
index 98558152d7..ea5e6684d0 100644
--- a/esphome/components/datetime/time_entity.cpp
+++ b/esphome/components/datetime/time_entity.cpp
@@ -94,8 +94,6 @@ void TimeEntityRestoreState::apply(TimeEntity *time) {
   time->publish_state();
 }
 
-#ifdef USE_TIME
-
 static const int MAX_TIMESTAMP_DRIFT = 900;  // how far can the clock drift before we consider
                                              // there has been a drastic time synchronization
 
@@ -103,7 +101,7 @@ void OnTimeTrigger::loop() {
   if (!this->parent_->has_state()) {
     return;
   }
-  ESPTime time = this->rtc_->now();
+  ESPTime time = this->parent_->rtc_->now();
   if (!time.is_valid()) {
     return;
   }
@@ -148,8 +146,6 @@ bool OnTimeTrigger::matches_(const ESPTime &time) const {
          time.second == this->parent_->second;
 }
 
-#endif
-
 }  // namespace datetime
 }  // namespace esphome
 
diff --git a/esphome/components/datetime/time_entity.h b/esphome/components/datetime/time_entity.h
index 956c09e2b4..62e593d28a 100644
--- a/esphome/components/datetime/time_entity.h
+++ b/esphome/components/datetime/time_entity.h
@@ -10,10 +10,6 @@
 
 #include "datetime_base.h"
 
-#ifdef USE_TIME
-#include "esphome/components/time/real_time_clock.h"
-#endif
-
 namespace esphome {
 namespace datetime {
 
@@ -27,6 +23,7 @@ namespace datetime {
 
 class TimeCall;
 class TimeEntity;
+class OnTimeTrigger;
 
 struct TimeEntityRestoreState {
   uint8_t hour;
@@ -62,6 +59,7 @@ class TimeEntity : public DateTimeBase {
  protected:
   friend class TimeCall;
   friend struct TimeEntityRestoreState;
+  friend class OnTimeTrigger;
 
   virtual void control(const TimeCall &call) = 0;
 };
@@ -115,22 +113,16 @@ template<typename... Ts> class TimeSetAction : public Action<Ts...>, public Pare
   }
 };
 
-#ifdef USE_TIME
-
 class OnTimeTrigger : public Trigger<>, public Component, public Parented<TimeEntity> {
  public:
-  explicit OnTimeTrigger(time::RealTimeClock *rtc) : rtc_(rtc) {}
   void loop() override;
 
  protected:
   bool matches_(const ESPTime &time) const;
 
-  time::RealTimeClock *rtc_;
   optional<ESPTime> last_check_;
 };
 
-#endif
-
 }  // namespace datetime
 }  // namespace esphome
 
diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py
index 7a42140ef6..064362c619 100644
--- a/esphome/components/mqtt/__init__.py
+++ b/esphome/components/mqtt/__init__.py
@@ -115,6 +115,7 @@ MQTTTextSensor = mqtt_ns.class_("MQTTTextSensor", MQTTComponent)
 MQTTNumberComponent = mqtt_ns.class_("MQTTNumberComponent", MQTTComponent)
 MQTTDateComponent = mqtt_ns.class_("MQTTDateComponent", MQTTComponent)
 MQTTTimeComponent = mqtt_ns.class_("MQTTTimeComponent", MQTTComponent)
+MQTTDateTimeComponent = mqtt_ns.class_("MQTTDateTimeComponent", MQTTComponent)
 MQTTTextComponent = mqtt_ns.class_("MQTTTextComponent", MQTTComponent)
 MQTTSelectComponent = mqtt_ns.class_("MQTTSelectComponent", MQTTComponent)
 MQTTButtonComponent = mqtt_ns.class_("MQTTButtonComponent", MQTTComponent)
diff --git a/esphome/components/mqtt/mqtt_datetime.cpp b/esphome/components/mqtt/mqtt_datetime.cpp
new file mode 100644
index 0000000000..4fa44aafb8
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_datetime.cpp
@@ -0,0 +1,84 @@
+#include "mqtt_datetime.h"
+
+#include <utility>
+#include "esphome/core/log.h"
+
+#include "mqtt_const.h"
+
+#ifdef USE_MQTT
+#ifdef USE_DATETIME_TIME
+
+namespace esphome {
+namespace mqtt {
+
+static const char *const TAG = "mqtt.datetime.time";
+
+using namespace esphome::datetime;
+
+MQTTDateTimeComponent::MQTTDateTimeComponent(DateTimeEntity *datetime) : datetime_(datetime) {}
+
+void MQTTDateTimeComponent::setup() {
+  this->subscribe_json(this->get_command_topic_(), [this](const std::string &topic, JsonObject root) {
+    auto call = this->datetime_->make_call();
+    if (root.containsKey("year")) {
+      call.set_year(root["year"]);
+    }
+    if (root.containsKey("month")) {
+      call.set_month(root["month"]);
+    }
+    if (root.containsKey("day")) {
+      call.set_day(root["day"]);
+    }
+    if (root.containsKey("hour")) {
+      call.set_hour(root["hour"]);
+    }
+    if (root.containsKey("minute")) {
+      call.set_minute(root["minute"]);
+    }
+    if (root.containsKey("second")) {
+      call.set_second(root["second"]);
+    }
+    call.perform();
+  });
+  this->datetime_->add_on_state_callback([this]() {
+    this->publish_state(this->datetime_->year, this->datetime_->month, this->datetime_->day, this->datetime_->hour,
+                        this->datetime_->minute, this->datetime_->second);
+  });
+}
+
+void MQTTDateTimeComponent::dump_config() {
+  ESP_LOGCONFIG(TAG, "MQTT DateTime '%s':", this->datetime_->get_name().c_str());
+  LOG_MQTT_COMPONENT(true, true)
+}
+
+std::string MQTTDateTimeComponent::component_type() const { return "datetime"; }
+const EntityBase *MQTTDateTimeComponent::get_entity() const { return this->datetime_; }
+
+void MQTTDateTimeComponent::send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) {
+  // Nothing extra to add here
+}
+bool MQTTDateTimeComponent::send_initial_state() {
+  if (this->datetime_->has_state()) {
+    return this->publish_state(this->datetime_->year, this->datetime_->month, this->datetime_->day,
+                               this->datetime_->hour, this->datetime_->minute, this->datetime_->second);
+  } else {
+    return true;
+  }
+}
+bool MQTTDateTimeComponent::publish_state(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute,
+                                          uint8_t second) {
+  return this->publish_json(this->get_state_topic_(), [year, month, day, hour, minute, second](JsonObject root) {
+    root["year"] = year;
+    root["month"] = month;
+    root["day"] = day;
+    root["hour"] = hour;
+    root["minute"] = minute;
+    root["second"] = second;
+  });
+}
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif  // USE_DATETIME_TIME
+#endif  // USE_MQTT
diff --git a/esphome/components/mqtt/mqtt_datetime.h b/esphome/components/mqtt/mqtt_datetime.h
new file mode 100644
index 0000000000..f0d68ad2e1
--- /dev/null
+++ b/esphome/components/mqtt/mqtt_datetime.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "esphome/core/defines.h"
+
+#ifdef USE_MQTT
+#ifdef USE_DATETIME_TIME
+
+#include "esphome/components/datetime/datetime_entity.h"
+#include "mqtt_component.h"
+
+namespace esphome {
+namespace mqtt {
+
+class MQTTDateTimeComponent : public mqtt::MQTTComponent {
+ public:
+  /** Construct this MQTTDateTimeComponent instance with the provided friendly_name and time
+   *
+   * @param time The time entity.
+   */
+  explicit MQTTDateTimeComponent(datetime::DateTimeEntity *time);
+
+  // ========== INTERNAL METHODS ==========
+  // (In most use cases you won't need these)
+  /// Override setup.
+  void setup() override;
+  void dump_config() override;
+
+  void send_discovery(JsonObject root, mqtt::SendDiscoveryConfig &config) override;
+
+  bool send_initial_state() override;
+
+  bool publish_state(uint16_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second);
+
+ protected:
+  std::string component_type() const override;
+  const EntityBase *get_entity() const override;
+
+  datetime::DateTimeEntity *datetime_;
+};
+
+}  // namespace mqtt
+}  // namespace esphome
+
+#endif  // USE_DATETIME_DATE
+#endif  // USE_MQTT
diff --git a/esphome/components/template/datetime/__init__.py b/esphome/components/template/datetime/__init__.py
index 53d9d1b9d3..bf7154ef76 100644
--- a/esphome/components/template/datetime/__init__.py
+++ b/esphome/components/template/datetime/__init__.py
@@ -31,6 +31,10 @@ TemplateTime = template_ns.class_(
     "TemplateTime", datetime.TimeEntity, cg.PollingComponent
 )
 
+TemplateDateTime = template_ns.class_(
+    "TemplateDateTime", datetime.DateTimeEntity, cg.PollingComponent
+)
+
 
 def validate(config):
     config = config.copy()
@@ -78,6 +82,13 @@ CONFIG_SCHEMA = cv.All(
                     cv.Optional(CONF_INITIAL_VALUE): cv.date_time(allowed_date=False),
                 }
             ),
+            "DATETIME": datetime.datetime_schema(TemplateDateTime)
+            .extend(_BASE_SCHEMA)
+            .extend(
+                {
+                    cv.Optional(CONF_INITIAL_VALUE): cv.date_time(),
+                }
+            ),
         },
         upper=True,
     ),
@@ -116,6 +127,17 @@ async def to_code(config):
                     ("hour", initial_value[CONF_HOUR]),
                 )
                 cg.add(var.set_initial_value(time_struct))
+            elif config[CONF_TYPE] == "DATETIME":
+                datetime_struct = cg.StructInitializer(
+                    cg.ESPTime,
+                    ("second", initial_value[CONF_SECOND]),
+                    ("minute", initial_value[CONF_MINUTE]),
+                    ("hour", initial_value[CONF_HOUR]),
+                    ("day_of_month", initial_value[CONF_DAY]),
+                    ("month", initial_value[CONF_MONTH]),
+                    ("year", initial_value[CONF_YEAR]),
+                )
+                cg.add(var.set_initial_value(datetime_struct))
 
     if CONF_SET_ACTION in config:
         await automation.build_automation(
diff --git a/esphome/components/template/datetime/template_datetime.cpp b/esphome/components/template/datetime/template_datetime.cpp
new file mode 100644
index 0000000000..3ab74e197f
--- /dev/null
+++ b/esphome/components/template/datetime/template_datetime.cpp
@@ -0,0 +1,150 @@
+#include "template_datetime.h"
+
+#ifdef USE_DATETIME_DATETIME
+
+#include "esphome/core/log.h"
+
+namespace esphome {
+namespace template_ {
+
+static const char *const TAG = "template.datetime";
+
+void TemplateDateTime::setup() {
+  if (this->f_.has_value())
+    return;
+
+  ESPTime state{};
+
+  if (!this->restore_value_) {
+    state = this->initial_value_;
+  } else {
+    datetime::DateTimeEntityRestoreState temp;
+    this->pref_ = global_preferences->make_preference<datetime::DateTimeEntityRestoreState>(194434090U ^
+                                                                                            this->get_object_id_hash());
+    if (this->pref_.load(&temp)) {
+      temp.apply(this);
+      return;
+    } else {
+      // set to inital value if loading from pref failed
+      state = this->initial_value_;
+    }
+  }
+
+  this->year_ = state.year;
+  this->month_ = state.month;
+  this->day_ = state.day_of_month;
+  this->hour_ = state.hour;
+  this->minute_ = state.minute;
+  this->second_ = state.second;
+  this->publish_state();
+}
+
+void TemplateDateTime::update() {
+  if (!this->f_.has_value())
+    return;
+
+  auto val = (*this->f_)();
+  if (!val.has_value())
+    return;
+
+  this->year_ = val->year;
+  this->month_ = val->month;
+  this->day_ = val->day_of_month;
+  this->hour_ = val->hour;
+  this->minute_ = val->minute;
+  this->second_ = val->second;
+  this->publish_state();
+}
+
+void TemplateDateTime::control(const datetime::DateTimeCall &call) {
+  bool has_year = call.get_year().has_value();
+  bool has_month = call.get_month().has_value();
+  bool has_day = call.get_day().has_value();
+  bool has_hour = call.get_hour().has_value();
+  bool has_minute = call.get_minute().has_value();
+  bool has_second = call.get_second().has_value();
+
+  ESPTime value = {};
+  if (has_year)
+    value.year = *call.get_year();
+
+  if (has_month)
+    value.month = *call.get_month();
+
+  if (has_day)
+    value.day_of_month = *call.get_day();
+
+  if (has_hour)
+    value.hour = *call.get_hour();
+
+  if (has_minute)
+    value.minute = *call.get_minute();
+
+  if (has_second)
+    value.second = *call.get_second();
+
+  this->set_trigger_->trigger(value);
+
+  if (this->optimistic_) {
+    if (has_year)
+      this->year_ = *call.get_year();
+    if (has_month)
+      this->month_ = *call.get_month();
+    if (has_day)
+      this->day_ = *call.get_day();
+    if (has_hour)
+      this->hour_ = *call.get_hour();
+    if (has_minute)
+      this->minute_ = *call.get_minute();
+    if (has_second)
+      this->second_ = *call.get_second();
+    this->publish_state();
+  }
+
+  if (this->restore_value_) {
+    datetime::DateTimeEntityRestoreState temp = {};
+    if (has_year) {
+      temp.year = *call.get_year();
+    } else {
+      temp.year = this->year_;
+    }
+    if (has_month) {
+      temp.month = *call.get_month();
+    } else {
+      temp.month = this->month_;
+    }
+    if (has_day) {
+      temp.day = *call.get_day();
+    } else {
+      temp.day = this->day_;
+    }
+    if (has_hour) {
+      temp.hour = *call.get_hour();
+    } else {
+      temp.hour = this->hour_;
+    }
+    if (has_minute) {
+      temp.minute = *call.get_minute();
+    } else {
+      temp.minute = this->minute_;
+    }
+    if (has_second) {
+      temp.second = *call.get_second();
+    } else {
+      temp.second = this->second_;
+    }
+
+    this->pref_.save(&temp);
+  }
+}
+
+void TemplateDateTime::dump_config() {
+  LOG_DATETIME_DATETIME("", "Template DateTime", this);
+  ESP_LOGCONFIG(TAG, "  Optimistic: %s", YESNO(this->optimistic_));
+  LOG_UPDATE_INTERVAL(this);
+}
+
+}  // namespace template_
+}  // namespace esphome
+
+#endif  // USE_DATETIME_DATETIME
diff --git a/esphome/components/template/datetime/template_datetime.h b/esphome/components/template/datetime/template_datetime.h
new file mode 100644
index 0000000000..cb1fd01132
--- /dev/null
+++ b/esphome/components/template/datetime/template_datetime.h
@@ -0,0 +1,46 @@
+#pragma once
+
+#include "esphome/core/defines.h"
+
+#ifdef USE_DATETIME_TIME
+
+#include "esphome/components/datetime/datetime_entity.h"
+#include "esphome/core/automation.h"
+#include "esphome/core/component.h"
+#include "esphome/core/preferences.h"
+#include "esphome/core/time.h"
+
+namespace esphome {
+namespace template_ {
+
+class TemplateDateTime : public datetime::DateTimeEntity, public PollingComponent {
+ public:
+  void set_template(std::function<optional<ESPTime>()> &&f) { this->f_ = f; }
+
+  void setup() override;
+  void update() override;
+  void dump_config() override;
+  float get_setup_priority() const override { return setup_priority::HARDWARE; }
+
+  Trigger<ESPTime> *get_set_trigger() const { return this->set_trigger_; }
+  void set_optimistic(bool optimistic) { this->optimistic_ = optimistic; }
+
+  void set_initial_value(ESPTime initial_value) { this->initial_value_ = initial_value; }
+  void set_restore_value(bool restore_value) { this->restore_value_ = restore_value; }
+
+ protected:
+  void control(const datetime::DateTimeCall &call) override;
+
+  bool optimistic_{false};
+  ESPTime initial_value_{};
+  bool restore_value_{false};
+  Trigger<ESPTime> *set_trigger_ = new Trigger<ESPTime>();
+  optional<std::function<optional<ESPTime>()>> f_;
+
+  ESPPreferenceObject pref_;
+};
+
+}  // namespace template_
+}  // namespace esphome
+
+#endif  // USE_DATETIME_TIME
diff --git a/esphome/components/time/real_time_clock.cpp b/esphome/components/time/real_time_clock.cpp
index 9b903d098b..2b9a95c6bd 100644
--- a/esphome/components/time/real_time_clock.cpp
+++ b/esphome/components/time/real_time_clock.cpp
@@ -13,6 +13,8 @@
 #endif
 #include <cerrno>
 
+#include <cinttypes>
+
 namespace esphome {
 namespace time {
 
diff --git a/esphome/components/web_server/list_entities.cpp b/esphome/components/web_server/list_entities.cpp
index 8d08783c8c..42af72e872 100644
--- a/esphome/components/web_server/list_entities.cpp
+++ b/esphome/components/web_server/list_entities.cpp
@@ -129,6 +129,15 @@ bool ListEntitiesIterator::on_time(datetime::TimeEntity *time) {
 }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+bool ListEntitiesIterator::on_datetime(datetime::DateTimeEntity *datetime) {
+  if (this->web_server_->events_.count() == 0)
+    return true;
+  this->web_server_->events_.send(this->web_server_->datetime_json(datetime, DETAIL_ALL).c_str(), "state");
+  return true;
+}
+#endif
+
 #ifdef USE_TEXT
 bool ListEntitiesIterator::on_text(text::Text *text) {
   if (this->web_server_->events_.count() == 0)
diff --git a/esphome/components/web_server/list_entities.h b/esphome/components/web_server/list_entities.h
index af84cb1d2b..47d427d9b5 100644
--- a/esphome/components/web_server/list_entities.h
+++ b/esphome/components/web_server/list_entities.h
@@ -47,6 +47,9 @@ class ListEntitiesIterator : public ComponentIterator {
 #ifdef USE_DATETIME_TIME
   bool on_time(datetime::TimeEntity *time) override;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  bool on_datetime(datetime::DateTimeEntity *datetime) override;
+#endif
 #ifdef USE_TEXT
   bool on_text(text::Text *text) override;
 #endif
diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp
index 0202038ffc..6a7b4121f0 100644
--- a/esphome/components/web_server/web_server.cpp
+++ b/esphome/components/web_server/web_server.cpp
@@ -926,6 +926,8 @@ std::string WebServer::date_json(datetime::DateEntity *obj, JsonDetail start_con
 
 #ifdef USE_DATETIME_TIME
 void WebServer::on_time_update(datetime::TimeEntity *obj) {
+  if (this->events_.count() == 0)
+    return;
   this->events_.send(this->time_json(obj, DETAIL_STATE).c_str(), "state");
 }
 void WebServer::handle_time_request(AsyncWebServerRequest *request, const UrlMatch &match) {
@@ -970,6 +972,55 @@ std::string WebServer::time_json(datetime::TimeEntity *obj, JsonDetail start_con
 }
 #endif  // USE_DATETIME_TIME
 
+#ifdef USE_DATETIME_DATETIME
+void WebServer::on_datetime_update(datetime::DateTimeEntity *obj) {
+  if (this->events_.count() == 0)
+    return;
+  this->events_.send(this->datetime_json(obj, DETAIL_STATE).c_str(), "state");
+}
+void WebServer::handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match) {
+  for (auto *obj : App.get_datetimes()) {
+    if (obj->get_object_id() != match.id)
+      continue;
+    if (request->method() == HTTP_GET && match.method.empty()) {
+      std::string data = this->datetime_json(obj, DETAIL_STATE);
+      request->send(200, "application/json", data.c_str());
+      return;
+    }
+    if (match.method != "set") {
+      request->send(404);
+      return;
+    }
+
+    auto call = obj->make_call();
+
+    if (!request->hasParam("value")) {
+      request->send(409);
+      return;
+    }
+
+    if (request->hasParam("value")) {
+      std::string value = request->getParam("value")->value().c_str();
+      call.set_datetime(value);
+    }
+
+    this->schedule_([call]() mutable { call.perform(); });
+    request->send(200);
+    return;
+  }
+  request->send(404);
+}
+std::string WebServer::datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config) {
+  return json::build_json([obj, start_config](JsonObject root) {
+    set_json_id(root, obj, "datetime-" + obj->get_object_id(), start_config);
+    std::string value = str_sprintf("%d-%02d-%02d %02d:%02d:%02d", obj->year, obj->month, obj->day, obj->hour,
+                                    obj->minute, obj->second);
+    root["value"] = value;
+    root["state"] = value;
+  });
+}
+#endif  // USE_DATETIME_DATETIME
+
 #ifdef USE_TEXT
 void WebServer::on_text_update(text::Text *obj, const std::string &state) {
   if (this->events_.count() == 0)
@@ -1458,6 +1509,11 @@ bool WebServer::canHandle(AsyncWebServerRequest *request) {
     return true;
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+  if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "datetime")
+    return true;
+#endif
+
 #ifdef USE_TEXT
   if ((request->method() == HTTP_POST || request->method() == HTTP_GET) && match.domain == "text")
     return true;
@@ -1595,6 +1651,13 @@ void WebServer::handleRequest(AsyncWebServerRequest *request) {
   }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+  if (match.domain == "datetime") {
+    this->handle_datetime_request(request, match);
+    return;
+  }
+#endif
+
 #ifdef USE_TEXT
   if (match.domain == "text") {
     this->handle_text_request(request, match);
diff --git a/esphome/components/web_server/web_server.h b/esphome/components/web_server/web_server.h
index 5e8f3f8236..dda14a7e05 100644
--- a/esphome/components/web_server/web_server.h
+++ b/esphome/components/web_server/web_server.h
@@ -239,6 +239,15 @@ class WebServer : public Controller, public Component, public AsyncWebHandler {
   std::string time_json(datetime::TimeEntity *obj, JsonDetail start_config);
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+  void on_datetime_update(datetime::DateTimeEntity *obj) override;
+  /// Handle a datetime request under '/datetime/<id>'.
+  void handle_datetime_request(AsyncWebServerRequest *request, const UrlMatch &match);
+
+  /// Dump the datetime state with its value as a JSON string.
+  std::string datetime_json(datetime::DateTimeEntity *obj, JsonDetail start_config);
+#endif
+
 #ifdef USE_TEXT
   void on_text_update(text::Text *obj, const std::string &state) override;
   /// Handle a text input request under '/text/<id>'.
diff --git a/esphome/const.py b/esphome/const.py
index a64bc73f59..324b32e847 100644
--- a/esphome/const.py
+++ b/esphome/const.py
@@ -179,6 +179,7 @@ CONF_DATA_PINS = "data_pins"
 CONF_DATA_RATE = "data_rate"
 CONF_DATA_TEMPLATE = "data_template"
 CONF_DATE = "date"
+CONF_DATETIME = "datetime"
 CONF_DAY = "day"
 CONF_DAYS_OF_MONTH = "days_of_month"
 CONF_DAYS_OF_WEEK = "days_of_week"
diff --git a/esphome/core/application.h b/esphome/core/application.h
index 35df350ec3..7487780412 100644
--- a/esphome/core/application.h
+++ b/esphome/core/application.h
@@ -45,6 +45,9 @@
 #ifdef USE_DATETIME_TIME
 #include "esphome/components/datetime/time_entity.h"
 #endif
+#ifdef USE_DATETIME_DATETIME
+#include "esphome/components/datetime/datetime_entity.h"
+#endif
 #ifdef USE_TEXT
 #include "esphome/components/text/text.h"
 #endif
@@ -141,6 +144,10 @@ class Application {
   void register_time(datetime::TimeEntity *time) { this->times_.push_back(time); }
 #endif
 
+#ifdef USE_DATETIME_DATETIME
+  void register_datetime(datetime::DateTimeEntity *datetime) { this->datetimes_.push_back(datetime); }
+#endif
+
 #ifdef USE_TEXT
   void register_text(text::Text *text) { this->texts_.push_back(text); }
 #endif
@@ -335,6 +342,15 @@ class Application {
     return nullptr;
   }
 #endif
+#ifdef USE_DATETIME_DATETIME
+  const std::vector<datetime::DateTimeEntity *> &get_datetimes() { return this->datetimes_; }
+  datetime::DateTimeEntity *get_datetime_by_key(uint32_t key, bool include_internal = false) {
+    for (auto *obj : this->datetimes_)
+      if (obj->get_object_id_hash() == key && (include_internal || !obj->is_internal()))
+        return obj;
+    return nullptr;
+  }
+#endif
 #ifdef USE_TEXT
   const std::vector<text::Text *> &get_texts() { return this->texts_; }
   text::Text *get_text_by_key(uint32_t key, bool include_internal = false) {
@@ -456,6 +472,9 @@ class Application {
 #ifdef USE_DATETIME_TIME
   std::vector<datetime::TimeEntity *> times_{};
 #endif
+#ifdef USE_DATETIME_DATETIME
+  std::vector<datetime::DateTimeEntity *> datetimes_{};
+#endif
 #ifdef USE_SELECT
   std::vector<select::Select *> selects_{};
 #endif
diff --git a/esphome/core/component_iterator.cpp b/esphome/core/component_iterator.cpp
index 687f1f6e23..9b02bf527b 100644
--- a/esphome/core/component_iterator.cpp
+++ b/esphome/core/component_iterator.cpp
@@ -232,6 +232,21 @@ void ComponentIterator::advance() {
       }
       break;
 #endif
+#ifdef USE_DATETIME_DATETIME
+    case IteratorState::DATETIME_DATETIME:
+      if (this->at_ >= App.get_datetimes().size()) {
+        advance_platform = true;
+      } else {
+        auto *datetime = App.get_datetimes()[this->at_];
+        if (datetime->is_internal() && !this->include_internal_) {
+          success = true;
+          break;
+        } else {
+          success = this->on_datetime(datetime);
+        }
+      }
+      break;
+#endif
 #ifdef USE_TEXT
     case IteratorState::TEXT:
       if (this->at_ >= App.get_texts().size()) {
diff --git a/esphome/core/component_iterator.h b/esphome/core/component_iterator.h
index 8f0398cbb3..2b847bc088 100644
--- a/esphome/core/component_iterator.h
+++ b/esphome/core/component_iterator.h
@@ -63,6 +63,9 @@ class ComponentIterator {
 #ifdef USE_DATETIME_TIME
   virtual bool on_time(datetime::TimeEntity *time) = 0;
 #endif
+#ifdef USE_DATETIME_DATETIME
+  virtual bool on_datetime(datetime::DateTimeEntity *datetime) = 0;
+#endif
 #ifdef USE_TEXT
   virtual bool on_text(text::Text *text) = 0;
 #endif
@@ -132,6 +135,9 @@ class ComponentIterator {
 #ifdef USE_DATETIME_TIME
     DATETIME_TIME,
 #endif
+#ifdef USE_DATETIME_DATETIME
+    DATETIME_DATETIME,
+#endif
 #ifdef USE_TEXT
     TEXT,
 #endif
diff --git a/esphome/core/controller.cpp b/esphome/core/controller.cpp
index eb975eaf6f..0957329500 100644
--- a/esphome/core/controller.cpp
+++ b/esphome/core/controller.cpp
@@ -71,6 +71,12 @@ void Controller::setup_controller(bool include_internal) {
       obj->add_on_state_callback([this, obj]() { this->on_time_update(obj); });
   }
 #endif
+#ifdef USE_DATETIME_DATETIME
+  for (auto *obj : App.get_datetimes()) {
+    if (include_internal || !obj->is_internal())
+      obj->add_on_state_callback([this, obj]() { this->on_datetime_update(obj); });
+  }
+#endif
 #ifdef USE_TEXT
   for (auto *obj : App.get_texts()) {
     if (include_internal || !obj->is_internal())
diff --git a/esphome/core/controller.h b/esphome/core/controller.h
index da9dbc00a6..e1bf93193a 100644
--- a/esphome/core/controller.h
+++ b/esphome/core/controller.h
@@ -37,6 +37,9 @@
 #ifdef USE_DATETIME_TIME
 #include "esphome/components/datetime/time_entity.h"
 #endif
+#ifdef USE_DATETIME_DATETIME
+#include "esphome/components/datetime/datetime_entity.h"
+#endif
 #ifdef USE_TEXT
 #include "esphome/components/text/text.h"
 #endif
@@ -97,6 +100,9 @@ class Controller {
 #ifdef USE_DATETIME_TIME
   virtual void on_time_update(datetime::TimeEntity *obj){};
 #endif
+#ifdef USE_DATETIME_DATETIME
+  virtual void on_datetime_update(datetime::DateTimeEntity *obj){};
+#endif
 #ifdef USE_TEXT
   virtual void on_text_update(text::Text *obj, const std::string &state){};
 #endif
diff --git a/esphome/core/defines.h b/esphome/core/defines.h
index fed73098d2..619a956071 100644
--- a/esphome/core/defines.h
+++ b/esphome/core/defines.h
@@ -39,6 +39,7 @@
 #define USE_DATETIME
 #define USE_DATETIME_DATE
 #define USE_DATETIME_TIME
+#define USE_DATETIME_DATETIME
 #define USE_OTA
 #define USE_OTA_PASSWORD
 #define USE_OTA_STATE_CALLBACK
diff --git a/esphome/core/time.cpp b/esphome/core/time.cpp
index 0004fc7e8e..add671701f 100644
--- a/esphome/core/time.cpp
+++ b/esphome/core/time.cpp
@@ -178,6 +178,15 @@ void ESPTime::recalc_timestamp_utc(bool use_day_of_year) {
   this->timestamp = res;
 }
 
+void ESPTime::recalc_timestamp_local(bool use_day_of_year) {
+  this->recalc_timestamp_utc(use_day_of_year);
+  this->timestamp -= ESPTime::timezone_offset();
+  ESPTime temp = ESPTime::from_epoch_local(this->timestamp);
+  if (temp.is_dst) {
+    this->timestamp -= 3600;
+  }
+}
+
 int32_t ESPTime::timezone_offset() {
   int32_t offset = 0;
   time_t now = ::time(nullptr);
diff --git a/esphome/core/time.h b/esphome/core/time.h
index 4300cf26b7..bce1108d93 100644
--- a/esphome/core/time.h
+++ b/esphome/core/time.h
@@ -99,6 +99,9 @@ struct ESPTime {
   /// Recalculate the timestamp field from the other fields of this ESPTime instance (must be UTC).
   void recalc_timestamp_utc(bool use_day_of_year = true);
 
+  /// Recalculate the timestamp field from the other fields of this ESPTime instance assuming local fields.
+  void recalc_timestamp_local(bool use_day_of_year = true);
+
   /// Convert this ESPTime instance back to a tm struct.
   struct tm to_c_tm();
 
diff --git a/script/ci-custom.py b/script/ci-custom.py
index 27fcd480f5..abe004dba3 100755
--- a/script/ci-custom.py
+++ b/script/ci-custom.py
@@ -623,6 +623,7 @@ def lint_trailing_whitespace(fname, match):
         "esphome/components/cover/cover.h",
         "esphome/components/datetime/date_entity.h",
         "esphome/components/datetime/time_entity.h",
+        "esphome/components/datetime/datetime_entity.h",
         "esphome/components/display/display.h",
         "esphome/components/event/event.h",
         "esphome/components/fan/fan.h",
diff --git a/tests/components/datetime/test.all.yaml b/tests/components/datetime/test.all.yaml
index 3f5996bb8b..4e26b68121 100644
--- a/tests/components/datetime/test.all.yaml
+++ b/tests/components/datetime/test.all.yaml
@@ -1 +1,3 @@
 datetime:
+
+time:
diff --git a/tests/components/template/test.all.yaml b/tests/components/template/common.yaml
similarity index 88%
rename from tests/components/template/test.all.yaml
rename to tests/components/template/common.yaml
index 64faec36c2..ba7167157b 100644
--- a/tests/components/template/test.all.yaml
+++ b/tests/components/template/common.yaml
@@ -183,3 +183,25 @@ datetime:
             - x.hour
             - x.minute
             - x.second
+  - platform: template
+    name: DateTime
+    id: test_datetime
+    type: datetime
+    set_action:
+      - logger.log: "set_value"
+    on_value:
+      - logger.log:
+          format: "DateTime: %04d-%02d-%02d %02d:%02d:%02d"
+          args:
+            - x.year
+            - x.month
+            - x.day_of_month
+            - x.hour
+            - x.minute
+            - x.second
+
+time:
+  - platform: sntp  # Required for datetime
+
+wifi:  # Required for sntp time
+  ap:
diff --git a/tests/components/template/test.bk72xx.yaml b/tests/components/template/test.bk72xx.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.bk72xx.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp32-c3-idf.yaml b/tests/components/template/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp32-c3-idf.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp32-c3.yaml b/tests/components/template/test.esp32-c3.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp32-c3.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp32-idf.yaml b/tests/components/template/test.esp32-idf.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp32-idf.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp32-s3-idf.yaml b/tests/components/template/test.esp32-s3-idf.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp32-s3-idf.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp32.yaml b/tests/components/template/test.esp32.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp32.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.esp8266.yaml b/tests/components/template/test.esp8266.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.esp8266.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/template/test.rp2040.yaml b/tests/components/template/test.rp2040.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/template/test.rp2040.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml

From 8fcfcccbc3f3bb5edb4706a6c4b55a677a5dda99 Mon Sep 17 00:00:00 2001
From: Anton Viktorov <anton.viktorov@live.com>
Date: Thu, 25 Apr 2024 23:20:21 +0200
Subject: [PATCH 52/81] Multiple Daly-BMS support (#6615)

---
 esphome/components/daly_bms/__init__.py | 1 +
 1 file changed, 1 insertion(+)

diff --git a/esphome/components/daly_bms/__init__.py b/esphome/components/daly_bms/__init__.py
index 2cc2c512f3..669d40a68d 100644
--- a/esphome/components/daly_bms/__init__.py
+++ b/esphome/components/daly_bms/__init__.py
@@ -4,6 +4,7 @@ from esphome.components import uart
 from esphome.const import CONF_ID, CONF_ADDRESS
 
 CODEOWNERS = ["@s1lvi0"]
+MULTI_CONF = True
 DEPENDENCIES = ["uart"]
 
 CONF_BMS_DALY_ID = "bms_daly_id"

From 3997503071bae2f208f761f668036f3cc8e62452 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Thu, 25 Apr 2024 18:03:24 -0500
Subject: [PATCH 53/81] Remove text_sensor from sync-device-class job (#6637)

---
 script/sync-device_class.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/script/sync-device_class.py b/script/sync-device_class.py
index 26d271535f..12e1bb6a9f 100755
--- a/script/sync-device_class.py
+++ b/script/sync-device_class.py
@@ -10,7 +10,6 @@ from homeassistant.components.event import EventDeviceClass
 from homeassistant.components.number import NumberDeviceClass
 from homeassistant.components.sensor import SensorDeviceClass
 from homeassistant.components.switch import SwitchDeviceClass
-from homeassistant.components.text_sensor import TextSensorDeviceClass
 from homeassistant.components.valve import ValveDeviceClass
 
 # pylint: enable=import-error
@@ -28,7 +27,6 @@ DOMAINS = {
     "number": NumberDeviceClass,
     "sensor": SensorDeviceClass,
     "switch": SwitchDeviceClass,
-    "text_sensor": TextSensorDeviceClass,
     "valve": ValveDeviceClass,
 }
 

From 3ecb5fa57f71c199ffd18c017ea3ebda6e05da58 Mon Sep 17 00:00:00 2001
From: esphomebot <esphome@nabucasa.com>
Date: Fri, 26 Apr 2024 11:40:19 +1200
Subject: [PATCH 54/81] Synchronise Device Classes from Home Assistant (#6638)

---
 esphome/components/event/__init__.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/esphome/components/event/__init__.py b/esphome/components/event/__init__.py
index 789f121cf3..241e884386 100644
--- a/esphome/components/event/__init__.py
+++ b/esphome/components/event/__init__.py
@@ -25,8 +25,8 @@ IS_PLATFORM_COMPONENT = True
 
 DEVICE_CLASSES = [
     DEVICE_CLASS_BUTTON,
-    DEVICE_CLASS_EMPTY,
     DEVICE_CLASS_DOORBELL,
+    DEVICE_CLASS_EMPTY,
     DEVICE_CLASS_MOTION,
 ]
 

From 031e26ad989fae720aae645bab9b6480336ac3e2 Mon Sep 17 00:00:00 2001
From: NP v/d Spek <github_mail@lumensoft.nl>
Date: Fri, 26 Apr 2024 05:23:28 +0200
Subject: [PATCH 55/81] Display: add diagnostic test_card option (#6608)

Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
---
 esphome/components/display/__init__.py |  4 ++
 esphome/components/display/display.cpp | 64 ++++++++++++++++++++++++--
 esphome/components/display/display.h   |  4 ++
 3 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/esphome/components/display/__init__.py b/esphome/components/display/__init__.py
index 992799008a..c4bb12b75d 100644
--- a/esphome/components/display/__init__.py
+++ b/esphome/components/display/__init__.py
@@ -38,6 +38,7 @@ DisplayOnPageChangeTrigger = display_ns.class_(
 )
 
 CONF_ON_PAGE_CHANGE = "on_page_change"
+CONF_SHOW_TEST_CARD = "show_test_card"
 
 DISPLAY_ROTATIONS = {
     0: display_ns.DISPLAY_ROTATION_0_DEGREES,
@@ -82,6 +83,7 @@ FULL_DISPLAY_SCHEMA = BASIC_DISPLAY_SCHEMA.extend(
             }
         ),
         cv.Optional(CONF_AUTO_CLEAR_ENABLED, default=True): cv.boolean,
+        cv.Optional(CONF_SHOW_TEST_CARD): cv.boolean,
     }
 )
 
@@ -113,6 +115,8 @@ async def setup_display_core_(var, config):
         await automation.build_automation(
             trigger, [(DisplayPagePtr, "from"), (DisplayPagePtr, "to")], conf
         )
+    if config.get(CONF_SHOW_TEST_CARD):
+        cg.add(var.show_test_card())
 
 
 async def register_display(var, config):
diff --git a/esphome/components/display/display.cpp b/esphome/components/display/display.cpp
index 010e6eca0b..75205292f7 100644
--- a/esphome/components/display/display.cpp
+++ b/esphome/components/display/display.cpp
@@ -1,7 +1,7 @@
 #include "display.h"
-
+#include "display_color_utils.h"
 #include <utility>
-
+#include "esphome/core/hal.h"
 #include "esphome/core/log.h"
 
 namespace esphome {
@@ -507,7 +507,9 @@ void Display::do_update_() {
   if (this->auto_clear_enabled_) {
     this->clear();
   }
-  if (this->page_ != nullptr) {
+  if (this->show_test_card_) {
+    this->test_card();
+  } else if (this->page_ != nullptr) {
     this->page_->get_writer()(*this);
   } else if (this->writer_.has_value()) {
     (*this->writer_)(*this);
@@ -608,6 +610,62 @@ bool Display::clamp_y_(int y, int h, int &min_y, int &max_y) {
   return min_y < max_y;
 }
 
+const uint8_t TESTCARD_FONT[3][8] PROGMEM = {{0x41, 0x7F, 0x7F, 0x09, 0x19, 0x7F, 0x66, 0x00},   // 'R'
+                                             {0x1C, 0x3E, 0x63, 0x41, 0x51, 0x73, 0x72, 0x00},   // 'G'
+                                             {0x41, 0x7F, 0x7F, 0x49, 0x49, 0x7F, 0x36, 0x00}};  // 'B'
+
+void Display::test_card() {
+  int w = get_width(), h = get_height(), image_w, image_h;
+  this->clear();
+  this->show_test_card_ = false;
+  if (this->get_display_type() == DISPLAY_TYPE_COLOR) {
+    Color r(255, 0, 0), g(0, 255, 0), b(0, 0, 255);
+    image_w = std::min(w - 20, 310);
+    image_h = std::min(h - 20, 255);
+
+    int shift_x = (w - image_w) / 2;
+    int shift_y = (h - image_h) / 2;
+    int line_w = (image_w - 6) / 6;
+    int image_c = image_w / 2;
+    for (auto i = 0; i <= image_h; i++) {
+      int c = esp_scale(i, image_h);
+      this->horizontal_line(shift_x + 0, shift_y + i, line_w, r.fade_to_white(c));
+      this->horizontal_line(shift_x + line_w, shift_y + i, line_w, r.fade_to_black(c));  //
+
+      this->horizontal_line(shift_x + image_c - line_w, shift_y + i, line_w, g.fade_to_white(c));
+      this->horizontal_line(shift_x + image_c, shift_y + i, line_w, g.fade_to_black(c));
+
+      this->horizontal_line(shift_x + image_w - (line_w * 2), shift_y + i, line_w, b.fade_to_white(c));
+      this->horizontal_line(shift_x + image_w - line_w, shift_y + i, line_w, b.fade_to_black(c));
+    }
+    this->rectangle(shift_x, shift_y, image_w, image_h, Color(127, 127, 0));
+
+    uint16_t shift_r = shift_x + line_w - (8 * 3);
+    uint16_t shift_g = shift_x + image_c - (8 * 3);
+    uint16_t shift_b = shift_x + image_w - line_w - (8 * 3);
+    shift_y = h / 2 - (8 * 3);
+    for (auto i = 0; i < 8; i++) {
+      uint8_t ftr = progmem_read_byte(&TESTCARD_FONT[0][i]);
+      uint8_t ftg = progmem_read_byte(&TESTCARD_FONT[1][i]);
+      uint8_t ftb = progmem_read_byte(&TESTCARD_FONT[2][i]);
+      for (auto k = 0; k < 8; k++) {
+        if ((ftr & (1 << k)) != 0) {
+          this->filled_rectangle(shift_r + (i * 6), shift_y + (k * 6), 6, 6, COLOR_OFF);
+        }
+        if ((ftg & (1 << k)) != 0) {
+          this->filled_rectangle(shift_g + (i * 6), shift_y + (k * 6), 6, 6, COLOR_OFF);
+        }
+        if ((ftb & (1 << k)) != 0) {
+          this->filled_rectangle(shift_b + (i * 6), shift_y + (k * 6), 6, 6, COLOR_OFF);
+        }
+      }
+    }
+  }
+  this->rectangle(0, 0, w, h, Color(127, 0, 127));
+  this->filled_rectangle(0, 0, 10, 10, Color(255, 0, 255));
+  this->stop_poller();
+}
+
 DisplayPage::DisplayPage(display_writer_t writer) : writer_(std::move(writer)) {}
 void DisplayPage::show() { this->parent_->show_page(this); }
 void DisplayPage::show_next() { this->next_->show(); }
diff --git a/esphome/components/display/display.h b/esphome/components/display/display.h
index a30ba976b4..4ee7ef93cb 100644
--- a/esphome/components/display/display.h
+++ b/esphome/components/display/display.h
@@ -631,6 +631,9 @@ class Display : public PollingComponent {
    */
   bool clip(int x, int y);
 
+  void test_card();
+  void show_test_card() { this->show_test_card_ = true; }
+
  protected:
   bool clamp_x_(int x, int w, int &min_x, int &max_x);
   bool clamp_y_(int y, int h, int &min_y, int &max_y);
@@ -659,6 +662,7 @@ class Display : public PollingComponent {
   std::vector<DisplayOnPageChangeTrigger *> on_page_change_triggers_;
   bool auto_clear_enabled_{true};
   std::vector<Rect> clipping_rectangle_;
+  bool show_test_card_{false};
 };
 
 class DisplayPage {

From cd91c7050c00dc8d7051f7870715dc4d8abdd537 Mon Sep 17 00:00:00 2001
From: polyfloyd <polyfloyd@users.noreply.github.com>
Date: Fri, 26 Apr 2024 10:44:58 +0200
Subject: [PATCH 56/81] waveshare_epaper: Add 2.90in-dke (#6492)

Co-authored-by: The_Niz <the_niz@nurdspace.nl>
---
 .../components/waveshare_epaper/display.py    |   4 +
 .../waveshare_epaper/waveshare_epaper.cpp     | 125 ++++++++++++++++++
 .../waveshare_epaper/waveshare_epaper.h       |  24 ++++
 .../waveshare_epaper/test.esp32.yaml          |  18 +++
 4 files changed, 171 insertions(+)

diff --git a/esphome/components/waveshare_epaper/display.py b/esphome/components/waveshare_epaper/display.py
index dc43cbf5a7..bba60efc0a 100644
--- a/esphome/components/waveshare_epaper/display.py
+++ b/esphome/components/waveshare_epaper/display.py
@@ -49,6 +49,9 @@ WaveshareEPaper2P9InV2R2 = waveshare_epaper_ns.class_(
     "WaveshareEPaper2P9InV2R2", WaveshareEPaper
 )
 GDEY029T94 = waveshare_epaper_ns.class_("GDEY029T94", WaveshareEPaper)
+WaveshareEPaper2P9InDKE = waveshare_epaper_ns.class_(
+    "WaveshareEPaper2P9InDKE", WaveshareEPaper
+)
 WaveshareEPaper4P2In = waveshare_epaper_ns.class_(
     "WaveshareEPaper4P2In", WaveshareEPaper
 )
@@ -115,6 +118,7 @@ MODELS = {
     "2.90in-b": ("b", WaveshareEPaper2P9InB),
     "2.90in-bv3": ("b", WaveshareEPaper2P9InBV3),
     "2.90inv2-r2": ("c", WaveshareEPaper2P9InV2R2),
+    "2.90in-dke": ("c", WaveshareEPaper2P9InDKE),
     "4.20in": ("b", WaveshareEPaper4P2In),
     "4.20in-bv2": ("b", WaveshareEPaper4P2InBV2),
     "5.83in": ("b", WaveshareEPaper5P8In),
diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.cpp b/esphome/components/waveshare_epaper/waveshare_epaper.cpp
index cf43c4cc32..7224aa44ed 100644
--- a/esphome/components/waveshare_epaper/waveshare_epaper.cpp
+++ b/esphome/components/waveshare_epaper/waveshare_epaper.cpp
@@ -1127,6 +1127,131 @@ void WaveshareEPaper2P9InB::dump_config() {
   LOG_UPDATE_INTERVAL(this);
 }
 
+// DKE 2.9
+// https://www.badge.team/docs/badges/sha2017/hardware/#e-ink-display-the-dke-group-depg0290b1
+// https://www.badge.team/docs/badges/sha2017/hardware/DEPG0290B01V3.0.pdf
+static const uint8_t LUT_SIZE_DKE = 70;
+static const uint8_t UPDATE_LUT_DKE[LUT_SIZE_DKE] = {
+    0xA0, 0x90, 0x50, 0x0,  0x0,  0x0,  0x0, 0x50, 0x90, 0xA0, 0x0,  0x0,  0x0,  0x0, 0xA0, 0x90, 0x50, 0x0,
+    0x0,  0x0,  0x0,  0x50, 0x90, 0xA0, 0x0, 0x0,  0x0,  0x0,  0x00, 0x00, 0x00, 0x0, 0x0,  0x0,  0x0,  0xF,
+    0xF,  0x0,  0x0,  0x0,  0xF,  0xF,  0x0, 0x0,  0x02, 0xF,  0xF,  0x0,  0x0,  0x0, 0x0,  0x0,  0x0,  0x0,
+    0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0, 0x0,  0x0,  0x0,  0x0,  0x0,  0x0,  0x0, 0x0,  0x0,
+};
+static const uint8_t PART_UPDATE_LUT_DKE[LUT_SIZE_DKE] = {
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+    0x05, 0x00, 0x00, 0x00, 0x01, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+static const uint8_t FULL_UPDATE_LUT_DKE[LUT_SIZE_DKE] = {
+    0x90, 0x50, 0xa0, 0x50, 0x50, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0xa0, 0x80, 0x00, 0x90, 0x50, 0xa0, 0x50,
+    0x50, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa0, 0xa0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17,
+    0x04, 0x00, 0x00, 0x00, 0x0b, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00, 0x04, 0x05, 0x00, 0x00,
+    0x00, 0x01, 0x0e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+void WaveshareEPaper2P9InDKE::initialize() {
+  // Hardware reset
+  delay(10);
+  this->reset_pin_->digital_write(false);
+  delayMicroseconds(200);
+  this->reset_pin_->digital_write(true);
+  delayMicroseconds(200);
+  // Wait for busy low
+  this->wait_until_idle_();
+  // Software reset
+  this->command(0x12);
+  // Wait for busy low
+  this->wait_until_idle_();
+  // Set Analog Block Control
+  this->command(0x74);
+  this->data(0x54);
+  // Set Digital Block Control
+  this->command(0x7E);
+  this->data(0x3B);
+  // Set display size and driver output control
+  this->command(0x01);
+  // this->data(0x27);
+  // this->data(0x01);
+  // this->data(0x00);
+  this->data(this->get_height_internal() - 1);
+  this->data((this->get_height_internal() - 1) >> 8);
+  this->data(0x00);  // ? GD = 0, SM = 0, TB = 0
+  // Ram data entry mode
+  this->command(0x11);
+  this->data(0x03);
+  // Set Ram X address
+  this->command(0x44);
+  this->data(0x00);
+  this->data(0x0F);
+  // Set Ram Y address
+  this->command(0x45);
+  this->data(0x00);
+  this->data(0x00);
+  this->data(0x27);
+  this->data(0x01);
+  // Set border
+  this->command(0x3C);
+  // this->data(0x80);
+  this->data(0x01);
+  // Set VCOM value
+  this->command(0x2C);
+  this->data(0x26);
+  // Gate voltage setting
+  this->command(0x03);
+  this->data(0x17);
+  // Source voltage setting
+  this->command(0x04);
+  this->data(0x41);
+  this->data(0x00);
+  this->data(0x32);
+  // Frame setting 50hz
+  this->command(0x3A);
+  this->data(0x30);
+  this->command(0x3B);
+  this->data(0x0A);
+  // Load LUT
+  this->command(0x32);
+  for (uint8_t v : FULL_UPDATE_LUT_DKE)
+    this->data(v);
+}
+
+void HOT WaveshareEPaper2P9InDKE::display() {
+  ESP_LOGI(TAG, "Performing e-paper update.");
+  // Set Ram X address counter
+  this->command(0x4e);
+  this->data(0);
+  // Set Ram Y address counter
+  this->command(0x4f);
+  this->data(0);
+  this->data(0);
+  // Load image (128/8*296)
+  this->command(0x24);
+  this->start_data_();
+  this->write_array(this->buffer_, this->get_buffer_length_());
+  this->end_data_();
+  // Image update
+  this->command(0x22);
+  this->data(0xC7);
+  this->command(0x20);
+  // Wait for busy low
+  this->wait_until_idle_();
+  // Enter deep sleep mode
+  this->command(0x10);
+  this->data(0x01);
+}
+int WaveshareEPaper2P9InDKE::get_width_internal() { return 128; }
+int WaveshareEPaper2P9InDKE::get_height_internal() { return 296; }
+void WaveshareEPaper2P9InDKE::dump_config() {
+  LOG_DISPLAY("", "Waveshare E-Paper", this);
+  ESP_LOGCONFIG(TAG, "  Model: 2.9in DKE");
+  LOG_PIN("  Reset Pin: ", this->reset_pin_);
+  LOG_PIN("  DC Pin: ", this->dc_pin_);
+  LOG_PIN("  Busy Pin: ", this->busy_pin_);
+  LOG_UPDATE_INTERVAL(this);
+}
+void WaveshareEPaper2P9InDKE::set_full_update_every(uint32_t full_update_every) {
+  this->full_update_every_ = full_update_every;
+}
+
 // ========================================================
 //               2.90in Type B (LUT from OTP)
 // Datasheet:
diff --git a/esphome/components/waveshare_epaper/waveshare_epaper.h b/esphome/components/waveshare_epaper/waveshare_epaper.h
index ffc099ca56..3c4470c30c 100644
--- a/esphome/components/waveshare_epaper/waveshare_epaper.h
+++ b/esphome/components/waveshare_epaper/waveshare_epaper.h
@@ -373,6 +373,30 @@ class WaveshareEPaper2P9InV2R2 : public WaveshareEPaper {
   void reset_();
 };
 
+class WaveshareEPaper2P9InDKE : public WaveshareEPaper {
+ public:
+  void initialize() override;
+
+  void display() override;
+
+  void dump_config() override;
+
+  void deep_sleep() override {
+    // COMMAND DEEP SLEEP
+    this->command(0x10);
+    this->data(0x01);
+  }
+
+  void set_full_update_every(uint32_t full_update_every);
+
+ protected:
+  uint32_t full_update_every_{30};
+  uint32_t at_update_{0};
+  int get_width_internal() override;
+
+  int get_height_internal() override;
+};
+
 class WaveshareEPaper4P2In : public WaveshareEPaper {
  public:
   void initialize() override;
diff --git a/tests/components/waveshare_epaper/test.esp32.yaml b/tests/components/waveshare_epaper/test.esp32.yaml
index cc6c665e7d..2f06c5c51b 100644
--- a/tests/components/waveshare_epaper/test.esp32.yaml
+++ b/tests/components/waveshare_epaper/test.esp32.yaml
@@ -83,6 +83,24 @@ display:
     full_update_every: 30
     lambda: |-
       it.rectangle(0, 0, it.get_width(), it.get_height());
+  - platform: waveshare_epaper
+    model: 2.90in-dke
+    spi_id: spi_id_1
+    cs_pin:
+      allow_other_uses: true
+      number: GPIO25
+    dc_pin:
+      allow_other_uses: true
+      number: GPIO26
+    busy_pin:
+      allow_other_uses: true
+      number: GPIO27
+    reset_pin:
+      allow_other_uses: true
+      number: GPIO32
+    full_update_every: 1
+    lambda: |-
+      it.rectangle(0, 0, it.get_width(), it.get_height());
   - platform: waveshare_epaper
     model: 2.70in-b
     spi_id: spi_id_1

From 9bfb36f58bcdaff1d5b62a2ea303d45a10af291e Mon Sep 17 00:00:00 2001
From: Alex Boyd <alex@opengroove.org>
Date: Fri, 26 Apr 2024 05:41:43 -0600
Subject: [PATCH 57/81] Extract core comments from #6241 (#6643)

---
 esphome/automation.py        | 10 ++++++++++
 esphome/config_validation.py |  2 +-
 esphome/core/component.h     |  2 +-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/esphome/automation.py b/esphome/automation.py
index 8475858a9c..b25ffa5abe 100644
--- a/esphome/automation.py
+++ b/esphome/automation.py
@@ -18,10 +18,20 @@ from esphome.util import Registry
 
 
 def maybe_simple_id(*validators):
+    """Allow a raw ID to be specified in place of a config block.
+    If the value that's being validated is a dictionary, it's passed as-is to the specified validators. Otherwise, it's
+    wrapped in a dict that looks like ``{"id": <value>}``, and that dict is then handed off to the specified validators.
+    """
     return maybe_conf(CONF_ID, *validators)
 
 
 def maybe_conf(conf, *validators):
+    """Allow a raw value to be specified in place of a config block.
+    If the value that's being validated is a dictionary, it's passed as-is to the specified validators. Otherwise, it's
+    wrapped in a dict that looks like ``{<conf>: <value>}``, and that dict is then handed off to the specified
+    validators.
+    (This is a general case of ``maybe_simple_id`` that allows the wrapping key to be something other than ``id``.)
+    """
     validator = cv.All(*validators)
 
     @schema_extractor("maybe")
diff --git a/esphome/config_validation.py b/esphome/config_validation.py
index bc58979f33..198b44f38d 100644
--- a/esphome/config_validation.py
+++ b/esphome/config_validation.py
@@ -304,7 +304,7 @@ def string(value):
     """Validate that a configuration value is a string. If not, automatically converts to a string.
 
     Note that this can be lossy, for example the input value 60.00 (float) will be turned into
-    "60.0" (string). For values where this could be a problem `string_string` has to be used.
+    "60.0" (string). For values where this could be a problem `string_strict` has to be used.
     """
     check_not_templatable(value)
     if isinstance(value, (dict, list)):
diff --git a/esphome/core/component.h b/esphome/core/component.h
index 4f244e5fcb..e6ffe96d1e 100644
--- a/esphome/core/component.h
+++ b/esphome/core/component.h
@@ -85,7 +85,7 @@ class Component {
 
   /** priority of setup(). higher -> executed earlier
    *
-   * Defaults to 0.
+   * Defaults to setup_priority::DATA, i.e. 600.
    *
    * @return The setup priority of this component
    */

From 76c55992aeee8fb416417efa0a9a33a1b5e27b25 Mon Sep 17 00:00:00 2001
From: tronikos <tronikos@users.noreply.github.com>
Date: Sat, 27 Apr 2024 18:22:41 -0700
Subject: [PATCH 58/81] Revert #6458 (#6650)

Reading the z-axis register is required.
---
 esphome/components/qmc5883l/qmc5883l.cpp | 46 ++++++++----------------
 1 file changed, 15 insertions(+), 31 deletions(-)

diff --git a/esphome/components/qmc5883l/qmc5883l.cpp b/esphome/components/qmc5883l/qmc5883l.cpp
index 4946ad1b77..8541b41ff7 100644
--- a/esphome/components/qmc5883l/qmc5883l.cpp
+++ b/esphome/components/qmc5883l/qmc5883l.cpp
@@ -77,8 +77,17 @@ void QMC5883LComponent::dump_config() {
 float QMC5883LComponent::get_setup_priority() const { return setup_priority::DATA; }
 void QMC5883LComponent::update() {
   uint8_t status = false;
-  if (ESPHOME_LOG_LEVEL >= ESPHOME_LOG_LEVEL_DEBUG)
-    this->read_byte(QMC5883L_REGISTER_STATUS, &status);
+  this->read_byte(QMC5883L_REGISTER_STATUS, &status);
+
+  // Always request X,Y,Z regardless if there are sensors for them
+  // to avoid https://github.com/esphome/issues/issues/5731
+  uint16_t raw_x, raw_y, raw_z;
+  if (!this->read_byte_16_(QMC5883L_REGISTER_DATA_X_LSB, &raw_x) ||
+      !this->read_byte_16_(QMC5883L_REGISTER_DATA_Y_LSB, &raw_y) ||
+      !this->read_byte_16_(QMC5883L_REGISTER_DATA_Z_LSB, &raw_z)) {
+    this->status_set_warning();
+    return;
+  }
 
   float mg_per_bit;
   switch (this->range_) {
@@ -93,36 +102,11 @@ void QMC5883LComponent::update() {
   }
 
   // in µT
-  float x = NAN, y = NAN, z = NAN;
-  if (this->x_sensor_ != nullptr || this->heading_sensor_ != nullptr) {
-    uint16_t raw_x;
-    if (!this->read_byte_16_(QMC5883L_REGISTER_DATA_X_LSB, &raw_x)) {
-      this->status_set_warning();
-      return;
-    }
-    x = int16_t(raw_x) * mg_per_bit * 0.1f;
-  }
-  if (this->y_sensor_ != nullptr || this->heading_sensor_ != nullptr) {
-    uint16_t raw_y;
-    if (!this->read_byte_16_(QMC5883L_REGISTER_DATA_Y_LSB, &raw_y)) {
-      this->status_set_warning();
-      return;
-    }
-    y = int16_t(raw_y) * mg_per_bit * 0.1f;
-  }
-  if (this->z_sensor_ != nullptr) {
-    uint16_t raw_z;
-    if (!this->read_byte_16_(QMC5883L_REGISTER_DATA_Z_LSB, &raw_z)) {
-      this->status_set_warning();
-      return;
-    }
-    z = int16_t(raw_z) * mg_per_bit * 0.1f;
-  }
+  const float x = int16_t(raw_x) * mg_per_bit * 0.1f;
+  const float y = int16_t(raw_y) * mg_per_bit * 0.1f;
+  const float z = int16_t(raw_z) * mg_per_bit * 0.1f;
 
-  float heading = NAN;
-  if (this->heading_sensor_ != nullptr) {
-    heading = atan2f(0.0f - x, y) * 180.0f / M_PI;
-  }
+  float heading = atan2f(0.0f - x, y) * 180.0f / M_PI;
 
   float temp = NAN;
   if (this->temperature_sensor_ != nullptr) {

From 0ef7781bb34f0b7f636942e16a0e638acdf597c5 Mon Sep 17 00:00:00 2001
From: optimusprimespace <62800678+optimusprimespace@users.noreply.github.com>
Date: Sun, 28 Apr 2024 21:22:14 +0200
Subject: [PATCH 59/81] [hm3301] Updated the AQI based on the airnow document
 (#6004)

---
 esphome/components/hm3301/aqi_calculator.h | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/esphome/components/hm3301/aqi_calculator.h b/esphome/components/hm3301/aqi_calculator.h
index 6c830f9bad..c1b47826a2 100644
--- a/esphome/components/hm3301/aqi_calculator.h
+++ b/esphome/components/hm3301/aqi_calculator.h
@@ -1,6 +1,7 @@
 #pragma once
 
 #include "abstract_aqi_calculator.h"
+// https://www.airnow.gov/sites/default/files/2020-05/aqi-technical-assistance-document-sept2018.pdf
 
 namespace esphome {
 namespace hm3301 {
@@ -15,14 +16,16 @@ class AQICalculator : public AbstractAQICalculator {
   }
 
  protected:
-  static const int AMOUNT_OF_LEVELS = 6;
+  static const int AMOUNT_OF_LEVELS = 7;
 
-  int index_grid_[AMOUNT_OF_LEVELS][2] = {{0, 51}, {51, 100}, {101, 150}, {151, 200}, {201, 300}, {301, 500}};
+  int index_grid_[AMOUNT_OF_LEVELS][2] = {{0, 50},    {51, 100},  {101, 150}, {151, 200},
+                                          {201, 300}, {301, 400}, {401, 500}};
 
-  int pm2_5_calculation_grid_[AMOUNT_OF_LEVELS][2] = {{0, 12}, {13, 35}, {36, 55}, {56, 150}, {151, 250}, {251, 500}};
+  int pm2_5_calculation_grid_[AMOUNT_OF_LEVELS][2] = {{0, 12},    {13, 35},   {36, 55},  {56, 150},
+                                                      {151, 250}, {251, 350}, {351, 500}};
 
-  int pm10_0_calculation_grid_[AMOUNT_OF_LEVELS][2] = {{0, 54},    {55, 154},  {155, 254},
-                                                       {255, 354}, {355, 424}, {425, 604}};
+  int pm10_0_calculation_grid_[AMOUNT_OF_LEVELS][2] = {{0, 54},    {55, 154},  {155, 254}, {255, 354},
+                                                       {355, 424}, {425, 504}, {505, 604}};
 
   int calculate_index_(uint16_t value, int array[AMOUNT_OF_LEVELS][2]) {
     int grid_index = get_grid_index_(value, array);

From a700ae481d24ab9cb7c8ffb1b018967a25523823 Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Mon, 29 Apr 2024 07:33:52 +1200
Subject: [PATCH 60/81] Fix command line substitutions without any yaml
 substitutions (#6644)

---
 esphome/components/substitutions/__init__.py                  | 2 +-
 esphome/config.py                                             | 4 ++--
 script/test_build_components                                  | 4 ++--
 tests/test_build_components/build_components_base.bk72xx.yaml | 4 ----
 .../build_components_base.esp32-ard.yaml                      | 4 ----
 .../build_components_base.esp32-c3-ard.yaml                   | 4 ----
 .../build_components_base.esp32-c3-idf.yaml                   | 4 ----
 .../build_components_base.esp32-idf.yaml                      | 4 ----
 .../build_components_base.esp32-s2-ard.yaml                   | 4 ----
 .../build_components_base.esp32-s2-idf.yaml                   | 4 ----
 .../build_components_base.esp32-s3-ard.yaml                   | 4 ----
 .../build_components_base.esp32-s3-idf.yaml                   | 4 ----
 .../test_build_components/build_components_base.esp8266.yaml  | 4 ----
 tests/test_build_components/build_components_base.host.yaml   | 4 ----
 tests/test_build_components/build_components_base.rp2040.yaml | 4 ----
 15 files changed, 5 insertions(+), 53 deletions(-)

diff --git a/esphome/components/substitutions/__init__.py b/esphome/components/substitutions/__init__.py
index ef368015b1..2d3a79ccae 100644
--- a/esphome/components/substitutions/__init__.py
+++ b/esphome/components/substitutions/__init__.py
@@ -116,7 +116,7 @@ def do_substitution_pass(config, command_line_substitutions, ignore_missing=Fals
     if CONF_SUBSTITUTIONS not in config and not command_line_substitutions:
         return
 
-    substitutions = config[CONF_SUBSTITUTIONS]
+    substitutions = config.get(CONF_SUBSTITUTIONS)
     if substitutions is None:
         substitutions = command_line_substitutions
     elif command_line_substitutions:
diff --git a/esphome/config.py b/esphome/config.py
index 1f6867eb59..73aa7077e0 100644
--- a/esphome/config.py
+++ b/esphome/config.py
@@ -756,11 +756,11 @@ def validate_config(
     CORE.raw_config = config
 
     # 1. Load substitutions
-    if CONF_SUBSTITUTIONS in config:
+    if CONF_SUBSTITUTIONS in config or command_line_substitutions:
         from esphome.components import substitutions
 
         result[CONF_SUBSTITUTIONS] = {
-            **config[CONF_SUBSTITUTIONS],
+            **config.get(CONF_SUBSTITUTIONS, {}),
             **command_line_substitutions,
         }
         result.add_output_path([CONF_SUBSTITUTIONS], CONF_SUBSTITUTIONS)
diff --git a/script/test_build_components b/script/test_build_components
index 2396353198..4d91256572 100755
--- a/script/test_build_components
+++ b/script/test_build_components
@@ -37,9 +37,9 @@ start_esphome() {
 
   # Start esphome process
   echo "> [$target_component] [$test_name] [$target_platform]"
-  echo "esphome -s component_name $target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file"
+  echo "esphome -s component_name $target_component -s component_dir ../../components/$target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file"
   # TODO: Validate escape of Command line substitution value
-  esphome -s component_name $target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file
+  esphome -s component_name $target_component -s component_dir ../../components/$target_component -s test_name $test_name -s target_platform $target_platform $esphome_command $component_test_file
 }
 
 # Find all test yaml files.
diff --git a/tests/test_build_components/build_components_base.bk72xx.yaml b/tests/test_build_components/build_components_base.bk72xx.yaml
index d74cc651eb..9fd9431826 100644
--- a/tests/test_build_components/build_components_base.bk72xx.yaml
+++ b/tests/test_build_components/build_components_base.bk72xx.yaml
@@ -12,8 +12,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-ard.yaml b/tests/test_build_components/build_components_base.esp32-ard.yaml
index e345adcafc..31b7067acc 100644
--- a/tests/test_build_components/build_components_base.esp32-ard.yaml
+++ b/tests/test_build_components/build_components_base.esp32-ard.yaml
@@ -14,8 +14,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-c3-ard.yaml b/tests/test_build_components/build_components_base.esp32-c3-ard.yaml
index 136ee62d4b..8aad447693 100644
--- a/tests/test_build_components/build_components_base.esp32-c3-ard.yaml
+++ b/tests/test_build_components/build_components_base.esp32-c3-ard.yaml
@@ -14,8 +14,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-c3-idf.yaml b/tests/test_build_components/build_components_base.esp32-c3-idf.yaml
index 4e809dd7ce..18584497f4 100644
--- a/tests/test_build_components/build_components_base.esp32-c3-idf.yaml
+++ b/tests/test_build_components/build_components_base.esp32-c3-idf.yaml
@@ -14,8 +14,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-idf.yaml b/tests/test_build_components/build_components_base.esp32-idf.yaml
index 3c4532a958..a62a995e68 100644
--- a/tests/test_build_components/build_components_base.esp32-idf.yaml
+++ b/tests/test_build_components/build_components_base.esp32-idf.yaml
@@ -14,8 +14,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-s2-ard.yaml b/tests/test_build_components/build_components_base.esp32-s2-ard.yaml
index db62cdff6a..b8f2639127 100644
--- a/tests/test_build_components/build_components_base.esp32-s2-ard.yaml
+++ b/tests/test_build_components/build_components_base.esp32-s2-ard.yaml
@@ -15,8 +15,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml
index 19fb657d8b..62f0f4f7bc 100644
--- a/tests/test_build_components/build_components_base.esp32-s2-idf.yaml
+++ b/tests/test_build_components/build_components_base.esp32-s2-idf.yaml
@@ -15,8 +15,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-s3-ard.yaml b/tests/test_build_components/build_components_base.esp32-s3-ard.yaml
index 39e12de08c..25cad038b6 100644
--- a/tests/test_build_components/build_components_base.esp32-s3-ard.yaml
+++ b/tests/test_build_components/build_components_base.esp32-s3-ard.yaml
@@ -15,8 +15,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml
index 95c73f917e..b1d08fcdf8 100644
--- a/tests/test_build_components/build_components_base.esp32-s3-idf.yaml
+++ b/tests/test_build_components/build_components_base.esp32-s3-idf.yaml
@@ -15,8 +15,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.esp8266.yaml b/tests/test_build_components/build_components_base.esp8266.yaml
index 0019298ef0..ecf9acd2ba 100644
--- a/tests/test_build_components/build_components_base.esp8266.yaml
+++ b/tests/test_build_components/build_components_base.esp8266.yaml
@@ -12,8 +12,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.host.yaml b/tests/test_build_components/build_components_base.host.yaml
index ec7570d99a..5492cfddd2 100644
--- a/tests/test_build_components/build_components_base.host.yaml
+++ b/tests/test_build_components/build_components_base.host.yaml
@@ -12,8 +12,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"
diff --git a/tests/test_build_components/build_components_base.rp2040.yaml b/tests/test_build_components/build_components_base.rp2040.yaml
index cb1cb6359b..335642374b 100644
--- a/tests/test_build_components/build_components_base.rp2040.yaml
+++ b/tests/test_build_components/build_components_base.rp2040.yaml
@@ -15,8 +15,4 @@ packages:
   component_under_test: !include
     file: $component_test_file
     vars:
-      component_name: $component_name
-      test_name: $test_name
-      target_platform: $target_platform
       component_test_file: $component_test_file
-      component_dir: "../../components/$component_name"

From 8334934e0825884946f0e6a18b461d015c080c54 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Sun, 28 Apr 2024 14:44:40 -0500
Subject: [PATCH 61/81] Allow platform dependencies (#6623)

---
 esphome/config.py         | 28 +++++++++++++++++++++++++---
 script/list-components.py |  8 ++++++--
 2 files changed, 31 insertions(+), 5 deletions(-)

diff --git a/esphome/config.py b/esphome/config.py
index 73aa7077e0..36a81f677b 100644
--- a/esphome/config.py
+++ b/esphome/config.py
@@ -374,7 +374,10 @@ class LoadValidationStep(ConfigValidationStep):
                         path + [CONF_ID],
                     )
                     continue
-                result.add_str_error("No platform specified! See 'platform' key.", path)
+                result.add_str_error(
+                    f"'{self.domain}' requires a 'platform' key but it was not specified.",
+                    path,
+                )
                 continue
             # Remove temp output path and construct new one
             result.remove_output_path(path, p_domain)
@@ -449,9 +452,28 @@ class MetadataValidationStep(ConfigValidationStep):
 
         success = True
         for dependency in self.comp.dependencies:
-            if dependency not in result:
+            dependency_parts = dependency.split(".")
+            if len(dependency_parts) > 2:
                 result.add_str_error(
-                    f"Component {self.domain} requires component {dependency}",
+                    "Dependencies must be specified as a single component or in component.platform format only",
+                    self.path,
+                )
+                return
+            component_dep = dependency_parts[0]
+            platform_dep = dependency_parts[-1]
+            if component_dep not in result:
+                result.add_str_error(
+                    f"Component {self.domain} requires component {component_dep}",
+                    self.path,
+                )
+                success = False
+            elif component_dep != platform_dep and (
+                not isinstance(platform_list := result.get(component_dep), list)
+                or not any(CONF_PLATFORM in p for p in platform_list)
+                or not any(p[CONF_PLATFORM] == platform_dep for p in platform_list)
+            ):
+                result.add_str_error(
+                    f"Component {self.domain} requires 'platform: {platform_dep}' in component '{component_dep}'",
                     self.path,
                 )
                 success = False
diff --git a/script/list-components.py b/script/list-components.py
index 8e2d47c6b3..5b5fa5811f 100755
--- a/script/list-components.py
+++ b/script/list-components.py
@@ -69,7 +69,9 @@ def create_components_graph():
             sys.exit(1)
 
         for dependency in comp.dependencies:
-            add_item_to_components_graph(components_graph, dependency, name)
+            add_item_to_components_graph(
+                components_graph, dependency.split(".")[0], name
+            )
 
         for target_config in TARGET_CONFIGURATIONS:
             CORE.data[KEY_CORE] = target_config
@@ -87,7 +89,9 @@ def create_components_graph():
             add_item_to_components_graph(components_graph, platform_name, name)
 
             for dependency in platform.dependencies:
-                add_item_to_components_graph(components_graph, dependency, name)
+                add_item_to_components_graph(
+                    components_graph, dependency.split(".")[0], name
+                )
 
             for target_config in TARGET_CONFIGURATIONS:
                 CORE.data[KEY_CORE] = target_config

From 5142d294f5204819fd6b5a858971b11a463620c3 Mon Sep 17 00:00:00 2001
From: Lucas Hartmann <lucas.hartmann@gmail.com>
Date: Sun, 28 Apr 2024 16:47:15 -0300
Subject: [PATCH 62/81] [light] Add transition_length to strobe effect. (#6595)

---
 esphome/components/light/base_light_effects.h | 3 ++-
 esphome/components/light/effects.py           | 4 ++++
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/esphome/components/light/base_light_effects.h b/esphome/components/light/base_light_effects.h
index c62ca43ca1..f7829a3f44 100644
--- a/esphome/components/light/base_light_effects.h
+++ b/esphome/components/light/base_light_effects.h
@@ -150,6 +150,7 @@ class AutomationLightEffect : public LightEffect {
 struct StrobeLightEffectColor {
   LightColorValues color;
   uint32_t duration;
+  uint32_t transition_length;
 };
 
 class StrobeLightEffect : public LightEffect {
@@ -174,7 +175,7 @@ class StrobeLightEffect : public LightEffect {
     }
     call.set_publish(false);
     call.set_save(false);
-    call.set_transition_length_if_supported(0);
+    call.set_transition_length_if_supported(this->colors_[this->at_color_].transition_length);
     call.perform();
     this->last_switch_ = now;
   }
diff --git a/esphome/components/light/effects.py b/esphome/components/light/effects.py
index 5093ace949..be50f63321 100644
--- a/esphome/components/light/effects.py
+++ b/esphome/components/light/effects.py
@@ -266,6 +266,9 @@ async def random_effect_to_code(config, effect_id):
                         cv.Required(
                             CONF_DURATION
                         ): cv.positive_time_period_milliseconds,
+                        cv.Optional(
+                            CONF_TRANSITION_LENGTH, default="0s"
+                        ): cv.positive_time_period_milliseconds,
                     }
                 ),
                 cv.has_at_least_one_key(
@@ -310,6 +313,7 @@ async def strobe_effect_to_code(config, effect_id):
                     ),
                 ),
                 ("duration", color[CONF_DURATION]),
+                ("transition_length", color[CONF_TRANSITION_LENGTH]),
             )
         )
     cg.add(var.set_colors(colors))

From 8b6a35845250deee6021fcd993467023f35d7f49 Mon Sep 17 00:00:00 2001
From: chiahsing <chiahsing@gmail.com>
Date: Mon, 29 Apr 2024 03:49:27 +0800
Subject: [PATCH 63/81] Fixed the issue that graph draws out of the boundary.
 (#6651)

---
 esphome/components/graph/graph.cpp | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/esphome/components/graph/graph.cpp b/esphome/components/graph/graph.cpp
index 1178af911d..09f7557714 100644
--- a/esphome/components/graph/graph.cpp
+++ b/esphome/components/graph/graph.cpp
@@ -177,22 +177,26 @@ void Graph::draw(Display *buff, uint16_t x_offset, uint16_t y_offset, Color colo
         bool b = (trace->get_line_type() & bit) == bit;
         if (b) {
           int16_t y = (int16_t) roundf((this->height_ - 1) * (1.0 - v)) - thick / 2 + y_offset;
+          auto draw_pixel_at = [&buff, c, y_offset, this](int16_t x, int16_t y) {
+            if (y >= y_offset && y < y_offset + this->height_)
+              buff->draw_pixel_at(x, y, c);
+          };
           if (!continuous || !has_prev || !prev_b || (abs(y - prev_y) <= thick)) {
             for (int16_t t = 0; t < thick; t++) {
-              buff->draw_pixel_at(x, y + t, c);
+              draw_pixel_at(x, y + t);
             }
           } else {
             int16_t mid_y = (y + prev_y + thick) / 2;
             if (y > prev_y) {
               for (int16_t t = prev_y + thick; t <= mid_y; t++)
-                buff->draw_pixel_at(x + 1, t, c);
+                draw_pixel_at(x + 1, t);
               for (int16_t t = mid_y + 1; t < y + thick; t++)
-                buff->draw_pixel_at(x, t, c);
+                draw_pixel_at(x, t);
             } else {
               for (int16_t t = prev_y - 1; t >= mid_y; t--)
-                buff->draw_pixel_at(x + 1, t, c);
+                draw_pixel_at(x + 1, t);
               for (int16_t t = mid_y - 1; t >= y; t--)
-                buff->draw_pixel_at(x, t, c);
+                draw_pixel_at(x, t);
             }
           }
           prev_y = y;

From 9ea442f3286ecb62b72f93133afb9f9a69d44fa2 Mon Sep 17 00:00:00 2001
From: Ulrich <uma19@umartiensen.de>
Date: Sun, 28 Apr 2024 21:56:13 +0200
Subject: [PATCH 64/81] Fix upload command. MQTT user and password is missing
 from configuration. #5093 (#5766)

Co-authored-by: ulrich <u.martiensen@umartiensen.de>
Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/__main__.py | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/esphome/__main__.py b/esphome/__main__.py
index dcd2dddb4b..b461dda4e7 100644
--- a/esphome/__main__.py
+++ b/esphome/__main__.py
@@ -768,7 +768,9 @@ def parse_args(argv):
     )
 
     parser_upload = subparsers.add_parser(
-        "upload", help="Validate the configuration and upload the latest binary."
+        "upload",
+        help="Validate the configuration and upload the latest binary.",
+        parents=[mqtt_options],
     )
     parser_upload.add_argument(
         "configuration", help="Your YAML configuration file(s).", nargs="+"

From e7c1ddb4525031c90df0e76414cae81577d9d953 Mon Sep 17 00:00:00 2001
From: Matt Quigley <quigleymd+github@gmail.com>
Date: Sun, 28 Apr 2024 14:57:11 -0500
Subject: [PATCH 65/81] patch esphome cli to skip mqtt based device discovery
 if --device option is specified (#6371)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/__main__.py | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/esphome/__main__.py b/esphome/__main__.py
index b461dda4e7..54c1aa112a 100644
--- a/esphome/__main__.py
+++ b/esphome/__main__.py
@@ -343,9 +343,10 @@ def upload_program(config, args, host):
     password = ota_conf.get(CONF_PASSWORD, "")
 
     if (
-        not is_ip_address(CORE.address)
+        not is_ip_address(CORE.address)  # pylint: disable=too-many-boolean-expressions
         and (get_port_type(host) == "MQTT" or config[CONF_MDNS][CONF_DISABLED])
         and CONF_MQTT in config
+        and (not args.device or args.device == "MQTT")
     ):
         from esphome import mqtt
 

From 80a0b5b1b109b424b85b5b00d5af84cec482c7bd Mon Sep 17 00:00:00 2001
From: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
Date: Mon, 29 Apr 2024 12:10:12 +1200
Subject: [PATCH 66/81] [i2s_audio.microphone] Fixing adc bug (#6654)

---
 .../microphone/i2s_audio_microphone.cpp       | 65 +++++++++++++++++--
 1 file changed, 58 insertions(+), 7 deletions(-)

diff --git a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp
index 602d537bcb..1475df0975 100644
--- a/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp
+++ b/esphome/components/i2s_audio/microphone/i2s_audio_microphone.cpp
@@ -61,28 +61,57 @@ void I2SAudioMicrophone::start_() {
       .bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT,
   };
 
+  esp_err_t err;
+
 #if SOC_I2S_SUPPORTS_ADC
   if (this->adc_) {
     config.mode = (i2s_mode_t) (config.mode | I2S_MODE_ADC_BUILT_IN);
-    i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
+    err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
+
+    err = i2s_set_adc_mode(ADC_UNIT_1, this->adc_channel_);
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error setting ADC mode: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
+    err = i2s_adc_enable(this->parent_->get_port());
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error enabling ADC: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
 
-    i2s_set_adc_mode(ADC_UNIT_1, this->adc_channel_);
-    i2s_adc_enable(this->parent_->get_port());
   } else
 #endif
   {
     if (this->pdm_)
       config.mode = (i2s_mode_t) (config.mode | I2S_MODE_PDM);
 
-    i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
+    err = i2s_driver_install(this->parent_->get_port(), &config, 0, nullptr);
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error installing I2S driver: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
 
     i2s_pin_config_t pin_config = this->parent_->get_pin_config();
     pin_config.data_in_num = this->din_pin_;
 
-    i2s_set_pin(this->parent_->get_port(), &pin_config);
+    err = i2s_set_pin(this->parent_->get_port(), &pin_config);
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error setting I2S pin: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
   }
   this->state_ = microphone::STATE_RUNNING;
   this->high_freq_.start();
+  this->status_clear_error();
 }
 
 void I2SAudioMicrophone::stop() {
@@ -96,11 +125,33 @@ void I2SAudioMicrophone::stop() {
 }
 
 void I2SAudioMicrophone::stop_() {
-  i2s_stop(this->parent_->get_port());
-  i2s_driver_uninstall(this->parent_->get_port());
+  esp_err_t err;
+#if SOC_I2S_SUPPORTS_ADC
+  if (this->adc_) {
+    err = i2s_adc_disable(this->parent_->get_port());
+    if (err != ESP_OK) {
+      ESP_LOGW(TAG, "Error disabling ADC: %s", esp_err_to_name(err));
+      this->status_set_error();
+      return;
+    }
+  }
+#endif
+  err = i2s_stop(this->parent_->get_port());
+  if (err != ESP_OK) {
+    ESP_LOGW(TAG, "Error stopping I2S microphone: %s", esp_err_to_name(err));
+    this->status_set_error();
+    return;
+  }
+  err = i2s_driver_uninstall(this->parent_->get_port());
+  if (err != ESP_OK) {
+    ESP_LOGW(TAG, "Error uninstalling I2S driver: %s", esp_err_to_name(err));
+    this->status_set_error();
+    return;
+  }
   this->parent_->unlock();
   this->state_ = microphone::STATE_STOPPED;
   this->high_freq_.stop();
+  this->status_clear_error();
 }
 
 size_t I2SAudioMicrophone::read(int16_t *buf, size_t len) {

From c007593f729d96c34566d6c36a5fb9b817cbc692 Mon Sep 17 00:00:00 2001
From: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
Date: Mon, 29 Apr 2024 13:53:08 +1000
Subject: [PATCH 67/81] Fix for #4866 - inconsistent arguments (#6639)

---
 esphome/components/binary_sensor/automation.cpp |  6 +++---
 esphome/core/helpers.cpp                        |  2 +-
 tests/components/host/test.host.yaml            | 15 +++++++++++++++
 3 files changed, 19 insertions(+), 4 deletions(-)
 create mode 100644 tests/components/host/test.host.yaml

diff --git a/esphome/components/binary_sensor/automation.cpp b/esphome/components/binary_sensor/automation.cpp
index bfec882e07..7ac201b2db 100644
--- a/esphome/components/binary_sensor/automation.cpp
+++ b/esphome/components/binary_sensor/automation.cpp
@@ -51,15 +51,15 @@ void binary_sensor::MultiClickTrigger::on_state_(bool state) {
   MultiClickTriggerEvent evt = this->timing_[*this->at_index_];
 
   if (evt.max_length != 4294967294UL) {
-    ESP_LOGV(TAG, "A i=%u min=%" PRIu32 " max=%" PRIu32, *this->at_index_, evt.min_length, evt.max_length);  // NOLINT
+    ESP_LOGV(TAG, "A i=%zu min=%" PRIu32 " max=%" PRIu32, *this->at_index_, evt.min_length, evt.max_length);  // NOLINT
     this->schedule_is_valid_(evt.min_length);
     this->schedule_is_not_valid_(evt.max_length);
   } else if (*this->at_index_ + 1 != this->timing_.size()) {
-    ESP_LOGV(TAG, "B i=%u min=%" PRIu32, *this->at_index_, evt.min_length);  // NOLINT
+    ESP_LOGV(TAG, "B i=%zu min=%" PRIu32, *this->at_index_, evt.min_length);  // NOLINT
     this->cancel_timeout("is_not_valid");
     this->schedule_is_valid_(evt.min_length);
   } else {
-    ESP_LOGV(TAG, "C i=%u min=%" PRIu32, *this->at_index_, evt.min_length);  // NOLINT
+    ESP_LOGV(TAG, "C i=%zu min=%" PRIu32, *this->at_index_, evt.min_length);  // NOLINT
     this->is_valid_ = false;
     this->cancel_timeout("is_not_valid");
     this->set_timeout("trigger", evt.min_length, [this]() { this->trigger_(); });
diff --git a/esphome/core/helpers.cpp b/esphome/core/helpers.cpp
index 4368576301..fdc0eed774 100644
--- a/esphome/core/helpers.cpp
+++ b/esphome/core/helpers.cpp
@@ -437,7 +437,7 @@ static inline bool is_base64(char c) { return (isalnum(c) || (c == '+') || (c ==
 
 std::string base64_encode(const std::vector<uint8_t> &buf) { return base64_encode(buf.data(), buf.size()); }
 
-std::string base64_encode(const char *buf, unsigned int buf_len) {
+std::string base64_encode(const uint8_t *buf, size_t buf_len) {
   std::string ret;
   int i = 0;
   int j = 0;
diff --git a/tests/components/host/test.host.yaml b/tests/components/host/test.host.yaml
new file mode 100644
index 0000000000..3d14c190a6
--- /dev/null
+++ b/tests/components/host/test.host.yaml
@@ -0,0 +1,15 @@
+time:
+  - platform: sntp
+    id: esptime
+    timezone: Australia/Sydney
+
+logger:
+  level: VERBOSE
+  logs:
+    lvgl: INFO
+    display: DEBUG
+    sensor: INFO
+    vnc: DEBUG
+
+host:
+  mac_address: "62:23:45:AF:B3:DD"

From 73bb4aa4d5428cd4d1034d8dd7ad9800903d632f Mon Sep 17 00:00:00 2001
From: Anton Sergunov <setosha@gmail.com>
Date: Mon, 29 Apr 2024 16:40:03 +0600
Subject: [PATCH 68/81] [template/text] Fix lambda config (#6655)

Co-authored-by: Clyde Stubbs <2366188+clydebarrow@users.noreply.github.com>
---
 esphome/components/template/text/__init__.py |  2 +-
 tests/component_tests/text/test_text.py      | 14 ++++++++++++++
 tests/component_tests/text/test_text.yaml    | 12 ++++++++++++
 tests/components/template/common.yaml        | 11 +++++++++++
 4 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/esphome/components/template/text/__init__.py b/esphome/components/template/text/__init__.py
index 0f228a3c6b..f73b240197 100644
--- a/esphome/components/template/text/__init__.py
+++ b/esphome/components/template/text/__init__.py
@@ -28,7 +28,7 @@ def validate(config):
             raise cv.Invalid("optimistic cannot be used with lambda")
         if CONF_INITIAL_VALUE in config:
             raise cv.Invalid("initial_value cannot be used with lambda")
-        if CONF_RESTORE_VALUE in config:
+        if config[CONF_RESTORE_VALUE]:
             raise cv.Invalid("restore_value cannot be used with lambda")
     elif CONF_INITIAL_VALUE not in config:
         config[CONF_INITIAL_VALUE] = ""
diff --git a/tests/component_tests/text/test_text.py b/tests/component_tests/text/test_text.py
index 43f4ef2592..51fcb3d382 100644
--- a/tests/component_tests/text/test_text.py
+++ b/tests/component_tests/text/test_text.py
@@ -54,3 +54,17 @@ def test_text_config_value_mode_set(generate_main):
     # Then
     assert "it_1->traits.set_mode(text::TEXT_MODE_TEXT);" in main_cpp
     assert "it_3->traits.set_mode(text::TEXT_MODE_PASSWORD);" in main_cpp
+
+
+def test_text_config_lamda_is_set(generate_main):
+    """
+    Test if lambda is set for lambda mode
+    """
+    # Given
+
+    # When
+    main_cpp = generate_main("tests/component_tests/text/test_text.yaml")
+
+    # Then
+    assert "it_4->set_template([=]() -> optional<std::string> {" in main_cpp
+    assert 'return std::string{"Hello"};' in main_cpp
diff --git a/tests/component_tests/text/test_text.yaml b/tests/component_tests/text/test_text.yaml
index d0fdf5303f..d81c909f9d 100644
--- a/tests/component_tests/text/test_text.yaml
+++ b/tests/component_tests/text/test_text.yaml
@@ -31,3 +31,15 @@ text:
     optimistic: true
     internal: true
     max_length: 255
+
+  - platform: template
+    name: "test 4 key"
+    id: "it_4"
+    mode: text
+    set_action:
+      - then:
+          - logger.log:
+              format: Template text set to %s
+              args: ["x.c_str()"]
+    lambda: |
+      return std::string{"Hello"};
diff --git a/tests/components/template/common.yaml b/tests/components/template/common.yaml
index ba7167157b..2b91225b5a 100644
--- a/tests/components/template/common.yaml
+++ b/tests/components/template/common.yaml
@@ -149,6 +149,17 @@ text:
     min_length: 0
     max_length: 100
     mode: text
+  - platform: template
+    name: "Template text lambda"
+    mode: text
+    update_interval: 1s
+    lambda: |
+      return std::string{"Hello!"};
+    set_action:
+      then:
+        - logger.log:
+            format: Template Text set to %s
+            args: ["x.c_str()"]
 
 alarm_control_panel:
   - platform: template

From 47c262832be69f7cd69ae93fde87c3e7931368eb Mon Sep 17 00:00:00 2001
From: Peter Zich <petezich@gmail.com>
Date: Mon, 29 Apr 2024 12:24:13 -0700
Subject: [PATCH 69/81] web_server: Add support for v3 local server_index
 (#6563)

---
 esphome/components/web_server/server_index.h  |  605 ---
 .../components/web_server/server_index_v2.h   |  633 +++
 .../components/web_server/server_index_v3.h   | 3995 +++++++++++++++++
 esphome/components/web_server/web_server.cpp  |    6 +-
 4 files changed, 4633 insertions(+), 606 deletions(-)
 delete mode 100644 esphome/components/web_server/server_index.h
 create mode 100644 esphome/components/web_server/server_index_v2.h
 create mode 100644 esphome/components/web_server/server_index_v3.h

diff --git a/esphome/components/web_server/server_index.h b/esphome/components/web_server/server_index.h
deleted file mode 100644
index 180dffab67..0000000000
--- a/esphome/components/web_server/server_index.h
+++ /dev/null
@@ -1,605 +0,0 @@
-#pragma once
-// Generated from https://github.com/esphome/esphome-webserver
-#include "esphome/core/hal.h"
-namespace esphome {
-
-namespace web_server {
-
-const uint8_t INDEX_GZ[] PROGMEM = {
-    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc5, 0x7d, 0xd9, 0x76, 0xe3, 0xc6, 0x92, 0xe0, 0xf3,
-    0x9c, 0x33, 0x7f, 0x30, 0x2f, 0x10, 0x4a, 0xad, 0x02, 0xae, 0x40, 0x88, 0xa4, 0x6a, 0x33, 0x28, 0x90, 0x57, 0xb5,
-    0xd8, 0x55, 0x76, 0x6d, 0x2e, 0xa9, 0xec, 0x6b, 0xcb, 0xb4, 0x04, 0x91, 0x49, 0x11, 0x2e, 0x10, 0xa0, 0x81, 0xa4,
-    0x16, 0x53, 0xe8, 0x33, 0x4f, 0xf3, 0xd4, 0xe7, 0xcc, 0xd6, 0x0f, 0xfd, 0x30, 0x7d, 0xba, 0x1f, 0xe6, 0x23, 0xe6,
-    0xb9, 0x3f, 0xe5, 0xfe, 0xc0, 0xf4, 0x27, 0x4c, 0x44, 0xe4, 0x82, 0x04, 0x17, 0x49, 0x5e, 0xba, 0xe7, 0xd8, 0x2a,
-    0x12, 0xb9, 0x46, 0x44, 0x46, 0xc6, 0x96, 0x91, 0xe0, 0xde, 0xc6, 0x30, 0x1b, 0xf0, 0xab, 0x29, 0xb3, 0xc6, 0x7c,
-    0x92, 0x74, 0xf7, 0xe4, 0xbf, 0x2c, 0x1a, 0x76, 0xf7, 0x92, 0x38, 0xfd, 0x64, 0xe5, 0x2c, 0x09, 0xe3, 0x41, 0x96,
-    0x5a, 0xe3, 0x9c, 0x8d, 0xc2, 0x61, 0xc4, 0xa3, 0x20, 0x9e, 0x44, 0x67, 0xcc, 0xda, 0xe9, 0xee, 0x4d, 0x18, 0x8f,
-    0xac, 0xc1, 0x38, 0xca, 0x0b, 0xc6, 0xc3, 0x8f, 0x87, 0x9f, 0x37, 0x9e, 0x74, 0xf7, 0x8a, 0x41, 0x1e, 0x4f, 0xb9,
-    0x85, 0x43, 0x86, 0x93, 0x6c, 0x38, 0x4b, 0x58, 0xf7, 0x3c, 0xca, 0xad, 0x17, 0x3c, 0x7c, 0x77, 0xfa, 0x13, 0x1b,
-    0x70, 0x7f, 0xc8, 0x46, 0x71, 0xca, 0xde, 0xe7, 0xd9, 0x94, 0xe5, 0xfc, 0xca, 0x3b, 0x58, 0x5d, 0x11, 0xb3, 0xc2,
-    0x7b, 0xa6, 0xab, 0xce, 0x18, 0x7f, 0x77, 0x91, 0xaa, 0x3e, 0xcf, 0x99, 0x98, 0x24, 0xcb, 0x0b, 0xaf, 0x58, 0xd3,
-    0xe6, 0xe0, 0x6a, 0x72, 0x9a, 0x25, 0x85, 0xf7, 0x49, 0xd7, 0x4f, 0xf3, 0x8c, 0x67, 0x08, 0x96, 0x3f, 0x8e, 0x0a,
-    0xa3, 0xa5, 0xf7, 0x6e, 0x45, 0x93, 0xa9, 0xac, 0x7c, 0x55, 0xbc, 0x48, 0x67, 0x13, 0x96, 0x47, 0xa7, 0x09, 0xf3,
-    0x72, 0x1e, 0x3a, 0xdc, 0x63, 0x5e, 0xec, 0x86, 0x5d, 0x66, 0xc5, 0xa9, 0xc5, 0x7b, 0x2f, 0x38, 0x95, 0xcc, 0x99,
-    0x6e, 0x15, 0x6c, 0x34, 0x3d, 0x20, 0xd7, 0x28, 0x3e, 0x9b, 0xe9, 0xe7, 0x8b, 0x3c, 0xe6, 0xea, 0xfb, 0x79, 0x94,
-    0xcc, 0x58, 0x10, 0x97, 0x6e, 0xc0, 0x8f, 0x58, 0x3f, 0x8c, 0xbd, 0x4f, 0x34, 0x28, 0x0c, 0x39, 0x1f, 0x65, 0xb9,
-    0x83, 0xb4, 0x8a, 0x71, 0x6c, 0x76, 0x7d, 0xed, 0xb0, 0x70, 0x5e, 0xba, 0xee, 0x27, 0xee, 0x0f, 0xa2, 0x24, 0x71,
-    0x70, 0xe2, 0xad, 0xad, 0x1c, 0x67, 0x8c, 0x3d, 0x76, 0x14, 0xf7, 0xdd, 0x4e, 0x3c, 0x72, 0x0a, 0xee, 0x56, 0xfd,
-    0xb2, 0x91, 0x55, 0x70, 0x87, 0xb9, 0xee, 0xbb, 0xf5, 0x7d, 0x72, 0xc6, 0x67, 0x39, 0xc0, 0x5e, 0x7a, 0xef, 0xd4,
-    0xcc, 0x07, 0x58, 0xff, 0x8c, 0x3a, 0x76, 0x00, 0xf6, 0x82, 0x5b, 0x9f, 0x87, 0x17, 0x71, 0x3a, 0xcc, 0x2e, 0xfc,
-    0x83, 0x71, 0x04, 0x1f, 0x1f, 0xb2, 0x8c, 0x6f, 0x6d, 0x39, 0xe7, 0x59, 0x3c, 0xb4, 0x9a, 0x61, 0x68, 0x56, 0x5e,
-    0x3d, 0x3b, 0x38, 0xb8, 0xbe, 0x5e, 0x28, 0xf0, 0xd3, 0x88, 0xc7, 0xe7, 0x4c, 0x74, 0x06, 0x00, 0x6c, 0xf8, 0x9c,
-    0x72, 0x36, 0x3c, 0xe0, 0x57, 0x09, 0x94, 0x32, 0xc6, 0x0b, 0x1b, 0x70, 0x7c, 0x9e, 0x0d, 0x80, 0x6c, 0xa9, 0x41,
-    0x78, 0x68, 0x9a, 0xb3, 0x69, 0x12, 0x0d, 0x18, 0xd6, 0xc3, 0x48, 0x55, 0x8f, 0xaa, 0x91, 0xf7, 0x6d, 0x28, 0x96,
-    0xd7, 0x71, 0xbd, 0x94, 0x87, 0x29, 0xbb, 0xb0, 0xde, 0x44, 0xd3, 0xce, 0x20, 0x89, 0x8a, 0xc2, 0xca, 0xf8, 0x9c,
-    0x50, 0xc8, 0x67, 0x03, 0x60, 0x10, 0x42, 0x70, 0x0e, 0x64, 0xe2, 0xe3, 0xb8, 0xf0, 0x8f, 0x37, 0x07, 0x45, 0xf1,
-    0x81, 0x15, 0xb3, 0x84, 0x6f, 0x86, 0xb0, 0x16, 0x6c, 0x23, 0x0c, 0xbf, 0x75, 0xf9, 0x38, 0xcf, 0x2e, 0xac, 0x17,
-    0x79, 0x0e, 0xcd, 0x6d, 0x98, 0x52, 0x34, 0xb0, 0xe2, 0xc2, 0x4a, 0x33, 0x6e, 0xe9, 0xc1, 0x70, 0x01, 0x7d, 0xeb,
-    0x63, 0xc1, 0xac, 0x93, 0x59, 0x5a, 0x44, 0x23, 0x06, 0x4d, 0x4f, 0xac, 0x2c, 0xb7, 0x4e, 0x60, 0xd0, 0x13, 0x58,
-    0xb2, 0x82, 0xc3, 0xae, 0xf1, 0x6d, 0xb7, 0x43, 0x73, 0x41, 0xe1, 0x21, 0xbb, 0xe4, 0x21, 0x2f, 0x81, 0x31, 0x61,
-    0x55, 0x14, 0x1a, 0x8e, 0x3b, 0x4f, 0xa0, 0x00, 0xc0, 0x26, 0x96, 0x75, 0xcc, 0xc6, 0x7a, 0x71, 0x3e, 0xdf, 0xda,
-    0xd2, 0xb4, 0x46, 0xc2, 0x43, 0xdb, 0x62, 0xa1, 0xad, 0x27, 0x10, 0xaf, 0x91, 0xc8, 0xf5, 0xb8, 0x2f, 0xc9, 0x77,
-    0x70, 0x95, 0x0e, 0xea, 0x63, 0x43, 0x65, 0xc9, 0xb3, 0x03, 0x9e, 0xc7, 0xe9, 0x19, 0x00, 0xa1, 0xd8, 0xc0, 0x68,
-    0x52, 0x96, 0x62, 0xf1, 0xdf, 0x03, 0xd4, 0x61, 0x17, 0x47, 0xcf, 0xb8, 0x63, 0x17, 0xd4, 0xc3, 0x06, 0x40, 0x80,
-    0xf4, 0xc0, 0x60, 0xbc, 0xc7, 0x03, 0xbe, 0x6d, 0xdb, 0xde, 0xb7, 0xae, 0x77, 0x81, 0x1c, 0xe4, 0xfb, 0x3e, 0xb1,
-    0xaf, 0xe8, 0x1c, 0x87, 0x2d, 0x04, 0xda, 0x4f, 0x58, 0x7a, 0xc6, 0xc7, 0x3d, 0x7e, 0xd4, 0xec, 0x07, 0x0c, 0xa0,
-    0x1a, 0xce, 0x06, 0xcc, 0x41, 0x7e, 0xf4, 0x0a, 0xdc, 0x3e, 0xdb, 0x0e, 0x4c, 0x81, 0x0b, 0xb3, 0x41, 0x38, 0xd6,
-    0x96, 0xc6, 0x55, 0xb0, 0x29, 0xc0, 0x90, 0xcf, 0x6d, 0xd8, 0x61, 0xa7, 0x2c, 0x37, 0xe0, 0xd0, 0xcd, 0x3a, 0xb5,
-    0x15, 0x9c, 0xc1, 0x0a, 0x41, 0x3f, 0x6b, 0x34, 0x4b, 0x07, 0x3c, 0x06, 0xc1, 0x65, 0x6f, 0x03, 0xb8, 0x62, 0xe5,
-    0xf4, 0xc2, 0xd9, 0x6e, 0xe9, 0x3a, 0xb1, 0xbb, 0xcd, 0x8f, 0x8a, 0xed, 0x56, 0xdf, 0x43, 0x28, 0x35, 0xf1, 0x25,
-    0xe2, 0x31, 0x20, 0x58, 0x7a, 0x1f, 0xb9, 0xde, 0x9e, 0x9f, 0xf7, 0xb8, 0xbf, 0xcc, 0xc7, 0x21, 0xf3, 0x27, 0xd1,
-    0x14, 0xb1, 0xe1, 0xc4, 0x03, 0x51, 0x3a, 0x40, 0xe8, 0x6a, 0xeb, 0x82, 0x14, 0xf3, 0x2b, 0x16, 0x70, 0x81, 0x20,
-    0xb0, 0x67, 0x5f, 0x44, 0x83, 0x31, 0x6c, 0xf1, 0x8a, 0x70, 0x43, 0xb5, 0x1d, 0x06, 0x39, 0x8b, 0x38, 0x7b, 0x91,
-    0x30, 0x7c, 0xc2, 0x15, 0x80, 0x9e, 0xb6, 0xeb, 0x15, 0x6a, 0xdf, 0x25, 0x31, 0x7f, 0x9b, 0xc1, 0x3c, 0x1d, 0xc1,
-    0x24, 0xc0, 0xc5, 0xc5, 0xd6, 0x56, 0x8c, 0x2c, 0xb2, 0xcf, 0x61, 0xb5, 0x4e, 0x67, 0x9c, 0x01, 0xbd, 0xb0, 0x85,
-    0x0d, 0xd4, 0xf6, 0x62, 0x9f, 0x03, 0x11, 0x9f, 0x65, 0x29, 0x87, 0xe1, 0x00, 0x5e, 0xcd, 0x41, 0x7e, 0x34, 0x9d,
-    0xb2, 0x74, 0xf8, 0x6c, 0x1c, 0x27, 0x43, 0xa0, 0x46, 0x09, 0xf8, 0x26, 0x3c, 0x04, 0x3c, 0x01, 0x99, 0xe0, 0x66,
-    0x8c, 0x68, 0xf9, 0x90, 0x91, 0x59, 0x68, 0xdb, 0x1d, 0x94, 0x40, 0x12, 0x0b, 0x94, 0x41, 0xb4, 0x70, 0x1f, 0x40,
-    0xf4, 0x17, 0x2e, 0xdb, 0x0e, 0x63, 0xbd, 0x8c, 0x92, 0xc0, 0xef, 0x51, 0xd2, 0x00, 0xfd, 0x81, 0x10, 0xbc, 0x83,
-    0x82, 0xeb, 0x4b, 0x29, 0x75, 0x22, 0xae, 0x30, 0x04, 0x02, 0x0c, 0x50, 0x82, 0x48, 0x1a, 0xbc, 0xcf, 0x92, 0xab,
-    0x51, 0x9c, 0x24, 0x07, 0xb3, 0xe9, 0x34, 0xcb, 0xb9, 0xf7, 0x55, 0x38, 0xe7, 0x59, 0x85, 0x2b, 0x6d, 0xf2, 0xe2,
-    0x22, 0xe6, 0x48, 0x50, 0x77, 0x3e, 0x88, 0x60, 0xa9, 0x9f, 0x66, 0x59, 0xc2, 0xa2, 0x14, 0xd0, 0xe0, 0x3d, 0xdb,
-    0x0e, 0xd2, 0x59, 0x92, 0x74, 0x4e, 0x61, 0xd8, 0x4f, 0x1d, 0xaa, 0x16, 0x12, 0x3f, 0xa0, 0xef, 0xfb, 0x79, 0x1e,
-    0x5d, 0x41, 0x43, 0x6c, 0x03, 0xec, 0x05, 0xab, 0xf5, 0xe5, 0xc1, 0xbb, 0xb7, 0xbe, 0x60, 0xfc, 0x78, 0x74, 0x05,
-    0x80, 0x96, 0x95, 0xd4, 0x1c, 0xe5, 0xd9, 0x64, 0x61, 0x6a, 0xa4, 0x43, 0x1c, 0xf2, 0xce, 0x1a, 0x10, 0x62, 0x1a,
-    0x19, 0x56, 0x89, 0x9b, 0x10, 0xbc, 0x25, 0x7e, 0x96, 0x95, 0xb8, 0x07, 0x7a, 0xf8, 0x25, 0x10, 0xc5, 0x30, 0xe5,
-    0x2d, 0xd0, 0xe6, 0x57, 0xf3, 0x38, 0x24, 0x38, 0xa7, 0xa8, 0x7f, 0x11, 0xc6, 0x41, 0x04, 0xb3, 0xcf, 0xc5, 0x80,
-    0xa5, 0x82, 0x38, 0x2e, 0x4b, 0x6f, 0xac, 0x99, 0x18, 0x25, 0x1e, 0x0a, 0x14, 0x16, 0x86, 0xa0, 0x60, 0x38, 0x3c,
-    0xb8, 0xde, 0xd7, 0xe1, 0x3c, 0x52, 0xf8, 0xa0, 0x86, 0xc2, 0xfd, 0x15, 0x08, 0x39, 0x81, 0x9a, 0xec, 0x1c, 0xf4,
-    0x20, 0xc0, 0xf9, 0x95, 0x07, 0xfa, 0x3f, 0x41, 0x28, 0x36, 0x5a, 0x1e, 0x68, 0xd0, 0x67, 0xe3, 0x28, 0x3d, 0x63,
-    0xc3, 0x60, 0xcc, 0x4b, 0x29, 0x79, 0xf7, 0x2d, 0x58, 0x63, 0x60, 0xa7, 0xc2, 0x7a, 0x79, 0xf8, 0xe6, 0xb5, 0x5c,
-    0xb9, 0x9a, 0x30, 0x86, 0x45, 0x9a, 0x81, 0x5a, 0x05, 0xb1, 0x2d, 0xc5, 0xf1, 0x0b, 0x2d, 0xbd, 0x45, 0x49, 0x5c,
-    0x7c, 0x9c, 0x82, 0x89, 0xc1, 0xde, 0xc3, 0x30, 0x30, 0x7d, 0x08, 0x53, 0x51, 0x39, 0xcc, 0x27, 0x2a, 0x86, 0xba,
-    0x08, 0x3a, 0x0b, 0x4c, 0xc5, 0x63, 0xe6, 0xb8, 0x25, 0xb0, 0x2a, 0x8f, 0x07, 0x56, 0x34, 0x1c, 0xbe, 0x4a, 0x63,
-    0x1e, 0x47, 0x49, 0xfc, 0x0b, 0x51, 0x72, 0x8e, 0x3c, 0xc6, 0x3a, 0x72, 0x11, 0x00, 0x77, 0xea, 0x91, 0xb8, 0x4a,
-    0xc8, 0x6e, 0x10, 0x31, 0x84, 0xb4, 0x4c, 0xc2, 0xa3, 0xbe, 0x04, 0x2f, 0xf1, 0xa7, 0xb3, 0x62, 0x8c, 0x84, 0x95,
-    0x03, 0xa3, 0x20, 0xcf, 0x4e, 0x0b, 0x96, 0x9f, 0xb3, 0xa1, 0xe6, 0x80, 0x02, 0xb0, 0xa2, 0xe6, 0x60, 0xbc, 0xd0,
-    0x8c, 0x8e, 0xd2, 0xa1, 0x1c, 0x86, 0xea, 0x98, 0x62, 0x96, 0x49, 0x66, 0xd6, 0x16, 0x8e, 0x96, 0x02, 0x8e, 0x30,
-    0x2a, 0xa4, 0x24, 0x28, 0x42, 0x85, 0xe1, 0x18, 0xa4, 0x10, 0x73, 0x6b, 0xdb, 0x5c, 0x69, 0xb2, 0x17, 0x33, 0x52,
-    0x09, 0x05, 0x74, 0x84, 0x8d, 0x4c, 0x90, 0x16, 0x2e, 0xec, 0x2a, 0x90, 0xf2, 0x12, 0x5c, 0x21, 0x45, 0x94, 0x99,
-    0x83, 0x0c, 0x10, 0x7e, 0x4d, 0xba, 0x90, 0xf9, 0xd8, 0x82, 0x21, 0x1b, 0xf8, 0x7a, 0xe5, 0x81, 0xb0, 0x12, 0xef,
-    0x0a, 0x11, 0x6f, 0x0d, 0xd8, 0xa4, 0x8b, 0x00, 0x30, 0x6f, 0x83, 0xf9, 0x69, 0xb6, 0x3f, 0x18, 0xb0, 0xa2, 0xc8,
-    0xf2, 0xad, 0xad, 0x0d, 0x6a, 0xbf, 0xce, 0xd0, 0x02, 0x4a, 0xba, 0x5a, 0xd6, 0xd9, 0x05, 0x69, 0x70, 0x53, 0xad,
-    0x28, 0x9d, 0x1e, 0xd8, 0xc7, 0xc7, 0x20, 0xb3, 0x3d, 0x49, 0x06, 0xa0, 0xfa, 0xb2, 0xe1, 0x27, 0xec, 0x99, 0x3a,
-    0x65, 0x56, 0xda, 0x97, 0x4e, 0x1d, 0x24, 0x0f, 0x86, 0x75, 0x4b, 0x63, 0x41, 0x57, 0x0e, 0x8d, 0xab, 0x21, 0x15,
-    0xe4, 0xfc, 0x8c, 0x54, 0xb6, 0xb1, 0x8c, 0x60, 0xb5, 0x95, 0x1e, 0x91, 0x5e, 0x61, 0x93, 0x13, 0xa0, 0x47, 0xbc,
-    0xdf, 0x91, 0xf5, 0x61, 0x21, 0x28, 0x97, 0xb3, 0x9f, 0x67, 0xac, 0xe0, 0x82, 0x75, 0x61, 0xdc, 0x1c, 0xc6, 0x2d,
-    0x97, 0xac, 0xc3, 0x9a, 0xed, 0xb8, 0x0a, 0xb6, 0x77, 0x53, 0xd4, 0x63, 0x05, 0x72, 0xf2, 0xcd, 0xec, 0x44, 0xf6,
-    0x84, 0x7b, 0x7d, 0xfd, 0xb5, 0x1a, 0xa4, 0x5a, 0x4a, 0x6d, 0x03, 0x2d, 0xac, 0x89, 0xad, 0x9a, 0x0c, 0x6d, 0x57,
-    0x2a, 0xd4, 0x8d, 0x56, 0xa7, 0xc6, 0x07, 0xb0, 0xe7, 0x9a, 0x9a, 0xa5, 0x2b, 0x63, 0xfb, 0xbd, 0xa2, 0xe9, 0x3b,
-    0x31, 0x32, 0x59, 0xa3, 0xfc, 0x76, 0xee, 0x51, 0x3b, 0x1e, 0xda, 0x2e, 0xd5, 0x55, 0x82, 0x61, 0x56, 0x17, 0x0c,
-    0x8b, 0x50, 0x4f, 0x75, 0x17, 0x5b, 0x33, 0x15, 0x0f, 0xd5, 0x5a, 0x2b, 0x07, 0x82, 0x85, 0x47, 0x60, 0x9c, 0xac,
-    0xf4, 0x0f, 0xde, 0x46, 0x13, 0x86, 0x14, 0xf5, 0xd6, 0x35, 0x90, 0x0e, 0x04, 0x34, 0xe9, 0x2f, 0xaa, 0x37, 0xe6,
-    0x0a, 0xab, 0xa9, 0xbe, 0xbf, 0x62, 0xb0, 0x22, 0xc0, 0xbe, 0x2e, 0x57, 0x2c, 0x11, 0xe9, 0x4d, 0xc9, 0xce, 0x8a,
-    0x3e, 0xa2, 0x4c, 0xac, 0x09, 0x29, 0x78, 0x40, 0x1e, 0x96, 0x7f, 0x61, 0xe1, 0x54, 0x2b, 0x85, 0x23, 0x43, 0x99,
-    0x02, 0x74, 0x26, 0x25, 0x00, 0xe2, 0x92, 0x3e, 0x6b, 0x1b, 0x0b, 0xc9, 0x76, 0x80, 0x7c, 0xe0, 0x8f, 0x92, 0x88,
-    0x3b, 0xad, 0x9d, 0xa6, 0x0b, 0x7c, 0x08, 0x42, 0x1c, 0x74, 0x04, 0x98, 0xf7, 0x15, 0x2a, 0x1c, 0x51, 0x89, 0x5d,
-    0xe6, 0x83, 0x51, 0x34, 0x8e, 0x47, 0xdc, 0x49, 0x90, 0x79, 0xdc, 0x92, 0x25, 0xa0, 0x64, 0xf4, 0xbe, 0x02, 0x65,
-    0xc1, 0x84, 0x74, 0x11, 0xd5, 0x4a, 0xa0, 0x31, 0x05, 0x29, 0x49, 0x29, 0xd2, 0x82, 0x0a, 0x02, 0x43, 0xa8, 0x74,
-    0x14, 0x47, 0x81, 0x7e, 0x8b, 0x7b, 0x62, 0xd0, 0x60, 0xc9, 0xa2, 0x8c, 0x7b, 0xf1, 0x72, 0x21, 0xa8, 0x61, 0x9f,
-    0x67, 0xaf, 0xb3, 0x0b, 0x96, 0x3f, 0x8b, 0x10, 0xf6, 0x40, 0x74, 0x2f, 0x41, 0xd2, 0x93, 0x40, 0xe7, 0x1d, 0xc5,
-    0x2b, 0xe7, 0x84, 0x34, 0x2c, 0xc4, 0x24, 0x46, 0x45, 0x08, 0x76, 0x0b, 0xd1, 0x3e, 0xc5, 0x2d, 0x45, 0x7b, 0x0f,
-    0x55, 0x09, 0xd7, 0xbc, 0xb5, 0xff, 0xba, 0xce, 0x5b, 0x30, 0xc2, 0x54, 0x71, 0x6b, 0x7d, 0xc7, 0x82, 0x7b, 0x21,
-    0x74, 0xb3, 0x23, 0x79, 0xcb, 0x50, 0x66, 0xa0, 0x3f, 0xae, 0xaf, 0x2b, 0x23, 0x1d, 0x94, 0xa9, 0x96, 0xe6, 0x08,
-    0x81, 0xd8, 0x12, 0x6e, 0x09, 0xca, 0x08, 0x0d, 0xaf, 0x3c, 0x4b, 0x12, 0x43, 0x17, 0x79, 0x71, 0xc7, 0x59, 0x50,
-    0x47, 0x00, 0xc5, 0xa4, 0xa6, 0x91, 0x7a, 0x2c, 0xd0, 0x15, 0xa8, 0x94, 0x94, 0x36, 0xf2, 0xaa, 0xb5, 0x11, 0x10,
-    0xa7, 0x43, 0x96, 0x0b, 0x07, 0x4d, 0xea, 0x50, 0x98, 0x30, 0x05, 0x86, 0x66, 0x43, 0xf4, 0x1c, 0x24, 0x02, 0x60,
-    0x9e, 0xf8, 0xe3, 0xac, 0xe0, 0xba, 0xce, 0x84, 0x3e, 0xbe, 0xbe, 0x8e, 0x85, 0xbf, 0x88, 0x0c, 0x90, 0xb3, 0x49,
-    0x76, 0xce, 0x56, 0x40, 0xdd, 0x51, 0x83, 0x99, 0x20, 0x1b, 0xc3, 0x80, 0x12, 0x05, 0xd5, 0x32, 0x4d, 0x62, 0xb0,
-    0xf4, 0x75, 0x03, 0x1f, 0x0c, 0x3a, 0x76, 0x89, 0x32, 0xc2, 0xed, 0x76, 0xbb, 0x4d, 0xaf, 0xe5, 0x96, 0x82, 0xe0,
-    0xf3, 0x25, 0x8a, 0xde, 0xa0, 0x1f, 0xa5, 0x09, 0xbe, 0x4a, 0x16, 0x30, 0xd7, 0x50, 0x8a, 0xc2, 0x4f, 0x62, 0x9e,
-    0x14, 0xc4, 0xae, 0x37, 0x84, 0x41, 0x39, 0x53, 0x82, 0x1b, 0x4d, 0x5c, 0xb1, 0x6d, 0x3f, 0x68, 0xb2, 0x69, 0x76,
-    0x52, 0x3b, 0x4c, 0x2d, 0x8c, 0x5c, 0xf3, 0x42, 0x7b, 0xc0, 0xe6, 0xf2, 0x90, 0x4d, 0x8f, 0xd5, 0xc0, 0xeb, 0x00,
-    0xa1, 0xf0, 0x74, 0x9d, 0x25, 0x94, 0xaa, 0xce, 0x52, 0x88, 0xeb, 0x0d, 0xf4, 0x51, 0x81, 0xb9, 0x8a, 0x04, 0x07,
-    0x52, 0x20, 0x30, 0xf4, 0xc8, 0xc4, 0x7a, 0x3d, 0x83, 0xe5, 0x39, 0x8d, 0x06, 0x9f, 0x34, 0xb8, 0x15, 0xef, 0x2d,
-    0xb2, 0x81, 0xb3, 0x50, 0x12, 0x1a, 0xe2, 0xca, 0xc4, 0x5b, 0x49, 0xe8, 0xda, 0x46, 0x01, 0x87, 0x6c, 0x89, 0xed,
-    0x17, 0x17, 0x7a, 0x91, 0xdb, 0x25, 0x7b, 0x28, 0xff, 0xa9, 0xe2, 0x92, 0xf5, 0x2c, 0xc7, 0x94, 0x34, 0x60, 0x8a,
-    0xf1, 0x60, 0x69, 0x16, 0x20, 0x01, 0xbe, 0x2b, 0x87, 0x71, 0xb1, 0x9e, 0x04, 0x7f, 0x28, 0x98, 0xcf, 0x8d, 0x99,
-    0x6e, 0x85, 0x54, 0x4b, 0x38, 0x69, 0x06, 0x6b, 0xd0, 0xa4, 0xf1, 0xa0, 0x44, 0xcd, 0x57, 0x68, 0xa8, 0x10, 0xc7,
-    0x9f, 0x89, 0x2a, 0x34, 0xc1, 0x10, 0x8c, 0xc2, 0xcb, 0x25, 0xc3, 0xa5, 0xcb, 0xa2, 0x45, 0xca, 0xd4, 0x98, 0x54,
-    0xaa, 0x66, 0xb9, 0x14, 0x0c, 0x2c, 0xda, 0xad, 0xbe, 0xb4, 0xc4, 0x95, 0xc8, 0xcd, 0x42, 0x2d, 0x4c, 0x72, 0xe5,
-    0x4d, 0x38, 0x05, 0xfa, 0x5d, 0xca, 0x7a, 0x37, 0xf1, 0x29, 0x14, 0x3e, 0x85, 0x6f, 0xf8, 0x50, 0x26, 0x6f, 0xe7,
-    0x3d, 0x30, 0xf7, 0x6b, 0x95, 0x68, 0x9f, 0xfa, 0x28, 0x98, 0x5d, 0x2d, 0x74, 0x41, 0xa0, 0x48, 0x36, 0xc9, 0x7a,
-    0x92, 0xdf, 0x50, 0x6c, 0x54, 0x9e, 0x51, 0xea, 0x8a, 0x0d, 0x52, 0xf3, 0x4a, 0x53, 0x2f, 0x73, 0x17, 0xec, 0xf7,
-    0xb2, 0x94, 0x74, 0x62, 0x82, 0x32, 0xb1, 0x77, 0x13, 0x6d, 0xbc, 0x2c, 0x4c, 0x85, 0xf5, 0x2b, 0x8c, 0x9d, 0x1a,
-    0x85, 0x32, 0x29, 0x02, 0x71, 0x6c, 0x7c, 0xac, 0x2c, 0x83, 0xd4, 0x5f, 0x61, 0x4f, 0x01, 0x28, 0x09, 0x2c, 0xbe,
-    0xa6, 0x92, 0x17, 0x85, 0x75, 0x3a, 0x6e, 0x10, 0x1d, 0x2b, 0x11, 0x5a, 0x13, 0xf9, 0x5a, 0x9f, 0xc5, 0x7e, 0xcd,
-    0x25, 0x34, 0x29, 0x59, 0xf4, 0x8a, 0xc0, 0x56, 0x81, 0x88, 0x4a, 0xb7, 0x25, 0xbd, 0x84, 0x1c, 0xd2, 0x65, 0xa2,
-    0xd7, 0x46, 0x32, 0x68, 0x9d, 0x09, 0x89, 0x96, 0xf5, 0xc3, 0x08, 0xc5, 0x86, 0x58, 0x8b, 0x25, 0x42, 0x2e, 0xda,
-    0x9b, 0xc4, 0x8a, 0xe8, 0x9c, 0x16, 0x68, 0xc2, 0x99, 0x3a, 0xdd, 0x71, 0x00, 0x1d, 0x10, 0xfb, 0x4b, 0xac, 0xb7,
-    0xd2, 0xec, 0x74, 0xfd, 0xca, 0xe1, 0xbb, 0xbe, 0x1e, 0x73, 0xd7, 0x91, 0x06, 0x2f, 0xac, 0x59, 0x4f, 0xc9, 0xde,
-    0xfd, 0xd7, 0xd8, 0x8a, 0xec, 0xcf, 0xaa, 0xa4, 0xf2, 0x14, 0x6a, 0x9c, 0x5b, 0x5f, 0xa7, 0x5a, 0x68, 0x51, 0x55,
-    0x1c, 0x18, 0x52, 0xfd, 0x40, 0x29, 0xec, 0x0a, 0xe5, 0x03, 0x39, 0x74, 0xec, 0xba, 0x6e, 0x50, 0x90, 0xf3, 0xb2,
-    0xb1, 0xca, 0x85, 0xdc, 0xda, 0x32, 0x7d, 0xa6, 0x73, 0x3d, 0xfc, 0x33, 0x07, 0x95, 0x73, 0x71, 0x95, 0x92, 0x05,
-    0xf3, 0x4c, 0xa9, 0xa3, 0x25, 0x07, 0xb4, 0xd9, 0x41, 0x4f, 0x3b, 0xba, 0x88, 0x62, 0x6e, 0xe9, 0x51, 0x84, 0xa7,
-    0x8d, 0xf2, 0x49, 0x1a, 0x1d, 0x80, 0x17, 0x9a, 0x90, 0xe4, 0x84, 0x9b, 0xb6, 0x68, 0x31, 0x18, 0x33, 0x0c, 0x81,
-    0x2b, 0x7b, 0xc2, 0x94, 0x3d, 0x1b, 0x88, 0xb7, 0x1c, 0x78, 0x35, 0xec, 0xe5, 0x62, 0xf7, 0x9a, 0xf9, 0x0f, 0x6b,
-    0x04, 0xb2, 0x6d, 0xa2, 0xea, 0xca, 0x85, 0x67, 0x29, 0x22, 0x31, 0xc2, 0xb6, 0x6a, 0x6c, 0x69, 0xeb, 0x77, 0x16,
-    0xdc, 0xeb, 0xca, 0x31, 0xaf, 0x29, 0xd5, 0x05, 0x3d, 0xac, 0xdc, 0x1c, 0x6e, 0x3a, 0xf2, 0x62, 0x05, 0xdd, 0x8e,
-    0x08, 0x0a, 0x81, 0x13, 0xa1, 0xec, 0x41, 0xcd, 0x0d, 0x44, 0x4a, 0xa6, 0xb4, 0x6a, 0x36, 0x4b, 0x86, 0x12, 0x58,
-    0x70, 0x61, 0x99, 0xe4, 0xa3, 0x8b, 0x38, 0x49, 0xaa, 0xd2, 0x3f, 0x54, 0xc0, 0x8b, 0x61, 0x6f, 0x13, 0xed, 0x02,
-    0xa3, 0x99, 0x02, 0xc1, 0xd5, 0x46, 0xd8, 0x47, 0xc7, 0xad, 0xd6, 0x5d, 0x44, 0x1c, 0x99, 0x19, 0x8d, 0xf8, 0x88,
-    0x36, 0x64, 0xc9, 0x34, 0x6b, 0xef, 0xbf, 0xc0, 0x90, 0x9a, 0x81, 0x0f, 0xaa, 0x33, 0x2a, 0xfe, 0x55, 0xf6, 0xd4,
-    0xaf, 0x44, 0xef, 0x56, 0xd5, 0xb5, 0x18, 0x50, 0x51, 0x81, 0x0f, 0x33, 0xc4, 0xd2, 0x54, 0x81, 0x80, 0x5c, 0x0f,
-    0xeb, 0x70, 0xb7, 0x46, 0x1a, 0x2c, 0x28, 0x05, 0xd6, 0x5a, 0xd9, 0xbd, 0xbe, 0x2d, 0x98, 0x43, 0xa1, 0x70, 0xd1,
-    0xff, 0x59, 0x36, 0x99, 0xa2, 0x65, 0xb6, 0xc0, 0xd4, 0xd0, 0xe0, 0xe3, 0x42, 0x7d, 0xb9, 0xa2, 0xac, 0xd6, 0x87,
-    0x76, 0x64, 0x8d, 0x9f, 0xb4, 0xa3, 0x0c, 0x0e, 0xd5, 0x4c, 0x17, 0xd5, 0xed, 0xe6, 0x45, 0x11, 0xb3, 0x8a, 0xc7,
-    0x7d, 0xd2, 0xdb, 0xda, 0x9a, 0xf4, 0x34, 0x0d, 0x48, 0x26, 0x49, 0x86, 0x37, 0x19, 0xa0, 0xac, 0x88, 0x33, 0x2f,
-    0x17, 0xc8, 0x37, 0x2f, 0x4b, 0x5c, 0xbf, 0xef, 0x3b, 0xfb, 0x35, 0xcf, 0xda, 0xdb, 0x5f, 0xef, 0x22, 0x57, 0x75,
-    0xd2, 0x83, 0x3c, 0xea, 0x43, 0xd1, 0x92, 0x4d, 0x19, 0xce, 0x27, 0xd9, 0x90, 0x05, 0x36, 0x74, 0x4f, 0xed, 0x52,
-    0x6e, 0x9a, 0x08, 0x36, 0x07, 0xf8, 0x7f, 0xf3, 0x0f, 0xf5, 0x48, 0x6a, 0xb0, 0x0f, 0x2c, 0xa0, 0xcd, 0x85, 0x2f,
-    0xc3, 0xb3, 0x24, 0x3b, 0x8d, 0x92, 0x43, 0xa1, 0xc0, 0x6b, 0x2d, 0xbf, 0x01, 0x97, 0x91, 0x2c, 0x56, 0x43, 0x49,
-    0x7d, 0xd9, 0xfb, 0x32, 0xb8, 0xbd, 0x47, 0xe5, 0xad, 0xd8, 0x2d, 0xbf, 0xe9, 0xb7, 0x6c, 0x15, 0x11, 0xfb, 0xc9,
-    0x9c, 0x0e, 0x34, 0x4e, 0x01, 0x94, 0x39, 0x04, 0x4d, 0x56, 0x78, 0x03, 0x1e, 0xfe, 0xd4, 0xfb, 0x49, 0xb9, 0xd4,
-    0x19, 0xb8, 0x10, 0xe0, 0xe4, 0x27, 0x31, 0x6f, 0xe0, 0x79, 0xa4, 0xed, 0xcd, 0x45, 0x05, 0xc6, 0x15, 0x29, 0x2e,
-    0x5d, 0x2a, 0x6f, 0xd0, 0x3b, 0x0e, 0x4f, 0xa0, 0xd9, 0xe6, 0xe6, 0xdc, 0x79, 0x13, 0xf1, 0xb1, 0x9f, 0x47, 0xe9,
-    0x30, 0x9b, 0x38, 0xee, 0xb6, 0x6d, 0xbb, 0x7e, 0x41, 0x9e, 0xc8, 0x67, 0x6e, 0xb9, 0x79, 0xe2, 0x0d, 0x79, 0x68,
-    0xf7, 0xec, 0xed, 0x63, 0xef, 0x90, 0x87, 0x27, 0x7b, 0x9b, 0xf3, 0x21, 0x2f, 0xbb, 0x27, 0xde, 0xa5, 0x8e, 0xb9,
-    0x7b, 0xef, 0x51, 0xca, 0x40, 0xaf, 0xb0, 0x7b, 0x29, 0xc1, 0x00, 0x76, 0xa3, 0xf8, 0x3b, 0x48, 0xb9, 0x8f, 0x74,
-    0x20, 0x22, 0xe3, 0xb4, 0xd7, 0xd7, 0x76, 0x46, 0x11, 0x03, 0x7b, 0x43, 0x3b, 0xab, 0x5b, 0x5b, 0x95, 0x9a, 0xaf,
-    0x4a, 0xbd, 0x19, 0x0f, 0x6b, 0x9e, 0xba, 0xf7, 0x92, 0x8e, 0x56, 0xea, 0x1b, 0x79, 0x26, 0x82, 0x36, 0xcb, 0x76,
-    0x82, 0x63, 0x6c, 0xf1, 0xd5, 0xdb, 0xfa, 0x48, 0x44, 0x29, 0xfc, 0x18, 0xac, 0x97, 0x08, 0xd4, 0x37, 0x38, 0x38,
-    0xde, 0x61, 0xb8, 0xb3, 0xe7, 0xf4, 0x02, 0x67, 0xa3, 0xd1, 0xb8, 0xfe, 0x61, 0xe7, 0xe8, 0xc7, 0xa8, 0xf1, 0xcb,
-    0x7e, 0xe3, 0xfb, 0xbe, 0x7b, 0xed, 0xfc, 0xb0, 0xd3, 0x3b, 0x92, 0x4f, 0x47, 0x3f, 0x76, 0x7f, 0x28, 0xfa, 0x7f,
-    0x12, 0x85, 0x9b, 0xae, 0xbb, 0x73, 0xe6, 0x4d, 0x79, 0xb8, 0xd3, 0x68, 0x74, 0xe1, 0xdb, 0x19, 0x7c, 0xc3, 0xcf,
-    0x53, 0xf8, 0xb8, 0x3e, 0xb2, 0xfe, 0xc3, 0x0f, 0xe9, 0x7f, 0xfc, 0x21, 0xef, 0xe3, 0x98, 0x47, 0x3f, 0xfe, 0x50,
-    0xd8, 0xf7, 0xbb, 0xe1, 0x4e, 0x7f, 0xdb, 0x75, 0x74, 0xcd, 0x9f, 0xc2, 0xea, 0x2b, 0xb4, 0x3a, 0xfa, 0x51, 0x3e,
-    0xd9, 0xf7, 0x4f, 0xf6, 0xba, 0x61, 0xff, 0xda, 0xb1, 0xaf, 0xef, 0xbb, 0xd7, 0xae, 0x7b, 0xbd, 0x89, 0xf3, 0x9c,
-    0xc3, 0xe8, 0xf7, 0xe1, 0x73, 0x04, 0x9f, 0x36, 0x7c, 0x6e, 0xc2, 0xe7, 0x8f, 0xd0, 0x4d, 0xc4, 0xdf, 0xae, 0x29,
-    0x16, 0x72, 0x8d, 0x07, 0x16, 0x11, 0xac, 0x82, 0xbb, 0xb9, 0x13, 0x7b, 0x13, 0x22, 0x1a, 0xec, 0x43, 0xdf, 0xf7,
-    0x31, 0x4c, 0xea, 0xcc, 0x8f, 0x37, 0x61, 0xd1, 0x91, 0x73, 0x36, 0x03, 0xee, 0x89, 0xc8, 0x41, 0x11, 0x30, 0x71,
-    0xb6, 0x5a, 0xe0, 0xe1, 0xaa, 0x37, 0x0c, 0x27, 0xdc, 0x01, 0xa3, 0xe0, 0x03, 0xc7, 0x2f, 0x6d, 0xd7, 0x7b, 0x21,
-    0xcf, 0x0c, 0x71, 0x9f, 0x0b, 0xd6, 0x4a, 0x33, 0x61, 0xd2, 0xd8, 0xae, 0x37, 0x5d, 0x51, 0x09, 0xdb, 0x3a, 0x3d,
-    0x83, 0xba, 0x63, 0x11, 0xa3, 0xfe, 0x96, 0x45, 0x9f, 0x70, 0x4b, 0xbe, 0x35, 0x0e, 0x81, 0x97, 0x2c, 0xf9, 0x45,
-    0xa3, 0xd1, 0xb0, 0x11, 0x85, 0x3b, 0xf6, 0x94, 0xc1, 0x0c, 0x4b, 0x26, 0x22, 0x23, 0xa5, 0x29, 0x2c, 0x5b, 0x98,
-    0xfc, 0x7d, 0x94, 0xf3, 0xcd, 0xca, 0xb0, 0x0d, 0xeb, 0x96, 0xec, 0x82, 0xa5, 0x7f, 0x87, 0x29, 0xd0, 0xb4, 0xa4,
-    0xf3, 0x0f, 0x73, 0xfc, 0x30, 0x23, 0xb4, 0x3e, 0x38, 0x0c, 0x3c, 0xf4, 0x02, 0xe4, 0x8e, 0xe8, 0xe7, 0xbc, 0x47,
-    0x35, 0x06, 0xff, 0xcb, 0x30, 0x83, 0x27, 0xe6, 0xc3, 0x10, 0xcd, 0xbc, 0xd4, 0xc1, 0xad, 0x0c, 0xc5, 0xfd, 0x2b,
-    0xdc, 0x19, 0x59, 0xe9, 0x1d, 0x84, 0x6a, 0xc7, 0x1c, 0xe6, 0x8c, 0x7d, 0x1b, 0x25, 0x9f, 0x58, 0xee, 0x5c, 0x7a,
-    0xad, 0xf6, 0x67, 0xd4, 0xd9, 0x43, 0xdb, 0xec, 0x4d, 0x75, 0x8c, 0xa6, 0xcd, 0x02, 0x79, 0x44, 0xd8, 0x68, 0x79,
-    0x28, 0x31, 0x88, 0x04, 0xb9, 0x97, 0x86, 0x6d, 0xe2, 0x70, 0x7b, 0xaf, 0x38, 0x3f, 0xeb, 0xda, 0x81, 0x6d, 0x83,
-    0xc5, 0x7f, 0x48, 0x61, 0x2b, 0x61, 0x58, 0x34, 0x3b, 0x6c, 0x2f, 0xee, 0xb0, 0xed, 0xed, 0x2a, 0xe0, 0x84, 0x07,
-    0xe9, 0xd4, 0x3d, 0xf1, 0x22, 0x6f, 0x1c, 0xc2, 0x80, 0x03, 0x68, 0x86, 0x5d, 0x3a, 0x83, 0xbd, 0x58, 0x4e, 0x03,
-    0xb2, 0x3e, 0xf3, 0x93, 0xa8, 0xe0, 0xaf, 0x30, 0x1e, 0x11, 0x0e, 0xc0, 0xd8, 0xcf, 0x7c, 0x76, 0xc9, 0x06, 0xca,
-    0xce, 0x00, 0x42, 0x45, 0x6e, 0xc7, 0x1d, 0x84, 0x46, 0x33, 0x98, 0x3b, 0x0c, 0x0f, 0x7b, 0x36, 0xec, 0x25, 0xd8,
-    0x95, 0x61, 0x74, 0xd4, 0xea, 0xf7, 0xb2, 0x70, 0xca, 0x03, 0x4d, 0x5b, 0x59, 0x74, 0x56, 0x2b, 0x6a, 0xf7, 0x7b,
-    0xce, 0x26, 0x18, 0xe9, 0x60, 0x8b, 0x3b, 0xf8, 0x84, 0x11, 0x8a, 0x3c, 0xfc, 0xc0, 0xce, 0x5e, 0x5c, 0x4e, 0x1d,
-    0x7b, 0x6f, 0xc7, 0xde, 0xc6, 0x52, 0xcf, 0x06, 0xf6, 0x02, 0x0a, 0x86, 0xa7, 0xae, 0xd9, 0x79, 0xb7, 0x8f, 0xa0,
-    0x62, 0x21, 0x4e, 0x7e, 0xda, 0xb3, 0xbb, 0x62, 0xea, 0x26, 0x0c, 0x9a, 0xc9, 0xe5, 0xc7, 0x15, 0x3d, 0x24, 0x54,
-    0x55, 0x57, 0x05, 0x1d, 0x94, 0xb5, 0x03, 0x67, 0x6c, 0x22, 0xd1, 0xc0, 0xc9, 0x24, 0x15, 0xc0, 0xe1, 0xc1, 0x66,
-    0x30, 0xa9, 0xd1, 0x6d, 0xb7, 0xdf, 0x3b, 0x0d, 0xee, 0xdb, 0xf7, 0xd5, 0xc3, 0x08, 0x90, 0xe1, 0x62, 0xfa, 0x11,
-    0x48, 0x3b, 0xfc, 0x3c, 0xe7, 0x80, 0xe4, 0x29, 0x15, 0x4d, 0x65, 0xd1, 0x19, 0x16, 0x1d, 0x06, 0x08, 0xaa, 0x97,
-    0x6b, 0xeb, 0x4f, 0xac, 0xc9, 0x30, 0x24, 0xd8, 0xc1, 0x16, 0x3a, 0x62, 0xdb, 0xad, 0x3e, 0x9e, 0x37, 0xe4, 0xbc,
-    0xf8, 0x36, 0xe6, 0xa0, 0x12, 0x76, 0xba, 0xb6, 0xdb, 0xb3, 0x2d, 0x5c, 0xda, 0x4e, 0xba, 0x1d, 0x0a, 0x0a, 0xc7,
-    0xdb, 0x87, 0x3c, 0x18, 0x77, 0xc3, 0x66, 0xcf, 0x29, 0x64, 0xb8, 0x11, 0xcf, 0x2d, 0x85, 0x04, 0x6f, 0x7a, 0x63,
-    0x10, 0xe8, 0xc8, 0xb9, 0x9b, 0xf6, 0xb6, 0x2a, 0x84, 0xa2, 0xe3, 0xed, 0xa1, 0x1b, 0xc4, 0xf0, 0xe1, 0x34, 0x90,
-    0x69, 0xc6, 0xba, 0xaf, 0xd2, 0xcc, 0xcc, 0x0d, 0x86, 0xca, 0x22, 0x4f, 0xc2, 0x74, 0xdb, 0xc1, 0x08, 0x2d, 0x48,
-    0xda, 0xbd, 0x1e, 0xc0, 0xb0, 0xed, 0x28, 0x4e, 0xdb, 0x51, 0xac, 0xa6, 0xec, 0xf3, 0x23, 0xbd, 0x1c, 0x03, 0xde,
-    0x1b, 0xa8, 0xf3, 0x58, 0xd4, 0x3e, 0x00, 0x56, 0x90, 0x78, 0x45, 0x5f, 0x9d, 0x79, 0xbd, 0xac, 0x9d, 0x6f, 0xcd,
-    0x95, 0x28, 0xe2, 0x9e, 0x21, 0xa1, 0x58, 0xa9, 0xdd, 0x30, 0x61, 0x6e, 0x4f, 0x91, 0x18, 0x9a, 0xe5, 0x43, 0xd8,
-    0x63, 0xa1, 0x0a, 0xb0, 0x67, 0xe6, 0xb6, 0x48, 0xc2, 0xaa, 0xb9, 0x77, 0x04, 0xac, 0xdd, 0x0f, 0xdf, 0x08, 0x77,
-    0xaa, 0xa3, 0xa2, 0xf9, 0x2c, 0x09, 0x5f, 0x2e, 0x1c, 0x17, 0x47, 0x78, 0x22, 0x74, 0xe0, 0x0f, 0x66, 0x39, 0xc8,
-    0x03, 0xfe, 0x16, 0x2c, 0x83, 0x50, 0x36, 0x45, 0x47, 0x0f, 0x8f, 0x80, 0x3d, 0x42, 0x7c, 0x21, 0x6c, 0x6e, 0x54,
-    0xa3, 0x45, 0x49, 0xc6, 0x0b, 0x1d, 0x0c, 0x77, 0x98, 0x74, 0xed, 0x51, 0x30, 0xc8, 0x13, 0x63, 0x07, 0xcf, 0xfc,
-    0xfd, 0x01, 0x56, 0xe3, 0x04, 0x85, 0x5b, 0xd2, 0x6e, 0xab, 0xc4, 0xdf, 0x81, 0x9f, 0x82, 0x04, 0xc7, 0x3a, 0xf0,
-    0xb3, 0xb6, 0xb6, 0x12, 0x89, 0xd4, 0x5e, 0xd6, 0xa1, 0x93, 0x08, 0x8c, 0x07, 0x17, 0x7e, 0x0a, 0xd5, 0x48, 0x22,
-    0x2a, 0x22, 0x0b, 0xd4, 0x3c, 0x55, 0xab, 0xe0, 0x3b, 0x32, 0x23, 0xf0, 0x8c, 0x92, 0x5c, 0xd0, 0x50, 0xd4, 0x8d,
-    0x45, 0x2c, 0xdf, 0x75, 0xe9, 0x68, 0x0b, 0x0f, 0x20, 0x05, 0xa3, 0x09, 0x86, 0x71, 0x29, 0x28, 0x59, 0xf1, 0xdf,
-    0xb1, 0x11, 0x2b, 0x1f, 0x1f, 0xa5, 0xdb, 0xdb, 0x7d, 0x71, 0x6e, 0x41, 0x8c, 0xc3, 0x8c, 0xe8, 0x6a, 0x5c, 0x01,
-    0x50, 0x9f, 0xce, 0x89, 0xeb, 0x81, 0x69, 0xc5, 0x9a, 0x2e, 0xc5, 0x3e, 0x39, 0xcc, 0x00, 0x14, 0xdc, 0x71, 0x8e,
-    0xfc, 0xde, 0x9f, 0xfb, 0xe0, 0x1e, 0xfb, 0x7f, 0x72, 0x77, 0x94, 0xa0, 0xe9, 0xc8, 0x33, 0xc5, 0x39, 0x9d, 0xb1,
-    0xb6, 0x3c, 0x8a, 0x8d, 0x06, 0x20, 0xf5, 0x00, 0x03, 0xd0, 0xe6, 0x20, 0x13, 0x2a, 0x0e, 0x42, 0x8e, 0x0a, 0x6c,
-    0x1f, 0x37, 0x3f, 0xc3, 0x9d, 0xfd, 0x9c, 0x07, 0x60, 0xc1, 0xa8, 0xa7, 0xd7, 0xf0, 0xf4, 0x67, 0xfd, 0xf4, 0x13,
-    0x0f, 0x7e, 0x29, 0x65, 0xe8, 0xbe, 0x36, 0xc5, 0x23, 0x35, 0x45, 0x29, 0x96, 0xc8, 0xa0, 0x21, 0x77, 0x97, 0x63,
-    0x36, 0xcc, 0x2d, 0x81, 0x18, 0x4a, 0x74, 0x81, 0x8d, 0x16, 0x9d, 0x21, 0x71, 0x5d, 0x93, 0x14, 0x46, 0x2e, 0x81,
-    0x89, 0x70, 0xc5, 0xb7, 0x48, 0x4f, 0xd6, 0x6d, 0xba, 0xf3, 0x5a, 0x5b, 0xb2, 0xef, 0xd8, 0x64, 0xca, 0xaf, 0x0e,
-    0x48, 0xd1, 0x07, 0x32, 0x6d, 0x40, 0x9c, 0x9d, 0x37, 0x3b, 0xf1, 0x1e, 0xeb, 0xc4, 0x20, 0xd5, 0x0b, 0xc5, 0x62,
-    0xb8, 0x57, 0xbd, 0xf7, 0x18, 0xa5, 0x34, 0x99, 0xc9, 0xab, 0xa1, 0xd7, 0x96, 0xe8, 0x6d, 0x6f, 0x03, 0x82, 0x1d,
-    0xa3, 0x2b, 0x13, 0x5d, 0xcb, 0x52, 0xd0, 0x04, 0x20, 0x7a, 0x52, 0x67, 0x39, 0xe2, 0x38, 0xcc, 0x66, 0x83, 0xe2,
-    0x21, 0x77, 0x57, 0x8e, 0x8a, 0x63, 0x62, 0x77, 0x99, 0xb0, 0x03, 0x98, 0x11, 0x97, 0x37, 0x5a, 0x22, 0x3a, 0x2c,
-    0xfa, 0xeb, 0xf8, 0xf6, 0xb1, 0xc7, 0xb7, 0x5b, 0x2e, 0x68, 0x90, 0xda, 0x58, 0x8f, 0xab, 0xb1, 0xa0, 0x3e, 0x3c,
-    0xd6, 0x54, 0x2a, 0xf3, 0xed, 0xed, 0xb2, 0x7e, 0x54, 0xab, 0x76, 0x70, 0xed, 0x34, 0xe5, 0x72, 0x31, 0x1b, 0x84,
-    0x03, 0x11, 0x13, 0x28, 0xd0, 0xd2, 0xca, 0x8a, 0x01, 0x86, 0x94, 0xe5, 0x28, 0x9f, 0x42, 0xee, 0xc5, 0x65, 0xa9,
-    0x53, 0x5f, 0x9e, 0xc9, 0xa0, 0x23, 0x9e, 0x7a, 0x92, 0xb1, 0x02, 0xac, 0xe6, 0x65, 0x5e, 0x42, 0x4b, 0x04, 0x98,
-    0xbf, 0x50, 0x39, 0x34, 0xc2, 0x02, 0x89, 0x42, 0xc3, 0x2c, 0x51, 0xc6, 0x67, 0x1e, 0xc6, 0xa0, 0xed, 0x9f, 0xd5,
-    0x62, 0x5f, 0xb9, 0x32, 0x3a, 0xf2, 0xa3, 0xa2, 0x1f, 0x50, 0xfd, 0x4c, 0x4a, 0xb0, 0x71, 0xf8, 0x11, 0xd8, 0xa8,
-    0x72, 0x3c, 0x49, 0x10, 0x3e, 0x8f, 0x73, 0x46, 0x9e, 0xc2, 0xa6, 0x84, 0x59, 0x9a, 0xb6, 0x91, 0x6a, 0x17, 0x99,
-    0x41, 0x28, 0x17, 0xe6, 0x1f, 0x1b, 0x67, 0x17, 0x69, 0xb8, 0xd4, 0x1a, 0xcc, 0x8f, 0x77, 0x26, 0x40, 0xe9, 0xf5,
-    0x75, 0x2a, 0x7c, 0xdc, 0x88, 0xec, 0x0d, 0x5d, 0x31, 0xee, 0x29, 0xa4, 0x02, 0x27, 0x22, 0x8b, 0x87, 0xce, 0x50,
-    0x68, 0x84, 0x43, 0x3a, 0x45, 0x2e, 0x5c, 0x63, 0xd3, 0x17, 0x3d, 0xed, 0x1b, 0x65, 0xa1, 0x93, 0x80, 0x10, 0x10,
-    0xb8, 0x1b, 0xd6, 0x54, 0xd6, 0xcb, 0x82, 0x84, 0x4a, 0xd1, 0xcf, 0x01, 0xfc, 0xc3, 0x48, 0x52, 0x00, 0xec, 0x87,
-    0x6a, 0xa4, 0x88, 0xb2, 0x2c, 0x70, 0x01, 0x68, 0xae, 0x03, 0x5c, 0x09, 0x5f, 0x18, 0xa8, 0x30, 0x3d, 0xcd, 0xca,
-    0x4a, 0xa1, 0x44, 0x9e, 0xae, 0x48, 0x59, 0x23, 0x99, 0x7c, 0x8e, 0x0e, 0x9f, 0xf2, 0xae, 0xdf, 0x4a, 0x3c, 0x74,
-    0xc1, 0x73, 0x58, 0x56, 0xf5, 0xfd, 0x4d, 0xc8, 0xc8, 0xb9, 0x06, 0x5d, 0x21, 0x85, 0xfe, 0x92, 0x93, 0xbc, 0xff,
-    0xc6, 0xaf, 0x6a, 0xa9, 0x31, 0x94, 0x7d, 0x5c, 0xd5, 0x0c, 0xcb, 0xcb, 0x69, 0x15, 0xa6, 0x20, 0xe0, 0xe6, 0x2c,
-    0x09, 0xe6, 0x52, 0x43, 0x80, 0x85, 0xed, 0x91, 0x56, 0x0a, 0x8a, 0x52, 0x87, 0x77, 0x9e, 0x83, 0x15, 0x60, 0x1c,
-    0x6a, 0xa9, 0x64, 0x1a, 0x49, 0x7c, 0xa9, 0x44, 0x81, 0x29, 0x0f, 0x06, 0xe0, 0xa7, 0x2e, 0x9e, 0x74, 0x5d, 0xba,
-    0x7e, 0x3c, 0xc1, 0xd4, 0x1e, 0x02, 0x3d, 0xf6, 0x36, 0xc0, 0x94, 0xa8, 0xeb, 0xb0, 0x9c, 0x38, 0x34, 0xad, 0x69,
-    0x16, 0x30, 0x63, 0x9a, 0xa0, 0x25, 0x9b, 0x60, 0xcb, 0x15, 0x60, 0x1f, 0x89, 0xed, 0x59, 0xad, 0x80, 0xd0, 0x35,
-    0x68, 0x60, 0xc8, 0x5d, 0x2a, 0xb4, 0x30, 0xeb, 0xb4, 0xa9, 0x08, 0xf7, 0x67, 0x8f, 0x49, 0x2b, 0x38, 0xf5, 0x52,
-    0x1a, 0xf8, 0x20, 0x3e, 0x4d, 0x30, 0xf1, 0x05, 0xb1, 0x02, 0x3b, 0x38, 0x68, 0x2d, 0x36, 0x05, 0x4e, 0xc5, 0x45,
-    0x4a, 0x61, 0x59, 0x51, 0x6a, 0xc3, 0x87, 0x14, 0xd9, 0xba, 0xcb, 0x23, 0xdd, 0x85, 0x58, 0x00, 0x3b, 0xfd, 0xc2,
-    0xa1, 0x83, 0xac, 0x97, 0x01, 0x83, 0x73, 0xad, 0x71, 0x10, 0xf8, 0xed, 0xed, 0xa4, 0x5f, 0x66, 0x48, 0xb9, 0x25,
-    0x56, 0x17, 0x90, 0xe3, 0x76, 0x58, 0xc0, 0x1d, 0x84, 0xa5, 0xb2, 0xc7, 0xf3, 0x72, 0x82, 0xcb, 0xa5, 0x2c, 0xe4,
-    0xc5, 0x74, 0x2c, 0x9a, 0xcf, 0xad, 0x34, 0x9b, 0x8e, 0xb7, 0xe2, 0x83, 0x82, 0xbf, 0xe7, 0xc4, 0xd2, 0xaa, 0xa7,
-    0xd4, 0x0a, 0x8f, 0x32, 0xb7, 0x64, 0x9d, 0x92, 0x5a, 0x6d, 0x37, 0x50, 0x8d, 0xf0, 0x34, 0x0d, 0x1b, 0x81, 0x10,
-    0x13, 0x5c, 0xfc, 0x61, 0x91, 0x89, 0x69, 0x6f, 0x09, 0xa9, 0x23, 0xec, 0x1e, 0xca, 0x09, 0x6e, 0x6b, 0x9e, 0x7d,
-    0x19, 0x4e, 0xd7, 0x33, 0xf7, 0xbe, 0xc1, 0xdc, 0x4f, 0x43, 0x66, 0x30, 0x7a, 0x2c, 0x13, 0x7e, 0x64, 0xec, 0xa3,
-    0x50, 0x55, 0xcf, 0xce, 0xc2, 0x4a, 0x64, 0x89, 0x6f, 0xc6, 0x51, 0x87, 0x71, 0x2a, 0x5a, 0x13, 0x64, 0xd7, 0xd7,
-    0xb9, 0xb9, 0x17, 0x28, 0x68, 0xea, 0xb1, 0x7a, 0x9c, 0xb6, 0x62, 0x67, 0x23, 0x12, 0xb9, 0xff, 0xa6, 0x16, 0x89,
-    0xac, 0xf8, 0x1c, 0x47, 0x5a, 0x73, 0x90, 0xfb, 0xec, 0x6c, 0x79, 0x93, 0x0a, 0xdd, 0xa2, 0xd1, 0x36, 0xf6, 0xa8,
-    0x3e, 0x90, 0xd4, 0x33, 0x2a, 0xb0, 0xaa, 0xb1, 0xb7, 0xb6, 0x5a, 0x22, 0xdd, 0x52, 0x29, 0x36, 0x0c, 0x69, 0x85,
-    0xcc, 0x18, 0x05, 0x83, 0x92, 0x22, 0x03, 0x35, 0xca, 0xd7, 0x08, 0x86, 0x7d, 0x6a, 0x00, 0x8a, 0x73, 0x75, 0xf5,
-    0xd3, 0x52, 0xb2, 0x85, 0x80, 0x04, 0x64, 0x13, 0x8a, 0x35, 0x62, 0x66, 0xe4, 0x93, 0x8f, 0xc0, 0x79, 0x3d, 0x8e,
-    0x8e, 0x01, 0xc8, 0x60, 0xb1, 0xe9, 0xc1, 0xc4, 0xb6, 0x89, 0x28, 0xfa, 0x6c, 0xe0, 0x25, 0x00, 0x3b, 0xad, 0x42,
-    0xa3, 0x1f, 0xaa, 0x14, 0x30, 0x64, 0x03, 0x37, 0xe0, 0x55, 0x58, 0x6e, 0xff, 0x25, 0xb4, 0x83, 0xc7, 0x17, 0xb2,
-    0xf9, 0x26, 0xe6, 0x09, 0x56, 0xb1, 0x3b, 0xbf, 0xb2, 0xac, 0xc5, 0xb9, 0xd3, 0xe1, 0x42, 0xbd, 0xa2, 0x84, 0xa8,
-    0x3d, 0xc0, 0xda, 0x97, 0x9c, 0x60, 0xc4, 0xe7, 0x37, 0x94, 0x75, 0xa8, 0xc6, 0x2d, 0xf7, 0x35, 0x5a, 0x84, 0xe9,
-    0x32, 0x69, 0x0c, 0x4a, 0xd6, 0xfd, 0x64, 0xc4, 0xbd, 0x3c, 0x10, 0xb1, 0xe0, 0x0a, 0x47, 0x23, 0x6c, 0xbe, 0x80,
-    0x24, 0x7d, 0xdb, 0xa7, 0x03, 0xf6, 0xcd, 0xc5, 0x5e, 0x40, 0x99, 0x8f, 0x15, 0xa9, 0x24, 0xa4, 0x34, 0xbb, 0x21,
-    0x92, 0x84, 0xb5, 0x22, 0x4f, 0x9d, 0x0f, 0x1c, 0xed, 0x73, 0x2b, 0x89, 0x60, 0x04, 0x27, 0x71, 0xba, 0xf2, 0x70,
-    0x51, 0x80, 0xab, 0xe8, 0x88, 0xe9, 0x9b, 0xa0, 0xfc, 0x06, 0xb9, 0xbd, 0x94, 0x5c, 0x5b, 0x68, 0x18, 0x9e, 0x21,
-    0xc1, 0xaa, 0x48, 0x04, 0x3a, 0x0a, 0x80, 0xe3, 0x4a, 0xcf, 0x03, 0x4c, 0xf8, 0xda, 0xde, 0x04, 0x80, 0x44, 0x56,
-    0x90, 0xb3, 0x14, 0xe8, 0x06, 0x2c, 0x57, 0xc7, 0xa9, 0x51, 0x91, 0xb8, 0xb8, 0x31, 0x5d, 0xdd, 0xd2, 0x9f, 0xa0,
-    0xe5, 0x4c, 0x86, 0x98, 0x0e, 0x82, 0x80, 0x4c, 0x7d, 0xca, 0x9d, 0x9c, 0xa6, 0x13, 0xd6, 0xe7, 0xd4, 0xa9, 0x4d,
-    0xdd, 0xe1, 0xd4, 0xcd, 0x93, 0xd4, 0x62, 0x75, 0xda, 0x94, 0x12, 0x31, 0x29, 0x31, 0x8f, 0x65, 0x2a, 0xb6, 0x12,
-    0x77, 0x6e, 0x7d, 0xa3, 0x85, 0xb4, 0xd1, 0x8e, 0x65, 0x0e, 0xb6, 0x96, 0xf7, 0x42, 0xb4, 0xbf, 0x24, 0xc2, 0xb3,
-    0x12, 0x19, 0x6b, 0x3e, 0xe3, 0x8e, 0x89, 0x60, 0xf5, 0x60, 0x2a, 0xf2, 0x0f, 0x8e, 0x4e, 0xb3, 0x37, 0xe8, 0x41,
-    0xea, 0x0d, 0x24, 0x66, 0x4d, 0x7c, 0xe7, 0xd2, 0x50, 0x47, 0x08, 0x54, 0x46, 0xb5, 0x4c, 0xc7, 0x89, 0xa5, 0xe2,
-    0x92, 0x7c, 0xf5, 0x5e, 0x1f, 0xe7, 0x1b, 0xdf, 0x17, 0x56, 0x23, 0x88, 0xc1, 0x5b, 0x28, 0xfa, 0x9e, 0x14, 0xe1,
-    0x39, 0x2c, 0xcf, 0xf6, 0x76, 0xa7, 0xd8, 0x63, 0x55, 0x88, 0xa4, 0x82, 0x31, 0xc6, 0x8c, 0x62, 0xdc, 0x13, 0x35,
-    0xb5, 0x88, 0xc4, 0x96, 0xad, 0xc3, 0x02, 0x0f, 0x00, 0xa0, 0xa5, 0x29, 0xbd, 0xcc, 0xb6, 0xea, 0x3c, 0x97, 0xf0,
-    0x31, 0xf2, 0x50, 0x64, 0xe3, 0xf7, 0x6b, 0x32, 0x50, 0x10, 0xee, 0x8d, 0x96, 0x87, 0x89, 0x71, 0xb0, 0x8a, 0x42,
-    0x16, 0xe8, 0x0d, 0xda, 0xa9, 0x12, 0xa1, 0xb8, 0x39, 0x59, 0x87, 0x1b, 0x4e, 0x2a, 0xd8, 0x42, 0x25, 0x2c, 0x95,
-    0x16, 0xf8, 0xd5, 0x46, 0x58, 0x3c, 0x65, 0xdc, 0x7f, 0x53, 0xe1, 0x0c, 0xfa, 0x83, 0x7b, 0xcb, 0x8c, 0xfa, 0x7e,
-    0xe9, 0x44, 0xa6, 0x02, 0x13, 0x37, 0xb3, 0xd4, 0x7e, 0xbf, 0xac, 0xd2, 0x7e, 0x5e, 0x2e, 0xf7, 0x39, 0x69, 0xbe,
-    0xd6, 0x1d, 0x34, 0x9f, 0x0c, 0xf7, 0x2b, 0xe5, 0x87, 0x16, 0x46, 0x4d, 0xf9, 0xd5, 0x97, 0x34, 0xcc, 0x3d, 0x15,
-    0xde, 0xea, 0xb6, 0x51, 0xe8, 0xa2, 0x3e, 0x07, 0x43, 0x48, 0x7f, 0x05, 0xd7, 0xd0, 0xe0, 0x41, 0x91, 0x2c, 0x16,
-    0x6b, 0x17, 0xc4, 0xf5, 0x31, 0xa7, 0xda, 0xa1, 0x8c, 0x31, 0xe2, 0x69, 0xc9, 0x41, 0x92, 0xc1, 0xc1, 0xf8, 0x0d,
-    0x0c, 0x88, 0x49, 0x49, 0x48, 0x87, 0xd0, 0x59, 0x99, 0x89, 0xa8, 0xdc, 0xc5, 0xdb, 0x8d, 0xcb, 0x9a, 0x42, 0x11,
-    0x76, 0x82, 0x99, 0x4a, 0xa9, 0x20, 0x90, 0x26, 0xdf, 0x46, 0xab, 0x16, 0x0c, 0x05, 0xd1, 0x60, 0x28, 0x20, 0x0f,
-    0xd3, 0x55, 0xc2, 0x8d, 0x8f, 0xe2, 0xe0, 0x79, 0x85, 0x1a, 0xf1, 0x52, 0x83, 0xaf, 0x61, 0xf3, 0xd7, 0x44, 0x49,
-    0x11, 0x72, 0x11, 0x7b, 0x05, 0x9f, 0x08, 0xd9, 0x94, 0x87, 0x39, 0xd0, 0x0f, 0xed, 0xca, 0x4e, 0xb6, 0x97, 0x57,
-    0x2e, 0x2d, 0x1a, 0x5b, 0x89, 0x9a, 0xb5, 0x38, 0x8a, 0xb7, 0xb3, 0x3e, 0x4c, 0x4d, 0x09, 0x04, 0xa4, 0xa9, 0x9c,
-    0xa4, 0x9a, 0xf7, 0x28, 0xeb, 0x03, 0x48, 0xb0, 0xfb, 0x09, 0x2c, 0xf4, 0x9b, 0x12, 0x13, 0x2c, 0xaa, 0xc6, 0x6e,
-    0x53, 0xd0, 0x9a, 0x53, 0xd2, 0x7c, 0x53, 0x84, 0x70, 0x5b, 0x59, 0xcf, 0x98, 0x1d, 0x60, 0xdb, 0xee, 0x76, 0x7e,
-    0x94, 0x6d, 0xb7, 0xfa, 0x86, 0xe0, 0xc2, 0xe3, 0xff, 0xa4, 0xc4, 0x34, 0x90, 0x42, 0xea, 0xc6, 0x4f, 0xa8, 0xc3,
-    0x3e, 0x91, 0x3a, 0x11, 0x03, 0x9a, 0xab, 0xb1, 0xe8, 0xdc, 0x6b, 0x8e, 0x92, 0xcb, 0xaa, 0xda, 0xd5, 0x12, 0x34,
-    0x74, 0x23, 0x19, 0x13, 0xc5, 0x3c, 0x27, 0x00, 0x46, 0xb1, 0xf9, 0x73, 0xae, 0x93, 0xbc, 0x7f, 0x59, 0x99, 0xda,
-    0xed, 0xfb, 0x7e, 0x94, 0x9f, 0xd1, 0x91, 0x8a, 0xca, 0xe6, 0x24, 0xe6, 0xdf, 0x95, 0x60, 0x1a, 0x13, 0x1f, 0xe9,
-    0xb9, 0xfa, 0xa1, 0x00, 0x5f, 0xd9, 0x50, 0x6a, 0xb6, 0xd7, 0xbf, 0x75, 0xb6, 0x07, 0x72, 0x36, 0xc1, 0x02, 0x0b,
-    0x74, 0x59, 0x83, 0x2f, 0x60, 0x19, 0xdc, 0x91, 0x7e, 0x0a, 0xbe, 0x9f, 0xd6, 0xc1, 0x67, 0xec, 0x7f, 0x01, 0x68,
-    0x55, 0x60, 0x40, 0xf9, 0x70, 0xd1, 0xb0, 0x12, 0xe2, 0x12, 0x15, 0x66, 0x15, 0xe7, 0x8f, 0xeb, 0xbc, 0x6e, 0x5a,
-    0x96, 0x18, 0x94, 0x9f, 0xba, 0x86, 0x1b, 0xdf, 0x59, 0xc8, 0x1f, 0xdf, 0x7f, 0x09, 0xba, 0x9d, 0x48, 0xbb, 0xb5,
-    0x55, 0x6c, 0x90, 0x85, 0x86, 0xf7, 0xc2, 0xa6, 0xd0, 0x16, 0x2f, 0x02, 0x14, 0xea, 0x3b, 0x16, 0xe3, 0x6d, 0x11,
-    0x2a, 0xc3, 0x2f, 0x58, 0x30, 0x05, 0x0c, 0xc1, 0x63, 0xa7, 0x32, 0xf9, 0x1d, 0x36, 0x9a, 0x62, 0xd7, 0x42, 0x18,
-    0x7c, 0x39, 0xa8, 0x4a, 0xc9, 0x8b, 0x75, 0xb2, 0xbd, 0x38, 0x87, 0xef, 0xaf, 0xe3, 0x02, 0xa8, 0x83, 0xe8, 0x6b,
-    0x2a, 0x8b, 0x0d, 0xe4, 0xe2, 0xa6, 0xac, 0xf5, 0x8a, 0x86, 0xc3, 0x1b, 0xbb, 0xf0, 0xba, 0x02, 0x1f, 0x47, 0xe9,
-    0x30, 0x11, 0x93, 0x98, 0x49, 0x95, 0x2b, 0x72, 0x6d, 0x74, 0x2f, 0x6d, 0xd1, 0xbc, 0x14, 0x12, 0xbc, 0x22, 0xf0,
-    0x82, 0xd0, 0x57, 0xfa, 0x72, 0xb5, 0x81, 0x82, 0x47, 0xed, 0x8b, 0x8b, 0x60, 0x62, 0xe2, 0x71, 0x43, 0x6a, 0xfa,
-    0x75, 0x38, 0xb5, 0xb2, 0x58, 0x72, 0xf8, 0x75, 0xce, 0xd8, 0x82, 0x02, 0x20, 0x3e, 0x79, 0xb4, 0xde, 0x4d, 0x7a,
-    0xa3, 0xb4, 0x83, 0xd2, 0x08, 0xf1, 0x5d, 0x85, 0xaf, 0x3b, 0x57, 0x7c, 0xe5, 0xaa, 0x7b, 0x5f, 0x57, 0xdc, 0xb8,
-    0x60, 0xf4, 0x92, 0x4f, 0x92, 0x85, 0x6b, 0x37, 0x74, 0x57, 0xe7, 0x3b, 0xef, 0x0b, 0x99, 0xb7, 0x70, 0x05, 0x76,
-    0xfe, 0x15, 0x77, 0x5e, 0x7a, 0x1f, 0x8c, 0x13, 0xe5, 0xef, 0xcd, 0x23, 0x5e, 0x39, 0xcc, 0xaa, 0x93, 0xe4, 0xef,
-    0x7b, 0xdf, 0x07, 0xeb, 0x5b, 0x1a, 0x27, 0xc8, 0x6d, 0x75, 0x82, 0x4c, 0x94, 0x1b, 0xe9, 0x0d, 0xb7, 0x7f, 0x57,
-    0x81, 0x20, 0x4e, 0xc5, 0xf4, 0x51, 0x39, 0xae, 0x1f, 0x2d, 0x50, 0xa9, 0x88, 0xf8, 0x5c, 0xe5, 0xae, 0xac, 0x4d,
-    0x0d, 0xf5, 0x98, 0x4e, 0x66, 0xa1, 0x69, 0x56, 0xe4, 0x52, 0x2e, 0x7a, 0x8c, 0x5c, 0xb3, 0x53, 0x6d, 0x7e, 0x77,
-    0xed, 0x21, 0x1d, 0xc7, 0xfb, 0x9e, 0xb5, 0x5a, 0x70, 0xbf, 0xab, 0x28, 0xbc, 0xeb, 0xc5, 0x46, 0x2a, 0x43, 0xcd,
-    0x7a, 0x14, 0x7d, 0x1c, 0x77, 0x31, 0x97, 0x47, 0xd9, 0x9f, 0x35, 0x00, 0x4c, 0x47, 0x58, 0x74, 0x37, 0x3d, 0x63,
-    0x4f, 0xa0, 0xa7, 0x27, 0x32, 0x48, 0xf4, 0x56, 0xe7, 0xab, 0x56, 0x89, 0xa5, 0x2b, 0x08, 0xec, 0xde, 0x90, 0xb1,
-    0x2a, 0x69, 0xb7, 0x5c, 0xbf, 0x9c, 0xe7, 0xf3, 0x9c, 0x2f, 0xe5, 0xf9, 0xd4, 0x2c, 0xba, 0x8d, 0xa6, 0x7b, 0x73,
-    0x6a, 0xa8, 0x98, 0x6b, 0x75, 0x93, 0xdf, 0x30, 0x5d, 0x0b, 0x43, 0x2d, 0x82, 0xcc, 0x6a, 0x57, 0xbd, 0x28, 0xcb,
-    0x51, 0x3d, 0x93, 0x63, 0x24, 0x7c, 0x53, 0xe9, 0x0e, 0xd1, 0x0d, 0x53, 0x35, 0xd3, 0x77, 0x0b, 0xdb, 0x42, 0xb6,
-    0x79, 0x79, 0x35, 0xcc, 0x81, 0xd2, 0x72, 0x7f, 0x99, 0x30, 0x7c, 0x77, 0x7d, 0xfd, 0x9d, 0x90, 0x53, 0x55, 0x47,
-    0x6f, 0xfe, 0x5a, 0xf7, 0x0c, 0x46, 0xa5, 0x72, 0x22, 0x4e, 0xf9, 0xea, 0xc1, 0x17, 0x77, 0xaf, 0x80, 0xe5, 0x14,
-    0xb0, 0x3b, 0xe5, 0xce, 0xc2, 0x50, 0xd5, 0x06, 0xfe, 0x62, 0xf5, 0x60, 0xab, 0xf6, 0xf0, 0x17, 0xbd, 0x2f, 0x82,
-    0x1b, 0x1b, 0x1b, 0xdb, 0x78, 0xb7, 0x96, 0x08, 0xf2, 0x16, 0x0f, 0xf4, 0xf1, 0xea, 0xa3, 0xa0, 0xe5, 0x0a, 0xb1,
-    0xcd, 0x7a, 0x0e, 0x85, 0xad, 0x41, 0xbe, 0x49, 0x99, 0x34, 0x98, 0x15, 0x3c, 0x9b, 0xc8, 0x19, 0x0a, 0x79, 0xcd,
-    0xc7, 0x41, 0xdb, 0x11, 0xfe, 0x0f, 0x9c, 0xda, 0xf1, 0xf2, 0xfc, 0x13, 0xf4, 0x01, 0x4f, 0x57, 0x4a, 0x53, 0x8a,
-    0x53, 0xaa, 0xa0, 0xce, 0x72, 0x9d, 0x07, 0x23, 0xc5, 0xc5, 0x18, 0x16, 0x17, 0x5c, 0x96, 0x1b, 0x67, 0x23, 0xa7,
-    0xbf, 0xc4, 0xab, 0x8b, 0x74, 0xf9, 0x48, 0x64, 0xab, 0x96, 0xde, 0x2b, 0x7d, 0xba, 0x6d, 0x4f, 0x18, 0x1f, 0x67,
-    0x43, 0x3a, 0x98, 0xf1, 0x71, 0x22, 0xbc, 0x3e, 0x31, 0xd4, 0x77, 0x8b, 0xc0, 0x74, 0x73, 0x6c, 0xf2, 0xc3, 0xf1,
-    0x7a, 0xb3, 0x59, 0xe3, 0xf6, 0xde, 0x39, 0x9f, 0x9c, 0x79, 0x89, 0x11, 0x95, 0xb9, 0x86, 0x07, 0xb4, 0x42, 0xbc,
-    0x78, 0xcf, 0x04, 0xc6, 0x65, 0x57, 0x24, 0xb5, 0xdd, 0x40, 0xe0, 0x62, 0x8f, 0x62, 0x96, 0x0c, 0x6d, 0x0f, 0xca,
-    0x03, 0x7d, 0x31, 0x9a, 0x6e, 0x01, 0xd3, 0xf2, 0xda, 0xd9, 0x45, 0x6a, 0x7b, 0xd5, 0x54, 0x01, 0xcc, 0x92, 0xe5,
-    0xf1, 0x19, 0xb2, 0xee, 0x57, 0xd0, 0x45, 0x0c, 0x18, 0x1b, 0x57, 0xe6, 0xdc, 0xf9, 0xaa, 0x15, 0xf1, 0x8d, 0x26,
-    0xd2, 0xa4, 0x3e, 0xa2, 0xbe, 0xfd, 0xb0, 0x56, 0x57, 0x39, 0x48, 0xe0, 0x1e, 0x79, 0x77, 0xc4, 0xa5, 0xa3, 0xcf,
-    0x2c, 0x36, 0xab, 0xf4, 0x2d, 0x75, 0x2d, 0x6e, 0x31, 0xec, 0x15, 0xf7, 0xc0, 0xfe, 0xc0, 0xb8, 0x45, 0x2c, 0xe2,
-    0xed, 0xac, 0x96, 0xc2, 0xba, 0x30, 0x47, 0x8e, 0xb1, 0xf6, 0xe0, 0x15, 0xaf, 0xd6, 0x0c, 0xcc, 0x30, 0xe3, 0x8c,
-    0xe4, 0x8d, 0x71, 0xaf, 0x6a, 0xd3, 0x91, 0xab, 0x00, 0xa2, 0x6f, 0x4e, 0x97, 0xe4, 0xf0, 0x4a, 0x96, 0xab, 0xce,
-    0x90, 0x7f, 0x86, 0x75, 0xd6, 0x8b, 0x13, 0x70, 0x93, 0xa6, 0xac, 0xc4, 0xc4, 0x14, 0x71, 0xb9, 0x59, 0xc6, 0x3c,
-    0x4d, 0x9f, 0x45, 0x3b, 0x38, 0x85, 0x91, 0xc0, 0x11, 0xfb, 0xc6, 0x32, 0x2c, 0x26, 0x6c, 0xc4, 0x44, 0x1a, 0x95,
-    0x52, 0xc2, 0x7a, 0x72, 0xa9, 0x25, 0x7f, 0x99, 0xcb, 0xab, 0x2f, 0xb7, 0x09, 0x0e, 0x28, 0x6a, 0x60, 0x39, 0x34,
-    0x8e, 0x5b, 0x06, 0x12, 0xb1, 0x18, 0x10, 0xa3, 0x56, 0xe5, 0x72, 0x32, 0xaa, 0x93, 0xfa, 0x0a, 0xb9, 0x50, 0x91,
-    0x07, 0xb7, 0x04, 0x4a, 0xfe, 0x02, 0x53, 0x07, 0xd3, 0x52, 0xbb, 0x69, 0xb1, 0x49, 0xf2, 0x8e, 0x19, 0x90, 0x5c,
-    0x7d, 0x0d, 0x0f, 0x8d, 0x5f, 0x86, 0x37, 0x14, 0x3d, 0x1d, 0x23, 0xe4, 0xb4, 0x34, 0xe6, 0xd2, 0x7f, 0x23, 0xcf,
-    0xbe, 0x24, 0x60, 0x3f, 0x83, 0x98, 0x32, 0x70, 0x89, 0x8d, 0x0b, 0x92, 0xf2, 0x5a, 0x9e, 0xb2, 0xfb, 0x16, 0x94,
-    0xef, 0x92, 0x49, 0x57, 0xa9, 0xac, 0x35, 0x56, 0xdd, 0xcf, 0x33, 0x96, 0x5f, 0x1d, 0x30, 0xcc, 0x4d, 0x46, 0x83,
-    0x6c, 0xc9, 0xcc, 0xa6, 0xfc, 0x6a, 0xef, 0xc6, 0xb7, 0x3c, 0x94, 0x74, 0xa8, 0x56, 0xe9, 0xe6, 0xa5, 0x1b, 0x8e,
-    0xf1, 0xc2, 0x0d, 0xc7, 0xb8, 0x43, 0xe7, 0xca, 0x15, 0xa9, 0x75, 0xfe, 0xfb, 0x52, 0xf8, 0x49, 0xec, 0xb5, 0xbe,
-    0xde, 0x75, 0xfd, 0x95, 0xe9, 0xe9, 0x37, 0xa0, 0x6a, 0x64, 0x09, 0xdd, 0x84, 0x2a, 0x26, 0x23, 0x51, 0x62, 0xba,
-    0x4a, 0x79, 0xd4, 0xd7, 0x88, 0x0b, 0x10, 0x37, 0x94, 0xbf, 0xf8, 0x97, 0xf0, 0xe2, 0x24, 0x40, 0x23, 0x6a, 0x3e,
-    0xca, 0x52, 0xde, 0x18, 0x45, 0x93, 0x38, 0xb9, 0x0a, 0x66, 0x71, 0x63, 0x92, 0xa5, 0x59, 0x31, 0x05, 0xae, 0xf4,
-    0x8a, 0x2b, 0xb0, 0xe1, 0x27, 0x8d, 0x59, 0xec, 0xbd, 0x64, 0xc9, 0x39, 0xe3, 0xf1, 0x20, 0xf2, 0xec, 0xfd, 0x1c,
-    0xc4, 0x83, 0xf5, 0x36, 0xca, 0xf3, 0xec, 0xc2, 0xf6, 0x3e, 0x64, 0xa7, 0xc0, 0xb4, 0xde, 0xbb, 0xcb, 0xab, 0x33,
-    0x96, 0x7a, 0x1f, 0x4f, 0x67, 0x29, 0x9f, 0x79, 0x45, 0x94, 0x16, 0x8d, 0x82, 0xe5, 0xf1, 0x08, 0xd4, 0x44, 0x92,
-    0xe5, 0x0d, 0xcc, 0x7f, 0x9e, 0xb0, 0x20, 0x89, 0xcf, 0xc6, 0xdc, 0x1a, 0x46, 0xf9, 0xa7, 0x4e, 0xa3, 0x31, 0xcd,
-    0xe3, 0x49, 0x94, 0x5f, 0x35, 0xa8, 0x45, 0x70, 0xaf, 0xb9, 0x1b, 0x7d, 0x36, 0x7a, 0xd0, 0xe1, 0x39, 0xf4, 0x8d,
-    0x91, 0x8a, 0x01, 0x08, 0x1f, 0x6b, 0xf7, 0x61, 0x73, 0x52, 0x6c, 0x88, 0x13, 0xa5, 0x28, 0xe5, 0xe5, 0x89, 0x77,
-    0x01, 0xb6, 0xed, 0x89, 0x7f, 0xca, 0x53, 0x0f, 0x7c, 0x39, 0x9e, 0xa5, 0xf3, 0xc1, 0x2c, 0x2f, 0x60, 0x80, 0x69,
-    0x16, 0xa7, 0x9c, 0xe5, 0x9d, 0xd3, 0x2c, 0x07, 0xb2, 0x35, 0xf2, 0x68, 0x18, 0xcf, 0x8a, 0xe0, 0xc1, 0xf4, 0xb2,
-    0x83, 0xb6, 0xc2, 0x59, 0x9e, 0xcd, 0xd2, 0xa1, 0x9c, 0x2b, 0x4e, 0x61, 0x63, 0xc4, 0xdc, 0xac, 0xa0, 0x37, 0xa1,
-    0x00, 0x7c, 0x29, 0x8b, 0xf2, 0xc6, 0x19, 0x76, 0x46, 0x43, 0xbf, 0x39, 0x64, 0x67, 0x5e, 0x7e, 0x76, 0x1a, 0x39,
-    0xad, 0xf6, 0x63, 0x4f, 0xfd, 0xf9, 0x0f, 0x5d, 0x30, 0xdc, 0x57, 0x16, 0xb7, 0x9a, 0xcd, 0xbf, 0x71, 0x3b, 0x0b,
-    0xb3, 0x10, 0x40, 0x41, 0x6b, 0x7a, 0x69, 0x15, 0x59, 0x02, 0xeb, 0xb3, 0xaa, 0x67, 0x67, 0x0a, 0x7e, 0x53, 0x9c,
-    0x9e, 0x05, 0xed, 0xe9, 0x65, 0x89, 0xd8, 0x05, 0x22, 0x21, 0x53, 0x22, 0x29, 0x9f, 0xe6, 0xbf, 0x15, 0xe2, 0x27,
-    0xab, 0x21, 0x6e, 0x2b, 0x88, 0x2b, 0xaa, 0x37, 0x86, 0xb0, 0x0f, 0x88, 0xfc, 0xad, 0x42, 0x00, 0x32, 0x06, 0x27,
-    0x30, 0x57, 0x70, 0xd0, 0xc3, 0x6f, 0x06, 0xa3, 0xbd, 0x1a, 0x8c, 0x27, 0xb7, 0x81, 0x91, 0xa7, 0xc3, 0x79, 0x7d,
-    0x5d, 0x5b, 0xe0, 0x9c, 0x76, 0xc6, 0x0c, 0xf9, 0x29, 0x68, 0xe3, 0xf7, 0x8b, 0x78, 0xc8, 0xc7, 0xe2, 0x2b, 0xb1,
-    0xf3, 0x85, 0xa8, 0x7b, 0xd8, 0x6c, 0x8a, 0xe7, 0x02, 0x14, 0x5a, 0xd0, 0xf2, 0xb1, 0x01, 0x30, 0xd1, 0xe7, 0xeb,
-    0x5e, 0x62, 0xf3, 0xed, 0xad, 0x6f, 0xaa, 0xf1, 0xb8, 0xca, 0x1b, 0x14, 0x2a, 0x42, 0xbd, 0xb3, 0x05, 0x33, 0xde,
-    0x8a, 0x6e, 0x4b, 0x1f, 0x54, 0xf5, 0xbe, 0xe5, 0xa4, 0xf5, 0x02, 0xe6, 0x99, 0xb9, 0x40, 0x9d, 0xac, 0x8b, 0x21,
-    0xa9, 0x46, 0xc3, 0x05, 0xbd, 0xc1, 0x31, 0x84, 0x44, 0x07, 0x82, 0x4e, 0xd1, 0xcb, 0xe9, 0x9d, 0x1a, 0xa9, 0x1b,
-    0xe4, 0x4e, 0xea, 0xc2, 0x96, 0x4f, 0xb5, 0x5c, 0x2f, 0xb6, 0xb6, 0xc0, 0xcb, 0xfe, 0x9c, 0xcb, 0x06, 0x20, 0xbd,
-    0x2b, 0x49, 0x6b, 0xbc, 0x87, 0x44, 0xb9, 0x7c, 0xd9, 0x80, 0x28, 0x07, 0xbe, 0x3e, 0x1f, 0xa3, 0xdf, 0xad, 0xaf,
-    0xae, 0x1b, 0x29, 0x35, 0x3b, 0xb6, 0xdb, 0xe3, 0x3a, 0x2b, 0x0b, 0xb3, 0xcf, 0x78, 0x89, 0xa3, 0x7c, 0xc9, 0x43,
-    0x1c, 0xd1, 0x7b, 0x15, 0x0a, 0x37, 0x4d, 0x39, 0x69, 0xa3, 0xbb, 0x3a, 0x69, 0xf0, 0x35, 0xa6, 0xcc, 0x67, 0x15,
-    0x27, 0x07, 0x37, 0xe6, 0x78, 0x20, 0xae, 0x20, 0x16, 0x55, 0x96, 0x7d, 0x44, 0xd0, 0x0b, 0xbf, 0x0b, 0x94, 0x14,
-    0x46, 0x2e, 0xbf, 0xe2, 0xbf, 0xc3, 0xe3, 0x70, 0x34, 0xfa, 0x45, 0x36, 0xcb, 0x07, 0x78, 0x39, 0x60, 0x45, 0x28,
-    0xc2, 0x26, 0x4b, 0xc0, 0xf6, 0xb8, 0x56, 0x40, 0x0c, 0xf3, 0x2c, 0xcc, 0xb7, 0x2f, 0x30, 0x3a, 0x9d, 0x11, 0x97,
-    0x1f, 0x64, 0xf8, 0x45, 0xa1, 0x84, 0x3a, 0x75, 0x48, 0x89, 0x78, 0x74, 0x31, 0xd4, 0x9f, 0xa5, 0x31, 0x88, 0xe0,
-    0xe3, 0x78, 0x48, 0x17, 0x62, 0xe2, 0x21, 0x9d, 0x90, 0x34, 0x28, 0x23, 0x0a, 0x43, 0xee, 0x50, 0x20, 0x17, 0x06,
-    0xbf, 0xcb, 0x0c, 0x1b, 0xbb, 0x61, 0xe3, 0x29, 0x87, 0xa1, 0xc3, 0x87, 0xd9, 0x24, 0x8a, 0xd3, 0x00, 0x5f, 0x5c,
-    0xe2, 0xe9, 0x11, 0x03, 0xec, 0xe2, 0xc1, 0xa7, 0x5a, 0xa3, 0x96, 0xeb, 0xff, 0x04, 0x02, 0x8e, 0xfa, 0x63, 0x32,
-    0x0b, 0x91, 0x55, 0x10, 0x31, 0x54, 0x64, 0xde, 0x57, 0x7a, 0xde, 0x33, 0xab, 0x55, 0xcc, 0xb4, 0xbe, 0x0e, 0xcd,
-    0x85, 0xe5, 0xd2, 0x67, 0xd8, 0xf5, 0x52, 0x10, 0xac, 0x5c, 0xe7, 0xd1, 0x53, 0x10, 0x67, 0x8f, 0xd1, 0x47, 0xaf,
-    0xd1, 0x0a, 0x5a, 0xda, 0x2f, 0xaf, 0x5d, 0xb5, 0x15, 0x89, 0x3a, 0xf2, 0xba, 0x26, 0xe1, 0xa1, 0xbf, 0x0b, 0x5c,
-    0xab, 0x67, 0x8d, 0xaf, 0x27, 0x37, 0x1d, 0x46, 0xa7, 0xce, 0x52, 0xa7, 0x06, 0x04, 0x1d, 0x74, 0xac, 0x99, 0xca,
-    0x2d, 0x2b, 0xbc, 0xb5, 0xf1, 0x67, 0x0b, 0xcd, 0x89, 0xaf, 0x1e, 0x90, 0x33, 0xd2, 0x2b, 0x9e, 0x56, 0xf0, 0x5d,
-    0x29, 0x09, 0xb2, 0x78, 0x21, 0x7f, 0xa1, 0x99, 0x00, 0xe5, 0x4a, 0x1f, 0x64, 0x2f, 0xd4, 0x8a, 0x47, 0x26, 0x22,
-    0xde, 0xab, 0x9b, 0x50, 0xd6, 0xd8, 0x32, 0x5c, 0xe8, 0x8b, 0x16, 0x5c, 0xc1, 0x8f, 0x06, 0xd3, 0x88, 0xe1, 0xbd,
-    0x94, 0x93, 0xcd, 0xf9, 0x97, 0xbc, 0xdc, 0xd9, 0x9c, 0xab, 0x86, 0xe2, 0x7b, 0x3c, 0xc4, 0x4f, 0x06, 0xf2, 0x6b,
-    0x2e, 0xac, 0xc7, 0xc0, 0x7e, 0xff, 0xee, 0xe0, 0xd0, 0xf6, 0x4e, 0xb3, 0xe1, 0x55, 0x60, 0xc3, 0xee, 0x64, 0x76,
-    0xe9, 0xfa, 0x7c, 0xcc, 0x52, 0x47, 0xb1, 0x78, 0x96, 0x30, 0x90, 0x08, 0x67, 0xe2, 0xb2, 0xe3, 0xa2, 0xe7, 0x3b,
-    0x3c, 0xd9, 0xa3, 0xb7, 0x21, 0x75, 0xf7, 0xb8, 0x78, 0x51, 0x18, 0xcf, 0xf1, 0x6b, 0x17, 0x63, 0xff, 0x7b, 0x3b,
-    0xf0, 0x05, 0x1f, 0x0e, 0x70, 0xcf, 0xd0, 0xd3, 0xe6, 0x7c, 0x89, 0x93, 0x7a, 0x38, 0xc4, 0xb8, 0x2b, 0x50, 0x28,
-    0xa8, 0xd5, 0x49, 0x30, 0x3c, 0x39, 0x29, 0xe1, 0x2b, 0x8c, 0xb5, 0xa3, 0xc6, 0x45, 0x08, 0x55, 0x7f, 0xcd, 0x5d,
-    0xf2, 0x75, 0x3b, 0x38, 0x04, 0xce, 0x3b, 0xc4, 0x06, 0xc4, 0x5d, 0xd8, 0x7b, 0xa8, 0x4b, 0x68, 0xd3, 0x8a, 0xa2,
-    0x75, 0x10, 0x88, 0x86, 0x15, 0xd3, 0x8b, 0x10, 0x61, 0xb5, 0xba, 0x0a, 0xa4, 0xa1, 0x09, 0xdd, 0x89, 0x8b, 0x9f,
-    0x04, 0x19, 0x7c, 0x12, 0x1d, 0x4e, 0xcc, 0x37, 0x84, 0x88, 0xcb, 0xfc, 0x9a, 0x5a, 0x47, 0x7f, 0x01, 0xdb, 0xc3,
-    0xbb, 0x38, 0xa1, 0x96, 0x4a, 0x1d, 0xa1, 0x9d, 0x84, 0x6a, 0xbb, 0xa9, 0xec, 0x0e, 0xd0, 0xfd, 0x49, 0x34, 0x2d,
-    0x58, 0xa0, 0xbe, 0x48, 0xcd, 0x84, 0x0a, 0x6e, 0xd9, 0x14, 0x90, 0x79, 0x31, 0xcf, 0xd0, 0x60, 0x58, 0xb6, 0x53,
-    0x40, 0xf4, 0x39, 0x8d, 0xc6, 0xa0, 0x71, 0x7a, 0xe6, 0x96, 0x7c, 0x3c, 0x37, 0xf5, 0xda, 0x23, 0xd0, 0x6b, 0x98,
-    0x93, 0xd7, 0x00, 0x4f, 0xed, 0x2c, 0x0d, 0x12, 0x36, 0xe2, 0x25, 0xc7, 0x4b, 0x5f, 0x73, 0x65, 0x48, 0xf8, 0xed,
-    0x87, 0xa0, 0xeb, 0x2c, 0x1f, 0xff, 0xbd, 0x79, 0x62, 0xe8, 0x18, 0xa4, 0xa0, 0x9b, 0x28, 0x0b, 0x14, 0x33, 0xec,
-    0x01, 0x5c, 0xf3, 0x79, 0x6e, 0x4c, 0x34, 0x60, 0x68, 0x64, 0x95, 0x1c, 0x64, 0xf2, 0xd8, 0xe3, 0xb9, 0xd9, 0x2e,
-    0x75, 0xe7, 0x4b, 0x18, 0x2c, 0xeb, 0xfa, 0x5d, 0xb7, 0x2c, 0xc8, 0x64, 0x5d, 0x6e, 0xac, 0x0c, 0xa6, 0xfa, 0xd3,
-    0x12, 0xf9, 0x0c, 0xd3, 0xae, 0x14, 0xc1, 0xd2, 0xb9, 0xe8, 0x71, 0x17, 0x62, 0xd6, 0x8c, 0x4e, 0xcf, 0xec, 0xe1,
-    0x96, 0x71, 0x3a, 0x9d, 0xf1, 0x23, 0x0a, 0xd4, 0xe6, 0x78, 0x9d, 0xa0, 0x3f, 0x17, 0x73, 0x83, 0x17, 0x3c, 0x70,
-    0x10, 0x00, 0xab, 0x61, 0x3d, 0x01, 0x6a, 0xba, 0xca, 0xf0, 0xf0, 0x1f, 0x23, 0x71, 0x4b, 0x9f, 0x5a, 0xaf, 0xa0,
-    0xd2, 0x09, 0x58, 0xdd, 0x1d, 0xce, 0x9d, 0xa3, 0x37, 0x8e, 0xdb, 0xf7, 0x5e, 0x19, 0x2f, 0x2f, 0xb1, 0xd5, 0x1e,
-    0xb0, 0x3d, 0xa4, 0xf7, 0xca, 0x26, 0x26, 0x93, 0x53, 0xb3, 0x57, 0x21, 0x36, 0x7c, 0xeb, 0xd8, 0xac, 0x98, 0x36,
-    0x84, 0x48, 0x6a, 0x10, 0x33, 0xda, 0xd8, 0x55, 0x05, 0x56, 0xbf, 0xe2, 0x73, 0x92, 0x36, 0x5c, 0xbf, 0x29, 0xe4,
-    0x88, 0xf7, 0xcd, 0x5b, 0x2d, 0xb5, 0x80, 0x3a, 0xd4, 0xb9, 0x86, 0xe4, 0x83, 0x47, 0xf9, 0xd6, 0x1b, 0x25, 0x37,
-    0x4e, 0xf6, 0xeb, 0x92, 0x0c, 0xf6, 0x59, 0xa9, 0xdf, 0xa8, 0x06, 0x5a, 0x18, 0xe7, 0x87, 0x8d, 0x24, 0xf7, 0xdd,
-    0x53, 0xb2, 0x12, 0x55, 0x1c, 0x9c, 0xae, 0x2c, 0xaa, 0x13, 0x0d, 0xa1, 0x50, 0x63, 0x3c, 0x77, 0xad, 0x25, 0xdd,
-    0x76, 0x2a, 0x59, 0x24, 0x6c, 0x4c, 0x8b, 0xf0, 0x08, 0x6d, 0x30, 0xfa, 0x6c, 0xeb, 0xcf, 0x03, 0x50, 0x7f, 0x9f,
-    0x42, 0x7b, 0x73, 0xee, 0xb8, 0xab, 0xef, 0xcd, 0x29, 0xcf, 0x50, 0x49, 0x61, 0x23, 0x63, 0xb1, 0x26, 0x5c, 0xd1,
-    0x41, 0xb5, 0xbb, 0x28, 0x3e, 0xf7, 0x76, 0xc4, 0x44, 0xb0, 0xdb, 0x8f, 0xe5, 0x8b, 0x9e, 0xb8, 0x29, 0x12, 0x91,
-    0xbc, 0xa2, 0xdc, 0x22, 0x36, 0x09, 0xed, 0x5b, 0x79, 0xc7, 0xb6, 0x84, 0x94, 0x42, 0x40, 0x95, 0xc0, 0x02, 0xe0,
-    0x75, 0x19, 0x93, 0xb0, 0xc7, 0x92, 0x0c, 0x36, 0xce, 0x05, 0x8a, 0x00, 0x03, 0x47, 0x3c, 0x8a, 0x13, 0xd1, 0x45,
-    0x06, 0xf6, 0x94, 0x03, 0xa8, 0x31, 0xc2, 0x23, 0xf5, 0x3a, 0x2e, 0x75, 0x12, 0x12, 0x66, 0x7b, 0x3b, 0x15, 0xdc,
-    0x84, 0x19, 0xed, 0x32, 0xf3, 0x00, 0xab, 0xc2, 0x50, 0xd4, 0x01, 0x71, 0xe9, 0xda, 0x0c, 0x02, 0x58, 0xa8, 0x60,
-    0x87, 0x97, 0xaa, 0x2b, 0x2c, 0x02, 0x96, 0x1c, 0x13, 0x85, 0xc1, 0xc8, 0x63, 0x5c, 0x13, 0x36, 0x17, 0xd9, 0x8f,
-    0x0a, 0xda, 0x74, 0x09, 0xda, 0xb4, 0x0e, 0xed, 0x09, 0x12, 0xbd, 0xb7, 0x39, 0x8f, 0xcb, 0x10, 0xbe, 0xa5, 0x83,
-    0x6c, 0xc8, 0x3e, 0x7e, 0x78, 0x85, 0x77, 0x00, 0xa1, 0x3d, 0x38, 0x0b, 0x99, 0x5b, 0x9e, 0xc8, 0xc5, 0x31, 0x75,
-    0x82, 0xd8, 0xdb, 0x16, 0xcd, 0x45, 0x74, 0x05, 0x8a, 0xf6, 0x04, 0xe4, 0x6c, 0x48, 0x05, 0x61, 0x98, 0x53, 0x2f,
-    0x0e, 0x4b, 0x2a, 0x5a, 0x0b, 0x99, 0x2e, 0x1a, 0x21, 0x11, 0x68, 0x67, 0x56, 0x34, 0xc0, 0x9c, 0x59, 0x93, 0x0e,
-    0xc3, 0xf8, 0x5c, 0x73, 0x1b, 0x5d, 0x20, 0xea, 0xee, 0x01, 0x43, 0xb3, 0x04, 0xc6, 0xcc, 0xaf, 0xaf, 0x9b, 0x30,
-    0x94, 0x78, 0xb4, 0xf6, 0x48, 0x36, 0x88, 0x77, 0x61, 0xc2, 0xcc, 0x2d, 0x4c, 0x4f, 0xc2, 0xab, 0x7a, 0x3d, 0x95,
-    0x6f, 0x13, 0xc8, 0x01, 0x00, 0x46, 0x3a, 0xea, 0x27, 0x3e, 0xd0, 0xe6, 0x0d, 0x94, 0xc6, 0xc3, 0xe5, 0x32, 0xb0,
-    0x4a, 0xa7, 0x58, 0x9a, 0x5d, 0x5f, 0xb7, 0xe0, 0x71, 0x12, 0xa7, 0xf8, 0x04, 0x33, 0xd3, 0x0d, 0x38, 0x78, 0x04,
-    0xd3, 0x1c, 0xd8, 0x16, 0x6a, 0xa2, 0x4b, 0xac, 0x49, 0x55, 0x4d, 0x74, 0x09, 0xf2, 0x48, 0x54, 0x69, 0xf2, 0x14,
-    0xc8, 0x70, 0xff, 0x1f, 0x16, 0x34, 0x93, 0x8b, 0x67, 0x69, 0xd2, 0x01, 0x98, 0x20, 0x2d, 0x35, 0xf1, 0xf6, 0x76,
-    0x80, 0xcc, 0xb0, 0x18, 0xd2, 0xfa, 0x91, 0x3b, 0xae, 0x7a, 0x8f, 0x91, 0x90, 0x64, 0x6e, 0x2d, 0x0d, 0x81, 0x8a,
-    0xd0, 0x1a, 0x04, 0xdf, 0x62, 0x78, 0x4c, 0x9b, 0x03, 0xf4, 0xbc, 0xd4, 0xfe, 0x0b, 0xb2, 0xa6, 0xea, 0xe0, 0xd9,
-    0x7f, 0xfd, 0xc7, 0xbf, 0xb3, 0x3d, 0xb1, 0xb9, 0xb2, 0xd1, 0x08, 0x4c, 0x65, 0xeb, 0x0e, 0x7d, 0xfe, 0xd7, 0xdf,
-    0xff, 0xdf, 0xff, 0xf3, 0x5f, 0x75, 0xb7, 0x14, 0x7a, 0x9d, 0xc8, 0x83, 0x3f, 0x25, 0x1d, 0x0c, 0x30, 0x15, 0x1a,
-    0xa3, 0x28, 0x5d, 0x87, 0xc3, 0x91, 0x89, 0x43, 0x31, 0x65, 0x6c, 0xe8, 0xd9, 0x96, 0xed, 0x2d, 0x95, 0x1e, 0x27,
-    0xec, 0x9c, 0xc9, 0xb7, 0x9e, 0xad, 0x9a, 0x6a, 0x45, 0x8f, 0x01, 0x28, 0x34, 0x2e, 0xcf, 0x3f, 0x25, 0x6f, 0x9b,
-    0xa8, 0x48, 0xa9, 0x52, 0xeb, 0x87, 0xb4, 0xab, 0x8b, 0x0b, 0xcf, 0x36, 0xa6, 0x5f, 0x0b, 0x57, 0x6f, 0x4d, 0x79,
-    0xd0, 0xf4, 0x9a, 0xeb, 0x20, 0xf3, 0xc0, 0x8f, 0xb4, 0xed, 0xbe, 0xa2, 0x11, 0x85, 0x7b, 0xcc, 0x0b, 0xec, 0xeb,
-    0x68, 0x75, 0x2b, 0xf6, 0xa7, 0x39, 0x0e, 0x95, 0xb2, 0xa2, 0xb8, 0x05, 0x79, 0x58, 0x3e, 0xcf, 0xae, 0x5a, 0xdb,
-    0x6b, 0x46, 0x01, 0x14, 0xda, 0x0f, 0x1f, 0x0a, 0x70, 0x3d, 0x47, 0xbb, 0x90, 0x66, 0x63, 0x36, 0x1a, 0x81, 0x10,
-    0x29, 0xdc, 0x2a, 0x1f, 0x74, 0x14, 0x27, 0x1c, 0xcf, 0xb3, 0xc3, 0xae, 0xfd, 0x16, 0x36, 0x06, 0x5e, 0x0f, 0x75,
-    0xa5, 0x5f, 0xaf, 0x32, 0xfd, 0x94, 0xd0, 0x5d, 0x0d, 0x97, 0x18, 0xb2, 0x0e, 0x93, 0x9c, 0xe6, 0xfa, 0x5a, 0xf9,
-    0xcb, 0xb5, 0xf2, 0x3a, 0x39, 0x33, 0x72, 0x88, 0x57, 0xef, 0x9b, 0xbb, 0xec, 0x8e, 0x7f, 0xfd, 0xa7, 0xbf, 0xff,
-    0x6f, 0x00, 0x06, 0x8e, 0x73, 0xb7, 0xad, 0x01, 0x1d, 0xfe, 0x27, 0x74, 0x98, 0xa5, 0x77, 0xef, 0xf2, 0xd7, 0xff,
-    0xf2, 0xdf, 0xa1, 0x07, 0x5d, 0x60, 0x86, 0x7d, 0xa4, 0x40, 0x1f, 0x60, 0xd8, 0xe8, 0x77, 0xc1, 0x5e, 0x1b, 0xf7,
-    0x2e, 0x70, 0xfc, 0x03, 0xa2, 0x5a, 0xf0, 0x6c, 0x7a, 0x57, 0xb8, 0x11, 0xd3, 0x41, 0x92, 0x15, 0xcc, 0x04, 0x5c,
-    0x58, 0x0a, 0xbf, 0x0f, 0x72, 0x82, 0x64, 0x0a, 0x12, 0xb4, 0xb0, 0xcc, 0xa1, 0x25, 0xaf, 0xdc, 0x28, 0x08, 0x57,
-    0x32, 0x54, 0xc1, 0x38, 0x91, 0x82, 0xac, 0xb9, 0x1a, 0xd3, 0x88, 0xb2, 0x25, 0x5e, 0x22, 0xe9, 0xae, 0x25, 0x97,
-    0xd0, 0x58, 0xb7, 0xcc, 0xbb, 0x62, 0x7f, 0x89, 0x69, 0xc5, 0x99, 0xd7, 0xf2, 0xf0, 0xb5, 0x12, 0x50, 0x5d, 0xc7,
-    0x2b, 0x4a, 0xa3, 0xcb, 0x15, 0xa5, 0xa8, 0x04, 0x35, 0x6c, 0x60, 0xed, 0x4d, 0xc4, 0x4b, 0x2f, 0xf4, 0xeb, 0x2e,
-    0x6a, 0xd0, 0x91, 0x2a, 0xc3, 0x53, 0xfc, 0xfa, 0x2b, 0x00, 0xe4, 0x50, 0x42, 0xad, 0x1d, 0xe3, 0xbd, 0x1a, 0xbc,
-    0x45, 0x3d, 0xcb, 0x19, 0xec, 0x99, 0x0b, 0xf3, 0x68, 0xfe, 0xe6, 0xc6, 0x63, 0x10, 0x0f, 0x3d, 0xb0, 0x27, 0xf5,
-    0xaa, 0xde, 0x38, 0x6e, 0xf9, 0x2f, 0xff, 0xec, 0xfb, 0xff, 0xf2, 0xcf, 0xb7, 0x36, 0xc5, 0x51, 0xc1, 0x65, 0xe7,
-    0xd5, 0xb0, 0xeb, 0xa9, 0xbb, 0x7a, 0xa6, 0x3a, 0xb9, 0x57, 0xb7, 0x59, 0xa2, 0x3f, 0xd6, 0x2f, 0x91, 0x7f, 0xa9,
-    0x50, 0x50, 0xdf, 0xfa, 0x2d, 0x80, 0x21, 0x5e, 0xb7, 0x42, 0x86, 0x8d, 0x7e, 0x17, 0x68, 0x27, 0x6e, 0x70, 0xa7,
-    0x15, 0xf9, 0xed, 0x14, 0xbe, 0x0d, 0x87, 0xdf, 0x09, 0xbe, 0x48, 0x07, 0x06, 0xd0, 0x4e, 0xd4, 0x8d, 0xa9, 0x5a,
-    0x57, 0xbc, 0x74, 0xd9, 0x5b, 0x2a, 0x91, 0x6a, 0x25, 0x68, 0xba, 0xdd, 0xe6, 0xd6, 0x96, 0x83, 0xdd, 0xdf, 0xe0,
-    0x9b, 0x21, 0xf6, 0x4e, 0x73, 0x15, 0x03, 0xb9, 0x41, 0x34, 0xe0, 0x10, 0x75, 0xac, 0x68, 0xd0, 0x25, 0xb9, 0x80,
-    0xa5, 0x98, 0x61, 0x8a, 0x60, 0x7a, 0x60, 0x0e, 0x0b, 0x7b, 0xed, 0x99, 0x70, 0x6c, 0x82, 0x45, 0xd6, 0x96, 0x0e,
-    0x4f, 0x8d, 0xe8, 0x9e, 0x75, 0x48, 0xf4, 0xa2, 0xc6, 0xac, 0xb2, 0x97, 0xc9, 0x4b, 0x44, 0x03, 0xf1, 0x44, 0xbc,
-    0x2b, 0xe3, 0xeb, 0x75, 0xf1, 0xf6, 0xef, 0x6f, 0x8f, 0xb7, 0xc7, 0x77, 0x8c, 0xb7, 0x7f, 0xff, 0x07, 0xc7, 0xdb,
-    0xbf, 0x36, 0xe3, 0xed, 0xb8, 0x88, 0x3f, 0xdf, 0x29, 0x26, 0xae, 0x22, 0x95, 0xd9, 0x45, 0x11, 0xb6, 0xa4, 0xa5,
-    0x04, 0x8e, 0x34, 0x06, 0xc4, 0xff, 0xed, 0xe3, 0xdb, 0x30, 0xd1, 0x42, 0x74, 0x9b, 0xc2, 0xd9, 0x92, 0x07, 0x99,
-    0x0a, 0x26, 0x37, 0x75, 0xee, 0x77, 0xe3, 0x81, 0xba, 0xec, 0x0a, 0x2e, 0x8c, 0xab, 0x0f, 0x04, 0xda, 0x2a, 0xdc,
-    0x1c, 0xd0, 0xdb, 0xaa, 0x75, 0xc7, 0xf6, 0xb6, 0x4a, 0x3a, 0x36, 0x47, 0xe8, 0xa8, 0xb3, 0x64, 0x71, 0x53, 0x72,
-    0x6e, 0xff, 0xa7, 0xa3, 0x56, 0x67, 0xb7, 0x35, 0x81, 0xde, 0xc0, 0x87, 0xf0, 0xd4, 0xec, 0xec, 0xee, 0xe2, 0xd3,
-    0x85, 0x7a, 0x6a, 0xe3, 0x53, 0xac, 0x9e, 0x1e, 0xe2, 0xd3, 0x40, 0x3d, 0x3d, 0xc2, 0xa7, 0xa1, 0x7a, 0x7a, 0x8c,
-    0x4f, 0xe7, 0x76, 0x79, 0xc4, 0x34, 0x70, 0x8f, 0xdd, 0xbe, 0x27, 0x4c, 0x51, 0x55, 0xf6, 0xd8, 0x6b, 0x61, 0x40,
-    0x3b, 0x3a, 0x0b, 0x62, 0x4f, 0x38, 0xd4, 0x41, 0xe1, 0x5d, 0x8c, 0x59, 0x1a, 0x50, 0x4e, 0xf4, 0x73, 0x7c, 0x5b,
-    0x10, 0xd8, 0xc0, 0x87, 0xf1, 0x84, 0xa9, 0xd7, 0xa6, 0x2b, 0xac, 0x41, 0x25, 0x1f, 0x35, 0xfb, 0x65, 0x47, 0xaf,
-    0x93, 0x88, 0x84, 0xab, 0xf4, 0x4e, 0x5a, 0xb9, 0xaa, 0x4e, 0x4c, 0xd7, 0xd0, 0x2b, 0xbc, 0x26, 0xa8, 0x6a, 0xf8,
-    0x95, 0x23, 0x90, 0xcd, 0x8d, 0x4b, 0x70, 0x2c, 0x57, 0x06, 0x5a, 0x11, 0x22, 0x1d, 0x68, 0x25, 0x9c, 0xf4, 0xd3,
-    0x61, 0x74, 0xa6, 0xbf, 0xbf, 0x01, 0xdb, 0x21, 0x3a, 0x93, 0x2d, 0xd7, 0x07, 0x56, 0x09, 0x44, 0x33, 0xa8, 0xaa,
-    0x80, 0x40, 0xc7, 0x13, 0x97, 0x06, 0xc3, 0x04, 0x32, 0x56, 0x8a, 0xd4, 0xa9, 0x87, 0x59, 0x69, 0xfa, 0x7a, 0x11,
-    0x50, 0xb4, 0x2a, 0xd8, 0x03, 0x13, 0x86, 0x4a, 0x05, 0x85, 0xa1, 0x02, 0x0b, 0x44, 0xf5, 0x9a, 0x70, 0xaa, 0x72,
-    0xfd, 0xd6, 0x07, 0x55, 0x2d, 0x15, 0x4f, 0x35, 0xcf, 0xa0, 0xf5, 0x01, 0xf4, 0x72, 0x14, 0xef, 0x5e, 0x6b, 0x80,
-    0xff, 0xc9, 0x18, 0xe1, 0xbd, 0xd1, 0x68, 0x74, 0x63, 0x7c, 0xf5, 0xde, 0x70, 0xc4, 0xda, 0xec, 0x61, 0x07, 0xcf,
-    0x27, 0x1b, 0x32, 0x6a, 0xd7, 0x2a, 0x89, 0x76, 0xf3, 0xbb, 0x35, 0xc6, 0x00, 0x1f, 0x1f, 0xcf, 0xef, 0x1e, 0x6b,
-    0x2d, 0x81, 0x2a, 0xf3, 0x09, 0x48, 0xc5, 0x38, 0x0d, 0x9a, 0xa5, 0x7f, 0x2e, 0x83, 0x93, 0xf7, 0x9e, 0x3c, 0x79,
-    0x52, 0xfa, 0x43, 0xf5, 0xd4, 0x1c, 0x0e, 0x4b, 0x7f, 0x30, 0xd7, 0x68, 0x34, 0x9b, 0xa3, 0x51, 0xe9, 0xc7, 0xaa,
-    0x60, 0xb7, 0x3d, 0x18, 0xee, 0xb6, 0x4b, 0xff, 0xc2, 0x68, 0x51, 0xfa, 0x4c, 0x3e, 0xe5, 0x6c, 0x58, 0x3b, 0xe4,
-    0x7c, 0x0c, 0xde, 0xb6, 0x2f, 0x18, 0x6d, 0x8e, 0x86, 0xb6, 0xf8, 0x1a, 0x44, 0x33, 0x9e, 0xa1, 0x00, 0xee, 0x00,
-    0x9f, 0x1f, 0x6d, 0xca, 0x6b, 0xcc, 0xe2, 0xad, 0xe4, 0x25, 0x6c, 0xa1, 0x9f, 0xcd, 0x60, 0x23, 0x32, 0x33, 0x05,
-    0x19, 0x63, 0x15, 0x8b, 0xac, 0x55, 0x23, 0x67, 0x51, 0xf5, 0xcf, 0x61, 0x5c, 0xc5, 0x20, 0x51, 0xda, 0x60, 0x4b,
-    0x91, 0x8c, 0xf3, 0xdd, 0x3a, 0x19, 0xff, 0xc5, 0xed, 0x32, 0xfe, 0xea, 0x6e, 0x22, 0xfe, 0x8b, 0x3f, 0x58, 0xc4,
-    0x7f, 0x67, 0x8a, 0x78, 0x21, 0xc4, 0xf6, 0x79, 0x68, 0x0f, 0xc6, 0x6c, 0xf0, 0xe9, 0x34, 0xbb, 0x6c, 0xe0, 0x96,
-    0xc8, 0x6d, 0x92, 0x9e, 0x93, 0xdf, 0x7a, 0x20, 0xaa, 0x06, 0x33, 0x5e, 0x71, 0x4e, 0x4a, 0xf2, 0x5d, 0x1a, 0xda,
-    0xef, 0x94, 0xfd, 0x2e, 0x4a, 0x46, 0x23, 0x28, 0x1a, 0x8d, 0x6c, 0x75, 0x79, 0x03, 0xc4, 0x16, 0xb5, 0x7a, 0x5b,
-    0x2b, 0xa1, 0x56, 0x9f, 0x7f, 0x6e, 0x96, 0x99, 0x05, 0x32, 0x64, 0x69, 0x86, 0x27, 0x65, 0xcd, 0x30, 0x2e, 0x70,
-    0xab, 0xe1, 0x9b, 0xd7, 0x97, 0x5e, 0x69, 0x25, 0x02, 0xab, 0xcb, 0x00, 0x57, 0xf1, 0x55, 0xe3, 0xed, 0xa9, 0x55,
-    0x84, 0x15, 0x16, 0x54, 0x66, 0xd6, 0x3d, 0xbd, 0x7a, 0x35, 0x74, 0xf6, 0xb9, 0x5b, 0xc6, 0xc5, 0xbb, 0x74, 0x21,
-    0x63, 0x59, 0xc0, 0x18, 0x86, 0x26, 0x5a, 0x25, 0xcf, 0xce, 0xce, 0x92, 0xe5, 0x1c, 0x58, 0xd1, 0xbd, 0x57, 0xc3,
-    0x37, 0x30, 0x3b, 0x4a, 0x5d, 0x46, 0x3f, 0x99, 0x21, 0x52, 0xfb, 0x28, 0x27, 0x5b, 0x1d, 0xed, 0xce, 0xa5, 0xfc,
-    0x97, 0x49, 0x5f, 0x8c, 0x0e, 0x51, 0x69, 0xe0, 0x61, 0x59, 0xca, 0xcc, 0x5a, 0x20, 0xc4, 0x14, 0xdf, 0xff, 0x26,
-    0x7a, 0xc6, 0xb7, 0x89, 0xf0, 0xe2, 0xc2, 0x88, 0x0b, 0xd6, 0x96, 0xab, 0x54, 0x81, 0x41, 0x11, 0xdd, 0xdb, 0xc7,
-    0x10, 0xa5, 0x88, 0x11, 0x2a, 0x22, 0xda, 0x56, 0x8f, 0xbe, 0xca, 0x88, 0x65, 0x85, 0x21, 0x06, 0x33, 0xf5, 0x82,
-    0xa8, 0x2a, 0x55, 0x50, 0x9a, 0x81, 0x6f, 0xaa, 0x11, 0xd4, 0xa2, 0x30, 0x1b, 0xc0, 0x9e, 0x0a, 0x31, 0x0a, 0xd3,
-    0x90, 0x3c, 0xd8, 0x9c, 0x57, 0x2b, 0x0f, 0x5d, 0x25, 0xd8, 0x82, 0x79, 0x41, 0x06, 0x63, 0x87, 0xae, 0x55, 0x03,
-    0x3d, 0x5d, 0x8a, 0xce, 0xdd, 0x7c, 0xee, 0x75, 0xe2, 0x17, 0x17, 0x1e, 0xfc, 0x59, 0x7f, 0x9a, 0x83, 0xd0, 0x39,
-    0xfd, 0x14, 0xf3, 0x06, 0x8f, 0xa6, 0x0d, 0xb4, 0xee, 0x29, 0xc8, 0x23, 0xa5, 0x33, 0xe5, 0x6f, 0x88, 0x7b, 0x96,
-    0x9d, 0x59, 0x81, 0xc7, 0x63, 0x64, 0xa3, 0x06, 0x69, 0x96, 0xb2, 0x4e, 0x3d, 0x4f, 0xc7, 0x3c, 0x6d, 0x51, 0xc4,
-    0xea, 0xcf, 0x33, 0x3c, 0x4e, 0xe3, 0x57, 0x41, 0x53, 0x4a, 0xf5, 0xa6, 0x3a, 0x6a, 0x69, 0xae, 0x6c, 0x1f, 0x48,
-    0xda, 0x6e, 0x93, 0xf2, 0xca, 0x97, 0x8f, 0x94, 0xd6, 0x1d, 0x09, 0xdd, 0x96, 0xb5, 0x82, 0xc1, 0x21, 0xf5, 0x67,
-    0xa4, 0xfb, 0x2c, 0x16, 0x53, 0xd6, 0xca, 0x5d, 0x20, 0x0b, 0xa2, 0x11, 0xbe, 0x96, 0xf4, 0x2e, 0x2d, 0x4f, 0x29,
-    0x65, 0x7c, 0x8e, 0x5a, 0x26, 0x68, 0x3d, 0x99, 0x5e, 0xde, 0x7d, 0xf8, 0x9b, 0xd1, 0x2f, 0x25, 0x8d, 0xd4, 0xcd,
-    0x7f, 0xdb, 0xee, 0xe0, 0x3e, 0x48, 0xa2, 0xab, 0x20, 0x4e, 0x49, 0xe5, 0x9d, 0x62, 0x94, 0xa7, 0x33, 0xcd, 0x64,
-    0xfa, 0x55, 0xce, 0x12, 0xfa, 0xed, 0x1f, 0xb9, 0x14, 0xbb, 0x8f, 0xa6, 0x97, 0x6a, 0x35, 0x5a, 0x0b, 0x69, 0x55,
-    0x7f, 0x68, 0xf6, 0xd4, 0xfa, 0x74, 0xad, 0x7a, 0x06, 0xd0, 0x43, 0x80, 0x41, 0xe8, 0xd9, 0x46, 0x2e, 0xa0, 0x6a,
-    0x42, 0x89, 0x91, 0x3f, 0x56, 0x0d, 0x64, 0xf9, 0xbb, 0x20, 0xb9, 0xa3, 0x82, 0x75, 0xf0, 0xfd, 0xb0, 0xf1, 0x20,
-    0x4a, 0xa4, 0x2e, 0x9f, 0xc4, 0xc3, 0x61, 0xc2, 0x3a, 0x4a, 0x5d, 0x5b, 0xad, 0x47, 0x98, 0x7e, 0x65, 0x2e, 0x59,
-    0x7d, 0x55, 0x0c, 0xe2, 0x69, 0x3a, 0x45, 0xa7, 0x60, 0x3e, 0xe0, 0x4b, 0x5e, 0x57, 0x92, 0x53, 0xe6, 0x25, 0x35,
-    0x2b, 0xe2, 0xd1, 0xf7, 0x3a, 0x2e, 0x0f, 0xc1, 0x76, 0xa1, 0x05, 0x6f, 0x76, 0x78, 0x36, 0x0d, 0x1a, 0xbb, 0x75,
-    0x44, 0xb0, 0x4a, 0xa3, 0xe0, 0xad, 0x40, 0xcb, 0x43, 0x65, 0x25, 0x04, 0xb4, 0xe5, 0xb7, 0x64, 0x19, 0x0d, 0x80,
-    0x2f, 0x12, 0xd5, 0x45, 0x65, 0x1d, 0x99, 0x7f, 0x9b, 0xdd, 0xf2, 0xd9, 0xea, 0xdd, 0xf2, 0x99, 0xda, 0x2d, 0x37,
-    0x73, 0xec, 0xbd, 0x51, 0x0b, 0xff, 0xeb, 0x54, 0x08, 0xc1, 0xaa, 0x00, 0x39, 0x2c, 0x34, 0xd3, 0x1a, 0x6d, 0xf8,
-    0x87, 0x86, 0xc6, 0x18, 0x74, 0x13, 0xf3, 0xc9, 0xbc, 0xa6, 0x85, 0x85, 0xf8, 0xd7, 0xac, 0x55, 0xb5, 0x1e, 0x60,
-    0x1d, 0xf6, 0x7a, 0xb8, 0x5c, 0xd7, 0xbe, 0x79, 0xd3, 0x82, 0xbc, 0xe2, 0x4e, 0xa0, 0x84, 0x31, 0x78, 0x0e, 0xd1,
-    0xe9, 0x29, 0x94, 0x8e, 0xb2, 0xc1, 0xac, 0xf8, 0x5b, 0x09, 0xbf, 0x24, 0xe2, 0x8d, 0x5b, 0x7a, 0x61, 0x1c, 0xd5,
-    0x55, 0xe4, 0xf2, 0xa9, 0x11, 0xe6, 0x7a, 0x9d, 0x82, 0x02, 0x18, 0x93, 0x39, 0x6d, 0xff, 0xc1, 0x8a, 0x4d, 0xf0,
-    0xef, 0xb2, 0x36, 0x2b, 0x91, 0xf9, 0xbd, 0xc4, 0xb8, 0x91, 0x08, 0xbf, 0x8a, 0x06, 0xe6, 0x1a, 0x36, 0x9f, 0xac,
-    0x06, 0xf7, 0x48, 0xcd, 0xd4, 0x57, 0x4a, 0x41, 0xea, 0x1d, 0x30, 0x4a, 0xa3, 0x59, 0xc2, 0x6f, 0x1e, 0x75, 0x1d,
-    0x67, 0x2c, 0x8d, 0x7a, 0x83, 0x40, 0xaf, 0xda, 0xde, 0x51, 0x4a, 0xdf, 0xfb, 0xec, 0x01, 0xfe, 0x27, 0xd2, 0x05,
-    0xae, 0x2a, 0x53, 0x5d, 0xb8, 0xaa, 0x68, 0xaa, 0x4f, 0x6a, 0xb6, 0xb8, 0xd0, 0xe0, 0x64, 0x8e, 0xdf, 0xb5, 0x35,
-    0x1a, 0x95, 0x77, 0x6a, 0x2e, 0x8d, 0xac, 0x5f, 0xd5, 0xfa, 0xd7, 0x0d, 0x7e, 0xc7, 0xb6, 0x03, 0x61, 0xb8, 0xd6,
-    0xdb, 0xca, 0xdf, 0x61, 0x5a, 0x6a, 0xac, 0x28, 0x4e, 0xed, 0x27, 0xe1, 0x95, 0xf6, 0x50, 0xc4, 0xb9, 0x12, 0x3a,
-    0x29, 0x13, 0xe1, 0xa4, 0xfc, 0x85, 0x87, 0xf7, 0xf1, 0x85, 0x84, 0xd6, 0xe5, 0x24, 0x49, 0xc1, 0x48, 0x1a, 0x73,
-    0x3e, 0x0d, 0x76, 0x76, 0x2e, 0x2e, 0x2e, 0xfc, 0x8b, 0x5d, 0x3f, 0xcb, 0xcf, 0x76, 0xda, 0xcd, 0x66, 0x13, 0xdf,
-    0x23, 0x67, 0x5b, 0xe7, 0x31, 0xbb, 0x78, 0x0a, 0x76, 0xb0, 0xfd, 0xd8, 0x7a, 0x62, 0x3d, 0xde, 0xb5, 0x1e, 0x3e,
-    0xb2, 0x2d, 0x12, 0xe7, 0x50, 0xb2, 0x6b, 0x5b, 0x42, 0x9c, 0x87, 0x36, 0x14, 0x77, 0xf7, 0xce, 0x94, 0x45, 0x86,
-    0xf7, 0x74, 0x84, 0xbd, 0x03, 0xce, 0x41, 0xf6, 0x89, 0xd5, 0x37, 0xae, 0x28, 0x6b, 0x48, 0xa5, 0xa0, 0x1e, 0x71,
-    0xf7, 0x0e, 0xa2, 0x69, 0x40, 0x4c, 0x61, 0x16, 0x62, 0x0c, 0x46, 0x94, 0xd2, 0x14, 0x68, 0x65, 0x9e, 0xc2, 0x37,
-    0x4c, 0xec, 0xb4, 0xe0, 0xfb, 0x9b, 0xf6, 0x63, 0xd0, 0x58, 0xe7, 0x8d, 0x07, 0x83, 0x66, 0xa3, 0x65, 0xb5, 0x1a,
-    0x6d, 0xff, 0xb1, 0xd5, 0x16, 0xff, 0x82, 0xc4, 0xdb, 0xb5, 0x5a, 0xf0, 0x6d, 0xd7, 0x82, 0xe7, 0xf3, 0x07, 0xe2,
-    0x00, 0x3a, 0xb2, 0x77, 0xba, 0x7b, 0xf8, 0xb3, 0x6a, 0x80, 0xd4, 0x67, 0xb6, 0xf8, 0x21, 0x48, 0xfb, 0x9e, 0x59,
-    0xda, 0x7a, 0xb2, 0xb2, 0xb8, 0xfd, 0x78, 0x65, 0xf1, 0xee, 0xa3, 0x95, 0xc5, 0x0f, 0x1e, 0xd6, 0x8b, 0x77, 0xce,
-    0x44, 0x95, 0xde, 0xe5, 0xa1, 0x3d, 0x89, 0x60, 0xd9, 0x2f, 0x9d, 0x16, 0xc0, 0xd9, 0xb4, 0x1a, 0xf8, 0xf1, 0xb8,
-    0xed, 0xea, 0x5e, 0xa7, 0xd8, 0x4b, 0x63, 0xf9, 0xf8, 0x09, 0x60, 0xf9, 0xb2, 0xfd, 0x68, 0x80, 0xed, 0x08, 0x51,
-    0xf8, 0x3b, 0xdf, 0x7d, 0x32, 0x00, 0xf9, 0x6e, 0xe1, 0x1f, 0xfc, 0x37, 0x7e, 0xd8, 0x1e, 0x88, 0x87, 0x26, 0xd6,
-    0x7f, 0xd3, 0x7a, 0x5c, 0x40, 0x53, 0xfc, 0xef, 0x17, 0x6d, 0x10, 0xa3, 0x39, 0x6e, 0x8e, 0xfb, 0x00, 0x68, 0xf4,
-    0x64, 0xdc, 0xf6, 0x3f, 0x3b, 0x7f, 0xec, 0x3f, 0x19, 0xb7, 0x1e, 0x7f, 0x23, 0x9e, 0x12, 0xa0, 0xe0, 0x67, 0xf8,
-    0xf7, 0xcd, 0x6e, 0x13, 0xbc, 0x4b, 0xff, 0xc9, 0xf9, 0xae, 0xbf, 0x9b, 0x34, 0x1e, 0xf9, 0x4f, 0xf0, 0xaf, 0x1a,
-    0x6e, 0x9c, 0x4d, 0x98, 0x6d, 0xe1, 0x7a, 0x2f, 0x78, 0x5b, 0xe6, 0x1c, 0xed, 0x07, 0xd6, 0xc3, 0x07, 0x2f, 0x9f,
-    0xc0, 0x1a, 0x8d, 0x5b, 0x6d, 0xf8, 0x77, 0xdd, 0xd7, 0x6f, 0x90, 0xf0, 0x72, 0xe0, 0x88, 0x61, 0x86, 0xbd, 0x22,
-    0x1c, 0xbd, 0xd3, 0xf0, 0xbe, 0x07, 0x0e, 0xd4, 0x6a, 0xef, 0x9a, 0xb1, 0xdb, 0x23, 0xa8, 0xec, 0x6e, 0xee, 0x35,
-    0x63, 0x7f, 0xac, 0x7b, 0xcd, 0xd9, 0x42, 0x04, 0xf5, 0x92, 0x2f, 0x79, 0xd1, 0x8b, 0xae, 0xd7, 0x07, 0xee, 0x1c,
-    0xfd, 0x85, 0xf7, 0xf1, 0x36, 0x09, 0xb4, 0x8e, 0x99, 0x19, 0x6c, 0xc8, 0x70, 0x23, 0xe3, 0x8f, 0x2b, 0xd2, 0xdd,
-    0x9f, 0x75, 0x04, 0xc9, 0x6f, 0x27, 0xc8, 0x37, 0x77, 0xa3, 0x47, 0xfe, 0x07, 0xd3, 0xa3, 0x30, 0xe9, 0x51, 0x0b,
-    0xe7, 0x92, 0x3b, 0x4b, 0xee, 0xe8, 0x01, 0x3d, 0x3b, 0x98, 0x84, 0xbd, 0x6d, 0xef, 0x30, 0x2c, 0x2a, 0x6c, 0x71,
-    0x88, 0xf0, 0xf4, 0xd7, 0xc4, 0x9f, 0xc5, 0x8d, 0x8b, 0xd0, 0x96, 0xbe, 0xff, 0x14, 0xdf, 0xdb, 0xad, 0x1e, 0xce,
-    0xc5, 0xad, 0xbe, 0x90, 0xae, 0xe4, 0x3e, 0xd4, 0x71, 0x03, 0xbc, 0x04, 0x13, 0xce, 0x33, 0x1e, 0xe1, 0x0f, 0xc3,
-    0x01, 0xb9, 0xe9, 0x27, 0xe4, 0x62, 0x9e, 0x30, 0x3c, 0x24, 0x1f, 0x88, 0x77, 0x28, 0xc3, 0x57, 0x79, 0xdd, 0x16,
-    0x6f, 0x71, 0x7c, 0x8d, 0x37, 0x50, 0x54, 0x60, 0x7a, 0x82, 0x2e, 0xf5, 0x1b, 0x36, 0x8c, 0x23, 0xc7, 0x76, 0xa6,
-    0xb0, 0x91, 0x61, 0x96, 0x46, 0xed, 0xfa, 0x07, 0xdd, 0xfc, 0x70, 0x6d, 0xf5, 0xeb, 0x64, 0x39, 0xbe, 0xed, 0x31,
-    0x3c, 0x92, 0x41, 0x2d, 0x5b, 0x9a, 0xf9, 0x30, 0xbe, 0x2a, 0xc9, 0x51, 0xa2, 0x57, 0xa6, 0x81, 0x2d, 0x6c, 0x83,
-    0x96, 0xdf, 0x06, 0x5f, 0x81, 0x8a, 0xf1, 0xed, 0x79, 0xdf, 0x39, 0x8d, 0x5d, 0xb0, 0x5d, 0x8c, 0x6e, 0x7a, 0xa0,
-    0xbe, 0xfe, 0xb1, 0x2b, 0xfd, 0x83, 0x8c, 0xf5, 0x3b, 0x33, 0xb6, 0xe0, 0x88, 0x7b, 0x02, 0x77, 0x5b, 0xbc, 0xa5,
-    0x84, 0xa8, 0x47, 0x77, 0x46, 0xa1, 0xcc, 0x31, 0x7f, 0x98, 0x4f, 0xbc, 0x9d, 0x4f, 0xfc, 0x06, 0x67, 0x59, 0x35,
-    0xe1, 0xee, 0x9c, 0x02, 0xef, 0x98, 0x64, 0x8c, 0x57, 0x75, 0x31, 0x0e, 0x1b, 0x1a, 0x34, 0xc5, 0x67, 0xb7, 0x46,
-    0x64, 0xee, 0x69, 0x80, 0x88, 0xc0, 0xa1, 0xfc, 0xac, 0x8a, 0xd5, 0x17, 0x19, 0x5d, 0x01, 0xb7, 0x1d, 0x7f, 0xf9,
-    0x88, 0x3e, 0x96, 0x62, 0x37, 0xe2, 0xec, 0x60, 0xa1, 0xb4, 0x1a, 0xaa, 0x8a, 0xd1, 0x14, 0x4f, 0xaf, 0x0e, 0xe5,
-    0x6b, 0x3f, 0x6c, 0x0c, 0x81, 0x52, 0xe8, 0xbb, 0x7a, 0xe5, 0xe0, 0x36, 0xa8, 0x46, 0xfa, 0x21, 0x60, 0xca, 0x60,
-    0x42, 0xed, 0x87, 0xb7, 0x6e, 0x2c, 0xe9, 0xf3, 0x84, 0xb6, 0xd0, 0x7d, 0x43, 0x76, 0x1e, 0x0f, 0xa4, 0x0a, 0xf3,
-    0x2c, 0x79, 0x5b, 0xb0, 0x41, 0x4b, 0x13, 0xb6, 0x3c, 0xe1, 0xf5, 0xc3, 0x03, 0xea, 0xe3, 0x30, 0xcd, 0xec, 0xee,
-    0xfd, 0xce, 0x3a, 0xe2, 0xe3, 0xaf, 0x12, 0x1f, 0x81, 0x97, 0xf9, 0xb7, 0xe1, 0x7d, 0xfc, 0x5d, 0xe2, 0xfb, 0x7d,
-    0xdb, 0xf5, 0x49, 0x01, 0xdc, 0xaf, 0x7e, 0x9c, 0x18, 0xa5, 0xdf, 0x36, 0xe8, 0x6a, 0xef, 0xae, 0x4a, 0x5b, 0x2a,
-    0xe8, 0xf6, 0xc3, 0x4a, 0x41, 0xc3, 0x77, 0x43, 0x22, 0x83, 0xb2, 0x68, 0xfb, 0x0f, 0x0d, 0xb1, 0x7f, 0xde, 0xc0,
-    0xcf, 0x9a, 0xe0, 0x7f, 0x00, 0x0d, 0x94, 0xe4, 0x7f, 0x0d, 0xcd, 0x77, 0x85, 0x92, 0x81, 0x7e, 0xdf, 0x93, 0x58,
-    0x96, 0x22, 0xb9, 0xb6, 0x0d, 0x56, 0x9c, 0xc6, 0x88, 0x6c, 0x2c, 0xdb, 0x73, 0xf4, 0x2f, 0x1e, 0xc9, 0x5d, 0x29,
-    0xe3, 0x40, 0xcf, 0xa1, 0xaf, 0xa3, 0xdf, 0xe4, 0xbf, 0xaa, 0xce, 0xab, 0x49, 0x89, 0x15, 0x53, 0xe0, 0xbe, 0x5e,
-    0x38, 0xf1, 0xe9, 0x88, 0x2b, 0x0c, 0xfa, 0x55, 0x40, 0xeb, 0x19, 0x5a, 0xde, 0x75, 0x70, 0x0d, 0x11, 0xc1, 0xe8,
-    0x6d, 0xc3, 0x34, 0xc9, 0xab, 0x61, 0xb9, 0x38, 0x3f, 0xa6, 0x83, 0xe5, 0x99, 0x71, 0xa7, 0x50, 0x46, 0xef, 0x30,
-    0x59, 0x74, 0x18, 0xe7, 0xf4, 0x62, 0x04, 0x05, 0x7a, 0x2d, 0x02, 0x58, 0x51, 0x89, 0xa4, 0x04, 0x2b, 0x7a, 0x36,
-    0x16, 0xd9, 0x81, 0x4d, 0xe1, 0x23, 0xdb, 0x7c, 0xdd, 0xbe, 0x79, 0x73, 0x9d, 0x38, 0x99, 0x12, 0xbb, 0x71, 0xaf,
-    0x22, 0x7d, 0x6c, 0x90, 0xb6, 0x6b, 0x77, 0x09, 0xd9, 0x60, 0x88, 0x6b, 0xf5, 0xfb, 0x72, 0xa6, 0x00, 0xb2, 0x4d,
-    0x42, 0xeb, 0x71, 0x89, 0x84, 0xae, 0xa4, 0xd3, 0x29, 0x8b, 0xb8, 0x1f, 0xa5, 0x22, 0x0b, 0xc1, 0x10, 0x53, 0x5e,
-    0x8b, 0xed, 0xba, 0x25, 0xc8, 0x46, 0x23, 0x6f, 0x42, 0xee, 0x6e, 0x28, 0x54, 0x17, 0x3d, 0x18, 0xaf, 0xe5, 0xb3,
-    0x8e, 0xdb, 0xdd, 0x77, 0x87, 0xfb, 0x96, 0xd8, 0x94, 0x7b, 0x3b, 0xf0, 0xb8, 0x47, 0xfe, 0xb8, 0x48, 0xde, 0x0f,
-    0x45, 0xf2, 0xbe, 0x25, 0x6f, 0x71, 0x50, 0x86, 0xe3, 0x8e, 0x40, 0xdb, 0xb6, 0x58, 0x3a, 0x10, 0x81, 0xc4, 0x09,
-    0xf8, 0x2c, 0x31, 0xbe, 0xa2, 0x71, 0x07, 0xbb, 0x36, 0x70, 0xc1, 0x80, 0x9b, 0x45, 0xd4, 0x51, 0xd9, 0x35, 0x3c,
-    0x55, 0x61, 0x47, 0xb0, 0x46, 0x98, 0xca, 0x40, 0x94, 0x43, 0xe9, 0xe4, 0xc5, 0xe5, 0xd6, 0xc5, 0xec, 0x74, 0x02,
-    0x72, 0x52, 0xe5, 0x10, 0x7e, 0x94, 0x1d, 0xf6, 0x68, 0xaa, 0xee, 0x49, 0x29, 0xe3, 0xa2, 0xea, 0xf5, 0xf9, 0x0b,
-    0x3f, 0x35, 0x2c, 0xb0, 0x97, 0x7a, 0x01, 0xb3, 0xf0, 0xc7, 0xbb, 0x5d, 0x1d, 0x89, 0x34, 0xeb, 0x4a, 0x40, 0x7d,
-    0xb7, 0x7b, 0x12, 0x4c, 0xe5, 0x78, 0xaf, 0xb3, 0xa5, 0x9f, 0x2d, 0xd6, 0x72, 0xb2, 0x47, 0xd9, 0xa9, 0xe2, 0x6a,
-    0x93, 0x04, 0x18, 0x56, 0x10, 0x60, 0x92, 0x26, 0x80, 0x45, 0xe7, 0xaa, 0xf6, 0xc3, 0xa6, 0x4a, 0x78, 0x85, 0x32,
-    0xdc, 0x90, 0xa2, 0x8b, 0x31, 0x49, 0x2d, 0x98, 0x3b, 0x6e, 0x75, 0xf7, 0x22, 0x69, 0x5c, 0xa2, 0xf0, 0x28, 0x40,
-    0x7a, 0x40, 0x67, 0xb4, 0xe0, 0xfc, 0x38, 0xdb, 0xb9, 0x60, 0xa7, 0x8d, 0x68, 0x1a, 0x57, 0x91, 0x53, 0x34, 0x35,
-    0xf4, 0x94, 0x59, 0x35, 0x13, 0x7e, 0x8d, 0x16, 0x90, 0x24, 0xc1, 0x5d, 0xca, 0xb0, 0x2c, 0x59, 0xe8, 0xc0, 0x42,
-    0x40, 0x61, 0x92, 0xeb, 0x2a, 0x7c, 0x2b, 0x35, 0x6e, 0x69, 0x77, 0xff, 0xfa, 0x8f, 0xff, 0x5b, 0x46, 0x64, 0x81,
-    0x2a, 0x2d, 0x35, 0xd6, 0x02, 0xa1, 0xcb, 0x3d, 0xba, 0xb5, 0xa2, 0x8f, 0x10, 0xd9, 0x25, 0xb8, 0xf6, 0xf1, 0xb0,
-    0x31, 0x8e, 0x92, 0x11, 0x00, 0xb6, 0x96, 0x40, 0x66, 0x52, 0xb8, 0x84, 0xba, 0x5e, 0x84, 0x2c, 0xf8, 0x9b, 0xd2,
-    0x9b, 0x55, 0x96, 0x2c, 0xed, 0x56, 0x33, 0xd9, 0xb9, 0xda, 0x50, 0xb5, 0x84, 0x67, 0xf5, 0xdb, 0x7d, 0x4a, 0xa8,
-    0xd5, 0xf2, 0x9c, 0xa1, 0xa5, 0x3e, 0x02, 0xf9, 0xd7, 0x7f, 0xfa, 0xbb, 0xff, 0xa1, 0x1e, 0xf1, 0x64, 0xe3, 0xaf,
-    0xff, 0xf0, 0x9f, 0x31, 0x1b, 0xd3, 0xd2, 0xa7, 0x1f, 0x24, 0x27, 0xac, 0xea, 0xe8, 0x43, 0x08, 0x0c, 0x0b, 0x53,
-    0x9d, 0x26, 0x20, 0x06, 0xe3, 0x41, 0x3d, 0xf3, 0xf9, 0x80, 0x26, 0xa4, 0xcd, 0x26, 0xa1, 0xa3, 0x4d, 0x5b, 0x56,
-    0x3c, 0x52, 0x23, 0x39, 0xf1, 0x22, 0x54, 0x22, 0xbd, 0xef, 0x74, 0xfb, 0xc3, 0xd7, 0xab, 0x31, 0x57, 0xf1, 0x3e,
-    0x2c, 0x29, 0xab, 0x72, 0x0b, 0x03, 0xf1, 0x73, 0x7c, 0x0c, 0xda, 0x46, 0x31, 0x2d, 0x5e, 0xad, 0x4f, 0xe7, 0xa7,
-    0x19, 0xc0, 0x3f, 0x42, 0x8a, 0x8b, 0xa8, 0x22, 0x9d, 0x79, 0x36, 0xd0, 0xe6, 0x4b, 0xae, 0x4a, 0x1a, 0x45, 0x38,
-    0x8a, 0x0f, 0x9e, 0xfc, 0x4d, 0xf9, 0xe7, 0x09, 0x5a, 0x56, 0x96, 0x33, 0x89, 0x2e, 0xa5, 0xfb, 0xf8, 0xa8, 0xd9,
-    0x9c, 0x5e, 0xba, 0xf3, 0x6a, 0x06, 0x6f, 0xdd, 0x64, 0x14, 0x89, 0x34, 0x07, 0xa4, 0xc3, 0x52, 0x1d, 0xf4, 0x04,
-    0x8f, 0xa9, 0x89, 0x31, 0xb2, 0xb2, 0xfc, 0xd3, 0x9c, 0xe2, 0x6e, 0xf1, 0x2f, 0x78, 0xa8, 0x29, 0x43, 0x94, 0x50,
-    0x62, 0x60, 0x31, 0x37, 0x7a, 0xb5, 0x45, 0xaf, 0x71, 0x6b, 0xf9, 0xea, 0x83, 0x79, 0x28, 0x6b, 0x1e, 0xa7, 0x3e,
-    0xc0, 0x03, 0xd2, 0x71, 0xcb, 0x1b, 0xb7, 0xe7, 0x7a, 0x78, 0xce, 0xb3, 0x89, 0x79, 0x0a, 0xcb, 0x22, 0x36, 0x60,
-    0x23, 0x15, 0xda, 0x95, 0xf5, 0xe2, 0x84, 0xb5, 0x1c, 0xef, 0xae, 0x98, 0x4b, 0x82, 0x44, 0xa7, 0xaf, 0x00, 0xcf,
-    0x3d, 0xdc, 0x80, 0x40, 0xff, 0x2c, 0xe2, 0x01, 0xf1, 0x6b, 0xc7, 0x3c, 0xcb, 0x8d, 0x50, 0xca, 0x64, 0x73, 0x03,
-    0x9e, 0x8e, 0x68, 0x8a, 0x41, 0xd6, 0xfa, 0xd5, 0x93, 0xd2, 0xa7, 0xee, 0xe6, 0x50, 0x22, 0x46, 0xf3, 0x8d, 0x3c,
-    0x22, 0x7d, 0x5a, 0x0b, 0x6e, 0x48, 0x15, 0xd3, 0x76, 0xbd, 0x95, 0xf5, 0x42, 0x53, 0x8b, 0xda, 0x6f, 0xb8, 0x63,
-    0x13, 0x98, 0xf6, 0x62, 0x2b, 0x2a, 0xc4, 0x56, 0x4f, 0xc3, 0x6f, 0xb4, 0xeb, 0x13, 0x4d, 0xa7, 0xd4, 0xd0, 0x05,
-    0x26, 0x26, 0x83, 0x15, 0x65, 0x07, 0x1d, 0xff, 0x8b, 0xd3, 0x76, 0xd9, 0x46, 0x6e, 0x04, 0xf1, 0x4d, 0x9e, 0xc3,
-    0xe3, 0xaf, 0xae, 0x74, 0xff, 0x1f, 0x1c, 0x1d, 0xa5, 0x5f, 0x1b, 0x82, 0x00, 0x00};
-
-}  // namespace web_server
-}  // namespace esphome
diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h
new file mode 100644
index 0000000000..21beecfff7
--- /dev/null
+++ b/esphome/components/web_server/server_index_v2.h
@@ -0,0 +1,633 @@
+#pragma once
+// Generated from https://github.com/esphome/esphome-webserver
+#ifdef USE_WEBSERVER_LOCAL
+#if USE_WEBSERVER_VERSION == 2
+#include "esphome/core/hal.h"
+namespace esphome {
+
+namespace web_server {
+
+const uint8_t INDEX_GZ[] PROGMEM = {
+    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc5, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3,
+    0xdc, 0xaf, 0x40, 0xc1, 0xd5, 0x25, 0x64, 0x33, 0x89, 0x22, 0x59, 0xda, 0x0c, 0x56, 0x92, 0x5d, 0x2a, 0xc9, 0x2d,
+    0xbb, 0xb5, 0xd8, 0x2a, 0xc9, 0x6e, 0x9b, 0x66, 0x57, 0xa1, 0x88, 0x24, 0x99, 0x16, 0x88, 0xa4, 0x13, 0xc9, 0x5a,
+    0x4c, 0xe2, 0xc6, 0x7c, 0xc0, 0x44, 0x4c, 0xc4, 0x3c, 0xcd, 0xcb, 0xc4, 0xdc, 0x87, 0xf9, 0x88, 0x79, 0xbe, 0x9f,
+    0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x3b, 0xa1, 0x90, 0x44, 0xe4,
+    0x7a, 0xf2, 0xe4, 0xc9, 0xb3, 0x27, 0x70, 0xbc, 0x97, 0xf0, 0x91, 0xbc, 0x9d, 0x53, 0x6f, 0x2a, 0x67, 0x69, 0xef,
+    0xd8, 0xfc, 0x4b, 0xe3, 0xa4, 0x77, 0x9c, 0xb2, 0xec, 0xa3, 0x27, 0x68, 0x4a, 0xd8, 0x88, 0x67, 0xde, 0x54, 0xd0,
+    0x31, 0x49, 0x62, 0x19, 0x47, 0x6c, 0x16, 0x4f, 0xa8, 0x77, 0xd8, 0x3b, 0x9e, 0x51, 0x19, 0x7b, 0xa3, 0x69, 0x2c,
+    0x72, 0x2a, 0xc9, 0x87, 0xf7, 0x5f, 0x34, 0x9f, 0xf6, 0x8e, 0xf3, 0x91, 0x60, 0x73, 0xe9, 0xc1, 0x90, 0x64, 0xc6,
+    0x93, 0x45, 0x4a, 0x7b, 0x87, 0x87, 0xd7, 0xd7, 0xd7, 0xe1, 0x4f, 0xf9, 0x3f, 0x8d, 0x78, 0x96, 0x4b, 0xef, 0x15,
+    0xb9, 0x66, 0x59, 0xc2, 0xaf, 0x31, 0x95, 0xe4, 0x55, 0x78, 0x36, 0x8d, 0x13, 0x7e, 0xfd, 0x8e, 0x73, 0x79, 0x70,
+    0x10, 0xe8, 0xc7, 0xdb, 0xd3, 0xb3, 0x33, 0x42, 0xc8, 0x15, 0x67, 0x89, 0xd7, 0x5a, 0xad, 0xaa, 0xc2, 0x30, 0x8b,
+    0x25, 0xbb, 0xa2, 0xba, 0x0b, 0x3a, 0x38, 0xf0, 0xe3, 0x84, 0xcf, 0x25, 0x4d, 0xce, 0xe4, 0x6d, 0x4a, 0xcf, 0xa6,
+    0x94, 0xca, 0xdc, 0x67, 0x99, 0xf7, 0x9c, 0x8f, 0x16, 0x33, 0x9a, 0xc9, 0x70, 0x2e, 0xb8, 0xe4, 0x00, 0xc9, 0xc1,
+    0x81, 0x2f, 0xe8, 0x3c, 0x8d, 0x47, 0x14, 0xea, 0x4f, 0xcf, 0xce, 0xaa, 0x1e, 0x55, 0x23, 0xcc, 0x24, 0x39, 0xbb,
+    0x9d, 0x5d, 0xf2, 0x34, 0x40, 0x38, 0x95, 0x24, 0xa3, 0xd7, 0xde, 0x77, 0x34, 0xfe, 0xf8, 0x3a, 0x9e, 0x77, 0x47,
+    0x69, 0x9c, 0xe7, 0xde, 0xa5, 0x5c, 0xaa, 0x25, 0x88, 0xc5, 0x48, 0x72, 0x11, 0x48, 0x4c, 0x31, 0x43, 0x4b, 0x36,
+    0x0e, 0xe4, 0x94, 0xe5, 0xe1, 0xf9, 0xfe, 0x28, 0xcf, 0xdf, 0xd1, 0x7c, 0x91, 0xca, 0x7d, 0xb2, 0xd7, 0xc2, 0x6c,
+    0x8f, 0x10, 0x26, 0x91, 0x9c, 0x0a, 0x7e, 0xed, 0xbd, 0x10, 0x82, 0x8b, 0xc0, 0x3f, 0x3d, 0x3b, 0xd3, 0x2d, 0x3c,
+    0x96, 0x7b, 0x19, 0x97, 0x5e, 0x39, 0x5e, 0x7c, 0x99, 0xd2, 0xd0, 0xfb, 0x90, 0x53, 0xef, 0x62, 0x91, 0xe5, 0xf1,
+    0x98, 0x9e, 0x9e, 0x9d, 0x5d, 0x78, 0x5c, 0x78, 0x17, 0xa3, 0x3c, 0xbf, 0xf0, 0x58, 0x96, 0x4b, 0x1a, 0x27, 0xa1,
+    0x8f, 0xba, 0x6a, 0xb2, 0x51, 0x9e, 0xbf, 0xa7, 0x37, 0x92, 0x48, 0xac, 0x1e, 0x25, 0xa1, 0xc5, 0x84, 0x4a, 0x2f,
+    0x2f, 0xd7, 0x15, 0xa0, 0x65, 0x4a, 0xa5, 0x27, 0x89, 0xaa, 0xe7, 0x5d, 0x8d, 0x7b, 0xaa, 0x1f, 0x65, 0x97, 0x8d,
+    0x03, 0x2a, 0x0f, 0x0e, 0x64, 0x89, 0x67, 0xa4, 0x97, 0xe6, 0x31, 0x42, 0xf7, 0x6c, 0xd9, 0xc1, 0x01, 0x0d, 0x53,
+    0x9a, 0x4d, 0xe4, 0x94, 0x10, 0xd2, 0xee, 0xb2, 0x83, 0x83, 0x40, 0x92, 0x54, 0x86, 0x13, 0x2a, 0x03, 0x8a, 0x10,
+    0xae, 0x7a, 0x1f, 0x1c, 0x04, 0x1a, 0x09, 0x9c, 0x68, 0xc4, 0xd5, 0x70, 0x8c, 0x42, 0x83, 0xfd, 0xb3, 0xdb, 0x6c,
+    0x14, 0xb8, 0xf0, 0x23, 0xcc, 0x0e, 0x0e, 0x52, 0x19, 0xe6, 0x30, 0x22, 0x96, 0x08, 0x15, 0x82, 0xca, 0x85, 0xc8,
+    0x3c, 0x59, 0x48, 0x7e, 0x26, 0x05, 0xcb, 0x26, 0x01, 0x5a, 0xda, 0x32, 0xa7, 0x63, 0x51, 0x68, 0x70, 0xbf, 0x96,
+    0x44, 0x90, 0x1e, 0xcc, 0x78, 0x29, 0x03, 0xd8, 0x45, 0x3e, 0xf6, 0x04, 0x21, 0x7e, 0xae, 0xfa, 0xfa, 0x7d, 0x11,
+    0x89, 0x86, 0xef, 0x63, 0x0d, 0x25, 0x66, 0x12, 0xe1, 0x8f, 0x24, 0x10, 0x38, 0x0c, 0x43, 0x89, 0x48, 0x6f, 0x69,
+    0xb1, 0x22, 0x9c, 0x75, 0xf6, 0xc5, 0xa0, 0x35, 0x8c, 0x64, 0x28, 0x68, 0xb2, 0x18, 0xd1, 0x20, 0x60, 0x38, 0xc7,
+    0x19, 0x22, 0x3d, 0xd6, 0x08, 0x38, 0xe9, 0xc1, 0x76, 0xf3, 0xfa, 0x5e, 0x13, 0xb2, 0xd7, 0x42, 0x06, 0x46, 0x6e,
+    0x01, 0x04, 0x0c, 0x1b, 0x78, 0x38, 0x21, 0x7e, 0xb6, 0x98, 0x5d, 0x52, 0xe1, 0x97, 0xcd, 0xba, 0x35, 0xb2, 0x58,
+    0xe4, 0xd4, 0x1b, 0xe5, 0xb9, 0x37, 0x5e, 0x64, 0x23, 0xc9, 0x78, 0xe6, 0xf9, 0x0d, 0xde, 0xf0, 0x35, 0x39, 0x94,
+    0xd4, 0xe0, 0xa3, 0x02, 0x05, 0x39, 0x6a, 0x88, 0x41, 0xd6, 0x68, 0x0f, 0x31, 0x40, 0x89, 0xba, 0x66, 0x3c, 0x83,
+    0x00, 0x8a, 0x05, 0xac, 0xb1, 0xc0, 0x1f, 0x24, 0xac, 0x52, 0x2d, 0x91, 0xca, 0xbe, 0x08, 0x37, 0x0f, 0x0a, 0x91,
+    0xe1, 0x2c, 0x9e, 0x07, 0x94, 0xf4, 0xa8, 0x22, 0xae, 0x38, 0x1b, 0x01, 0xac, 0xb5, 0x7d, 0xeb, 0xd3, 0x88, 0x86,
+    0x15, 0x49, 0xa1, 0x48, 0x86, 0x63, 0x2e, 0x5e, 0xc4, 0xa3, 0x29, 0xf4, 0x2b, 0x09, 0x26, 0xb1, 0xe7, 0x6d, 0x24,
+    0x68, 0x2c, 0xe9, 0x8b, 0x94, 0xc2, 0x53, 0xe0, 0xab, 0x9e, 0x3e, 0xc2, 0x39, 0x79, 0x15, 0xa6, 0x4c, 0xbe, 0xe1,
+    0xd9, 0x88, 0x76, 0x73, 0x87, 0xba, 0x18, 0xec, 0xfb, 0x89, 0x94, 0x82, 0x5d, 0x2e, 0x24, 0x0d, 0xfc, 0x0c, 0x5a,
+    0xf8, 0x38, 0x47, 0x98, 0x85, 0x92, 0xde, 0xc8, 0x53, 0x9e, 0x49, 0x9a, 0x49, 0x42, 0x2d, 0x52, 0xb1, 0x08, 0xe3,
+    0xf9, 0x9c, 0x66, 0xc9, 0xe9, 0x94, 0xa5, 0x49, 0xc0, 0x50, 0x81, 0x0a, 0x1c, 0x4b, 0x02, 0x6b, 0x24, 0x3d, 0x11,
+    0xc1, 0x3f, 0xbb, 0x57, 0x13, 0x48, 0xd2, 0x53, 0x87, 0x82, 0x12, 0xdf, 0xef, 0x8e, 0xb9, 0x08, 0xcc, 0x0a, 0x3c,
+    0x3e, 0xf6, 0x24, 0xcc, 0xf1, 0x6e, 0x91, 0xd2, 0x1c, 0xd1, 0x06, 0x61, 0xe5, 0x36, 0x1a, 0x04, 0x7f, 0x0d, 0x14,
+    0x5f, 0xa0, 0x40, 0xa0, 0x48, 0x74, 0xaf, 0x62, 0xe1, 0x7d, 0x61, 0x4e, 0xd4, 0x4f, 0x96, 0x9b, 0x4d, 0x25, 0xf9,
+    0x29, 0x94, 0x62, 0x91, 0x4b, 0x9a, 0xbc, 0xbf, 0x9d, 0xd3, 0x1c, 0xbf, 0x94, 0x64, 0x2a, 0xfb, 0x53, 0x19, 0xd2,
+    0xd9, 0x5c, 0xde, 0x9e, 0x29, 0xc6, 0x18, 0xf9, 0x3e, 0x1e, 0x41, 0x4b, 0x41, 0xe3, 0x11, 0x30, 0x33, 0x83, 0xad,
+    0xaf, 0x79, 0x7a, 0x3b, 0x66, 0x69, 0x7a, 0xb6, 0x98, 0xcf, 0xb9, 0x90, 0xf8, 0xaf, 0x64, 0x29, 0x79, 0x85, 0x1a,
+    0xd8, 0xcb, 0x65, 0x7e, 0xcd, 0xe4, 0x68, 0x1a, 0x48, 0xb4, 0x1c, 0xc5, 0x39, 0xf5, 0x9e, 0x71, 0x9e, 0xd2, 0x38,
+    0x8b, 0x04, 0x11, 0xfd, 0x97, 0x32, 0xca, 0x16, 0x69, 0xda, 0xbd, 0x14, 0x34, 0xfe, 0xd8, 0x55, 0xd5, 0x6f, 0x2f,
+    0x7f, 0xa2, 0x23, 0x19, 0xa9, 0xdf, 0x27, 0x42, 0xc4, 0xb7, 0xd0, 0x90, 0x10, 0x68, 0xd6, 0x17, 0xd1, 0x57, 0x67,
+    0x6f, 0xdf, 0x84, 0xfa, 0x90, 0xb0, 0xf1, 0x6d, 0x20, 0xca, 0x83, 0x27, 0x0a, 0x3c, 0x16, 0x7c, 0xb6, 0x36, 0xb5,
+    0xc6, 0x9a, 0xe8, 0xee, 0x00, 0x81, 0x12, 0xb1, 0xa7, 0x87, 0x76, 0x21, 0x78, 0xa3, 0x68, 0x1e, 0x2a, 0x89, 0x99,
+    0x17, 0xfe, 0x89, 0x74, 0x71, 0x20, 0xd0, 0xdd, 0xd0, 0x4a, 0x71, 0xbb, 0xa4, 0x44, 0xc1, 0x39, 0x07, 0x09, 0x03,
+    0x30, 0x8e, 0x62, 0x39, 0x9a, 0x2e, 0xa9, 0x1a, 0xac, 0xb0, 0x10, 0xd3, 0xa2, 0xc0, 0xd7, 0x25, 0xbd, 0xcb, 0x3d,
+    0x42, 0x84, 0x62, 0x54, 0x44, 0xae, 0x56, 0x82, 0x10, 0x81, 0xf0, 0x77, 0x64, 0x19, 0xdb, 0xf5, 0x44, 0x7b, 0x2d,
+    0x0c, 0xe7, 0x32, 0xd2, 0xdc, 0x05, 0x8f, 0x78, 0x76, 0x45, 0x85, 0xa4, 0x22, 0xfa, 0x2b, 0x16, 0x74, 0x9c, 0x02,
+    0x14, 0x7b, 0x6d, 0x3c, 0x8d, 0xf3, 0xd3, 0x69, 0x9c, 0x4d, 0x68, 0x12, 0x5d, 0xcb, 0x02, 0xff, 0x9d, 0xf8, 0x63,
+    0x96, 0xc5, 0x29, 0xfb, 0x85, 0x26, 0xbe, 0x91, 0x06, 0x27, 0x1e, 0xbd, 0x91, 0x34, 0x4b, 0x72, 0xef, 0xe5, 0xfb,
+    0xd7, 0xaf, 0xcc, 0x3e, 0xd6, 0x04, 0x04, 0x5a, 0xe6, 0x8b, 0x39, 0x15, 0x01, 0xc2, 0x46, 0x40, 0xbc, 0x60, 0x8a,
+    0x39, 0xbe, 0x8e, 0xe7, 0xba, 0x84, 0xe5, 0x1f, 0xe6, 0x49, 0x2c, 0xe9, 0xd7, 0x34, 0x4b, 0x58, 0x36, 0x21, 0x7b,
+    0x6d, 0x5d, 0x3e, 0x8d, 0x4d, 0x45, 0x52, 0x16, 0x9d, 0xef, 0xbf, 0x48, 0xd5, 0xba, 0xcb, 0xc7, 0x45, 0x80, 0x8a,
+    0x5c, 0xc6, 0x92, 0x8d, 0xbc, 0x38, 0x49, 0xbe, 0xcc, 0x98, 0x64, 0x0a, 0x40, 0x01, 0xdb, 0x03, 0x24, 0x4a, 0xb5,
+    0xa8, 0xb0, 0x80, 0x07, 0x08, 0x07, 0x81, 0x11, 0x00, 0x53, 0x64, 0xf6, 0xeb, 0xe0, 0xa0, 0x62, 0xf7, 0x7d, 0x1a,
+    0xe9, 0x4a, 0x32, 0x18, 0xa2, 0x70, 0xbe, 0xc8, 0x61, 0xa3, 0xed, 0x14, 0x20, 0x5d, 0xf8, 0x65, 0x4e, 0xc5, 0x15,
+    0x4d, 0x4a, 0xe2, 0xc8, 0x03, 0xb4, 0x5c, 0x9b, 0xc3, 0x1c, 0x0b, 0x49, 0x06, 0xc3, 0xae, 0xcb, 0xb7, 0xa9, 0xa1,
+    0x73, 0xc1, 0xe7, 0x54, 0x48, 0x46, 0xf3, 0x92, 0x95, 0x04, 0x20, 0x45, 0x4b, 0x76, 0x92, 0x13, 0xbb, 0xbe, 0x79,
+    0xc0, 0x30, 0x45, 0x35, 0x86, 0x61, 0x05, 0xed, 0x8b, 0x2b, 0x25, 0x31, 0x72, 0xcc, 0x10, 0x96, 0x1a, 0xd2, 0x1c,
+    0xa1, 0x02, 0x61, 0x69, 0xc1, 0xd5, 0xac, 0xc8, 0xcc, 0x76, 0x0b, 0xa2, 0x9a, 0x7c, 0xa7, 0x44, 0x35, 0x30, 0xb4,
+    0x58, 0xd2, 0x83, 0x83, 0x80, 0x86, 0x25, 0x51, 0x90, 0xbd, 0xb6, 0xd9, 0x23, 0x07, 0x59, 0x3b, 0xc0, 0x86, 0x89,
+    0x25, 0xa6, 0x08, 0xef, 0xd1, 0x30, 0xe3, 0x27, 0xa3, 0x11, 0xcd, 0x73, 0x2e, 0x0e, 0x0e, 0xf6, 0x54, 0xfb, 0x52,
+    0x9b, 0x80, 0x3d, 0x7c, 0x7b, 0x9d, 0x55, 0x10, 0xa0, 0x4a, 0xc2, 0x1a, 0xb9, 0x20, 0x41, 0x4e, 0x29, 0x85, 0xc3,
+    0xef, 0x5b, 0xc5, 0x23, 0xf2, 0xcf, 0xcf, 0xfd, 0x86, 0xc4, 0x06, 0x0d, 0x13, 0x6a, 0xa7, 0xbe, 0x7d, 0x4e, 0xb5,
+    0x6a, 0xa5, 0x14, 0x8f, 0x0d, 0xcc, 0xe8, 0xf3, 0x13, 0x26, 0x74, 0xcc, 0x32, 0x67, 0xd9, 0x35, 0x90, 0xb0, 0xc4,
+    0x39, 0x2a, 0x9c, 0x0d, 0xdd, 0x3a, 0xb4, 0xd2, 0x69, 0xf4, 0xce, 0x2d, 0x27, 0x4a, 0x8f, 0x70, 0xb6, 0x71, 0x40,
+    0x87, 0x05, 0x56, 0xa8, 0xb7, 0xab, 0xc9, 0x14, 0xa0, 0x03, 0x39, 0xec, 0x9a, 0x7a, 0x92, 0x6b, 0xcc, 0x09, 0xfa,
+    0xf3, 0x82, 0xe6, 0x52, 0xd3, 0x71, 0x20, 0x71, 0x86, 0x19, 0x2a, 0xe0, 0xb8, 0x8d, 0xd9, 0x64, 0x21, 0x40, 0xdd,
+    0x81, 0xa3, 0x48, 0xb3, 0xc5, 0x8c, 0xda, 0xa7, 0x6d, 0xb0, 0xbd, 0x9d, 0x83, 0x40, 0xcc, 0x81, 0xa6, 0xef, 0x26,
+    0x27, 0x80, 0x55, 0xa2, 0xd5, 0xea, 0x3b, 0x3b, 0x48, 0xb5, 0x95, 0xa5, 0x8a, 0xb6, 0xb6, 0x27, 0x7f, 0x47, 0x46,
+    0x1e, 0xef, 0xb5, 0x35, 0xf4, 0x7f, 0x1f, 0x92, 0xbd, 0x56, 0x49, 0xc1, 0x06, 0xa7, 0x1a, 0x18, 0x8d, 0xc2, 0xb7,
+    0x7a, 0x20, 0xa4, 0xa4, 0x7b, 0x8d, 0x58, 0xc2, 0xe9, 0x06, 0x9d, 0x4e, 0xc9, 0x00, 0xf4, 0x8c, 0x70, 0x3a, 0xdc,
+    0x45, 0x4c, 0x96, 0x1b, 0x04, 0x72, 0xb3, 0xae, 0x62, 0x1a, 0x57, 0x75, 0xa6, 0xb1, 0xb6, 0x08, 0x7f, 0x5e, 0x76,
+    0xf1, 0x4b, 0x1a, 0x33, 0xc7, 0xbc, 0xaa, 0xc2, 0x4c, 0x01, 0x53, 0x2d, 0xc9, 0x19, 0xe2, 0x4d, 0x3c, 0xa3, 0x79,
+    0x40, 0x11, 0xde, 0xd5, 0x40, 0x13, 0x27, 0x34, 0x19, 0x3a, 0x62, 0x33, 0x07, 0xb1, 0xc9, 0x90, 0xd6, 0xca, 0xea,
+    0xc7, 0x2d, 0xc7, 0x74, 0x90, 0x0f, 0x2b, 0x65, 0xce, 0x59, 0xbc, 0x92, 0xc7, 0x86, 0xba, 0x2d, 0xfe, 0x74, 0x99,
+    0x46, 0x9a, 0x52, 0x1a, 0x72, 0x84, 0xf7, 0x5a, 0xeb, 0xfb, 0x68, 0x5b, 0x55, 0x6b, 0x1c, 0x0c, 0x61, 0x1f, 0x94,
+    0xb8, 0x08, 0x59, 0xae, 0xfe, 0xaf, 0x9d, 0x33, 0x40, 0xdb, 0x19, 0x90, 0x45, 0x38, 0x4e, 0x63, 0x19, 0xb4, 0x0f,
+    0x5b, 0xa0, 0x89, 0x5e, 0x51, 0x90, 0x26, 0x08, 0x6d, 0x2e, 0x85, 0x86, 0x8b, 0x2c, 0x9f, 0xb2, 0xb1, 0x0c, 0x62,
+    0xa9, 0x18, 0x0a, 0x4d, 0x73, 0xea, 0xc9, 0x9a, 0x3e, 0xac, 0x98, 0x4d, 0x0c, 0xa4, 0x56, 0x2a, 0x5f, 0xd4, 0x42,
+    0xaa, 0x98, 0x16, 0xf0, 0x86, 0x4a, 0x97, 0xae, 0x78, 0x8c, 0x6d, 0xcd, 0x40, 0x5f, 0x6c, 0xf7, 0xf5, 0x88, 0x91,
+    0x61, 0x05, 0xcc, 0x51, 0x59, 0x59, 0xe4, 0xf2, 0x07, 0x53, 0x28, 0x43, 0xc9, 0x5f, 0xf1, 0x6b, 0x2a, 0x4e, 0x63,
+    0x00, 0x3e, 0xd2, 0xdd, 0x0b, 0x2d, 0x06, 0x14, 0xb7, 0x97, 0x5d, 0x4b, 0x2f, 0xe7, 0x6a, 0xe1, 0x5f, 0x0b, 0x3e,
+    0x63, 0x39, 0x05, 0x4d, 0x4d, 0xe3, 0x3f, 0x83, 0x53, 0xa6, 0x8e, 0x23, 0x88, 0x1a, 0x5a, 0xd2, 0xd7, 0xc9, 0xab,
+    0x3a, 0x7d, 0x9d, 0xef, 0xbf, 0x98, 0x58, 0xf6, 0x57, 0x3f, 0xc4, 0x08, 0x07, 0xc6, 0x9e, 0x70, 0xa4, 0x5c, 0x38,
+    0x45, 0x46, 0xbc, 0xaf, 0x56, 0xd2, 0x31, 0xdb, 0x6a, 0xba, 0x22, 0xd5, 0xc7, 0x06, 0x15, 0x71, 0x92, 0x80, 0x56,
+    0x27, 0x78, 0x9a, 0x3a, 0x82, 0x0a, 0xb3, 0x6e, 0x29, 0x9a, 0xce, 0xf7, 0x5f, 0x9c, 0xdd, 0x25, 0x9d, 0xa0, 0xde,
+    0x15, 0x50, 0x16, 0xd0, 0x2c, 0xa1, 0x02, 0xcc, 0x48, 0x67, 0xb7, 0x8c, 0x8c, 0x3d, 0xe5, 0x59, 0x46, 0x47, 0x92,
+    0x26, 0x60, 0xa5, 0x30, 0x22, 0xc3, 0x29, 0xcf, 0x65, 0x59, 0x58, 0x41, 0xcf, 0x1c, 0xe8, 0x59, 0x38, 0x8a, 0xd3,
+    0x34, 0xd0, 0x16, 0xc9, 0x8c, 0x5f, 0xd1, 0x2d, 0x50, 0x77, 0x6b, 0x20, 0x97, 0xc3, 0x50, 0x67, 0x18, 0x1a, 0xe6,
+    0xf3, 0x94, 0x8d, 0x68, 0x29, 0xb8, 0xce, 0x42, 0x96, 0x25, 0xf4, 0x06, 0xf8, 0x08, 0xea, 0xf5, 0x7a, 0x2d, 0xdc,
+    0x46, 0x85, 0x46, 0xf8, 0x72, 0x03, 0xb1, 0x77, 0x88, 0x4c, 0x20, 0x32, 0xd2, 0x5b, 0x6e, 0xe3, 0x07, 0x14, 0x39,
+    0x72, 0x92, 0x59, 0xcb, 0x4a, 0xf3, 0x66, 0x84, 0x13, 0x9a, 0x52, 0x49, 0x2d, 0x2f, 0x07, 0xfd, 0x59, 0x1f, 0xdd,
+    0x77, 0x25, 0xfe, 0x4a, 0x72, 0xb2, 0xa7, 0xcc, 0xee, 0x79, 0x5e, 0x5a, 0xea, 0xd5, 0xf6, 0x54, 0xd8, 0xee, 0x4b,
+    0xbd, 0x3d, 0xb1, 0x94, 0xf1, 0x68, 0xaa, 0x4d, 0xf4, 0x60, 0x63, 0x49, 0xd5, 0x18, 0x86, 0xaf, 0x97, 0x87, 0xe8,
+    0x83, 0x05, 0x73, 0x1b, 0x0a, 0xce, 0x0c, 0x53, 0xa0, 0x60, 0xf5, 0xe9, 0x6d, 0x3b, 0x8d, 0xd3, 0xf4, 0x32, 0x1e,
+    0x7d, 0xac, 0x53, 0x7f, 0x45, 0x06, 0x64, 0x9d, 0x1b, 0x3b, 0x55, 0x0e, 0xcb, 0x72, 0xd7, 0x6d, 0xb9, 0x74, 0xed,
+    0xa0, 0x04, 0x7b, 0xad, 0x8a, 0xec, 0xeb, 0x1b, 0xbd, 0x93, 0xda, 0x15, 0x44, 0xcc, 0xac, 0x2c, 0x00, 0x2e, 0xf0,
+    0x49, 0x8a, 0xb3, 0xfc, 0xc0, 0xd0, 0x1d, 0xd8, 0x1a, 0xc5, 0x1a, 0x20, 0x12, 0x2d, 0x8b, 0x84, 0xe5, 0xbb, 0x31,
+    0xf0, 0x87, 0x40, 0xf9, 0xdc, 0x99, 0xe1, 0xbe, 0x80, 0x96, 0x3c, 0xce, 0xa8, 0xcc, 0x25, 0x64, 0x46, 0x9b, 0xb0,
+    0x8c, 0xe6, 0x6f, 0xa0, 0xb9, 0x28, 0x7a, 0x7f, 0xab, 0xab, 0x40, 0x27, 0x03, 0x28, 0xf2, 0xae, 0xab, 0x4c, 0xd4,
+    0x28, 0xc0, 0xf0, 0x54, 0xa6, 0x44, 0x6e, 0x56, 0x33, 0x1e, 0x8d, 0xba, 0xae, 0xed, 0x6f, 0xc3, 0x72, 0x39, 0x09,
+    0x82, 0x20, 0x07, 0xfb, 0xcd, 0xea, 0xf5, 0xd5, 0x22, 0xf2, 0x8d, 0x45, 0xe4, 0xa1, 0x63, 0x64, 0xa1, 0x8a, 0x96,
+    0x9d, 0xee, 0xd1, 0x5f, 0x91, 0xdb, 0x08, 0x94, 0xd5, 0x10, 0xf8, 0x33, 0x2a, 0xd9, 0x6d, 0x4a, 0x24, 0xe6, 0xc6,
+    0xc0, 0x31, 0x94, 0x06, 0x0c, 0xa3, 0xea, 0x92, 0x21, 0x7d, 0x34, 0x6a, 0xc6, 0x6e, 0x86, 0x39, 0x5a, 0xd3, 0xec,
+    0x8b, 0xc2, 0xe0, 0x88, 0x22, 0xb3, 0x37, 0x35, 0x95, 0xd8, 0xc1, 0x0a, 0xce, 0x88, 0x51, 0x83, 0xb5, 0xd6, 0xb3,
+    0x8e, 0x9b, 0x72, 0x5c, 0x38, 0xa8, 0x15, 0x6a, 0x6a, 0xfa, 0xa4, 0x55, 0xac, 0x32, 0x84, 0xa7, 0x56, 0x23, 0xe5,
+    0xd5, 0xba, 0x09, 0xf1, 0xad, 0x37, 0xc2, 0xef, 0x2f, 0x6b, 0x26, 0x61, 0xe4, 0x34, 0x2b, 0x22, 0x60, 0xa9, 0x7c,
+    0x1b, 0xba, 0xb7, 0xd1, 0x4c, 0x6d, 0x1c, 0x07, 0xe1, 0xdc, 0x45, 0xb8, 0x83, 0xd9, 0x4c, 0x73, 0xae, 0x6c, 0x48,
+    0xa6, 0xf5, 0xbe, 0x01, 0xc5, 0x5c, 0xef, 0xc3, 0x06, 0x12, 0xd7, 0x15, 0x4f, 0x45, 0x82, 0x60, 0xc0, 0xe6, 0xa0,
+    0xdc, 0xb9, 0xf2, 0x21, 0x00, 0xd8, 0xd9, 0x6a, 0xb5, 0x41, 0x74, 0x5b, 0xf5, 0x4f, 0x14, 0x56, 0x46, 0xe1, 0x6a,
+    0x75, 0x2d, 0x51, 0x60, 0x34, 0x5f, 0x4c, 0x51, 0xdf, 0x72, 0xdc, 0x93, 0x57, 0xd0, 0x4a, 0x29, 0xa2, 0x55, 0x49,
+    0x69, 0x32, 0xd4, 0x69, 0xb6, 0xbe, 0x4f, 0xd2, 0x61, 0xdb, 0xa7, 0x1b, 0xdc, 0x4b, 0x15, 0x1a, 0x31, 0x5d, 0x2d,
+    0xf9, 0xd4, 0x0c, 0xcd, 0x10, 0x42, 0x51, 0xae, 0xac, 0x98, 0xbd, 0x6d, 0x86, 0xe5, 0xc1, 0x41, 0xee, 0x0c, 0x74,
+    0x5e, 0xb2, 0x89, 0x9f, 0x02, 0x10, 0xc9, 0xf9, 0x6d, 0xa6, 0x74, 0x97, 0x9f, 0xac, 0x10, 0xda, 0x30, 0x4b, 0x5b,
+    0x5d, 0xb0, 0xc6, 0xe3, 0xeb, 0x98, 0x49, 0xaf, 0x1c, 0x45, 0x5b, 0xe3, 0x01, 0x45, 0x4b, 0xa3, 0x6a, 0x84, 0x82,
+    0x82, 0xf2, 0x08, 0x3c, 0xc1, 0xaa, 0xd0, 0x9a, 0xee, 0x47, 0x53, 0x0a, 0x8e, 0x60, 0xab, 0x45, 0x94, 0x76, 0xe1,
+    0x9e, 0x91, 0x22, 0x66, 0xe0, 0xed, 0xb0, 0x17, 0xeb, 0xdd, 0x6b, 0x76, 0xc0, 0x9c, 0x8a, 0x31, 0x17, 0x33, 0x5b,
+    0x57, 0xac, 0x3d, 0x1b, 0xce, 0xc8, 0xc6, 0xc1, 0xd6, 0xb1, 0x8d, 0xfa, 0xdf, 0x5d, 0x33, 0xba, 0x2b, 0x73, 0xbd,
+    0x26, 0x4a, 0x4b, 0xe9, 0xab, 0xfd, 0x81, 0x96, 0x32, 0x73, 0xd7, 0xbc, 0x37, 0xce, 0xd4, 0xae, 0x76, 0x98, 0xec,
+    0xb5, 0xbb, 0xa5, 0xcd, 0x67, 0xa9, 0xa1, 0xab, 0x1d, 0x1b, 0x46, 0xa4, 0xf2, 0x45, 0x9a, 0x18, 0x60, 0x19, 0xc2,
+    0xd4, 0xd0, 0xd1, 0x35, 0x4b, 0xd3, 0xaa, 0xf4, 0xd7, 0xf0, 0xf5, 0xdc, 0xf0, 0xf5, 0xcc, 0xf2, 0x75, 0xe0, 0x14,
+    0xc0, 0xd7, 0xf5, 0x70, 0x55, 0xf7, 0x6c, 0xe3, 0x74, 0x66, 0x9a, 0xa3, 0xe7, 0xca, 0x8e, 0x86, 0xf9, 0x16, 0x16,
+    0x02, 0x54, 0x6a, 0x5e, 0x1f, 0x03, 0xe3, 0x84, 0x01, 0x03, 0x50, 0xbb, 0x30, 0xa9, 0xeb, 0xa2, 0xf8, 0x18, 0x20,
+    0x9c, 0x17, 0xb4, 0xa4, 0xec, 0x93, 0x17, 0xe0, 0xa4, 0x73, 0x96, 0x03, 0x42, 0x4c, 0x15, 0xff, 0x2a, 0x25, 0xca,
+    0xae, 0x8e, 0x99, 0xd5, 0xe5, 0x76, 0x75, 0xc0, 0xe9, 0xab, 0xd5, 0x25, 0x77, 0xf3, 0x7a, 0xb5, 0x3c, 0x56, 0x2e,
+    0xaf, 0xda, 0xef, 0xd5, 0x2a, 0x58, 0x2b, 0x01, 0xff, 0xbd, 0x31, 0x51, 0x44, 0x39, 0x3a, 0xf0, 0x00, 0x17, 0x33,
+    0x50, 0x50, 0xe8, 0x45, 0x97, 0x22, 0xee, 0xd5, 0xa7, 0x1c, 0x3c, 0xca, 0x4d, 0xaf, 0xfb, 0x9f, 0xf2, 0xd9, 0x1c,
+    0xb4, 0xb1, 0x35, 0x92, 0x9e, 0x50, 0x33, 0x61, 0x55, 0x5f, 0x6c, 0x29, 0xab, 0xf5, 0x51, 0xe7, 0xb1, 0x46, 0x4d,
+    0xa5, 0xbd, 0xbc, 0xd7, 0x2a, 0x16, 0x65, 0x51, 0xc9, 0x38, 0xb6, 0x39, 0x55, 0x4e, 0xd7, 0x5d, 0x32, 0xb6, 0xe2,
+    0x6d, 0xc0, 0x34, 0x1f, 0x66, 0xc0, 0xeb, 0x1c, 0xf6, 0x63, 0xc9, 0xdd, 0xdd, 0xff, 0xa2, 0x42, 0xce, 0xb2, 0x58,
+    0x43, 0xdf, 0xb2, 0x28, 0x4e, 0xb4, 0x91, 0x8d, 0x4f, 0x76, 0x5b, 0xc3, 0x55, 0x9d, 0x31, 0x16, 0x07, 0x43, 0x7c,
+    0xb2, 0xa9, 0x3a, 0x92, 0xe5, 0x8c, 0x27, 0x34, 0xf2, 0xf9, 0x9c, 0x66, 0x7e, 0x01, 0x5e, 0x55, 0xb3, 0xf7, 0x23,
+    0x19, 0x2c, 0xdf, 0xd5, 0xdd, 0xab, 0xd1, 0x49, 0x01, 0xde, 0xaf, 0x2f, 0x36, 0x1d, 0xaf, 0xdf, 0x52, 0x91, 0x2b,
+    0x45, 0xb4, 0xd4, 0x69, 0xbf, 0xa8, 0xc4, 0xd2, 0x17, 0xd1, 0xce, 0xf6, 0x95, 0x09, 0xe2, 0xb7, 0xc3, 0xc7, 0xe1,
+    0x91, 0x8f, 0x94, 0x5b, 0xf8, 0x2b, 0x73, 0xe0, 0x9f, 0x5b, 0xb7, 0xf0, 0x0b, 0xf2, 0xbc, 0xee, 0x15, 0x4e, 0x24,
+    0x79, 0xd1, 0x7f, 0x61, 0x2d, 0x66, 0x9e, 0xb2, 0xd1, 0x6d, 0xe0, 0xa7, 0x4c, 0x36, 0x21, 0xf4, 0xe6, 0xe3, 0xa5,
+    0xae, 0x00, 0x97, 0xa2, 0x72, 0x67, 0x17, 0xd6, 0xd6, 0xc3, 0x52, 0x12, 0x7f, 0x3f, 0x65, 0x72, 0xdf, 0xc7, 0x33,
+    0x72, 0x01, 0x3f, 0xf6, 0x97, 0xc1, 0xeb, 0x58, 0x4e, 0x43, 0x11, 0x67, 0x09, 0x9f, 0x05, 0xa8, 0xe1, 0xfb, 0x28,
+    0xcc, 0x95, 0xbd, 0xf1, 0x39, 0x2a, 0xf6, 0x2f, 0xf0, 0x8d, 0x24, 0x7e, 0xdf, 0x6f, 0xcc, 0xf0, 0x1b, 0x49, 0x2e,
+    0x8e, 0xf7, 0x97, 0x37, 0xb2, 0xe8, 0x5d, 0xe0, 0x9b, 0xd2, 0x63, 0x8f, 0xbf, 0x26, 0x01, 0x22, 0xbd, 0x1b, 0x03,
+    0xcd, 0x29, 0x9f, 0x69, 0xcf, 0xbd, 0x8f, 0xf0, 0x07, 0x88, 0xab, 0x88, 0x8a, 0xdb, 0x98, 0xd0, 0xca, 0x1e, 0xf1,
+    0xb9, 0x72, 0x11, 0xf8, 0x07, 0x07, 0x4e, 0x59, 0xa9, 0x2a, 0xe0, 0x13, 0x49, 0x6a, 0x06, 0x39, 0x7e, 0xaf, 0x22,
+    0x34, 0x27, 0x32, 0x10, 0xc8, 0x0e, 0x13, 0x58, 0x3f, 0xb4, 0x39, 0x9a, 0x62, 0xa0, 0x3d, 0x0c, 0x21, 0x93, 0x54,
+    0xc4, 0x92, 0x8b, 0x21, 0x72, 0xd5, 0x0f, 0xfc, 0x37, 0x72, 0x31, 0xf0, 0xfe, 0xd3, 0x3f, 0xfd, 0x38, 0xfe, 0x51,
+    0x0c, 0x2f, 0xf0, 0x5b, 0x72, 0x78, 0x1c, 0xf4, 0xa3, 0x60, 0xaf, 0xd9, 0x5c, 0xfd, 0x78, 0x38, 0xf8, 0x47, 0xdc,
+    0xfc, 0xe5, 0xa4, 0xf9, 0xc3, 0x10, 0xad, 0x82, 0x1f, 0x0f, 0xfb, 0x03, 0xf3, 0x34, 0xf8, 0x47, 0xef, 0xc7, 0x7c,
+    0xf8, 0x67, 0x5d, 0xb8, 0x8f, 0xd0, 0xe1, 0x04, 0x2f, 0x24, 0x39, 0x6c, 0x36, 0x7b, 0x87, 0x13, 0x3c, 0x97, 0xe4,
+    0x10, 0xfe, 0xbf, 0x24, 0xef, 0xe8, 0xe4, 0xc5, 0xcd, 0x3c, 0xb8, 0xe8, 0xad, 0xf6, 0x97, 0x7f, 0x2b, 0x60, 0xd4,
+    0xc1, 0x3f, 0x7e, 0xfc, 0x31, 0xf7, 0x1f, 0xf4, 0xc8, 0xe1, 0xb0, 0x81, 0x02, 0x28, 0xfd, 0x33, 0x51, 0xff, 0x06,
+    0xfd, 0x68, 0xf0, 0x0f, 0x03, 0x85, 0xff, 0xe0, 0xc7, 0x8b, 0xe3, 0x1e, 0x19, 0xae, 0x02, 0x7f, 0xf5, 0x00, 0xad,
+    0x10, 0x5a, 0xed, 0xa3, 0x0b, 0xec, 0x4f, 0x7c, 0x84, 0x27, 0x92, 0x1c, 0x3e, 0x38, 0x9c, 0xe0, 0x2b, 0x49, 0x0e,
+    0xfd, 0xc3, 0x09, 0x7e, 0x21, 0xc9, 0xe1, 0x3f, 0x82, 0x7e, 0xa4, 0x3d, 0x6c, 0x2b, 0xe5, 0xde, 0x58, 0x41, 0x70,
+    0x23, 0x16, 0x34, 0x5e, 0x49, 0x26, 0x53, 0x8a, 0xf6, 0x0f, 0x19, 0x3e, 0x53, 0x68, 0x0a, 0x24, 0x38, 0x61, 0xc0,
+    0xb6, 0x0b, 0x96, 0xe7, 0xb0, 0xd9, 0x40, 0x33, 0xfb, 0x91, 0xc0, 0xda, 0x0f, 0x90, 0x47, 0x12, 0x5f, 0xc5, 0xe9,
+    0x82, 0xe6, 0x11, 0x2d, 0x10, 0x1e, 0x91, 0x33, 0x19, 0xb4, 0x11, 0x7e, 0x27, 0xe1, 0x47, 0x07, 0xe1, 0x33, 0x13,
+    0xc0, 0x84, 0x83, 0xac, 0x89, 0x2a, 0xe3, 0x5a, 0x63, 0xf1, 0x11, 0x9e, 0x6f, 0xa9, 0x94, 0x53, 0xf0, 0x2e, 0x20,
+    0x3c, 0xae, 0x85, 0x3b, 0xf1, 0x35, 0xb1, 0x24, 0xf1, 0x5e, 0x50, 0xfa, 0x5d, 0x9c, 0x7e, 0xa4, 0x22, 0xb8, 0xc1,
+    0xed, 0xce, 0xe7, 0x58, 0xb9, 0xa0, 0xf7, 0xda, 0xa8, 0x5b, 0xc6, 0xaa, 0x4e, 0xa5, 0x8e, 0x11, 0x80, 0x90, 0xad,
+    0xfb, 0x62, 0x60, 0xc7, 0xf7, 0xc4, 0x86, 0xc3, 0x4a, 0xc4, 0xd7, 0x3e, 0xaa, 0xc7, 0x45, 0x59, 0x76, 0x15, 0xa7,
+    0x2c, 0xf1, 0x24, 0x9d, 0xcd, 0xd3, 0x58, 0x52, 0xcf, 0xac, 0xd7, 0x8b, 0x61, 0x20, 0xbf, 0x54, 0x19, 0x12, 0xc7,
+    0xe0, 0x4c, 0x6c, 0xc0, 0x09, 0xce, 0x4a, 0x00, 0xd1, 0x29, 0xa3, 0x76, 0xbc, 0xae, 0x82, 0x5f, 0xeb, 0xf1, 0xbd,
+    0x66, 0x1b, 0x1c, 0x61, 0x43, 0x25, 0x9e, 0x73, 0x9c, 0x11, 0x10, 0xa2, 0x9d, 0xbe, 0x7f, 0x9c, 0x5f, 0x4d, 0x7a,
+    0x3e, 0xc4, 0x66, 0x38, 0x79, 0xab, 0xfc, 0x42, 0xd0, 0x60, 0x4a, 0x5a, 0xdd, 0xe9, 0x31, 0xed, 0x4e, 0x1b, 0x0d,
+    0xab, 0x43, 0xa7, 0x44, 0x0c, 0xa6, 0xba, 0x7b, 0x8c, 0x13, 0xbc, 0x20, 0xcd, 0x36, 0x9e, 0x90, 0x96, 0xea, 0xd2,
+    0x9d, 0x1c, 0xa7, 0x66, 0x9a, 0x83, 0x83, 0x80, 0x87, 0x69, 0x9c, 0xcb, 0x2f, 0xc1, 0xd8, 0x27, 0x13, 0x9c, 0x10,
+    0x1e, 0xd2, 0x1b, 0x3a, 0x0a, 0x52, 0x84, 0x13, 0xc3, 0x69, 0x50, 0x17, 0x4d, 0x88, 0xd3, 0x0c, 0x8c, 0x08, 0xf2,
+    0xb6, 0x9f, 0x0c, 0xda, 0x43, 0x42, 0x88, 0xbf, 0xd7, 0x6c, 0xfa, 0x7d, 0x4e, 0x16, 0x32, 0x82, 0x12, 0x47, 0x55,
+    0x26, 0x73, 0x28, 0xea, 0x38, 0x45, 0xc1, 0x0b, 0x19, 0x4a, 0x9a, 0xcb, 0x00, 0x8a, 0xc1, 0xfc, 0xcf, 0x2d, 0x61,
+    0xfb, 0xc7, 0x87, 0x7e, 0x03, 0x4a, 0x15, 0x71, 0x22, 0xcc, 0xc9, 0x25, 0x8a, 0x92, 0xc1, 0xd1, 0xd0, 0xe5, 0xff,
+    0xaa, 0x10, 0x26, 0xbf, 0xec, 0x27, 0x83, 0x96, 0x9a, 0xbc, 0xe7, 0xf7, 0x03, 0x4e, 0x72, 0xad, 0xa0, 0xf5, 0xf3,
+    0xe8, 0xad, 0x5a, 0x2a, 0x8a, 0x0c, 0x70, 0x66, 0xde, 0x05, 0x69, 0x76, 0xa2, 0x60, 0xe1, 0x2e, 0xa2, 0x09, 0x93,
+    0x19, 0x2c, 0xe0, 0x98, 0x40, 0x7b, 0xcc, 0x09, 0xcc, 0x58, 0x75, 0xbb, 0x8c, 0xcc, 0xf3, 0x03, 0xff, 0x41, 0xff,
+    0x4a, 0x46, 0x13, 0xa9, 0xa7, 0xbf, 0x92, 0xab, 0x15, 0xfc, 0x3f, 0x91, 0x7d, 0x4e, 0x2e, 0x55, 0xd1, 0xc2, 0x14,
+    0xcd, 0xa1, 0xe8, 0x6d, 0x04, 0xa0, 0xe2, 0xbc, 0x54, 0xb2, 0xf4, 0x9e, 0x5c, 0x11, 0x05, 0xfb, 0xc1, 0x81, 0x18,
+    0x4c, 0x1b, 0xed, 0x21, 0xf8, 0xf7, 0x85, 0xcc, 0xbf, 0x63, 0x72, 0x1a, 0xf8, 0x87, 0x3d, 0x1f, 0xf5, 0x7d, 0x0f,
+    0xb6, 0xb6, 0x9b, 0x35, 0x88, 0xc6, 0x70, 0xda, 0x78, 0x23, 0xa3, 0x45, 0x8f, 0xb4, 0xfa, 0x01, 0x33, 0xfe, 0x3c,
+    0x84, 0x53, 0xc3, 0x38, 0x5b, 0x78, 0x81, 0x1a, 0x52, 0x36, 0xec, 0xf3, 0x02, 0x35, 0x66, 0x8d, 0x2b, 0x14, 0xa5,
+    0x8d, 0x59, 0x23, 0x58, 0x10, 0x42, 0x9a, 0x9d, 0xb2, 0x9b, 0x95, 0x7e, 0x53, 0x14, 0x5d, 0x59, 0x67, 0xe7, 0x40,
+    0x1d, 0x87, 0xac, 0x11, 0x88, 0x01, 0x1d, 0xae, 0x56, 0xfe, 0x71, 0xbf, 0xe7, 0xa3, 0x46, 0x60, 0x09, 0xed, 0xd0,
+    0x52, 0x1a, 0x42, 0x98, 0x0d, 0x0b, 0x13, 0x4a, 0x7a, 0x59, 0x0b, 0x1b, 0x2d, 0xab, 0xc3, 0xee, 0xf0, 0x00, 0x5a,
+    0x94, 0x76, 0x8c, 0xd6, 0x57, 0xe7, 0xb0, 0x4c, 0x4b, 0xcc, 0x19, 0x69, 0x61, 0x4e, 0xac, 0xef, 0x7a, 0x4a, 0x64,
+    0x45, 0xf0, 0x29, 0xa9, 0x9a, 0xe3, 0x41, 0x8c, 0x93, 0x21, 0x79, 0xad, 0xed, 0x91, 0xae, 0xf5, 0x8b, 0xd3, 0x94,
+    0xbc, 0x5c, 0x8b, 0xde, 0xc6, 0x10, 0x5b, 0xb9, 0x0e, 0x47, 0x0b, 0x21, 0x68, 0x26, 0xdf, 0xf0, 0xc4, 0xa8, 0x69,
+    0x34, 0x05, 0x4b, 0x09, 0xc2, 0xb2, 0x18, 0x74, 0xb4, 0x8e, 0x3d, 0x19, 0x8b, 0x8d, 0xea, 0x09, 0x59, 0x68, 0xf5,
+    0x49, 0x05, 0x6b, 0xbb, 0x13, 0x63, 0x17, 0x07, 0x08, 0x2f, 0x4c, 0x14, 0x37, 0x08, 0xc3, 0x70, 0x12, 0x8e, 0xa0,
+    0x1a, 0x26, 0xc8, 0x51, 0xa1, 0xce, 0x51, 0x90, 0x93, 0xeb, 0x30, 0xa3, 0x37, 0x6a, 0xd6, 0x00, 0x55, 0x92, 0xd9,
+    0x1e, 0xaf, 0xe3, 0x69, 0x57, 0xb1, 0x9b, 0x3c, 0xcc, 0x78, 0x42, 0x01, 0x3d, 0x10, 0xb7, 0x37, 0x45, 0xd3, 0x38,
+    0x77, 0xe3, 0x53, 0x15, 0x7c, 0x03, 0xd7, 0x79, 0x3d, 0x01, 0x8f, 0xaf, 0xd2, 0xb5, 0xca, 0xc6, 0xda, 0x0d, 0x8e,
+    0x10, 0x1b, 0x07, 0x93, 0x10, 0xe2, 0x7a, 0x8a, 0x84, 0x24, 0x98, 0x72, 0x13, 0x97, 0xa8, 0x66, 0xe5, 0x98, 0x57,
+    0x24, 0x19, 0xf0, 0x46, 0x43, 0x79, 0xa1, 0x17, 0x9a, 0x24, 0x26, 0x08, 0x5f, 0x95, 0x67, 0xcb, 0xb6, 0x7b, 0x2b,
+    0x49, 0x7d, 0xaa, 0xe0, 0xaa, 0xee, 0xce, 0x6d, 0x48, 0x89, 0x94, 0xa7, 0x50, 0x06, 0x33, 0x84, 0x9f, 0x91, 0xc3,
+    0x60, 0x10, 0xf6, 0xff, 0x32, 0x44, 0xfd, 0x20, 0xfc, 0x33, 0x3a, 0xd4, 0x9c, 0xe3, 0x0a, 0x75, 0x53, 0x3d, 0xc7,
+    0x52, 0xc5, 0x2f, 0xdb, 0x58, 0x79, 0x12, 0xa3, 0x0c, 0x67, 0xf1, 0x8c, 0x46, 0xcf, 0xe0, 0x90, 0x5b, 0xc2, 0x79,
+    0x2b, 0x31, 0x50, 0x52, 0xf4, 0xcc, 0xf0, 0x92, 0xd0, 0xef, 0xbf, 0x92, 0xe5, 0x53, 0xdf, 0xef, 0x3f, 0xaf, 0x9e,
+    0xfe, 0xe2, 0xf7, 0x7f, 0x91, 0xd1, 0xcf, 0x85, 0xf1, 0x76, 0xd7, 0xe6, 0x78, 0x6c, 0xe7, 0x28, 0xf4, 0xd6, 0x38,
+    0xb8, 0x5b, 0xa0, 0x4d, 0x47, 0xc7, 0x04, 0x15, 0x6c, 0x5c, 0x32, 0xa3, 0x3c, 0x94, 0xf1, 0x04, 0x90, 0xea, 0xec,
+    0x41, 0xee, 0xc6, 0xf5, 0xab, 0x15, 0x03, 0xa9, 0x58, 0x7a, 0x05, 0x64, 0x4e, 0x7a, 0x2d, 0xb4, 0xac, 0xb5, 0x55,
+    0x3a, 0x53, 0x3d, 0x8e, 0x5e, 0xf2, 0xe9, 0x2b, 0xd2, 0xea, 0x5e, 0x1d, 0x4f, 0xba, 0x57, 0x8d, 0x06, 0xca, 0x2d,
+    0x69, 0x2d, 0x06, 0x57, 0x43, 0xfc, 0x35, 0x38, 0xf5, 0x5c, 0x5a, 0xc2, 0xb5, 0xe5, 0x75, 0xcc, 0xf2, 0x1a, 0x8d,
+    0xac, 0x40, 0x5d, 0xa7, 0xeb, 0x44, 0x77, 0x2d, 0x0a, 0x8d, 0x93, 0x75, 0x52, 0x7b, 0x8a, 0x54, 0x09, 0x24, 0x43,
+    0x11, 0x42, 0x6e, 0x24, 0xda, 0x3a, 0x2a, 0x8c, 0x09, 0xdd, 0xd5, 0x99, 0x05, 0xf6, 0xa9, 0xa5, 0x44, 0x00, 0x58,
+    0x80, 0xae, 0xa5, 0x27, 0x78, 0x86, 0x17, 0x8d, 0xb6, 0x22, 0xf3, 0x66, 0xbb, 0x5b, 0x1f, 0xeb, 0x49, 0x35, 0x16,
+    0x5e, 0x34, 0xc8, 0xac, 0xc4, 0x52, 0x91, 0x35, 0x1a, 0x45, 0x3d, 0xd8, 0x69, 0x4f, 0x6e, 0x2d, 0x00, 0x71, 0xb3,
+    0x9e, 0x94, 0x61, 0x25, 0x6c, 0x25, 0x53, 0x59, 0xc8, 0xb2, 0x8c, 0x0a, 0x90, 0xa2, 0x44, 0x62, 0x56, 0x14, 0x95,
+    0x64, 0x07, 0x31, 0x8a, 0x29, 0x11, 0xc0, 0x79, 0x94, 0xdd, 0x85, 0x33, 0xcc, 0xf1, 0x54, 0xf1, 0x0d, 0x42, 0xc8,
+    0x99, 0x4d, 0x67, 0x91, 0x8a, 0x07, 0xa5, 0x84, 0x39, 0x32, 0x29, 0x27, 0x34, 0x3c, 0xdf, 0x3f, 0xe5, 0x77, 0xda,
+    0x64, 0x03, 0x36, 0x8c, 0x54, 0xb3, 0xd4, 0x70, 0xae, 0x98, 0x7c, 0x08, 0x24, 0x2a, 0xa3, 0x23, 0xa1, 0x62, 0x80,
+    0xcf, 0x99, 0xa0, 0x4a, 0x07, 0xdf, 0xb7, 0x76, 0x5f, 0x5a, 0x57, 0x20, 0x53, 0xd7, 0x7b, 0x03, 0x88, 0x8c, 0xc1,
+    0xb9, 0x93, 0x91, 0x8d, 0x66, 0xe7, 0xfb, 0x27, 0x6f, 0xb7, 0xd9, 0xc0, 0xab, 0x95, 0xb1, 0x7e, 0x95, 0x6e, 0x83,
+    0xe3, 0x0a, 0xd2, 0xd4, 0xfc, 0x88, 0x82, 0x54, 0xa9, 0x48, 0x71, 0x20, 0x80, 0x8a, 0xce, 0xf7, 0x4f, 0xde, 0x07,
+    0x42, 0xf9, 0x96, 0x10, 0x76, 0x97, 0x1d, 0x70, 0x12, 0x4c, 0x09, 0x45, 0x7a, 0xed, 0x25, 0xeb, 0xe2, 0x8e, 0x00,
+    0x8f, 0xa6, 0xaa, 0x12, 0x2c, 0x88, 0x01, 0x1b, 0x92, 0xd4, 0x60, 0x80, 0xa4, 0x08, 0xa7, 0x35, 0xbb, 0x8c, 0xc0,
+    0x06, 0xa8, 0xb9, 0xce, 0x60, 0x27, 0x42, 0xad, 0xfa, 0x21, 0x9c, 0xaa, 0x59, 0x65, 0xa1, 0x85, 0xc7, 0xb3, 0x8d,
+    0xac, 0xb4, 0xca, 0x1c, 0xfd, 0x16, 0x6c, 0x27, 0xfb, 0xf0, 0x86, 0x58, 0x4b, 0xc2, 0x14, 0x3c, 0xb7, 0xe9, 0x63,
+    0xe7, 0xfb, 0x27, 0xaf, 0x4d, 0x06, 0xd9, 0x3c, 0xb6, 0xfc, 0x7e, 0xc3, 0xc4, 0x3c, 0x79, 0x1d, 0x56, 0xb5, 0xaa,
+    0xf1, 0xf9, 0xfe, 0xc9, 0x87, 0x6d, 0xcd, 0xa0, 0xbc, 0x58, 0x54, 0x36, 0xbe, 0x82, 0x6f, 0x49, 0xd3, 0x68, 0x69,
+    0x84, 0x43, 0xc4, 0x0a, 0xac, 0x04, 0x52, 0x94, 0x17, 0xa5, 0x6b, 0xe4, 0x39, 0xce, 0x88, 0x0a, 0x03, 0xd5, 0x77,
+    0xcd, 0xa8, 0x79, 0x8c, 0x67, 0x67, 0x23, 0x3e, 0xa7, 0x3b, 0x62, 0x43, 0x37, 0x28, 0x64, 0x33, 0x48, 0x9d, 0x51,
+    0xa0, 0x33, 0xbc, 0xd7, 0x42, 0xdd, 0xba, 0xf8, 0xca, 0x14, 0x91, 0xf2, 0x9a, 0x6c, 0xc1, 0x53, 0xd2, 0xc2, 0x29,
+    0x69, 0xe1, 0x98, 0xe4, 0x83, 0x96, 0x16, 0x10, 0xdd, 0xb8, 0x1c, 0x57, 0x8b, 0x19, 0xc8, 0x0a, 0x33, 0xa7, 0x55,
+    0x0b, 0xe0, 0xa4, 0x1b, 0x2b, 0xdf, 0xa3, 0x92, 0xe9, 0x89, 0x22, 0x8b, 0xf7, 0x01, 0xc7, 0x5c, 0x0d, 0x7c, 0xc6,
+    0x2e, 0x53, 0x48, 0x2c, 0x81, 0x55, 0x61, 0x89, 0xa2, 0xb2, 0x69, 0xdb, 0x34, 0x8d, 0x43, 0xb5, 0x4f, 0x1c, 0xc7,
+    0x21, 0x70, 0x6e, 0x1c, 0x9b, 0x3c, 0x9c, 0x7c, 0xb3, 0xcb, 0xe3, 0x83, 0x83, 0x40, 0x77, 0xfa, 0x52, 0x06, 0xdc,
+    0xd6, 0x57, 0x91, 0xbb, 0x6f, 0x35, 0xaf, 0x48, 0x90, 0x82, 0xbf, 0xd1, 0x48, 0x87, 0x05, 0x84, 0xa1, 0x83, 0xb8,
+    0x8e, 0x41, 0x0b, 0xbc, 0xd2, 0xf5, 0xea, 0xcb, 0x6f, 0x34, 0xca, 0x28, 0x6d, 0x1d, 0x5b, 0x37, 0x38, 0x2b, 0xae,
+    0x82, 0x32, 0xf5, 0xa7, 0xb5, 0x91, 0x2f, 0x65, 0x41, 0x40, 0xcc, 0xa5, 0x59, 0x66, 0x17, 0xe3, 0x1c, 0x09, 0x06,
+    0xed, 0xbe, 0x34, 0x59, 0x0b, 0x58, 0x65, 0x57, 0x99, 0x46, 0x96, 0x9d, 0x75, 0x50, 0x64, 0x1b, 0x41, 0x54, 0x0a,
+    0x1a, 0x35, 0x0a, 0x43, 0xde, 0xef, 0x37, 0x73, 0x2e, 0x71, 0x8e, 0x8c, 0x93, 0x4b, 0x41, 0xa1, 0x90, 0xd5, 0x29,
+    0x91, 0xf2, 0x92, 0xcc, 0x77, 0x93, 0xfc, 0x89, 0x43, 0xf2, 0xcf, 0x08, 0x75, 0xc8, 0x5f, 0xbb, 0x38, 0x42, 0x6e,
+    0x9c, 0x0b, 0xb9, 0xad, 0x3a, 0x9d, 0x13, 0x70, 0xa2, 0xd5, 0x31, 0x5a, 0x0b, 0x2b, 0xee, 0x60, 0x28, 0xee, 0x09,
+    0x51, 0x6e, 0x48, 0x6c, 0x63, 0xc0, 0x41, 0x15, 0x54, 0x83, 0xa9, 0xb7, 0xf9, 0xf4, 0x5c, 0x0e, 0x78, 0xf2, 0xe1,
+    0xee, 0x78, 0xe8, 0xe9, 0x7c, 0xf3, 0xe4, 0x3a, 0xb9, 0x9f, 0xb0, 0x6a, 0xe7, 0xe0, 0xd6, 0x33, 0x41, 0x61, 0xfe,
+    0x32, 0x8e, 0x5d, 0x67, 0x3e, 0x6b, 0x87, 0xd0, 0xca, 0x3f, 0x80, 0xb6, 0xdd, 0x56, 0x2d, 0xa8, 0x33, 0x2c, 0xf0,
+    0x23, 0x9d, 0x81, 0x1a, 0x8b, 0x1d, 0xec, 0xe3, 0x44, 0x35, 0xa0, 0x59, 0xb2, 0xbd, 0xfa, 0x59, 0x61, 0xc8, 0x44,
+    0x83, 0x86, 0x96, 0xc0, 0xff, 0x34, 0xc9, 0x03, 0xdd, 0x28, 0xb9, 0x00, 0x08, 0x9a, 0x2b, 0x3c, 0x55, 0x08, 0xf3,
+    0xfd, 0xca, 0xfb, 0xfe, 0x72, 0x8f, 0x90, 0x79, 0xe5, 0x7d, 0x7c, 0x57, 0xa5, 0x5e, 0x01, 0x59, 0xa0, 0x08, 0xcc,
+    0xc7, 0xb2, 0x40, 0x87, 0x2f, 0xcf, 0x6c, 0x73, 0x65, 0x42, 0x86, 0x95, 0xc6, 0xed, 0x84, 0x36, 0x95, 0x5b, 0x4e,
+    0xd7, 0x5b, 0x34, 0xac, 0xd5, 0xee, 0x43, 0xed, 0x7b, 0xa9, 0x60, 0x84, 0xe7, 0xf7, 0xaa, 0xb5, 0x1d, 0xb7, 0xf8,
+    0xb8, 0x9e, 0xbf, 0xb2, 0xb6, 0x29, 0x21, 0xcb, 0x72, 0x2a, 0xe4, 0x33, 0x3a, 0xe6, 0x02, 0x62, 0x16, 0x25, 0x4e,
+    0x50, 0xb1, 0xef, 0xf8, 0xed, 0xd4, 0xfa, 0x9c, 0x40, 0xc1, 0xda, 0x02, 0xd5, 0xaf, 0x8f, 0x2a, 0x68, 0x7d, 0xbe,
+    0xde, 0x6b, 0x7e, 0x70, 0xf0, 0xa1, 0x42, 0x93, 0x81, 0x52, 0x41, 0xe1, 0x30, 0x2d, 0xad, 0xd2, 0x98, 0x48, 0xee,
+    0x7e, 0x50, 0x3a, 0x01, 0x2c, 0xc3, 0x70, 0x79, 0xcf, 0x4b, 0x22, 0x8b, 0xc9, 0x3a, 0x8b, 0x37, 0xce, 0x09, 0xe6,
+    0x1a, 0x2e, 0xc0, 0xe1, 0xc1, 0xd4, 0xd6, 0xde, 0xa2, 0xbc, 0x4a, 0x86, 0x2d, 0x61, 0x38, 0x05, 0x64, 0x05, 0xca,
+    0x0c, 0x71, 0x28, 0x70, 0xab, 0x59, 0x72, 0x0a, 0x7a, 0xe5, 0x14, 0xe7, 0xe1, 0x14, 0xd2, 0x5f, 0x6b, 0x47, 0x16,
+    0x21, 0xac, 0x13, 0x73, 0x9c, 0x54, 0x82, 0x93, 0x97, 0xdb, 0x5c, 0xca, 0x96, 0xa8, 0xa9, 0x92, 0x3a, 0xaa, 0x05,
+    0x2a, 0x3b, 0x84, 0x57, 0x01, 0x33, 0x8a, 0x9b, 0x8d, 0x9b, 0x01, 0x03, 0x7e, 0x26, 0x03, 0x1d, 0x8c, 0x02, 0x99,
+    0xc1, 0xc3, 0x45, 0x50, 0x9b, 0xba, 0xcb, 0x55, 0x37, 0x6c, 0x10, 0x37, 0x75, 0xd1, 0xc4, 0x55, 0x5c, 0xef, 0xb4,
+    0xe2, 0xa5, 0x63, 0x9d, 0x41, 0x2d, 0x2d, 0x17, 0xac, 0x12, 0x49, 0x9c, 0xe5, 0x8f, 0x75, 0x52, 0x74, 0xd9, 0x08,
+    0x53, 0x05, 0xc6, 0x4b, 0xb5, 0x07, 0xb4, 0x00, 0xfa, 0x5a, 0x9e, 0x48, 0x67, 0x47, 0xad, 0x13, 0x5b, 0xcd, 0xe9,
+    0x48, 0xfd, 0x77, 0x90, 0xea, 0xb2, 0x7e, 0xe6, 0x5f, 0x2a, 0x59, 0xc8, 0x70, 0x5e, 0x63, 0xec, 0x99, 0x62, 0xec,
+    0x08, 0xf4, 0x34, 0x9b, 0xf8, 0xdd, 0x37, 0x19, 0x2f, 0xcc, 0x48, 0x39, 0x43, 0x62, 0x5f, 0x97, 0xd1, 0x72, 0xe7,
+    0xf7, 0xda, 0x6e, 0x44, 0x8c, 0x40, 0x16, 0x10, 0x36, 0x9c, 0x3d, 0x43, 0x38, 0x6f, 0x34, 0xba, 0xf9, 0x31, 0xad,
+    0x9c, 0x24, 0x15, 0x8c, 0x0c, 0x02, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x21, 0x7f, 0x9b, 0x99, 0x9d, 0x83, 0xaf,
+    0xfd, 0xe4, 0x5d, 0xe0, 0x72, 0x35, 0xb7, 0x6d, 0x19, 0x34, 0x85, 0xf5, 0x04, 0x55, 0xc0, 0xe5, 0xeb, 0xbb, 0x13,
+    0x3c, 0x00, 0xee, 0xbd, 0x36, 0x86, 0x54, 0x34, 0xd4, 0x95, 0x9a, 0x25, 0x94, 0xa7, 0xaf, 0x8b, 0xaa, 0xac, 0x44,
+    0x77, 0xb2, 0xae, 0xac, 0x8c, 0x59, 0x49, 0xf2, 0xa2, 0xc8, 0x69, 0x15, 0xde, 0x5f, 0x4b, 0xbf, 0x54, 0xc2, 0x65,
+    0xd3, 0xdb, 0x7e, 0x3a, 0x27, 0x12, 0x3b, 0x84, 0xfa, 0xf5, 0xae, 0xd8, 0x47, 0x05, 0x26, 0x9c, 0x6b, 0x23, 0x14,
+    0x7f, 0xde, 0x26, 0x14, 0x71, 0x66, 0x8e, 0xbc, 0x12, 0x88, 0xed, 0x7b, 0x08, 0x44, 0xe3, 0x66, 0xb7, 0x32, 0x11,
+    0xd4, 0x91, 0x9a, 0x4c, 0xac, 0x6f, 0x29, 0xc9, 0x30, 0x33, 0xbb, 0xd1, 0xeb, 0xac, 0x56, 0x6c, 0xd0, 0x02, 0x37,
+    0x92, 0xef, 0xc3, 0xcf, 0xb6, 0xfe, 0xe9, 0x70, 0x62, 0xed, 0x06, 0x0e, 0x58, 0x69, 0xb2, 0xa0, 0x10, 0x12, 0x9c,
+    0x03, 0x95, 0x94, 0xa5, 0x68, 0xda, 0x50, 0x90, 0x21, 0x70, 0xc2, 0xca, 0x30, 0x13, 0x40, 0xac, 0x64, 0x85, 0x31,
+    0x20, 0x83, 0xad, 0xb9, 0x7f, 0xd6, 0xbc, 0xfc, 0xb4, 0x26, 0x5a, 0x93, 0x2b, 0x5a, 0x7d, 0xa8, 0xe5, 0x1b, 0x18,
+    0x08, 0x8c, 0x7e, 0xb8, 0xa7, 0x4c, 0xd0, 0x4a, 0x94, 0x23, 0x57, 0x0e, 0xe1, 0x16, 0x38, 0xd1, 0xf6, 0x3e, 0xe8,
+    0x08, 0xef, 0x16, 0x69, 0x82, 0xb9, 0x43, 0xd7, 0x2f, 0x89, 0xac, 0xb1, 0x92, 0x29, 0x31, 0x96, 0x12, 0x8e, 0x15,
+    0x99, 0x4a, 0x92, 0x0d, 0x5a, 0x43, 0x50, 0x40, 0xbb, 0xe9, 0x71, 0x56, 0x99, 0xc0, 0x69, 0xa3, 0x81, 0x62, 0x3b,
+    0xeb, 0x74, 0xc0, 0x1a, 0xe9, 0x10, 0x53, 0x9c, 0x6a, 0xc3, 0xe4, 0xec, 0xe0, 0x20, 0x88, 0xab, 0x79, 0x07, 0xe9,
+    0x10, 0x61, 0xbe, 0x5a, 0x05, 0x0a, 0xac, 0x18, 0xad, 0x56, 0xb1, 0x0b, 0x96, 0xaa, 0x86, 0x6e, 0xf3, 0xbe, 0x24,
+    0x73, 0x25, 0x00, 0xe7, 0x00, 0x61, 0x83, 0x04, 0xb1, 0x71, 0xef, 0xc5, 0xe0, 0x8e, 0x6a, 0x64, 0x83, 0xb4, 0xd1,
+    0x1e, 0x3a, 0x8c, 0x6b, 0x90, 0x0e, 0x49, 0x5c, 0xf0, 0x83, 0x83, 0xbd, 0xdc, 0x88, 0xc8, 0x9f, 0x40, 0x94, 0xfd,
+    0xa4, 0x24, 0x8b, 0x1e, 0xd0, 0xdd, 0x8d, 0x75, 0x67, 0x40, 0x49, 0x51, 0x66, 0x5b, 0x6d, 0xbb, 0x5a, 0x16, 0x44,
+    0xd9, 0x08, 0x9b, 0x60, 0x70, 0x1f, 0x2c, 0xfb, 0x92, 0xcc, 0x5f, 0xc9, 0x32, 0xc7, 0xfa, 0xe7, 0xad, 0x99, 0xd5,
+    0x61, 0x18, 0xc6, 0x62, 0xa2, 0x62, 0x19, 0x36, 0x0c, 0xab, 0x88, 0xff, 0xc8, 0x80, 0xe9, 0x4c, 0x3c, 0x28, 0xe7,
+    0x1a, 0x12, 0x0d, 0xbe, 0x55, 0x6d, 0xec, 0x5d, 0x92, 0x9f, 0xb6, 0x7a, 0x19, 0x34, 0x24, 0xcf, 0x7f, 0x2b, 0x24,
+    0x0f, 0x0d, 0x24, 0x9a, 0x3c, 0xd6, 0x70, 0xb6, 0x03, 0x17, 0x3f, 0xc9, 0x35, 0x9c, 0xed, 0xc6, 0xad, 0xc5, 0xd4,
+    0x2f, 0xbb, 0xe0, 0x73, 0x78, 0x83, 0x06, 0xb4, 0x2a, 0x70, 0xa0, 0x7c, 0xb4, 0xae, 0x7b, 0x69, 0x56, 0x0a, 0xc2,
+    0x54, 0x92, 0x80, 0xd5, 0x0f, 0x40, 0xa5, 0x8d, 0x3a, 0x86, 0x2f, 0x8b, 0xe6, 0xc8, 0x71, 0x09, 0xd4, 0x53, 0x57,
+    0x80, 0x9c, 0x8c, 0xb7, 0x7d, 0x7e, 0x70, 0x00, 0xb6, 0x01, 0x28, 0x71, 0xe1, 0x28, 0x9e, 0xcb, 0x85, 0x00, 0x55,
+    0x2a, 0xb7, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xa8, 0x32, 0xf8, 0x01, 0x05, 0xf3, 0x38, 0xcf, 0xd9, 0x95, 0x2e, 0x33,
+    0xbf, 0x31, 0x27, 0x96, 0x94, 0x73, 0xad, 0x13, 0x66, 0xa8, 0x9b, 0x19, 0x3a, 0xad, 0xa3, 0xed, 0xc5, 0x15, 0xcd,
+    0xe4, 0x2b, 0x96, 0x4b, 0x9a, 0xc1, 0xf2, 0x2b, 0x8a, 0x83, 0x15, 0xe5, 0x08, 0x0e, 0x6c, 0xad, 0x57, 0x9c, 0x24,
+    0x77, 0x76, 0x91, 0x75, 0x1d, 0x68, 0x1a, 0x67, 0x49, 0xaa, 0x27, 0x71, 0xf3, 0x19, 0x6d, 0x0e, 0x67, 0xd9, 0xd2,
+    0xcd, 0xa7, 0xa9, 0x94, 0x0d, 0xc5, 0xdd, 0x03, 0x46, 0xac, 0x24, 0xb0, 0xd2, 0xf3, 0x4e, 0xad, 0x05, 0x22, 0xde,
+    0x3b, 0x36, 0xc1, 0x5d, 0x09, 0x96, 0x0e, 0x47, 0x0d, 0xeb, 0x70, 0x5a, 0xba, 0xf9, 0x72, 0xeb, 0x95, 0xb6, 0x6d,
+    0xc2, 0x41, 0xd1, 0xc9, 0xe3, 0xdd, 0x96, 0xd5, 0x6b, 0x2b, 0x39, 0xac, 0xb4, 0x60, 0xf7, 0x65, 0xcc, 0x68, 0x69,
+    0xc9, 0x0b, 0xd9, 0xa3, 0xb8, 0x2f, 0xc9, 0x73, 0xb8, 0x33, 0xf4, 0x52, 0xce, 0xd2, 0xb5, 0xab, 0x31, 0xdd, 0xfd,
+    0x52, 0xfb, 0xdf, 0x97, 0xc1, 0x4b, 0xfc, 0x1e, 0x02, 0xbb, 0x5f, 0x55, 0xcd, 0x37, 0x03, 0xba, 0x5f, 0x55, 0x08,
+    0xfa, 0x2a, 0xda, 0x68, 0xe7, 0x04, 0x72, 0x3b, 0xe1, 0xd3, 0xb0, 0xe5, 0x5b, 0x6d, 0xe9, 0x67, 0x1d, 0x46, 0xd2,
+    0x99, 0x96, 0xea, 0x3c, 0xe0, 0x2a, 0x4f, 0x0d, 0xf2, 0xe5, 0xea, 0x16, 0x12, 0x35, 0x19, 0x86, 0x5a, 0x87, 0xdf,
+    0xb5, 0x3d, 0x46, 0xc6, 0x64, 0xda, 0xce, 0xf8, 0x3a, 0x16, 0x72, 0x1f, 0x4e, 0x19, 0xdf, 0xb8, 0x87, 0x37, 0x25,
+    0xe0, 0x41, 0xbb, 0xdf, 0x14, 0x8e, 0xb1, 0x9d, 0xeb, 0x7b, 0x40, 0xee, 0xf8, 0x84, 0x5b, 0xdd, 0xad, 0x6e, 0x65,
+    0x7c, 0x0d, 0xf6, 0x3f, 0xc2, 0x53, 0x7b, 0x39, 0x8e, 0x1a, 0x0e, 0x4c, 0xa3, 0x65, 0x51, 0x3a, 0x05, 0xb8, 0x56,
+    0xde, 0x04, 0xc2, 0xbc, 0x50, 0x01, 0xee, 0x1f, 0xf0, 0x37, 0x86, 0x25, 0x8e, 0x4b, 0x8e, 0x73, 0x72, 0x5f, 0x8e,
+    0xa8, 0xc1, 0x2f, 0xe3, 0xf7, 0x40, 0xc7, 0x8a, 0x42, 0x0b, 0x4b, 0x45, 0xcf, 0xb9, 0x59, 0xc8, 0xce, 0xb4, 0x54,
+    0x4c, 0xcb, 0x94, 0x1a, 0x35, 0xcd, 0x96, 0x3c, 0x4e, 0x6b, 0x65, 0xcb, 0xf2, 0x54, 0xd5, 0xe6, 0x45, 0x3b, 0xb0,
+    0x58, 0x85, 0x16, 0x57, 0xab, 0xa0, 0x8e, 0x6a, 0xc2, 0x9c, 0x48, 0x06, 0xc2, 0xcc, 0xc9, 0xa8, 0xa8, 0x69, 0xd6,
+    0xba, 0x4f, 0x80, 0xd6, 0x13, 0x8a, 0xac, 0x6e, 0x5e, 0x83, 0xc3, 0x75, 0x21, 0xe8, 0xee, 0xae, 0x4f, 0x01, 0xeb,
+    0xd5, 0x95, 0x13, 0x39, 0x18, 0xfa, 0xb9, 0x4c, 0x95, 0xad, 0x72, 0x5a, 0xb7, 0xe0, 0x17, 0xdd, 0x91, 0x2c, 0x6b,
+    0x50, 0xb7, 0x59, 0xef, 0x24, 0x1b, 0x3d, 0xe7, 0xbb, 0x92, 0x8d, 0x6a, 0xda, 0xee, 0x5e, 0x0b, 0xdd, 0x9d, 0x96,
+    0xaa, 0xe7, 0xda, 0xde, 0xe4, 0x37, 0x4c, 0xd7, 0x06, 0xda, 0xd4, 0x68, 0xb6, 0x5c, 0xe5, 0xac, 0x28, 0xc6, 0xe5,
+    0x65, 0x02, 0x95, 0xbb, 0x33, 0xd6, 0xf4, 0x6f, 0xac, 0x46, 0x75, 0x1d, 0x37, 0xf8, 0x81, 0x4c, 0x52, 0x7e, 0x19,
+    0xa7, 0xef, 0x61, 0xbe, 0xaa, 0xf2, 0xe5, 0x6d, 0x22, 0x62, 0x49, 0x0d, 0x77, 0xa9, 0x60, 0xf8, 0xc1, 0x81, 0xe1,
+    0x07, 0xcd, 0xa7, 0xab, 0xfe, 0x78, 0xf9, 0xaa, 0x1c, 0x20, 0x1a, 0x17, 0x96, 0x65, 0x9c, 0xcb, 0xed, 0x73, 0xac,
+    0xb3, 0xb0, 0xf3, 0x92, 0x85, 0x9d, 0xcb, 0x60, 0x7d, 0xa8, 0x20, 0xf8, 0x66, 0xfb, 0x28, 0x9b, 0x9c, 0xed, 0x9b,
+    0xea, 0xe0, 0x7f, 0x13, 0xdd, 0xd9, 0xc7, 0xe1, 0x72, 0x47, 0xe1, 0x91, 0x4a, 0x57, 0xd1, 0x20, 0xbf, 0x83, 0xb4,
+    0x03, 0x49, 0x7a, 0xce, 0x9d, 0x83, 0x4a, 0x4e, 0xd9, 0x44, 0xa0, 0x60, 0xb4, 0xc8, 0x25, 0x9f, 0x99, 0x31, 0x73,
+    0x73, 0xcd, 0x48, 0x55, 0x82, 0x2b, 0x5a, 0x45, 0xdb, 0xa3, 0xfa, 0x45, 0xae, 0xe5, 0x47, 0x96, 0x25, 0x51, 0x8e,
+    0x8d, 0x14, 0xc9, 0xa3, 0xac, 0x20, 0x36, 0xd9, 0x78, 0xb3, 0x0e, 0x8f, 0x59, 0xc6, 0xf2, 0x29, 0x15, 0x01, 0x47,
+    0xcb, 0x5d, 0x93, 0x71, 0x08, 0xc8, 0xe8, 0xc9, 0xf0, 0xb7, 0xd5, 0x85, 0xbf, 0x10, 0x46, 0x03, 0x3f, 0xd0, 0x8c,
+    0xca, 0x29, 0x4f, 0x20, 0x31, 0x25, 0x4c, 0xca, 0x1b, 0x4d, 0x07, 0x07, 0x7b, 0x81, 0xaf, 0xdc, 0x12, 0x70, 0xf5,
+    0xdb, 0xad, 0x41, 0xfd, 0x25, 0x5c, 0xcf, 0xa9, 0xa6, 0xa6, 0x68, 0x49, 0xd7, 0x6f, 0xb2, 0xc8, 0xf0, 0x23, 0xbd,
+    0xc5, 0x02, 0x15, 0x45, 0xa4, 0xa1, 0xf6, 0xc7, 0x8c, 0xa6, 0x89, 0x8f, 0x3f, 0xd2, 0xdb, 0xa8, 0xbc, 0x2d, 0xae,
+    0x2e, 0x37, 0xab, 0x0d, 0xf4, 0xf9, 0x75, 0xe6, 0xe3, 0x6a, 0x92, 0x68, 0x59, 0x60, 0x2e, 0xd8, 0x04, 0x88, 0xf3,
+    0x6f, 0xf4, 0x36, 0xd2, 0xe3, 0x31, 0xe7, 0xb2, 0x1e, 0x5a, 0x5a, 0xd4, 0x87, 0x4e, 0xb1, 0xbb, 0x0d, 0xc6, 0xa0,
+    0x18, 0xa8, 0xbe, 0x43, 0x52, 0x6b, 0x57, 0x99, 0x87, 0x08, 0x15, 0xf7, 0x5d, 0x0a, 0xfe, 0xc2, 0x15, 0x6d, 0xb2,
+    0x96, 0xfa, 0xba, 0xd6, 0x89, 0x42, 0x87, 0x2a, 0xd7, 0xe3, 0x3c, 0x10, 0xf6, 0xd4, 0x99, 0x3b, 0x08, 0x8e, 0x23,
+    0xec, 0x0b, 0x69, 0x06, 0x8d, 0xbe, 0xd5, 0x29, 0x21, 0x55, 0x24, 0xe9, 0x75, 0xd5, 0xcf, 0x3b, 0x0f, 0x00, 0xef,
+    0x90, 0xd2, 0x12, 0xab, 0xeb, 0x98, 0x85, 0x4d, 0x17, 0xfd, 0x4e, 0x92, 0x60, 0x69, 0x97, 0x10, 0x09, 0x17, 0x8b,
+    0xb2, 0x00, 0x2a, 0x34, 0xf4, 0xa5, 0x33, 0x00, 0xd9, 0x38, 0x60, 0x1b, 0x52, 0x33, 0x53, 0x52, 0x33, 0x74, 0x30,
+    0xbe, 0x43, 0x4a, 0x52, 0x85, 0x0c, 0xa5, 0x44, 0x2a, 0xa1, 0x67, 0x36, 0xd7, 0x90, 0x90, 0xbb, 0xa1, 0xe5, 0xf5,
+    0x39, 0xbd, 0xe7, 0x59, 0x0d, 0xac, 0x40, 0x8d, 0x83, 0x8a, 0x08, 0x96, 0x44, 0x75, 0x83, 0xc2, 0xba, 0x73, 0x84,
+    0xcd, 0x6f, 0x0d, 0x78, 0x68, 0x97, 0x45, 0x2c, 0x4a, 0x82, 0x29, 0x5a, 0x8a, 0x60, 0x8a, 0x33, 0xc8, 0x47, 0xe4,
+    0x45, 0x09, 0x3f, 0x75, 0x77, 0xa3, 0x96, 0xad, 0xbc, 0xfd, 0x8a, 0x1f, 0x28, 0xf3, 0x12, 0x72, 0x34, 0xb1, 0xb0,
+    0x3c, 0x45, 0x04, 0xea, 0xae, 0x9d, 0xb3, 0x6d, 0x5f, 0x99, 0x14, 0x1d, 0x03, 0xd8, 0x77, 0x32, 0x58, 0x3a, 0xab,
+    0x70, 0xef, 0x72, 0x9b, 0x2b, 0x7f, 0x26, 0xd8, 0x57, 0x25, 0x91, 0x06, 0x39, 0x59, 0x93, 0x38, 0x77, 0xe7, 0x5a,
+    0xfe, 0xbc, 0xa0, 0xe2, 0xf6, 0x8c, 0x42, 0xae, 0x33, 0x87, 0xbb, 0xbe, 0xd5, 0x36, 0x54, 0x79, 0xea, 0xfd, 0x4c,
+    0x29, 0x2b, 0x45, 0xfd, 0x12, 0xe0, 0xfa, 0x15, 0xc1, 0x42, 0x45, 0x1b, 0x1d, 0x47, 0x8c, 0x3e, 0x2d, 0x74, 0xe7,
+    0xe5, 0x49, 0xda, 0x65, 0xe0, 0x5f, 0xab, 0x30, 0x6d, 0x82, 0x05, 0x98, 0xbb, 0x17, 0x52, 0x07, 0xf9, 0x70, 0xdd,
+    0x2b, 0x03, 0x45, 0x10, 0xbe, 0xcb, 0x76, 0x2f, 0x75, 0x5b, 0xd6, 0xec, 0xee, 0xa5, 0xd6, 0x82, 0x7e, 0x2a, 0xe5,
+    0x07, 0x9b, 0x79, 0xca, 0xcb, 0xcb, 0xac, 0x28, 0x50, 0x01, 0xe0, 0x7d, 0xdf, 0x0d, 0x82, 0xef, 0x4d, 0xd2, 0x60,
+    0x08, 0xb1, 0xd8, 0xb3, 0x94, 0x5b, 0x26, 0x5e, 0xcd, 0xff, 0xfd, 0xc6, 0xfc, 0xdf, 0x3b, 0x57, 0x4e, 0xc1, 0x34,
+    0x9a, 0x64, 0x34, 0xb1, 0xac, 0x13, 0x69, 0x02, 0x54, 0x7a, 0x5b, 0x2e, 0xc9, 0xc7, 0x8b, 0x08, 0x34, 0xae, 0xe5,
+    0x98, 0x67, 0xb2, 0x39, 0x8e, 0x67, 0x2c, 0xbd, 0x8d, 0x16, 0xac, 0x39, 0xe3, 0x19, 0xcf, 0xe7, 0xf1, 0x88, 0xe2,
+    0xfc, 0x36, 0x97, 0x74, 0xd6, 0x5c, 0x30, 0xfc, 0x92, 0xa6, 0x57, 0x54, 0xb2, 0x51, 0x8c, 0xfd, 0x13, 0xc1, 0xe2,
+    0xd4, 0x7b, 0x13, 0x0b, 0xc1, 0xaf, 0x7d, 0xfc, 0x8e, 0x5f, 0x72, 0xc9, 0xf1, 0xdb, 0x9b, 0xdb, 0x09, 0xcd, 0xf0,
+    0x87, 0xcb, 0x45, 0x26, 0x17, 0x38, 0x8f, 0xb3, 0xbc, 0x99, 0x53, 0xc1, 0xc6, 0xdd, 0x11, 0x4f, 0xb9, 0x68, 0x42,
+    0xca, 0xf6, 0x8c, 0x46, 0x29, 0x9b, 0x4c, 0xa5, 0x97, 0xc4, 0xe2, 0x63, 0xb7, 0xd9, 0x9c, 0x0b, 0x36, 0x8b, 0xc5,
+    0x6d, 0x53, 0xb5, 0x88, 0x3e, 0x6b, 0x1d, 0xc5, 0x9f, 0x8f, 0x1f, 0x76, 0xa5, 0x88, 0xb3, 0x9c, 0xc1, 0x36, 0x45,
+    0x71, 0x9a, 0x7a, 0x47, 0x8f, 0x5a, 0xb3, 0x7c, 0x4f, 0x07, 0xf2, 0xe2, 0x4c, 0x16, 0x17, 0xf8, 0x23, 0xc0, 0x1d,
+    0x5e, 0xca, 0x0c, 0x5f, 0x2e, 0xa4, 0xe4, 0xd9, 0x72, 0xb4, 0x10, 0x39, 0x17, 0xd1, 0x9c, 0xb3, 0x4c, 0x52, 0xd1,
+    0xbd, 0xe4, 0x22, 0xa1, 0xa2, 0x29, 0xe2, 0x84, 0x2d, 0xf2, 0xe8, 0xe1, 0xfc, 0xa6, 0x0b, 0x9a, 0xc5, 0x44, 0xf0,
+    0x45, 0x96, 0x98, 0xb9, 0x58, 0x36, 0xa5, 0x82, 0x49, 0xb7, 0x42, 0xbd, 0xc2, 0x24, 0x4a, 0x59, 0x46, 0x63, 0xd1,
+    0x9c, 0x40, 0x67, 0x30, 0x8b, 0x5a, 0x09, 0x9d, 0x60, 0x31, 0xb9, 0x8c, 0x83, 0x76, 0xe7, 0x09, 0xb6, 0x7f, 0xc3,
+    0x47, 0xc8, 0x6b, 0x6d, 0x2f, 0x6e, 0xb7, 0x5a, 0x7f, 0x42, 0xdd, 0xb5, 0x59, 0x14, 0x40, 0x51, 0x7b, 0x7e, 0xe3,
+    0xe5, 0x1c, 0x72, 0xda, 0xb6, 0xf5, 0xec, 0xce, 0xe3, 0x04, 0x12, 0x82, 0xa3, 0xce, 0xfc, 0xa6, 0x80, 0xd5, 0x45,
+    0x3a, 0xc9, 0xd4, 0x2c, 0xd2, 0x3c, 0x2d, 0x7f, 0x2b, 0xc4, 0x4f, 0xb7, 0x43, 0xdc, 0xb1, 0x10, 0x57, 0x58, 0x6f,
+    0x26, 0x0b, 0xa1, 0x62, 0xab, 0x51, 0x3b, 0xd7, 0x80, 0x4c, 0xf9, 0x15, 0x15, 0x16, 0x0e, 0xf5, 0xf0, 0x9b, 0xc1,
+    0xe8, 0x6c, 0x07, 0xe3, 0xe9, 0xa7, 0xc0, 0x10, 0x59, 0xb2, 0xac, 0xef, 0x6b, 0x5b, 0xd0, 0x59, 0x77, 0x4a, 0x81,
+    0x9e, 0xa2, 0x0e, 0xfc, 0xbe, 0x66, 0x89, 0x9c, 0xea, 0x9f, 0x8a, 0x9c, 0xaf, 0x75, 0xdd, 0xa3, 0x56, 0x4b, 0x3f,
+    0xe7, 0xec, 0x17, 0x1a, 0xb5, 0x43, 0x68, 0x50, 0x5c, 0xe0, 0xbf, 0x95, 0x97, 0x79, 0xeb, 0xdc, 0x13, 0xff, 0xe0,
+    0xde, 0xf2, 0x75, 0x92, 0x14, 0xab, 0x1b, 0xd1, 0x58, 0x58, 0x59, 0xa9, 0x85, 0x0f, 0xb8, 0xed, 0xd4, 0x79, 0x22,
+    0xac, 0x57, 0xde, 0xe2, 0x64, 0xfd, 0x1f, 0x74, 0xde, 0x45, 0x04, 0x91, 0x0e, 0x27, 0xd9, 0x90, 0x77, 0xb3, 0x1e,
+    0x69, 0x75, 0xb3, 0x66, 0x13, 0x05, 0x9c, 0x88, 0x41, 0x66, 0xd2, 0xf3, 0x02, 0xd6, 0xe7, 0xca, 0xd8, 0xce, 0x51,
+    0xc4, 0xe1, 0xaa, 0xe9, 0x6a, 0x55, 0x85, 0x01, 0x98, 0xba, 0xae, 0xf1, 0x37, 0x69, 0x1a, 0xe0, 0xdc, 0xe1, 0xe4,
+    0x99, 0x7d, 0xb1, 0x8b, 0xb0, 0xbc, 0x22, 0xe5, 0x23, 0x85, 0xb9, 0x70, 0x1e, 0xcb, 0x29, 0x78, 0x29, 0x4a, 0xf1,
+    0x53, 0x25, 0x31, 0xf9, 0x87, 0x3e, 0xea, 0x8b, 0x32, 0xc3, 0x0d, 0x32, 0xf9, 0x44, 0x01, 0xa3, 0x7c, 0x23, 0x09,
+    0x8c, 0x88, 0x7f, 0x21, 0xda, 0xa6, 0xb3, 0x16, 0xdd, 0xf8, 0xbe, 0x16, 0x1d, 0xcd, 0x24, 0x53, 0xb9, 0xdb, 0x36,
+    0xe2, 0x30, 0x8d, 0xf3, 0xf3, 0x91, 0xbe, 0x2b, 0x99, 0x57, 0x37, 0x03, 0x62, 0x05, 0xbd, 0x36, 0xd2, 0xa8, 0x50,
+    0xf6, 0xe8, 0xf7, 0x72, 0xa7, 0x7d, 0x22, 0xee, 0xb2, 0x4f, 0xca, 0x85, 0xe7, 0x7c, 0x21, 0x46, 0x10, 0x8e, 0x34,
+    0x52, 0x6f, 0xd3, 0x71, 0xe3, 0x2b, 0x15, 0xc3, 0xc7, 0xd2, 0xc9, 0x04, 0x95, 0x98, 0xb9, 0x2f, 0x95, 0xa0, 0x2a,
+    0xe4, 0xa5, 0xef, 0x6b, 0x18, 0x11, 0x67, 0x97, 0x04, 0x32, 0x3b, 0x51, 0x49, 0x8d, 0x41, 0x46, 0x7a, 0x59, 0xb8,
+    0xc8, 0xd8, 0xcf, 0x0b, 0x7a, 0xce, 0x40, 0xd7, 0x64, 0x21, 0x4b, 0x54, 0xac, 0x09, 0x64, 0x5f, 0xb3, 0x0d, 0xc1,
+    0x0b, 0x96, 0xe8, 0x8d, 0xc9, 0x54, 0xa5, 0xc9, 0x6d, 0xf2, 0x9b, 0x3e, 0xf8, 0x8b, 0x41, 0x3b, 0x60, 0x38, 0xe1,
+    0xb3, 0x98, 0x65, 0x91, 0x72, 0xf9, 0x96, 0x83, 0x45, 0xd0, 0x1a, 0xb3, 0x24, 0xca, 0xcc, 0xf6, 0xb4, 0x51, 0xf8,
+    0x13, 0x67, 0x99, 0xea, 0x5a, 0x74, 0xb9, 0x42, 0xa8, 0x46, 0x1f, 0xb1, 0x08, 0x3e, 0xd1, 0x72, 0x8d, 0x23, 0xec,
+    0x56, 0x97, 0xd7, 0xce, 0x6b, 0x3b, 0xd0, 0x5a, 0xdb, 0x28, 0x6d, 0x04, 0xf0, 0xf5, 0xd2, 0x9c, 0x0b, 0x19, 0x04,
+    0x53, 0x9c, 0x22, 0xd2, 0x9b, 0x2a, 0x67, 0xd7, 0x71, 0xaa, 0xfe, 0xeb, 0x37, 0xdb, 0x51, 0xbb, 0x34, 0xdf, 0x6b,
+    0xb7, 0x81, 0x75, 0x72, 0x94, 0xb9, 0x51, 0xaa, 0x96, 0x51, 0xfe, 0xd6, 0x4b, 0xad, 0x9e, 0xcb, 0xe5, 0x62, 0x73,
+    0xdc, 0xb4, 0xa8, 0x0a, 0x6a, 0x40, 0xa8, 0x60, 0xd1, 0x8e, 0xa9, 0x50, 0x51, 0xad, 0xbb, 0x54, 0x25, 0x2f, 0xb4,
+    0x88, 0x3e, 0xdf, 0x5f, 0x0a, 0x33, 0x63, 0x71, 0xc1, 0xac, 0x93, 0xa9, 0x4e, 0x72, 0x85, 0xc1, 0x88, 0xa3, 0x87,
+    0x6e, 0x6b, 0xa6, 0x61, 0xb9, 0x25, 0x62, 0x2b, 0xdd, 0x86, 0xfa, 0x91, 0x0a, 0x52, 0x85, 0xbb, 0x36, 0x06, 0x80,
+    0x5c, 0xbd, 0x6d, 0x80, 0x81, 0xd9, 0x9a, 0x4b, 0xbb, 0x04, 0xd0, 0xc6, 0xc6, 0x14, 0x2e, 0xd2, 0x5c, 0xec, 0x2f,
+    0xbf, 0x91, 0xc5, 0xa1, 0xd3, 0x54, 0xfd, 0x66, 0x09, 0xfc, 0x0f, 0x12, 0x70, 0xa9, 0x95, 0xd2, 0xc8, 0xff, 0xfa,
+    0xed, 0xd9, 0x7b, 0x1f, 0x5f, 0xf2, 0xe4, 0x36, 0xf2, 0xa5, 0x58, 0x50, 0xbf, 0x40, 0xa1, 0x9c, 0xd2, 0xac, 0x7c,
+    0x19, 0x0f, 0x4f, 0x69, 0x98, 0xf2, 0x89, 0xbe, 0x94, 0xb9, 0x6e, 0x24, 0x8f, 0x2e, 0x8e, 0xd5, 0x4b, 0xa6, 0x7a,
+    0xc7, 0x52, 0xbf, 0xde, 0x4b, 0x0a, 0xf8, 0xd9, 0x83, 0x10, 0xca, 0xf1, 0xa1, 0x9c, 0xaa, 0x87, 0x33, 0x38, 0x30,
+    0xea, 0x69, 0x7f, 0xb9, 0x41, 0x4c, 0x7d, 0x18, 0x62, 0xda, 0xd3, 0x4b, 0xc8, 0x55, 0xab, 0x8b, 0x68, 0x74, 0x71,
+    0x51, 0x1c, 0x1f, 0xc2, 0x58, 0x87, 0x76, 0x5c, 0x80, 0xd0, 0xf6, 0x2f, 0x09, 0x0c, 0x5e, 0x36, 0x24, 0x48, 0x0f,
+    0x86, 0x80, 0x79, 0x93, 0x1e, 0x2c, 0x12, 0x08, 0x0c, 0x7a, 0x27, 0x65, 0x89, 0x3a, 0xb1, 0xba, 0x68, 0x17, 0x04,
+    0xba, 0x61, 0x45, 0xf7, 0xda, 0x9b, 0x5a, 0xed, 0xaf, 0x05, 0x29, 0x71, 0xa1, 0xbb, 0x40, 0xf0, 0xbf, 0x82, 0xec,
+    0xf8, 0x50, 0xe3, 0xe1, 0xc2, 0x7d, 0xb5, 0x89, 0x7e, 0xed, 0x40, 0x89, 0xad, 0x41, 0x2e, 0xf1, 0x47, 0x89, 0x3f,
+    0x5e, 0xa8, 0xa6, 0x56, 0x18, 0x81, 0x96, 0x04, 0x42, 0xbb, 0x65, 0xb5, 0x8e, 0x11, 0x4f, 0xd3, 0x78, 0x9e, 0xd3,
+    0xc8, 0xfe, 0x30, 0x72, 0x09, 0xc4, 0xdb, 0xa6, 0x22, 0x60, 0xd2, 0x6b, 0x4e, 0x41, 0x5d, 0xd8, 0xd4, 0x52, 0xae,
+    0x62, 0x11, 0x34, 0x9b, 0xa3, 0xe6, 0xe5, 0x04, 0x15, 0x72, 0xba, 0x74, 0xa5, 0xda, 0xe3, 0x56, 0xab, 0x0b, 0xb9,
+    0x90, 0xcd, 0x38, 0x65, 0x93, 0x2c, 0x4a, 0xe9, 0x58, 0x16, 0x12, 0x6e, 0xa9, 0x2d, 0xad, 0x1a, 0x11, 0x76, 0x1e,
+    0x09, 0x3a, 0xf3, 0x42, 0xf8, 0xf7, 0xee, 0x89, 0x0b, 0x99, 0x44, 0x99, 0x9c, 0x36, 0x55, 0xd6, 0x2d, 0xdc, 0x19,
+    0x90, 0xd3, 0xda, 0xf3, 0xd2, 0x99, 0x68, 0x44, 0x41, 0xc5, 0x2a, 0xa4, 0xf0, 0xe4, 0x14, 0x4b, 0xe1, 0xb6, 0xcb,
+    0xd0, 0x72, 0x63, 0x05, 0x9b, 0x92, 0xfe, 0x08, 0x15, 0xb9, 0x52, 0x8c, 0x37, 0x1b, 0x5b, 0x75, 0xa9, 0xfe, 0xb4,
+    0x81, 0x3e, 0x47, 0xb1, 0x2b, 0xb4, 0x63, 0x79, 0xa9, 0x7b, 0xdc, 0x07, 0x99, 0x35, 0x95, 0x13, 0xbb, 0x3d, 0x50,
+    0xc1, 0xb2, 0xf9, 0x42, 0x0e, 0x94, 0x53, 0x5b, 0xc0, 0x05, 0x89, 0x21, 0x76, 0x4a, 0x00, 0x07, 0xc3, 0xa5, 0x06,
+    0x66, 0x14, 0xa7, 0xa3, 0x00, 0x20, 0xf2, 0x9a, 0xde, 0x53, 0x41, 0x67, 0xa8, 0x3b, 0x63, 0x59, 0x53, 0xd7, 0x3d,
+    0x72, 0xd4, 0x92, 0xf0, 0x09, 0x3c, 0x15, 0xa1, 0x1a, 0x0d, 0xab, 0xdc, 0xd5, 0x2d, 0xb8, 0xbc, 0x18, 0x16, 0x45,
+    0x57, 0xc8, 0x60, 0xf0, 0x3a, 0x40, 0x43, 0xfc, 0x8b, 0xf3, 0x72, 0x16, 0xdf, 0x1e, 0x15, 0x1f, 0x77, 0xd0, 0x8e,
+    0x26, 0xee, 0x59, 0x50, 0xcd, 0x7e, 0x21, 0xd0, 0xf0, 0x5d, 0xe0, 0xd3, 0x7c, 0xde, 0xd4, 0xbc, 0xab, 0xa9, 0x48,
+    0xd6, 0x87, 0xae, 0xc8, 0x78, 0x6a, 0xbf, 0x97, 0x4b, 0xc5, 0x96, 0xcc, 0x25, 0x0d, 0xed, 0x4c, 0x18, 0x96, 0x97,
+    0x7a, 0xcc, 0xb3, 0x7b, 0x8d, 0x07, 0xd5, 0xf8, 0xc9, 0xc5, 0x49, 0x9d, 0xc7, 0x01, 0x5f, 0x2a, 0x5f, 0x60, 0x17,
+    0xa7, 0x29, 0x4c, 0x78, 0x61, 0xd5, 0x17, 0xf7, 0xa5, 0x1f, 0x03, 0x39, 0x0c, 0x50, 0x61, 0xce, 0xe9, 0x33, 0xa5,
+    0x52, 0x3a, 0x6f, 0xcd, 0xdb, 0x93, 0x36, 0x58, 0xa4, 0xa5, 0x2f, 0x83, 0x70, 0x77, 0x2d, 0x2f, 0xba, 0x5b, 0xf1,
+    0x2e, 0xad, 0x90, 0x7a, 0x6a, 0x41, 0xc4, 0x17, 0x59, 0xe2, 0x7b, 0x7f, 0x19, 0xa5, 0x6c, 0xf4, 0x91, 0xf8, 0xfb,
+    0xcb, 0x00, 0x6d, 0x5e, 0x7b, 0x54, 0x5c, 0xc1, 0x32, 0x6c, 0x54, 0x77, 0xa4, 0x67, 0xa1, 0xc3, 0x8b, 0xf5, 0x5b,
+    0x71, 0xfc, 0xde, 0xfe, 0x12, 0x18, 0x8f, 0x9e, 0xa7, 0x77, 0x51, 0x9c, 0x57, 0xef, 0xba, 0xaa, 0xa0, 0x00, 0x34,
+    0xeb, 0x72, 0x4f, 0x11, 0x15, 0xf1, 0x3f, 0x49, 0x69, 0xbe, 0xa7, 0x99, 0x1a, 0xc0, 0x29, 0x0d, 0x7f, 0xf3, 0xbd,
+    0xbf, 0x94, 0x65, 0xb4, 0xf4, 0x68, 0xa8, 0x94, 0x0c, 0xe2, 0xc3, 0x5c, 0x60, 0xc6, 0x86, 0x09, 0x95, 0x31, 0x4b,
+    0x75, 0x97, 0xae, 0x35, 0xc0, 0xd7, 0x56, 0xb4, 0x5a, 0xe5, 0xf5, 0xb5, 0xb0, 0x3a, 0x06, 0xd5, 0xca, 0x8e, 0x0f,
+    0x2b, 0xb8, 0xd5, 0xca, 0xd4, 0x99, 0x74, 0x43, 0x83, 0xd5, 0x0a, 0x75, 0x9d, 0xf7, 0x97, 0x91, 0xba, 0x36, 0x04,
+    0x00, 0x72, 0x03, 0x20, 0x04, 0xad, 0xf5, 0xb5, 0x98, 0x20, 0x25, 0x3c, 0x94, 0xb1, 0x98, 0x50, 0xb9, 0x86, 0xd8,
+    0x54, 0xe7, 0xa8, 0x76, 0x6d, 0x80, 0x7a, 0x03, 0xda, 0xb8, 0x0e, 0xed, 0x05, 0x20, 0xbd, 0xbf, 0xbf, 0x64, 0x05,
+    0xd9, 0x5f, 0xd2, 0x6c, 0xc4, 0x13, 0xfa, 0xe1, 0xdd, 0x97, 0x70, 0xc9, 0x91, 0x67, 0x60, 0x58, 0x4c, 0x11, 0x08,
+    0x4e, 0xb5, 0x39, 0x5a, 0x84, 0x70, 0x25, 0x42, 0x34, 0x27, 0xf0, 0xd4, 0x5c, 0x0a, 0xc4, 0xc2, 0xf7, 0xfa, 0x1a,
+    0x72, 0x9a, 0x68, 0x98, 0x49, 0xa6, 0x7a, 0xf1, 0xe2, 0xf8, 0x50, 0xb7, 0xd6, 0x22, 0x40, 0x37, 0x02, 0x24, 0xa8,
+    0x73, 0x5a, 0xe1, 0x00, 0xf2, 0x9a, 0x5d, 0x3c, 0x24, 0xec, 0xaa, 0x24, 0x36, 0x75, 0x81, 0xaa, 0x77, 0x9c, 0xc6,
+    0x97, 0x34, 0xed, 0xed, 0x2f, 0xb3, 0xd5, 0xaa, 0x55, 0x1c, 0x1f, 0xea, 0x47, 0xef, 0x58, 0xf1, 0x0d, 0xfd, 0xc2,
+    0x4b, 0xb5, 0xc5, 0x70, 0x2b, 0x11, 0xb2, 0x3d, 0x6d, 0x9a, 0x53, 0x64, 0x06, 0x28, 0x7c, 0x4f, 0x25, 0x58, 0xa8,
+    0x46, 0xa5, 0x42, 0x54, 0xf8, 0x1e, 0x4b, 0x36, 0xcb, 0x72, 0x49, 0xe7, 0x50, 0x3a, 0x5d, 0xad, 0xda, 0x85, 0xef,
+    0xcd, 0x58, 0x06, 0x4f, 0xd9, 0x6a, 0xa5, 0x2e, 0xfc, 0xcd, 0x58, 0x16, 0xb4, 0x80, 0x6c, 0x7d, 0x6f, 0x16, 0xdf,
+    0xa8, 0x05, 0xdb, 0x9a, 0xf8, 0x26, 0x68, 0x9b, 0xaa, 0xb0, 0xc4, 0x4f, 0x0e, 0x14, 0x57, 0xed, 0x68, 0x6a, 0x76,
+    0x34, 0xc1, 0x0b, 0x7d, 0x95, 0x89, 0x04, 0x09, 0x49, 0xb7, 0xef, 0x68, 0x62, 0x77, 0x74, 0xb1, 0x63, 0x47, 0x17,
+    0x77, 0xec, 0x68, 0x6c, 0x76, 0xcf, 0x2b, 0x71, 0xc7, 0x57, 0xab, 0x76, 0xab, 0xc2, 0xde, 0xf1, 0x61, 0xc2, 0xae,
+    0x60, 0x37, 0x40, 0xcd, 0x93, 0x6c, 0x46, 0xb7, 0x13, 0x65, 0x1d, 0xc5, 0xf4, 0x57, 0x61, 0xb2, 0x44, 0x42, 0x56,
+    0x47, 0x82, 0x4b, 0xd6, 0x65, 0xc8, 0xed, 0x8f, 0x24, 0x6c, 0x06, 0x68, 0xc8, 0x01, 0x0d, 0x53, 0x83, 0x86, 0x8b,
+    0xe2, 0x1c, 0x24, 0x82, 0x5a, 0xcd, 0xbd, 0x28, 0x0f, 0x5a, 0xfb, 0xbd, 0xdd, 0x14, 0x06, 0xc1, 0xf0, 0x6b, 0x2e,
+    0x12, 0x3f, 0xd2, 0x4d, 0x7f, 0x15, 0x62, 0x66, 0x2c, 0x33, 0xa9, 0x55, 0x3b, 0x29, 0xab, 0xaa, 0x77, 0xe9, 0xab,
+    0xf3, 0xe8, 0x91, 0x6e, 0x31, 0x8f, 0xa5, 0xa4, 0x22, 0x33, 0x74, 0xea, 0xfb, 0x2e, 0xb6, 0xff, 0x7f, 0x91, 0xdc,
+    0x16, 0x26, 0x12, 0x5b, 0x26, 0x62, 0xa9, 0xcd, 0x68, 0xe7, 0x86, 0xc1, 0x6b, 0x59, 0xb4, 0x57, 0xa9, 0xab, 0xb7,
+    0xc8, 0xb5, 0x10, 0x74, 0x11, 0x18, 0x2c, 0x8b, 0x19, 0x4d, 0xce, 0x15, 0x37, 0xee, 0x8f, 0x2e, 0x8c, 0x76, 0xba,
+    0x26, 0xdb, 0xaa, 0x0e, 0xd8, 0xff, 0x71, 0xd1, 0x79, 0xf2, 0xf0, 0xd4, 0xc7, 0x9a, 0xa1, 0xf3, 0xf1, 0xd8, 0x47,
+    0x85, 0x77, 0xbf, 0x6e, 0xed, 0x87, 0x3f, 0x2e, 0xbe, 0x78, 0xd1, 0xfa, 0xa2, 0xec, 0x9c, 0xf9, 0xa8, 0xb8, 0x30,
+    0xc1, 0x7c, 0x2b, 0x97, 0x1c, 0x78, 0xed, 0x8a, 0xc6, 0x71, 0xb6, 0x7b, 0x39, 0x03, 0x77, 0x39, 0xf9, 0x9c, 0xd2,
+    0x04, 0xfb, 0x9e, 0x8f, 0x37, 0x4a, 0xcf, 0x53, 0x7a, 0x45, 0xed, 0x6b, 0x06, 0xb7, 0x4c, 0xb6, 0xa5, 0xc7, 0x88,
+    0x2f, 0x32, 0x69, 0xb2, 0x1a, 0x0c, 0x5f, 0x75, 0x96, 0x74, 0xa1, 0xd6, 0xe0, 0x1a, 0x04, 0xb7, 0x5a, 0xa8, 0xd5,
+    0x45, 0x55, 0x71, 0x81, 0x7d, 0x07, 0x80, 0x9d, 0x90, 0xf5, 0x77, 0x94, 0x47, 0x2d, 0xdc, 0xda, 0x05, 0x1b, 0x6e,
+    0xa3, 0xc8, 0xf7, 0x87, 0x16, 0x4f, 0xca, 0x31, 0x59, 0x7b, 0x3b, 0xc4, 0x4e, 0x7c, 0x7d, 0x12, 0x03, 0x97, 0x02,
+    0x06, 0xcb, 0x68, 0x9e, 0xef, 0x44, 0x40, 0xb9, 0x89, 0xd8, 0xaf, 0x5a, 0xfb, 0x3b, 0x46, 0xc1, 0x2d, 0x0c, 0x07,
+    0x4c, 0x01, 0x5c, 0x86, 0x47, 0x4d, 0x2b, 0x3a, 0x1e, 0xd3, 0x51, 0xe9, 0xd7, 0x85, 0x40, 0xd7, 0x98, 0xa5, 0x12,
+    0xe2, 0x3d, 0x2a, 0x10, 0xe3, 0xbf, 0xe1, 0x19, 0xf5, 0x91, 0x4d, 0xdd, 0x34, 0xf0, 0x1b, 0x61, 0xbf, 0x1d, 0x1e,
+    0x3d, 0x62, 0x1d, 0x16, 0x33, 0xcb, 0x6a, 0x65, 0x7d, 0x3a, 0xb5, 0xf2, 0x3a, 0x22, 0xb9, 0x72, 0xda, 0xec, 0x3a,
+    0x40, 0xf7, 0x3b, 0x26, 0xcb, 0xf6, 0x17, 0x8f, 0xda, 0xad, 0xc2, 0xc7, 0x3e, 0x0c, 0x77, 0xdf, 0x53, 0xa2, 0x7a,
+    0x1d, 0x41, 0xaf, 0x45, 0xf6, 0x6b, 0xfa, 0x75, 0xda, 0x9f, 0xb7, 0x7d, 0xac, 0xdf, 0x1a, 0x80, 0x8a, 0x92, 0x19,
+    0x8c, 0xc0, 0xd3, 0xf9, 0xbb, 0x97, 0x52, 0x1f, 0xfc, 0x7e, 0xf0, 0x3c, 0x6e, 0xb7, 0x7c, 0xec, 0xe7, 0x92, 0xcf,
+    0x7f, 0xc5, 0x12, 0x8e, 0x7c, 0xec, 0x8f, 0x52, 0x9e, 0x53, 0x77, 0x0d, 0x5a, 0x77, 0xfd, 0xfd, 0x8b, 0xd0, 0x10,
+    0xcd, 0x05, 0xcd, 0x73, 0xcf, 0x1d, 0xdf, 0x90, 0xd2, 0x27, 0x18, 0xe6, 0x56, 0x8a, 0xcb, 0xa9, 0x54, 0x78, 0xd1,
+    0x17, 0xfa, 0x5d, 0xaa, 0xd2, 0x65, 0x1b, 0xc4, 0xa6, 0x44, 0x40, 0xc9, 0xd8, 0xb4, 0x2a, 0xf5, 0xc9, 0x99, 0xb7,
+    0x1c, 0x3d, 0x3d, 0xb1, 0x0e, 0x00, 0x6f, 0x4e, 0x50, 0x2b, 0x99, 0xb1, 0xec, 0x7c, 0x4b, 0x69, 0x7c, 0xb3, 0xa5,
+    0x14, 0xf4, 0xb3, 0x12, 0x3a, 0xf3, 0xae, 0x99, 0x4f, 0x63, 0xbd, 0xd2, 0x72, 0x5c, 0x10, 0x13, 0xe5, 0xa4, 0xfc,
+    0x04, 0xa4, 0xce, 0x36, 0xa8, 0x11, 0x7e, 0xfb, 0x74, 0x50, 0xf2, 0xab, 0xa6, 0xa3, 0x37, 0x9f, 0xde, 0x73, 0x47,
+    0xaf, 0xf9, 0x1d, 0xd8, 0x37, 0xf7, 0xc6, 0xd7, 0xd1, 0xbf, 0xa5, 0xd8, 0xa8, 0x1e, 0xe5, 0x16, 0x8c, 0x52, 0x36,
+    0xab, 0x76, 0x61, 0x13, 0x4c, 0xa5, 0x74, 0x40, 0xf2, 0x90, 0x3b, 0x88, 0xd6, 0x3e, 0xce, 0xe1, 0x4a, 0x24, 0xbc,
+    0x77, 0x62, 0x21, 0xe8, 0x79, 0xca, 0xaf, 0xd7, 0xdf, 0xa3, 0xb5, 0xbb, 0xf1, 0x94, 0x4d, 0xa6, 0xce, 0x3d, 0x27,
+    0x4a, 0x4a, 0xd4, 0xdf, 0x39, 0x41, 0xf1, 0xaf, 0xff, 0x12, 0x86, 0xff, 0xfa, 0x2f, 0x9f, 0x6c, 0x0a, 0xc3, 0x17,
+    0x17, 0x58, 0x56, 0xc3, 0xee, 0x26, 0xf0, 0xed, 0x33, 0xd5, 0x71, 0xbe, 0xbd, 0xcd, 0xc6, 0x26, 0x40, 0xfd, 0xc6,
+    0x16, 0x6c, 0x14, 0xea, 0x03, 0xe0, 0xfd, 0x16, 0xc0, 0x60, 0x5d, 0x9f, 0x84, 0x0c, 0x1a, 0xfd, 0x2e, 0xd0, 0x2e,
+    0x50, 0x74, 0xaf, 0x1d, 0xf9, 0xed, 0x18, 0xfe, 0xd4, 0x1a, 0x7e, 0x27, 0xf8, 0xc6, 0x1f, 0x30, 0xba, 0xb8, 0x28,
+    0x13, 0xda, 0xdc, 0xae, 0x70, 0x61, 0xbe, 0xbf, 0x51, 0x62, 0x64, 0x7f, 0xd4, 0x42, 0x3d, 0x75, 0x1d, 0x8f, 0x8c,
+    0x2e, 0x5e, 0xc3, 0x5b, 0x72, 0x8e, 0x2f, 0x85, 0x75, 0xa8, 0xde, 0xc1, 0x9f, 0x61, 0x88, 0xfa, 0xaa, 0xd4, 0xa0,
+    0x1b, 0xcc, 0x19, 0x4a, 0x41, 0xe1, 0x07, 0x30, 0xf1, 0xe8, 0xc2, 0x58, 0x77, 0xa7, 0xda, 0xed, 0x11, 0xad, 0x93,
+    0xb6, 0x71, 0x87, 0xd4, 0x90, 0x8e, 0xbd, 0xf7, 0x0a, 0x5f, 0xaa, 0x31, 0xad, 0xac, 0x69, 0xe5, 0x5a, 0x02, 0x55,
+    0xfe, 0xa2, 0x50, 0x61, 0xf1, 0xbf, 0xee, 0x8a, 0xdc, 0xfd, 0xfd, 0xd3, 0x91, 0x3b, 0x7e, 0xaf, 0xc8, 0xdd, 0xdf,
+    0xff, 0xf0, 0xc8, 0xdd, 0x5f, 0xdd, 0xc8, 0x1d, 0x6c, 0xe2, 0x97, 0xf7, 0x8a, 0xae, 0xd9, 0xc8, 0x07, 0xbf, 0xce,
+    0x49, 0xdb, 0x68, 0xb2, 0x29, 0x9f, 0x40, 0x68, 0xed, 0xdf, 0x3f, 0x52, 0x96, 0xf2, 0x89, 0x1b, 0x27, 0x83, 0xb7,
+    0xa4, 0x42, 0x60, 0xac, 0x6b, 0x23, 0x5a, 0x26, 0x36, 0xd5, 0x2a, 0x6f, 0x80, 0x34, 0x1f, 0xda, 0x37, 0x16, 0xf8,
+    0x51, 0xf9, 0xd6, 0xa1, 0x16, 0xee, 0xd8, 0xe8, 0x55, 0xa4, 0x02, 0x5f, 0x65, 0xc7, 0x4e, 0xc3, 0x5e, 0x6f, 0x70,
+    0x47, 0xe8, 0xda, 0xb7, 0xaa, 0xe8, 0xdb, 0xee, 0x4b, 0xff, 0xc7, 0x9b, 0xf6, 0xb3, 0x41, 0xbb, 0x7b, 0xd4, 0x9e,
+    0xf9, 0x91, 0x0f, 0x52, 0x4a, 0x15, 0xb4, 0xba, 0x47, 0x47, 0x50, 0x70, 0xed, 0x14, 0x74, 0xa0, 0x80, 0x39, 0x05,
+    0x8f, 0xa0, 0x60, 0xe4, 0x14, 0x3c, 0x86, 0x82, 0xc4, 0x29, 0x78, 0x02, 0x05, 0x57, 0x7e, 0x31, 0x60, 0x25, 0xb8,
+    0x4f, 0xd0, 0x10, 0x6b, 0xe3, 0xc1, 0x96, 0x3d, 0xc1, 0x6d, 0x08, 0x99, 0xc5, 0x13, 0x95, 0xe9, 0x03, 0x0e, 0xb8,
+    0x88, 0xe3, 0xeb, 0x29, 0xcd, 0x22, 0x08, 0x5a, 0x3e, 0x57, 0x32, 0x26, 0x94, 0xfc, 0x3d, 0x9b, 0x51, 0xfb, 0x7d,
+    0x0a, 0x8b, 0x07, 0xcf, 0x47, 0x83, 0xd6, 0xb0, 0xe8, 0x96, 0x3b, 0xa7, 0x63, 0x6d, 0x26, 0xeb, 0x43, 0xef, 0x65,
+    0x55, 0xa7, 0xa7, 0x6b, 0x96, 0x7b, 0xbe, 0x23, 0x66, 0xe3, 0x78, 0x03, 0xc6, 0x29, 0xbf, 0x6e, 0xde, 0xf8, 0xbd,
+    0xed, 0x71, 0x1c, 0x80, 0xa8, 0x8c, 0xe3, 0xa8, 0x35, 0x95, 0x4f, 0xef, 0xe3, 0x49, 0xf9, 0xfb, 0x35, 0xcd, 0xf3,
+    0x78, 0x62, 0x5a, 0xee, 0x8e, 0xdb, 0x28, 0x10, 0xdd, 0x98, 0x8d, 0x05, 0x02, 0x62, 0x2f, 0xb0, 0x59, 0x60, 0x4e,
+    0x9b, 0x50, 0x0c, 0x60, 0xa7, 0x1e, 0xc5, 0x51, 0xd3, 0xd7, 0x8b, 0x64, 0x3c, 0xa9, 0x0a, 0x8e, 0xe7, 0x82, 0xaa,
+    0x52, 0x8d, 0xe1, 0xe2, 0xf8, 0x10, 0x0a, 0x74, 0xf5, 0x8e, 0x68, 0x8d, 0xb5, 0xdd, 0x77, 0xc7, 0x6c, 0x3c, 0x1b,
+    0xad, 0x71, 0xf3, 0x5b, 0xca, 0xe4, 0x96, 0xcd, 0x18, 0xc1, 0x67, 0xed, 0x11, 0xfc, 0x31, 0x11, 0x88, 0xcf, 0xc6,
+    0xe3, 0xf1, 0x9d, 0xd1, 0x9b, 0xcf, 0x92, 0x31, 0xed, 0xd0, 0x47, 0x5d, 0xc8, 0x7d, 0x68, 0x1a, 0x9f, 0x7f, 0xbb,
+    0x50, 0xb8, 0x5b, 0xde, 0xaf, 0x31, 0x84, 0x07, 0xe4, 0x74, 0x79, 0xff, 0x48, 0x4e, 0x31, 0x17, 0x74, 0x39, 0x8b,
+    0xc5, 0x84, 0x65, 0x51, 0xab, 0x08, 0xaf, 0x4c, 0xe8, 0xe3, 0xb3, 0xa7, 0x4f, 0x9f, 0x16, 0x61, 0x62, 0x9f, 0x5a,
+    0x49, 0x52, 0x84, 0xa3, 0x65, 0xb9, 0x8c, 0x56, 0x6b, 0x3c, 0x2e, 0x42, 0x66, 0x0b, 0x8e, 0x3a, 0xa3, 0xe4, 0xa8,
+    0x53, 0x84, 0xd7, 0x4e, 0x8b, 0x22, 0xa4, 0xe6, 0x49, 0xd0, 0xa4, 0x96, 0x40, 0xf1, 0xa4, 0xd5, 0x2a, 0x42, 0x4d,
+    0x68, 0x4b, 0xb0, 0x88, 0xf4, 0xcf, 0x28, 0x5e, 0x48, 0x0e, 0x2c, 0xb9, 0xcb, 0x65, 0x30, 0x38, 0x37, 0x2f, 0xa7,
+    0xd0, 0x1f, 0x72, 0x28, 0xd0, 0x10, 0x7f, 0xe9, 0x06, 0x29, 0x80, 0x98, 0x55, 0x70, 0x82, 0xdb, 0x18, 0x46, 0xad,
+    0x1a, 0x28, 0x4b, 0x55, 0x7f, 0x49, 0x78, 0x15, 0xbb, 0x00, 0xfe, 0x03, 0x2d, 0xf5, 0x5b, 0xd4, 0x24, 0xdd, 0xc1,
+    0xf5, 0x29, 0xfd, 0x24, 0xd7, 0xbf, 0xbd, 0x0f, 0xd3, 0xa7, 0xf4, 0x8f, 0x66, 0xfa, 0xe6, 0x55, 0xa3, 0x9a, 0xe9,
+    0x6b, 0xb6, 0x36, 0x93, 0xc4, 0x1f, 0x4d, 0xe9, 0xe8, 0xe3, 0x25, 0xbf, 0x69, 0xc2, 0x91, 0x10, 0xbe, 0xe2, 0xa7,
+    0xfb, 0xbf, 0x35, 0xd9, 0xc2, 0x0e, 0xe6, 0x7c, 0x07, 0x42, 0x89, 0xcd, 0xb7, 0x19, 0xf1, 0xdf, 0x5a, 0xb3, 0x4a,
+    0x97, 0x8c, 0xc7, 0xc4, 0x7f, 0x3b, 0x1e, 0xfb, 0xf6, 0x8a, 0x5d, 0x2c, 0xa9, 0x6a, 0xf5, 0xa6, 0x56, 0xa2, 0x5a,
+    0x7d, 0xf1, 0x85, 0x5b, 0xe6, 0x16, 0x98, 0x10, 0x87, 0x1b, 0xce, 0x30, 0x35, 0x09, 0xcb, 0xe1, 0xa8, 0xc1, 0xe7,
+    0x29, 0xea, 0xef, 0xf8, 0x13, 0xb5, 0xd7, 0x31, 0x97, 0x00, 0x6f, 0x79, 0x87, 0xf4, 0xfa, 0xfd, 0xf2, 0x09, 0xb5,
+    0xe9, 0x6e, 0xcf, 0x6e, 0xbf, 0x4c, 0x82, 0x99, 0x44, 0x05, 0xcb, 0xdf, 0x66, 0x6b, 0x77, 0x47, 0x34, 0x8c, 0x84,
+    0xb8, 0xcb, 0x2a, 0x24, 0x9f, 0x4c, 0x52, 0xf8, 0x40, 0xc8, 0xb2, 0xf6, 0xde, 0x51, 0xdd, 0xbd, 0x5f, 0x5b, 0x6f,
+    0xe4, 0x76, 0x34, 0x6f, 0xe9, 0x54, 0xdf, 0x2b, 0xd2, 0x39, 0xc7, 0x57, 0xe6, 0xc3, 0x35, 0xca, 0x22, 0x5b, 0x1a,
+    0xfe, 0xbf, 0xd4, 0x99, 0xaa, 0x12, 0xb2, 0x34, 0xf4, 0xc0, 0x49, 0x51, 0x98, 0x1c, 0xff, 0x84, 0xe5, 0x73, 0x78,
+    0x1f, 0xa6, 0xee, 0x49, 0x3f, 0xc5, 0xc2, 0xf3, 0x6b, 0x27, 0x8e, 0x50, 0xdb, 0xae, 0xc2, 0x06, 0x12, 0xb4, 0xab,
+    0x76, 0x26, 0x0b, 0xdf, 0x78, 0x7c, 0x2d, 0x12, 0x7d, 0x4f, 0xe3, 0x53, 0x47, 0x38, 0x9c, 0x15, 0x82, 0xab, 0xbf,
+    0xdc, 0x10, 0x5b, 0x65, 0x0b, 0x0a, 0x37, 0x4e, 0xa6, 0x6a, 0x34, 0xb6, 0x94, 0x57, 0x3e, 0x9f, 0xc7, 0x99, 0x66,
+    0xa3, 0xc4, 0xd7, 0xfc, 0x60, 0x7f, 0x59, 0xed, 0x7c, 0xe1, 0x5b, 0xb0, 0x35, 0xf1, 0xf6, 0x8e, 0x0f, 0xa1, 0x43,
+    0xcf, 0xab, 0x81, 0x9e, 0x6d, 0x38, 0xf3, 0x3f, 0x11, 0x56, 0xbf, 0x08, 0xf3, 0x6b, 0x1c, 0xe6, 0xd7, 0xde, 0x9f,
+    0x97, 0xcd, 0x6b, 0x7a, 0xf9, 0x91, 0xc9, 0xa6, 0x8c, 0xe7, 0x4d, 0x50, 0xf8, 0x95, 0x5f, 0xce, 0xb0, 0x67, 0x95,
+    0x1c, 0xa6, 0x6f, 0xc8, 0x77, 0x17, 0x39, 0x44, 0xdf, 0x95, 0xda, 0x1a, 0x65, 0x3c, 0xa3, 0xdd, 0x7a, 0x12, 0xa0,
+    0x1b, 0xcc, 0xb5, 0xd8, 0x1a, 0x2e, 0x39, 0x44, 0xeb, 0xe5, 0x6d, 0xd4, 0x32, 0x6c, 0xbd, 0x65, 0x23, 0xb5, 0xad,
+    0xad, 0xed, 0x23, 0x83, 0xdc, 0x86, 0x92, 0x5e, 0x62, 0x33, 0x62, 0xbd, 0x2b, 0xe2, 0xfc, 0xa9, 0x94, 0x38, 0xf0,
+    0xe6, 0xd9, 0xbf, 0x4e, 0x2e, 0xe1, 0x7a, 0xb1, 0x4a, 0x89, 0xbb, 0x0f, 0x64, 0x51, 0x3c, 0x96, 0x54, 0xe0, 0xfb,
+    0xb4, 0xbc, 0x54, 0xb7, 0x57, 0x96, 0x20, 0x66, 0xa2, 0xf6, 0xd3, 0xf9, 0xcd, 0xfd, 0x87, 0xbf, 0x7b, 0xf9, 0x85,
+    0xc1, 0x91, 0x7d, 0x9b, 0x8b, 0xef, 0x77, 0xe1, 0x20, 0xa4, 0xf1, 0x6d, 0xc4, 0x32, 0x25, 0xf3, 0x2e, 0xc1, 0x25,
+    0xd7, 0x9d, 0x73, 0x93, 0xdb, 0x29, 0x68, 0xaa, 0x3e, 0xdd, 0x66, 0xb6, 0xe2, 0xe8, 0xf1, 0xfc, 0xc6, 0xee, 0x46,
+    0x7b, 0x2d, 0x67, 0xf3, 0x0f, 0x4d, 0xcd, 0xdc, 0x9d, 0x0b, 0x5a, 0x4f, 0x2f, 0x7c, 0x34, 0xbf, 0xe9, 0x6a, 0x41,
+    0xdb, 0x14, 0x1a, 0xaa, 0xd6, 0xfc, 0xc6, 0x4d, 0x4e, 0xad, 0x06, 0xf2, 0xc2, 0xa3, 0xdc, 0xa3, 0x71, 0x4e, 0xbb,
+    0xf0, 0xbe, 0x6a, 0x36, 0x8a, 0x53, 0x23, 0xcc, 0x67, 0x2c, 0x49, 0x52, 0xda, 0xb5, 0xf2, 0xda, 0x6b, 0x3f, 0x86,
+    0xdc, 0x4e, 0x77, 0xcb, 0xea, 0xbb, 0xe2, 0x20, 0xaf, 0xc4, 0x53, 0x7c, 0x99, 0xf3, 0x14, 0x3e, 0x16, 0xb1, 0x15,
+    0x9d, 0x26, 0xe9, 0xb1, 0x55, 0x21, 0x4f, 0xfd, 0xae, 0xaf, 0xe5, 0x51, 0xeb, 0x4f, 0x5d, 0xb5, 0xe1, 0xad, 0xae,
+    0xe4, 0xf3, 0xa8, 0x79, 0x54, 0x5f, 0x08, 0x54, 0x95, 0x4b, 0xc0, 0x5b, 0x96, 0x85, 0x41, 0x5a, 0x69, 0x3e, 0xed,
+    0x85, 0x6d, 0x53, 0xa6, 0x06, 0x80, 0x17, 0x2b, 0x97, 0x45, 0x45, 0x7d, 0x31, 0xff, 0x3e, 0xa7, 0xe5, 0xf3, 0xed,
+    0xa7, 0xe5, 0x73, 0x7b, 0x5a, 0xee, 0xa6, 0xd8, 0xcf, 0xc6, 0x6d, 0xf8, 0xd3, 0xad, 0x16, 0x14, 0xb5, 0xbc, 0xa3,
+    0xf9, 0x8d, 0x07, 0x7a, 0x5a, 0xb3, 0x33, 0xbf, 0xd1, 0xa9, 0xb9, 0x10, 0x36, 0x68, 0x41, 0xb2, 0x2a, 0x6e, 0x79,
+    0x50, 0x08, 0x7f, 0x5b, 0xb5, 0xaa, 0xf6, 0x43, 0xa8, 0x83, 0x5e, 0x8f, 0x36, 0xeb, 0x3a, 0x77, 0x1f, 0xda, 0x28,
+    0xe3, 0x32, 0x88, 0x2c, 0x37, 0x46, 0xa1, 0x8c, 0x2f, 0x2f, 0x69, 0x12, 0x8d, 0xf9, 0x68, 0x91, 0xff, 0xb3, 0x81,
+    0xdf, 0x20, 0xf1, 0xce, 0x23, 0xbd, 0x36, 0x8e, 0xed, 0xaa, 0x13, 0x85, 0xed, 0x08, 0xcb, 0x72, 0x9f, 0xa2, 0x7c,
+    0x14, 0xa7, 0x34, 0xe8, 0x84, 0x0f, 0xb7, 0x1c, 0x82, 0xff, 0x90, 0xbd, 0xd9, 0xba, 0x98, 0xdf, 0x8b, 0x8c, 0x3b,
+    0x91, 0xf0, 0xab, 0x70, 0xe0, 0xee, 0x61, 0xeb, 0xe9, 0x76, 0x70, 0x07, 0x76, 0xa6, 0xa1, 0x15, 0x0a, 0x46, 0xee,
+    0x24, 0x74, 0x1c, 0x2f, 0x52, 0x79, 0xf7, 0xa8, 0xbb, 0x28, 0x63, 0x63, 0xd4, 0x3b, 0x18, 0x7a, 0xd5, 0xf6, 0x9e,
+    0x5c, 0xfa, 0xb3, 0xcf, 0x1f, 0xc2, 0x1f, 0x9d, 0x67, 0x74, 0x5b, 0xe9, 0xea, 0xda, 0x56, 0x05, 0x5d, 0x7d, 0xbf,
+    0xa6, 0x8c, 0x6b, 0x11, 0xae, 0xf4, 0xf1, 0xfb, 0xb6, 0x06, 0xad, 0xf2, 0x5e, 0xcd, 0x8d, 0x96, 0xf5, 0xab, 0x5a,
+    0xff, 0xba, 0xc1, 0xef, 0xd9, 0x76, 0xa4, 0x35, 0xd7, 0x7a, 0x5b, 0xf3, 0xed, 0xba, 0x8d, 0xc6, 0x16, 0xe3, 0xaa,
+    0xfd, 0x3e, 0xb9, 0x2d, 0x4d, 0x14, 0x1d, 0x08, 0x04, 0x2b, 0x65, 0x5f, 0x5b, 0x29, 0x8c, 0x92, 0x07, 0xf0, 0xe6,
+    0x58, 0xef, 0x66, 0x96, 0x66, 0x39, 0xf1, 0xa7, 0x52, 0xce, 0x23, 0xfd, 0xb1, 0xd3, 0xeb, 0xa3, 0x90, 0x8b, 0xc9,
+    0x61, 0xa7, 0xd5, 0x6a, 0xc1, 0x1b, 0x3f, 0x7d, 0xef, 0x8a, 0xd1, 0xeb, 0x67, 0xfc, 0x86, 0xf8, 0x4f, 0xbc, 0xa7,
+    0xde, 0x93, 0x23, 0xef, 0xd1, 0x63, 0xdf, 0x53, 0xec, 0x9c, 0xf8, 0x4f, 0x8e, 0x7c, 0x4f, 0xb3, 0x73, 0xe2, 0x3f,
+    0x7a, 0xec, 0xf7, 0x8e, 0x27, 0x56, 0x25, 0x83, 0x2b, 0x83, 0x5a, 0xdf, 0xc9, 0xa5, 0xe0, 0x1f, 0x69, 0xfd, 0xe0,
+    0xea, 0x32, 0x93, 0x89, 0xd6, 0xb1, 0x8f, 0x70, 0x7a, 0x47, 0xf1, 0x3c, 0x52, 0x44, 0xe1, 0x16, 0x82, 0x5b, 0x46,
+    0x97, 0xaa, 0x29, 0x40, 0xcd, 0xbc, 0xf4, 0x7b, 0xc7, 0x90, 0x35, 0xee, 0x25, 0xc4, 0x7f, 0xdd, 0x79, 0xe2, 0xb5,
+    0x1f, 0x5f, 0x35, 0x1f, 0x8e, 0x5a, 0xcd, 0xb6, 0xd7, 0x6e, 0x76, 0xc2, 0x27, 0x5e, 0x47, 0xff, 0xeb, 0xb5, 0xbc,
+    0x23, 0xaf, 0x1d, 0x3e, 0xf1, 0x8e, 0xbc, 0x4e, 0xf8, 0xe4, 0xea, 0xa1, 0x4e, 0x27, 0x88, 0xfd, 0xc3, 0xde, 0x31,
+    0x7c, 0xb8, 0xf2, 0x86, 0xf8, 0x9f, 0xfb, 0xfa, 0xf3, 0xb0, 0xfe, 0x67, 0x6e, 0x69, 0xfb, 0xe9, 0xd6, 0xe2, 0xce,
+    0x93, 0xad, 0xc5, 0x47, 0x8f, 0xb7, 0x16, 0x3f, 0x7c, 0x54, 0x2f, 0x3e, 0x9c, 0xe8, 0xaa, 0xf2, 0x94, 0x13, 0x7f,
+    0x16, 0x4b, 0xc1, 0x6e, 0x82, 0xb6, 0xd7, 0xf2, 0x5a, 0x5e, 0x13, 0xfe, 0x7b, 0xd2, 0x41, 0x65, 0xaf, 0x4b, 0xe8,
+    0x55, 0xae, 0xf2, 0xc9, 0x53, 0xaf, 0xfd, 0xf8, 0x65, 0xe7, 0xf1, 0x08, 0xda, 0xa9, 0x85, 0xb6, 0xbd, 0xf6, 0xd5,
+    0xd1, 0xd3, 0x51, 0xcb, 0x83, 0x8e, 0x6d, 0xf8, 0x33, 0x7d, 0xd4, 0x19, 0xe9, 0x87, 0x16, 0xd4, 0x7f, 0xdb, 0x7e,
+    0x92, 0xb7, 0x9a, 0x6d, 0xf8, 0xf3, 0x4b, 0xa9, 0x11, 0x83, 0x3e, 0xee, 0x8e, 0xfb, 0xb0, 0xe5, 0x1d, 0x3d, 0x9d,
+    0x76, 0xc2, 0xcf, 0xaf, 0x9e, 0x84, 0x4f, 0xa7, 0xed, 0x27, 0xdf, 0xea, 0xa7, 0xb4, 0xd9, 0x09, 0x3f, 0x87, 0xbf,
+    0xdf, 0x1e, 0xb5, 0xa6, 0xcd, 0x76, 0xf8, 0xf4, 0xea, 0x28, 0x3c, 0x4a, 0x9b, 0x8f, 0xc3, 0xa7, 0xf0, 0xb7, 0x1a,
+    0x6e, 0xca, 0x67, 0xd4, 0xf7, 0x60, 0xbf, 0xd7, 0xcc, 0x2d, 0x77, 0x8e, 0xce, 0x43, 0xef, 0xd1, 0xc3, 0x97, 0x4f,
+    0xaf, 0x9a, 0x0f, 0xa7, 0xed, 0xce, 0x55, 0x73, 0xe7, 0xcf, 0x6f, 0x01, 0xf1, 0x66, 0xe0, 0x98, 0xc2, 0xf5, 0x1d,
+    0x8b, 0x38, 0xf5, 0xf6, 0xd9, 0x07, 0x38, 0xdf, 0x65, 0x5e, 0x8b, 0x4f, 0x9b, 0xd7, 0x19, 0xbd, 0x8f, 0x7d, 0x2d,
+    0xfe, 0x70, 0xfb, 0x3a, 0xa7, 0x6b, 0x4e, 0xd5, 0x5b, 0xb9, 0x61, 0x46, 0xaf, 0xdb, 0x5e, 0xef, 0x64, 0x30, 0x60,
+    0xf0, 0x95, 0xa3, 0xa2, 0x7b, 0x0b, 0x2f, 0xb8, 0x76, 0xbd, 0x0d, 0x1c, 0x0e, 0xf2, 0xad, 0xd4, 0x27, 0x99, 0xef,
+    0x42, 0x48, 0xfa, 0x69, 0x84, 0x7c, 0x7b, 0x1f, 0x7c, 0xa4, 0x7f, 0x38, 0x3e, 0xb8, 0x8b, 0x8f, 0x9a, 0x9f, 0x57,
+    0xd9, 0xb3, 0xca, 0x1e, 0x3d, 0x53, 0xcf, 0x01, 0xdc, 0xf0, 0x68, 0xf8, 0x87, 0x14, 0x8a, 0x72, 0x5f, 0xc7, 0x15,
+    0xde, 0xfc, 0x1a, 0x97, 0xb4, 0xbe, 0xce, 0x45, 0x7c, 0x63, 0xfc, 0xcf, 0xe1, 0x4b, 0x06, 0xf6, 0xe1, 0x4a, 0x5f,
+    0x30, 0x26, 0x7e, 0x27, 0x6c, 0x85, 0xad, 0xd2, 0x71, 0x00, 0x57, 0xf8, 0xc8, 0x92, 0xcb, 0x18, 0x3e, 0xa6, 0x99,
+    0xf2, 0x89, 0xfa, 0xec, 0x26, 0xbc, 0xec, 0x5c, 0x7d, 0x00, 0x55, 0xbf, 0x67, 0x3e, 0xf2, 0x7d, 0x73, 0xf1, 0x1f,
+    0xae, 0x88, 0x7d, 0x03, 0xd7, 0xe8, 0xac, 0xc7, 0x7a, 0x06, 0x36, 0xf5, 0x6b, 0x9a, 0xb0, 0x38, 0xf0, 0x83, 0xb9,
+    0xa0, 0x63, 0x2a, 0xf2, 0x66, 0xed, 0x6e, 0x99, 0xba, 0x56, 0x86, 0x7c, 0xfb, 0xd9, 0x46, 0x01, 0x2f, 0xef, 0x25,
+    0x03, 0xe3, 0xd5, 0xf2, 0x8d, 0x9a, 0xef, 0x17, 0xd8, 0x96, 0x08, 0xe0, 0xe8, 0x95, 0x6a, 0xe0, 0x6b, 0xdd, 0xa0,
+    0x1d, 0x76, 0x1e, 0x21, 0xcd, 0x4b, 0xe0, 0xa5, 0xa8, 0xdf, 0x07, 0xcd, 0xa3, 0xd6, 0x9f, 0x90, 0xd3, 0xad, 0x1c,
+    0x68, 0x68, 0x9c, 0x3a, 0xa2, 0xfa, 0xdc, 0x6d, 0xfd, 0xe2, 0x9f, 0xaf, 0x29, 0xe2, 0x33, 0xbd, 0x76, 0x78, 0xbd,
+    0xaa, 0x89, 0x1f, 0xea, 0xeb, 0xeb, 0x63, 0x36, 0x09, 0xdc, 0x8f, 0x99, 0xea, 0x97, 0xae, 0xaa, 0x6f, 0x20, 0xa3,
+    0xa2, 0x6a, 0x22, 0xd0, 0x52, 0xf9, 0xe2, 0x59, 0xe6, 0x89, 0xd5, 0x2a, 0x10, 0xe0, 0x88, 0x25, 0x0e, 0x4e, 0xe1,
+    0x19, 0xd5, 0x90, 0x2c, 0x70, 0x09, 0x90, 0x42, 0x30, 0x11, 0xfa, 0xff, 0xaa, 0xd8, 0xfe, 0x30, 0xee, 0x95, 0x30,
+    0x8d, 0xb3, 0x09, 0x50, 0x61, 0x9c, 0x4d, 0x36, 0x9c, 0x37, 0x3a, 0x9c, 0xb0, 0x56, 0x5a, 0x0d, 0x55, 0x39, 0x69,
+    0xf2, 0x67, 0xb7, 0xef, 0xcd, 0xdb, 0x99, 0x7c, 0xf0, 0x81, 0x2a, 0xdf, 0x77, 0xf5, 0x26, 0xd9, 0x06, 0x79, 0xa0,
+    0x3f, 0x0f, 0xae, 0xf2, 0xd1, 0x40, 0xfa, 0xc1, 0x95, 0x3e, 0xcf, 0xd8, 0x3c, 0xc4, 0xd7, 0xb2, 0x2f, 0xa1, 0x57,
+    0x6c, 0x64, 0x44, 0x18, 0xf6, 0xcc, 0xb5, 0xe6, 0xa6, 0xda, 0x1a, 0xd2, 0xc6, 0xda, 0xea, 0x1f, 0xc5, 0x2a, 0xbf,
+    0x98, 0x64, 0xdc, 0xef, 0x3d, 0x28, 0xbf, 0xcd, 0xb8, 0x6b, 0x13, 0xe0, 0x9b, 0xe5, 0x03, 0x41, 0xd3, 0x7f, 0x26,
+    0x0f, 0xe0, 0xab, 0xe5, 0x0f, 0x86, 0xf0, 0xc1, 0xec, 0x50, 0x89, 0x82, 0x07, 0xd5, 0xc7, 0xcb, 0x81, 0x0f, 0x36,
+    0x6e, 0x66, 0x29, 0xbe, 0xaf, 0xf8, 0x36, 0xa2, 0xba, 0xf3, 0xa8, 0x12, 0xd5, 0x9d, 0x47, 0xae, 0xf4, 0x6c, 0x7b,
+    0xed, 0x4e, 0xf8, 0xc8, 0x11, 0x00, 0x57, 0x4d, 0xf8, 0xbf, 0x26, 0x02, 0x1e, 0x86, 0x8f, 0x4a, 0x19, 0xf0, 0xaa,
+    0xdd, 0x09, 0x8f, 0xb4, 0xb8, 0xe9, 0x84, 0x8f, 0x7e, 0x50, 0x0c, 0x5a, 0x33, 0xe7, 0xfa, 0x81, 0xd8, 0x12, 0xaa,
+    0xd1, 0x49, 0x75, 0x3e, 0x0e, 0xca, 0x2f, 0xc0, 0x99, 0xf3, 0x69, 0x5c, 0x42, 0xcf, 0x63, 0x01, 0x9f, 0xe1, 0xa8,
+    0x9f, 0xdd, 0x5a, 0x1d, 0xae, 0xf1, 0x8b, 0x2d, 0x53, 0xc0, 0x09, 0xf7, 0xb1, 0x7b, 0x2f, 0x18, 0x2e, 0xd5, 0xaa,
+    0x97, 0x16, 0xdb, 0x77, 0xb7, 0xed, 0x26, 0x6d, 0xdd, 0xd0, 0xbe, 0x1f, 0x4e, 0x31, 0x0b, 0xa6, 0x5e, 0x10, 0xaf,
+    0x26, 0xf9, 0x32, 0x29, 0xd6, 0xe7, 0x87, 0xdc, 0x3e, 0xc1, 0x9d, 0xab, 0xd1, 0xb4, 0x4a, 0x3f, 0x4f, 0x18, 0x5c,
+    0x66, 0x2f, 0x0a, 0x0b, 0x7a, 0xcd, 0x19, 0x58, 0x61, 0x49, 0xf1, 0x0b, 0x9a, 0xf7, 0x7d, 0x28, 0xf2, 0x23, 0x5f,
+    0x39, 0x92, 0xfc, 0xf2, 0x53, 0x24, 0x25, 0x61, 0x57, 0x05, 0x58, 0x5d, 0x21, 0x81, 0x53, 0x0b, 0xf8, 0xf1, 0xd1,
+    0xc1, 0xc1, 0xce, 0xf3, 0xa2, 0xb4, 0x31, 0x58, 0x6b, 0xf5, 0x09, 0x03, 0x97, 0x15, 0xf9, 0x2e, 0xa2, 0xcb, 0x71,
+    0x15, 0x0a, 0x91, 0xc1, 0xd3, 0x25, 0x8d, 0x65, 0x18, 0x67, 0x3a, 0x45, 0xc1, 0x61, 0x58, 0xb8, 0x4d, 0x8f, 0x50,
+    0xc1, 0x65, 0xec, 0x7c, 0xa3, 0xd4, 0x9c, 0x73, 0x2e, 0x63, 0x7b, 0xd1, 0x2f, 0x93, 0xb5, 0x4c, 0xf8, 0x69, 0xa7,
+    0xf7, 0xf6, 0xfd, 0x89, 0xa7, 0x8f, 0xe7, 0xf1, 0xe1, 0xb4, 0xd3, 0x3b, 0x56, 0x96, 0xb9, 0xbe, 0x26, 0x44, 0xf4,
+    0x35, 0x21, 0xcf, 0x5c, 0x19, 0x83, 0x78, 0x4d, 0x71, 0xa8, 0x97, 0xed, 0x7b, 0x34, 0x1b, 0x69, 0x9f, 0xe2, 0x6c,
+    0x91, 0x4a, 0x06, 0x2f, 0xe0, 0x3d, 0x84, 0xae, 0x4d, 0xd8, 0xb0, 0x32, 0xcf, 0xd4, 0x6a, 0x38, 0x32, 0xb3, 0x1e,
+    0xc8, 0x31, 0x4b, 0xa9, 0xcd, 0x2c, 0x35, 0x43, 0x95, 0x79, 0xcf, 0x9b, 0xad, 0xf3, 0xc5, 0xe5, 0x8c, 0xc9, 0x32,
+    0x15, 0xf4, 0x83, 0xe9, 0x70, 0xac, 0xa6, 0xea, 0x5d, 0x14, 0xc6, 0x45, 0x6a, 0x3f, 0x36, 0xb2, 0xf6, 0x79, 0x77,
+    0xbd, 0x7a, 0x23, 0x21, 0xe0, 0xbe, 0xcf, 0xf4, 0xa8, 0x57, 0x3a, 0x25, 0xdd, 0xba, 0xe2, 0xf8, 0x70, 0x7a, 0xd4,
+    0xbb, 0x88, 0xe6, 0x66, 0xbc, 0x57, 0x7c, 0xe3, 0x53, 0xf1, 0x25, 0xc7, 0xec, 0xab, 0xc4, 0x76, 0x7d, 0x83, 0xd2,
+    0x00, 0x3c, 0xe2, 0xa9, 0xdf, 0x3b, 0x36, 0xca, 0x80, 0xa7, 0x82, 0xae, 0xfe, 0xa3, 0x96, 0xcd, 0x95, 0x4f, 0xb9,
+    0xd2, 0x96, 0x74, 0x17, 0x67, 0x92, 0x9a, 0x5f, 0x77, 0xda, 0xee, 0x1d, 0xc7, 0x46, 0xcd, 0x04, 0xe6, 0x91, 0x47,
+    0x87, 0xd0, 0x19, 0x74, 0xb9, 0x90, 0xf1, 0xc3, 0x6b, 0x7a, 0xd9, 0x8c, 0xe7, 0xac, 0x72, 0xa2, 0x82, 0xd2, 0x51,
+    0x4e, 0xc9, 0xab, 0x99, 0xe0, 0x67, 0xbc, 0xb6, 0x48, 0xc5, 0xc2, 0x0b, 0xe3, 0xa1, 0x55, 0xba, 0x3a, 0x8d, 0xa5,
+    0xef, 0x69, 0x0e, 0x6f, 0x3d, 0xb9, 0x46, 0xf6, 0x16, 0x7e, 0xef, 0xdf, 0xfe, 0xc7, 0xff, 0x32, 0xce, 0xd9, 0xe3,
+    0xc3, 0x69, 0xdb, 0x8e, 0xb5, 0x86, 0xe8, 0xe2, 0x18, 0xae, 0x97, 0x55, 0xd1, 0x44, 0x7a, 0xd3, 0x9c, 0x08, 0x96,
+    0x34, 0xa7, 0x71, 0x3a, 0xf6, 0x7b, 0xbb, 0x11, 0xe4, 0xde, 0x2b, 0x31, 0x50, 0xd7, 0x8b, 0x80, 0x04, 0x7f, 0xd3,
+    0xcd, 0x08, 0x9b, 0x60, 0xaf, 0x4e, 0xab, 0x7b, 0x4f, 0xa2, 0x3a, 0x50, 0xb5, 0xbb, 0x12, 0xc2, 0x7c, 0x93, 0xc8,
+    0x30, 0x35, 0x51, 0xbb, 0x22, 0x51, 0xf8, 0x5e, 0x19, 0x0d, 0xf9, 0xbf, 0xff, 0xf3, 0xbf, 0xfc, 0x37, 0xfb, 0x08,
+    0x41, 0x8e, 0x7f, 0xfb, 0xef, 0xff, 0xf9, 0xff, 0xfc, 0xef, 0xff, 0x0a, 0x69, 0xf5, 0x26, 0x10, 0xa2, 0xf8, 0x84,
+    0x57, 0x45, 0x41, 0x34, 0xc3, 0xf0, 0x20, 0x19, 0x6d, 0xc6, 0x72, 0xc9, 0x46, 0xf5, 0x4b, 0x13, 0x67, 0x6a, 0x42,
+    0x75, 0xd8, 0x0c, 0x74, 0xea, 0xd0, 0x16, 0x15, 0x8d, 0xd4, 0x50, 0xae, 0x68, 0xb1, 0x38, 0x3e, 0x04, 0x7c, 0xdf,
+    0xef, 0x9e, 0x59, 0x58, 0x6e, 0xc7, 0xd2, 0xba, 0xfe, 0xa0, 0xa4, 0xa8, 0xca, 0x3d, 0x70, 0xca, 0x2f, 0xe1, 0x31,
+    0xea, 0x38, 0xc5, 0x6a, 0xf7, 0x6a, 0x7d, 0xba, 0x3f, 0x2d, 0x72, 0xc9, 0xc6, 0x80, 0x72, 0xed, 0x60, 0x54, 0xf1,
+    0xcf, 0x26, 0xa8, 0x7f, 0xe9, 0x6d, 0xa1, 0x46, 0xd1, 0x36, 0xe3, 0xc3, 0xa7, 0x7f, 0x2a, 0xfe, 0x32, 0x03, 0x25,
+    0xcb, 0x0b, 0x66, 0xf1, 0x8d, 0xb1, 0x24, 0x1f, 0xb7, 0x5a, 0xf3, 0x1b, 0xb4, 0xac, 0x66, 0xc0, 0xbb, 0x26, 0x53,
+    0x4e, 0x49, 0x77, 0x40, 0x15, 0x38, 0x2d, 0xfd, 0x9f, 0x2d, 0x0f, 0x9c, 0xa8, 0x5e, 0xab, 0x28, 0xfe, 0xbc, 0x54,
+    0x2e, 0x38, 0xf6, 0x0b, 0x04, 0x38, 0x8d, 0xb7, 0xf2, 0x92, 0xbb, 0x8b, 0x5b, 0x3a, 0xbd, 0x3a, 0xba, 0xd7, 0xb4,
+    0xbd, 0x79, 0x7d, 0xca, 0x0d, 0xd0, 0xba, 0xa1, 0xd5, 0x87, 0x10, 0x2c, 0x9d, 0xb6, 0xf1, 0xb4, 0xb3, 0x2c, 0x87,
+    0x97, 0x92, 0xcf, 0xdc, 0x88, 0x2c, 0x8d, 0xe9, 0x88, 0x8e, 0xad, 0x97, 0xd7, 0xd4, 0xeb, 0x68, 0x6b, 0x31, 0x3d,
+    0xda, 0x32, 0x97, 0x01, 0x49, 0x45, 0x62, 0xbd, 0x56, 0xf1, 0x19, 0x9c, 0xc0, 0xe5, 0x38, 0xe5, 0xb1, 0x8c, 0x14,
+    0xc1, 0x76, 0xdd, 0xb8, 0x6e, 0x0c, 0x6c, 0x86, 0x2f, 0x1d, 0x78, 0xba, 0xba, 0x29, 0xf8, 0x5b, 0xeb, 0x97, 0xdc,
+    0x8a, 0x50, 0x75, 0x77, 0x87, 0xd2, 0xee, 0x9a, 0x6f, 0x4d, 0xb8, 0xf4, 0x4d, 0xcd, 0xcf, 0x61, 0x64, 0x4c, 0x07,
+    0x6d, 0xaf, 0xd7, 0xa2, 0x5a, 0xd7, 0x7e, 0x25, 0x03, 0x5f, 0x81, 0xe9, 0xaf, 0xb7, 0x52, 0x85, 0xd0, 0xea, 0x0d,
+    0xf9, 0xb6, 0xb4, 0x82, 0xe2, 0xf9, 0x5c, 0x35, 0x44, 0xdd, 0xe3, 0x43, 0xad, 0xbc, 0x02, 0xf7, 0x50, 0xb9, 0x00,
+    0x3a, 0xf4, 0x6e, 0x1a, 0x99, 0xa3, 0xa0, 0x7f, 0x99, 0xa0, 0x3c, 0x7c, 0xac, 0xaa, 0xf7, 0xff, 0x00, 0xbb, 0x9f,
+    0x49, 0x8d, 0x3d, 0x86, 0x00, 0x00};
+
+}  // namespace web_server
+}  // namespace esphome
+#endif
+#endif
diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h
new file mode 100644
index 0000000000..49de0cfab6
--- /dev/null
+++ b/esphome/components/web_server/server_index_v3.h
@@ -0,0 +1,3995 @@
+#pragma once
+// Generated from https://github.com/esphome/esphome-webserver
+#ifdef USE_WEBSERVER_LOCAL
+#if USE_WEBSERVER_VERSION == 3
+#include "esphome/core/hal.h"
+namespace esphome {
+
+namespace web_server {
+
+const uint8_t INDEX_GZ[] PROGMEM = {
+    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcc, 0xbd, 0xeb, 0x7a, 0x1b, 0xb7, 0xb2, 0x20, 0xfa,
+    0xfb, 0xcc, 0x53, 0x48, 0xbd, 0x1d, 0xa5, 0x21, 0x82, 0x2d, 0x92, 0xba, 0x58, 0x6e, 0x0a, 0xe2, 0xf8, 0x1a, 0x3b,
+    0x71, 0x6c, 0xc7, 0x72, 0xec, 0xd8, 0x0c, 0xb7, 0x02, 0x36, 0x41, 0x12, 0x71, 0x13, 0x60, 0x1a, 0xa0, 0x25, 0x99,
+    0xe4, 0xbb, 0x9f, 0xaf, 0x70, 0xe9, 0x46, 0x93, 0xb4, 0xd7, 0x5a, 0x73, 0x66, 0xce, 0x37, 0x3b, 0x7b, 0x59, 0x6c,
+    0xdc, 0x51, 0x28, 0x14, 0xaa, 0x0a, 0x55, 0x85, 0x8b, 0xfd, 0x91, 0xcc, 0xf4, 0xdd, 0x9c, 0xed, 0x4d, 0xf5, 0x2c,
+    0xbf, 0xbc, 0x70, 0xff, 0x32, 0x3a, 0xba, 0xbc, 0xc8, 0xb9, 0xf8, 0xbc, 0x57, 0xb0, 0x9c, 0xf0, 0x4c, 0x8a, 0xbd,
+    0x69, 0xc1, 0xc6, 0x64, 0x44, 0x35, 0x4d, 0xf9, 0x8c, 0x4e, 0xd8, 0xde, 0xd1, 0xe5, 0xc5, 0x8c, 0x69, 0xba, 0x97,
+    0x4d, 0x69, 0xa1, 0x98, 0x26, 0xbf, 0xbf, 0x7b, 0xd6, 0x3c, 0xbf, 0xbc, 0x50, 0x59, 0xc1, 0xe7, 0x7a, 0x0f, 0x9a,
+    0x24, 0x33, 0x39, 0x5a, 0xe4, 0xec, 0xf2, 0xe8, 0xe8, 0xe6, 0xe6, 0x26, 0xf9, 0x5b, 0xfd, 0x8f, 0x2f, 0xb4, 0xd8,
+    0xfb, 0xa5, 0x20, 0xaf, 0x87, 0x7f, 0xb3, 0x4c, 0x27, 0x23, 0x36, 0xe6, 0x82, 0xbd, 0x29, 0xe4, 0x9c, 0x15, 0xfa,
+    0xae, 0x0b, 0x99, 0x3f, 0x15, 0x24, 0xe6, 0x58, 0x63, 0x86, 0xc8, 0xa5, 0xde, 0xe3, 0x62, 0x8f, 0xf7, 0x7e, 0x29,
+    0x4c, 0xca, 0x92, 0x89, 0xc5, 0x8c, 0x15, 0x74, 0x98, 0xb3, 0x74, 0xbf, 0x85, 0x33, 0x29, 0xc6, 0x7c, 0xb2, 0x28,
+    0xbf, 0x6f, 0x0a, 0xae, 0xfd, 0xef, 0x2f, 0x34, 0x5f, 0xb0, 0x94, 0xad, 0x51, 0xca, 0xfb, 0x7a, 0x40, 0x98, 0x69,
+    0xf9, 0x73, 0xd5, 0x70, 0xfc, 0x93, 0x69, 0xf2, 0x6e, 0xce, 0xe4, 0x78, 0x4f, 0xef, 0x93, 0x48, 0xdd, 0xcd, 0x86,
+    0x32, 0x8f, 0x7a, 0xba, 0x11, 0x45, 0x29, 0x94, 0xc1, 0x0c, 0x75, 0x33, 0x29, 0x94, 0xde, 0x13, 0x9c, 0xdc, 0x70,
+    0x31, 0x92, 0x37, 0xf8, 0x46, 0x10, 0xc1, 0x93, 0xab, 0x29, 0x1d, 0xc9, 0x9b, 0xb7, 0x52, 0xea, 0x83, 0x83, 0xd8,
+    0x7d, 0xdf, 0x3d, 0xbe, 0xba, 0x22, 0x84, 0x7c, 0x91, 0x7c, 0xb4, 0xd7, 0x5a, 0xad, 0x82, 0xd4, 0x44, 0x50, 0xcd,
+    0xbf, 0x30, 0x5b, 0x09, 0x1d, 0x1c, 0x44, 0x74, 0x24, 0xe7, 0x9a, 0x8d, 0xae, 0xf4, 0x5d, 0xce, 0xae, 0xa6, 0x8c,
+    0x69, 0x15, 0x71, 0xb1, 0xf7, 0x44, 0x66, 0x8b, 0x19, 0x13, 0x3a, 0x99, 0x17, 0x52, 0x4b, 0x18, 0xd8, 0xc1, 0x41,
+    0x54, 0xb0, 0x79, 0x4e, 0x33, 0x06, 0xf9, 0x8f, 0xaf, 0xae, 0xaa, 0x1a, 0x55, 0x21, 0xfc, 0x59, 0x90, 0x2b, 0x33,
+    0xf4, 0x18, 0xe1, 0x0f, 0x82, 0x08, 0x76, 0xb3, 0xf7, 0x81, 0xd1, 0xcf, 0xbf, 0xd2, 0x79, 0x37, 0xcb, 0xa9, 0x52,
+    0x7b, 0xcf, 0xe4, 0xd2, 0x4c, 0xa3, 0x58, 0x64, 0x5a, 0x16, 0xb1, 0xc6, 0x0c, 0x0b, 0xb4, 0xe4, 0xe3, 0x58, 0x4f,
+    0xb9, 0x4a, 0xae, 0xef, 0x65, 0x4a, 0xbd, 0x65, 0x6a, 0x91, 0xeb, 0x7b, 0x64, 0xbf, 0x85, 0xc5, 0x3e, 0x21, 0x9f,
+    0x05, 0xd2, 0xd3, 0x42, 0xde, 0xec, 0x3d, 0x2d, 0x0a, 0x59, 0xc4, 0xd1, 0xe3, 0xab, 0x2b, 0x5b, 0x62, 0x8f, 0xab,
+    0x3d, 0x21, 0xf5, 0x5e, 0xd9, 0x1e, 0x40, 0x3b, 0xd9, 0xfb, 0x5d, 0xb1, 0xbd, 0xbf, 0x16, 0x42, 0xd1, 0x31, 0x7b,
+    0x7c, 0x75, 0xf5, 0xd7, 0x9e, 0x2c, 0xf6, 0xfe, 0xca, 0x94, 0xfa, 0x6b, 0x8f, 0x0b, 0xa5, 0x19, 0x1d, 0x25, 0x11,
+    0xea, 0x9a, 0xce, 0x32, 0xa5, 0xde, 0xb1, 0x5b, 0x4d, 0x34, 0x36, 0x9f, 0x9a, 0xb0, 0xf5, 0x84, 0xe9, 0x3d, 0x55,
+    0xce, 0x2b, 0x46, 0xcb, 0x9c, 0xe9, 0x3d, 0x4d, 0x4c, 0xbe, 0x74, 0xf0, 0x67, 0xf6, 0x53, 0x77, 0xf9, 0x38, 0xbe,
+    0x11, 0x07, 0x07, 0xba, 0x04, 0x34, 0x5a, 0xba, 0x15, 0x22, 0x6c, 0xdf, 0xa7, 0x1d, 0x1c, 0xb0, 0x24, 0x67, 0x62,
+    0xa2, 0xa7, 0x84, 0x90, 0x76, 0x57, 0x1c, 0x1c, 0xc4, 0x9a, 0x7c, 0x10, 0xc9, 0x84, 0xe9, 0x98, 0x21, 0x84, 0xab,
+    0xda, 0x07, 0x07, 0xb1, 0x05, 0x82, 0x24, 0xda, 0x00, 0xae, 0x06, 0x63, 0x94, 0x38, 0xe8, 0x5f, 0xdd, 0x89, 0x2c,
+    0x0e, 0xc7, 0x8f, 0xb0, 0x38, 0x38, 0xf8, 0x20, 0x12, 0x05, 0x2d, 0x62, 0x8d, 0xd0, 0xba, 0x60, 0x7a, 0x51, 0x88,
+    0x3d, 0xbd, 0xd6, 0xf2, 0x4a, 0x17, 0x5c, 0x4c, 0x62, 0xb4, 0xf4, 0x69, 0x41, 0xc5, 0xf5, 0xda, 0x0e, 0xf7, 0xb7,
+    0x82, 0x70, 0x72, 0x09, 0x3d, 0x3e, 0x93, 0xb1, 0xc3, 0x41, 0x4e, 0x48, 0xa4, 0x4c, 0xdd, 0xa8, 0xc7, 0x53, 0xde,
+    0x88, 0x22, 0x6c, 0x47, 0x89, 0x3f, 0x0b, 0x84, 0xb9, 0x06, 0xd4, 0x4d, 0x92, 0x44, 0x23, 0x72, 0xb9, 0xf4, 0x60,
+    0xe1, 0xc1, 0x44, 0x7b, 0xbc, 0xdf, 0x1a, 0xa4, 0x3a, 0x29, 0xd8, 0x68, 0x91, 0xb1, 0x38, 0x16, 0x58, 0x61, 0x89,
+    0xc8, 0xa5, 0x68, 0xc4, 0x05, 0xb9, 0x84, 0xf5, 0x2e, 0xea, 0x8b, 0x4d, 0xc8, 0x7e, 0x0b, 0xb9, 0x41, 0x16, 0x7e,
+    0x84, 0x00, 0x62, 0x37, 0xa0, 0x82, 0x90, 0x48, 0x2c, 0x66, 0x43, 0x56, 0x44, 0x65, 0xb1, 0x6e, 0x0d, 0x2f, 0x16,
+    0x8a, 0xed, 0x65, 0x4a, 0xed, 0x8d, 0x17, 0x22, 0xd3, 0x5c, 0x8a, 0xbd, 0xa8, 0x51, 0x34, 0x22, 0x8b, 0x0f, 0x25,
+    0x3a, 0x44, 0x68, 0x8d, 0x62, 0x85, 0x1a, 0xbc, 0x2f, 0x1b, 0xed, 0x01, 0x86, 0x51, 0xa2, 0xae, 0x6b, 0xcf, 0x41,
+    0x80, 0x61, 0x0e, 0x93, 0x5c, 0xe3, 0x4f, 0x76, 0xe7, 0xc3, 0x14, 0x6f, 0x44, 0x8f, 0x27, 0xdb, 0x3b, 0x85, 0xe8,
+    0x64, 0x46, 0xe7, 0x31, 0x23, 0x97, 0xcc, 0x60, 0x17, 0x15, 0x19, 0x8c, 0xb5, 0xb6, 0x70, 0x3d, 0x96, 0xb2, 0xa4,
+    0xc2, 0x29, 0x94, 0xea, 0x64, 0x2c, 0x8b, 0xa7, 0x34, 0x9b, 0x42, 0xbd, 0x12, 0x63, 0x46, 0x7e, 0xc3, 0x65, 0x05,
+    0xa3, 0x9a, 0x3d, 0xcd, 0x19, 0x7c, 0xc5, 0x91, 0xa9, 0x19, 0x21, 0xac, 0x60, 0xab, 0xe7, 0x5c, 0xbf, 0x92, 0x22,
+    0x63, 0x5d, 0x15, 0xe0, 0x97, 0x59, 0xf9, 0x87, 0x5a, 0x17, 0x7c, 0xb8, 0xd0, 0x2c, 0x8e, 0x04, 0x94, 0x88, 0xb0,
+    0x42, 0x58, 0x24, 0x9a, 0xdd, 0xea, 0xc7, 0x52, 0x68, 0x26, 0x34, 0x61, 0x1e, 0xaa, 0x98, 0x27, 0x74, 0x3e, 0x67,
+    0x62, 0xf4, 0x78, 0xca, 0xf3, 0x51, 0x2c, 0xd0, 0x1a, 0xad, 0xf1, 0xef, 0x82, 0xc0, 0x24, 0xc9, 0x25, 0x4f, 0xe1,
+    0x9f, 0x6f, 0x4f, 0x27, 0xd6, 0xe4, 0xd2, 0x6c, 0x0b, 0x46, 0xa2, 0xa8, 0x3b, 0x96, 0x45, 0xec, 0xa6, 0xb0, 0x07,
+    0xa4, 0x0b, 0xfa, 0x78, 0xbb, 0xc8, 0x99, 0x42, 0xac, 0x41, 0x44, 0xb9, 0x8e, 0x0e, 0xc2, 0xbf, 0x15, 0x31, 0x83,
+    0x05, 0xe0, 0x28, 0xe5, 0x86, 0x04, 0xbe, 0xe4, 0x6e, 0x53, 0x8d, 0x4a, 0xa2, 0xf6, 0x51, 0x90, 0x11, 0x4f, 0x74,
+    0xb1, 0x50, 0x9a, 0x8d, 0xde, 0xdd, 0xcd, 0x99, 0xc2, 0x3f, 0x17, 0xe4, 0xa3, 0xe8, 0x7d, 0x14, 0x09, 0x9b, 0xcd,
+    0xf5, 0xdd, 0x95, 0xa1, 0xe6, 0x69, 0x14, 0xe1, 0x7f, 0x4c, 0xd1, 0x82, 0xd1, 0x0c, 0x48, 0x9a, 0x03, 0xd9, 0x1b,
+    0x99, 0xdf, 0x8d, 0x79, 0x9e, 0x5f, 0x2d, 0xe6, 0x73, 0x59, 0x68, 0xac, 0x05, 0x59, 0x6a, 0x59, 0xc1, 0x07, 0x56,
+    0x74, 0xa9, 0x6e, 0xb8, 0xce, 0xa6, 0xb1, 0x46, 0xcb, 0x8c, 0x2a, 0xb6, 0xf7, 0x48, 0xca, 0x9c, 0x51, 0x91, 0x72,
+    0xc2, 0x7b, 0x3f, 0x17, 0xa9, 0x58, 0xe4, 0x79, 0x77, 0x58, 0x30, 0xfa, 0xb9, 0x6b, 0xb2, 0xed, 0xe1, 0x90, 0x9a,
+    0xdf, 0x0f, 0x8b, 0x82, 0xde, 0x41, 0x41, 0x42, 0xa0, 0x58, 0x8f, 0xa7, 0x3f, 0x5f, 0xbd, 0x7e, 0x95, 0xd8, 0xbd,
+    0xc2, 0xc7, 0x77, 0x31, 0x2f, 0xf7, 0x1f, 0x5f, 0xe3, 0x71, 0x21, 0x67, 0x1b, 0x5d, 0x5b, 0xd0, 0xf1, 0xee, 0x37,
+    0x86, 0xc0, 0x08, 0xdf, 0xb7, 0x4d, 0x87, 0x23, 0x78, 0x65, 0x30, 0x1f, 0x32, 0x89, 0xeb, 0x17, 0xfe, 0x49, 0x6d,
+    0x72, 0xcc, 0xd1, 0xf7, 0x47, 0xab, 0x8b, 0xbb, 0x25, 0x23, 0x66, 0x9c, 0x73, 0x38, 0x18, 0x61, 0x8c, 0x19, 0xd5,
+    0xd9, 0x74, 0xc9, 0x4c, 0x63, 0x6b, 0x3f, 0x62, 0xb6, 0x5e, 0xe3, 0xaf, 0xd2, 0x63, 0xbd, 0xde, 0x27, 0x84, 0x1b,
+    0x7a, 0x45, 0xf4, 0x6a, 0xc5, 0x09, 0xe1, 0x08, 0xbf, 0xe5, 0x64, 0x49, 0xfd, 0x84, 0xe0, 0x64, 0x83, 0xed, 0x99,
+    0x5a, 0x2a, 0x03, 0x27, 0xe0, 0x17, 0x56, 0x68, 0x56, 0xa4, 0x5a, 0xe0, 0x82, 0x8d, 0x73, 0x18, 0xc7, 0x7e, 0x1b,
+    0x4f, 0xa9, 0x7a, 0x3c, 0xa5, 0x62, 0xc2, 0x46, 0xe9, 0x57, 0xb9, 0xc6, 0x4c, 0x90, 0x68, 0xcc, 0x05, 0xcd, 0xf9,
+    0x57, 0x36, 0x8a, 0xdc, 0xb9, 0xf0, 0x48, 0xef, 0xb1, 0x5b, 0xcd, 0xc4, 0x48, 0xed, 0x3d, 0x7f, 0xf7, 0xeb, 0x4b,
+    0xb7, 0x98, 0xb5, 0xb3, 0x02, 0x2d, 0xd5, 0x62, 0xce, 0x8a, 0x18, 0x61, 0x77, 0x56, 0x3c, 0xe5, 0x86, 0x4e, 0xfe,
+    0x4a, 0xe7, 0x36, 0x85, 0xab, 0xdf, 0xe7, 0x23, 0xaa, 0xd9, 0x1b, 0x26, 0x46, 0x5c, 0x4c, 0xc8, 0x7e, 0xdb, 0xa6,
+    0x4f, 0xa9, 0xcb, 0x18, 0x95, 0x49, 0xd7, 0xf7, 0x9e, 0xe6, 0x66, 0xee, 0xe5, 0xe7, 0x22, 0x46, 0x6b, 0xa5, 0xa9,
+    0xe6, 0xd9, 0x1e, 0x1d, 0x8d, 0x5e, 0x08, 0xae, 0xb9, 0x19, 0x61, 0x01, 0x4b, 0x04, 0xb8, 0xca, 0xec, 0xa9, 0xe1,
+    0x47, 0x1e, 0x23, 0x1c, 0xc7, 0xee, 0x2c, 0x98, 0x22, 0xb7, 0x66, 0x07, 0x07, 0x15, 0xe5, 0xef, 0xb1, 0xd4, 0x66,
+    0x92, 0xfe, 0x00, 0x25, 0xf3, 0x85, 0x82, 0xc5, 0xf6, 0x5d, 0xc0, 0x41, 0x23, 0x87, 0x8a, 0x15, 0x5f, 0xd8, 0xa8,
+    0x44, 0x10, 0x15, 0xa3, 0xe5, 0x46, 0x1f, 0x6e, 0x7b, 0x68, 0xd2, 0x1f, 0x74, 0x43, 0x12, 0xce, 0x1c, 0xb2, 0x5b,
+    0x4e, 0x85, 0x33, 0x55, 0x12, 0x95, 0x18, 0x0e, 0xd4, 0x92, 0xb0, 0x28, 0xe2, 0xe7, 0x37, 0x8f, 0x05, 0xf0, 0x10,
+    0x21, 0xe5, 0xf0, 0x67, 0xee, 0xd3, 0x2f, 0xe6, 0xf0, 0x50, 0x58, 0x20, 0xac, 0xed, 0x48, 0x15, 0x42, 0x6b, 0x84,
+    0xb5, 0x1f, 0xae, 0x25, 0x4a, 0x9e, 0x2f, 0x82, 0x53, 0x9b, 0xbc, 0xe5, 0xe6, 0xd8, 0x06, 0xda, 0x46, 0x35, 0x3b,
+    0x38, 0x88, 0x59, 0x52, 0x22, 0x06, 0xd9, 0x6f, 0xbb, 0x45, 0x0a, 0xa0, 0xf5, 0x8d, 0x71, 0x43, 0xcf, 0x86, 0xc1,
+    0xd9, 0x67, 0x89, 0x90, 0x0f, 0xb3, 0x8c, 0x29, 0x25, 0x8b, 0x83, 0x83, 0x7d, 0x53, 0xbe, 0xe4, 0x2c, 0x60, 0x11,
+    0x5f, 0xdf, 0x88, 0x6a, 0x08, 0xa8, 0x3a, 0x6d, 0x3d, 0xdf, 0x44, 0x2a, 0xbe, 0xc9, 0x33, 0x21, 0x69, 0x74, 0x7d,
+    0x1d, 0x35, 0x34, 0x76, 0x70, 0x98, 0x30, 0xdf, 0xf5, 0xdd, 0x13, 0x66, 0xd9, 0x42, 0xc3, 0x84, 0x6c, 0x81, 0x66,
+    0x27, 0x3f, 0x18, 0xd7, 0x87, 0x84, 0x35, 0x56, 0x68, 0x1d, 0xac, 0xe8, 0xce, 0xa6, 0x0d, 0x7f, 0x63, 0x97, 0x6e,
+    0x39, 0x31, 0x3c, 0x45, 0xb0, 0x8e, 0x7d, 0x36, 0x58, 0x63, 0x03, 0x7b, 0x3f, 0x1b, 0x69, 0x06, 0xda, 0xd7, 0x83,
+    0xae, 0xcb, 0x27, 0xca, 0x42, 0xae, 0x60, 0xff, 0x2c, 0x98, 0xd2, 0x16, 0x91, 0x63, 0x8d, 0x25, 0x86, 0x33, 0x6a,
+    0x93, 0xe9, 0xac, 0xb1, 0xa4, 0xbb, 0xc6, 0xf6, 0x7a, 0x0e, 0x67, 0xa3, 0x02, 0xa4, 0xfe, 0x3e, 0x3e, 0xc1, 0x58,
+    0x35, 0x5a, 0xad, 0xde, 0x72, 0xdf, 0x4a, 0xb5, 0x96, 0x25, 0xbf, 0xb6, 0xb1, 0x28, 0x4c, 0x20, 0x77, 0x38, 0xef,
+    0xb7, 0xdd, 0xf8, 0xc5, 0x80, 0xec, 0xb7, 0x4a, 0x2c, 0x76, 0x60, 0xb5, 0xe3, 0xb1, 0x50, 0x7c, 0x6d, 0x9b, 0x42,
+    0xe6, 0xac, 0xaf, 0xe1, 0x4b, 0x32, 0xdd, 0xc2, 0xd5, 0x29, 0xe9, 0x03, 0xd7, 0x91, 0x4c, 0x07, 0xdf, 0xc2, 0x27,
+    0x4f, 0x11, 0x62, 0xbd, 0x9d, 0x57, 0x11, 0x8e, 0x2f, 0x75, 0xc2, 0xb1, 0x31, 0x8d, 0x68, 0x5e, 0x56, 0x89, 0x4a,
+    0x34, 0x73, 0x5b, 0xbd, 0xca, 0xc2, 0xc2, 0x0c, 0xa6, 0x9a, 0x52, 0xd0, 0xc4, 0x2b, 0x3a, 0x63, 0x2a, 0x66, 0x08,
+    0x7f, 0xab, 0x80, 0xc5, 0x4f, 0x28, 0x32, 0x08, 0xce, 0x50, 0x05, 0x67, 0x28, 0xb0, 0xbb, 0xc0, 0xa4, 0xd5, 0xb7,
+    0x9c, 0xc2, 0xac, 0xaf, 0x06, 0x15, 0x6f, 0x17, 0x4c, 0xde, 0x1c, 0xce, 0x0e, 0xc1, 0x3d, 0xfc, 0x6c, 0x9a, 0x05,
+    0x9a, 0x61, 0x21, 0x14, 0xc2, 0xfb, 0xad, 0xcd, 0x95, 0xf4, 0xa5, 0xaa, 0x39, 0xf6, 0x07, 0xb0, 0x0e, 0xe6, 0xd8,
+    0x48, 0xb8, 0x32, 0x7f, 0x6b, 0x5b, 0x0d, 0xc0, 0x76, 0x05, 0x98, 0x91, 0x8c, 0x73, 0xaa, 0xe3, 0xf6, 0x51, 0x0b,
+    0x18, 0xd3, 0x2f, 0x0c, 0x4e, 0x15, 0x84, 0xb6, 0xa7, 0xc2, 0x92, 0x85, 0x50, 0x53, 0x3e, 0xd6, 0xf1, 0xef, 0xc2,
+    0x10, 0x15, 0x96, 0x2b, 0x06, 0x12, 0x4e, 0xc0, 0x1e, 0x1b, 0x82, 0xf3, 0xbb, 0x80, 0x7e, 0xba, 0xe5, 0x41, 0xe4,
+    0x46, 0x6a, 0x08, 0x17, 0x90, 0x87, 0x8a, 0xb5, 0xae, 0xc8, 0x4c, 0xc9, 0xb8, 0x01, 0xf7, 0xd8, 0xee, 0xd9, 0x16,
+    0x53, 0x47, 0x0d, 0x44, 0xc0, 0xc1, 0x8a, 0x34, 0x24, 0x11, 0x2e, 0x51, 0x27, 0x5a, 0xbe, 0x94, 0x37, 0xac, 0x78,
+    0x4c, 0x61, 0xf0, 0xa9, 0xad, 0xbe, 0xb6, 0x47, 0x81, 0xa1, 0xf8, 0xba, 0xeb, 0xf1, 0xe5, 0xda, 0x4c, 0xfc, 0x4d,
+    0x21, 0x67, 0x5c, 0x31, 0xe0, 0xdb, 0x2c, 0xfc, 0x05, 0x6c, 0x34, 0xb3, 0x23, 0xe1, 0xb8, 0x61, 0x25, 0x7e, 0x3d,
+    0x7c, 0x59, 0xc7, 0xaf, 0xeb, 0x7b, 0x4f, 0x27, 0x9e, 0x02, 0xd6, 0xf7, 0x31, 0xc2, 0xb1, 0x13, 0x2f, 0x82, 0x93,
+    0x2e, 0x99, 0x22, 0x77, 0xcc, 0xaf, 0x56, 0x3a, 0x10, 0xe3, 0x6a, 0x9c, 0x23, 0xb3, 0xdb, 0x06, 0xad, 0xe9, 0x68,
+    0x04, 0x2c, 0x5e, 0x21, 0xf3, 0x3c, 0x38, 0xac, 0xb0, 0xe8, 0x96, 0xc7, 0xd3, 0xf5, 0xbd, 0xa7, 0x57, 0xdf, 0x3b,
+    0xa1, 0x20, 0x3f, 0x3c, 0xa4, 0xfc, 0x40, 0xc5, 0x88, 0x15, 0x20, 0x57, 0x06, 0xab, 0xe5, 0xce, 0xd9, 0xc7, 0x52,
+    0x08, 0x96, 0x69, 0x36, 0x02, 0xa1, 0x45, 0x10, 0x9d, 0x4c, 0xa5, 0xd2, 0x65, 0x62, 0x35, 0x7a, 0x11, 0x0a, 0xa1,
+    0x49, 0x46, 0xf3, 0x3c, 0xb6, 0x02, 0xca, 0x4c, 0x7e, 0x61, 0x3b, 0x46, 0xdd, 0xad, 0x0d, 0xb9, 0x6c, 0x86, 0x05,
+    0xcd, 0xb0, 0x44, 0xcd, 0x73, 0x9e, 0xb1, 0xf2, 0xf0, 0xba, 0x4a, 0xb8, 0x18, 0xb1, 0x5b, 0xa0, 0x23, 0xe8, 0xf2,
+    0xf2, 0xb2, 0x85, 0xdb, 0x68, 0x6d, 0x01, 0xbe, 0xdc, 0x02, 0xec, 0x77, 0x8e, 0x4d, 0x2b, 0x88, 0x2f, 0x77, 0x92,
+    0x35, 0x14, 0x9c, 0x95, 0xdc, 0x0b, 0x5a, 0x96, 0x3c, 0x23, 0x3c, 0x62, 0x39, 0xd3, 0xcc, 0x93, 0x73, 0x60, 0xa6,
+    0xed, 0xd6, 0x7d, 0x5b, 0xc2, 0xaf, 0x44, 0x27, 0xbf, 0xcb, 0xfc, 0x9a, 0xab, 0x52, 0x74, 0xaf, 0x96, 0xa7, 0x82,
+    0x76, 0x4f, 0xdb, 0xe5, 0xa1, 0x5a, 0xd3, 0x6c, 0x6a, 0x25, 0xf6, 0x78, 0x6b, 0x4a, 0x55, 0x1b, 0x8e, 0xb4, 0x97,
+    0x9b, 0xe8, 0x53, 0xe1, 0x86, 0xb9, 0x0b, 0x04, 0x57, 0x8e, 0x28, 0x30, 0x10, 0x02, 0xed, 0xb2, 0x3d, 0xa6, 0x79,
+    0x3e, 0xa4, 0xd9, 0xe7, 0x3a, 0xf6, 0x57, 0x68, 0x40, 0x36, 0xa9, 0x71, 0x90, 0x15, 0x90, 0xac, 0x70, 0xde, 0x9e,
+    0x4a, 0xd7, 0x36, 0x4a, 0xbc, 0xdf, 0xaa, 0xd0, 0xbe, 0xbe, 0xd0, 0xdf, 0xc4, 0x76, 0x33, 0x22, 0xe1, 0x66, 0x16,
+    0x03, 0x15, 0xf8, 0x97, 0x18, 0xe7, 0xe9, 0x81, 0xc3, 0x3b, 0x10, 0x3c, 0xd6, 0x1b, 0x03, 0xd1, 0x68, 0xb9, 0x1e,
+    0x71, 0xf5, 0x6d, 0x08, 0xfc, 0x6f, 0x19, 0xe5, 0x93, 0xa0, 0x87, 0x7f, 0x77, 0xa0, 0x25, 0x8d, 0x73, 0x8c, 0x73,
+    0x39, 0x32, 0xc7, 0x50, 0x78, 0x42, 0xf3, 0x0b, 0x30, 0x2f, 0x06, 0xdf, 0x5f, 0xdb, 0x2c, 0xc3, 0x97, 0xc1, 0x30,
+    0x54, 0x37, 0x64, 0x28, 0x6a, 0x28, 0xe0, 0x88, 0xaa, 0x30, 0x67, 0xae, 0xac, 0x89, 0x92, 0x8e, 0x6b, 0xb7, 0xe2,
+    0xb8, 0xa3, 0xb9, 0x05, 0x89, 0xe3, 0x58, 0x81, 0x34, 0xe7, 0xf9, 0xfb, 0x6a, 0x16, 0x6a, 0x6b, 0x16, 0x2a, 0x09,
+    0xa4, 0x2d, 0x54, 0x21, 0x73, 0x50, 0x3d, 0xd5, 0x02, 0x85, 0xa5, 0x80, 0x65, 0x4d, 0x80, 0x42, 0xa3, 0x92, 0xe0,
+    0xe6, 0x44, 0xe3, 0xc2, 0x89, 0x3a, 0x0e, 0xd7, 0x80, 0x64, 0x54, 0x55, 0x24, 0xb2, 0x9b, 0xa3, 0x26, 0xfb, 0x4a,
+    0x5c, 0xa0, 0x0d, 0xfe, 0x7e, 0xbd, 0x76, 0x50, 0x62, 0xc8, 0xad, 0x4e, 0x8d, 0x31, 0x0e, 0xc0, 0x82, 0x25, 0x71,
+    0xcc, 0xb0, 0x65, 0x7d, 0x36, 0x81, 0x53, 0xb6, 0xbb, 0x4f, 0x88, 0xac, 0x60, 0x53, 0x63, 0x2a, 0x3d, 0x77, 0x25,
+    0x11, 0xa6, 0x9e, 0x2d, 0x2d, 0xaa, 0x89, 0x13, 0x12, 0x79, 0xed, 0x44, 0xd4, 0x5b, 0xd6, 0x84, 0xc3, 0x34, 0x28,
+    0xb6, 0x4e, 0x81, 0xa8, 0x16, 0xbb, 0xe0, 0xbd, 0x0b, 0x6b, 0x6a, 0xed, 0x04, 0x10, 0x2f, 0x6a, 0x10, 0x0f, 0x40,
+    0x2b, 0x2d, 0xf1, 0x92, 0x03, 0x42, 0xeb, 0x95, 0x63, 0x86, 0x0b, 0xbb, 0x10, 0x5b, 0x50, 0xdc, 0x64, 0x3f, 0x0d,
+    0x16, 0x82, 0x2c, 0xab, 0x80, 0xbf, 0x0b, 0x8f, 0x88, 0x18, 0x06, 0x2f, 0x56, 0xab, 0x2d, 0xb4, 0xdb, 0xc9, 0x85,
+    0xa2, 0xa4, 0x92, 0x0e, 0x57, 0xab, 0xaf, 0x12, 0xc5, 0x8e, 0xff, 0xc5, 0x0c, 0xf5, 0x3c, 0xd1, 0x7d, 0xf8, 0x12,
+    0x4a, 0x19, 0x76, 0xb4, 0x4a, 0x29, 0x05, 0x87, 0x3a, 0xd6, 0xd6, 0x17, 0x4a, 0x07, 0x94, 0xfb, 0xf1, 0x16, 0x01,
+    0x33, 0x89, 0xee, 0xa4, 0xae, 0xa6, 0xfc, 0xd8, 0x35, 0x2d, 0x10, 0x42, 0xa9, 0x32, 0xb2, 0xcc, 0xfe, 0x2e, 0xf9,
+    0xf2, 0xe0, 0x40, 0x05, 0x0d, 0x5d, 0x97, 0x94, 0xe2, 0xef, 0x18, 0x4e, 0x65, 0x75, 0x27, 0x0c, 0xfb, 0xf2, 0xb7,
+    0x3f, 0x87, 0xb6, 0xa4, 0xd3, 0x56, 0x17, 0x04, 0x73, 0x7a, 0x43, 0xb9, 0xde, 0x2b, 0x5b, 0xb1, 0x82, 0x79, 0xcc,
+    0xd0, 0xd2, 0x71, 0x1b, 0x49, 0xc1, 0x80, 0x7f, 0x04, 0xb2, 0xe0, 0xb9, 0x68, 0x8b, 0xf8, 0xd9, 0x94, 0x81, 0x2a,
+    0xdb, 0x33, 0x12, 0xa5, 0x78, 0xb8, 0xef, 0x0e, 0x12, 0xd7, 0xf0, 0xee, 0xb1, 0xaf, 0x37, 0xab, 0xd7, 0xa4, 0x81,
+    0x39, 0x2b, 0xc6, 0xb2, 0x98, 0xf9, 0xbc, 0xf5, 0xc6, 0xb7, 0x23, 0x8e, 0x7c, 0x1c, 0xef, 0x6c, 0xdb, 0x89, 0x00,
+    0xdd, 0x0d, 0xd9, 0xbb, 0x92, 0xda, 0x6b, 0xa7, 0x69, 0x79, 0x00, 0x5b, 0x05, 0xa1, 0xc7, 0x4c, 0x15, 0x4a, 0xf9,
+    0x4e, 0xbd, 0xda, 0xb5, 0xba, 0x93, 0xfd, 0x76, 0xb7, 0x94, 0xfc, 0x3c, 0x36, 0x74, 0xad, 0x8e, 0xc3, 0x9d, 0xaa,
+    0x72, 0x91, 0x8f, 0xdc, 0x60, 0x05, 0xc2, 0xcc, 0xe1, 0xd1, 0x0d, 0xcf, 0xf3, 0x2a, 0xf5, 0x3f, 0x21, 0xed, 0xca,
+    0x91, 0x76, 0xe9, 0x49, 0x3b, 0x90, 0x0a, 0x20, 0xed, 0xb6, 0xb9, 0xaa, 0xba, 0xdc, 0xda, 0x9e, 0xd2, 0x12, 0x75,
+    0x65, 0xc4, 0x69, 0xe8, 0x6f, 0xe1, 0x47, 0x80, 0x4a, 0xe6, 0xeb, 0x73, 0xec, 0xf4, 0x31, 0x20, 0x06, 0x5a, 0x9d,
+    0x26, 0x0b, 0x35, 0x15, 0x9f, 0x63, 0x84, 0xd5, 0x9a, 0x95, 0x98, 0xfd, 0xf0, 0x29, 0x28, 0xed, 0x82, 0xe9, 0xc0,
+    0x39, 0x66, 0x92, 0xff, 0x23, 0x3e, 0xca, 0xcf, 0x4e, 0xb8, 0xd9, 0x29, 0x3f, 0x3b, 0xa0, 0xf5, 0xd5, 0xec, 0x46,
+    0xdf, 0xa7, 0xf6, 0x66, 0x7a, 0xa2, 0x9c, 0x5e, 0xb5, 0xde, 0xab, 0x55, 0xbc, 0x91, 0x02, 0x1a, 0x7d, 0x27, 0xa5,
+    0x14, 0x65, 0xeb, 0x40, 0x03, 0x42, 0xc8, 0x40, 0xc2, 0xda, 0x4e, 0xba, 0x3c, 0xe5, 0x5e, 0xfe, 0x2b, 0x3d, 0x8f,
+    0x51, 0xdc, 0xdb, 0xfa, 0x8f, 0xe5, 0x6c, 0x0e, 0x0c, 0xd9, 0x06, 0x4a, 0x4f, 0x98, 0xeb, 0xb0, 0xca, 0x5f, 0xef,
+    0x48, 0xab, 0xd5, 0x31, 0xfb, 0xb1, 0x86, 0x4d, 0xa5, 0xd4, 0xbc, 0xdf, 0x5a, 0x2f, 0xca, 0xa4, 0x92, 0x70, 0xec,
+    0xd2, 0xad, 0x3c, 0xde, 0xd4, 0xcc, 0xf8, 0x8c, 0xd7, 0xb1, 0xb0, 0x74, 0x58, 0x00, 0xad, 0x0b, 0xc8, 0x8f, 0x47,
+    0xf7, 0x70, 0xfd, 0xd7, 0x15, 0x70, 0x96, 0xeb, 0x0d, 0xf0, 0x2d, 0xd7, 0xeb, 0x47, 0xda, 0x49, 0xda, 0xf8, 0xd1,
+    0x0e, 0xb9, 0xb7, 0x84, 0x5e, 0x95, 0xe9, 0x64, 0xc6, 0xfe, 0x00, 0xd2, 0xb6, 0x58, 0x48, 0xb2, 0x9c, 0xc9, 0x11,
+    0x4b, 0x23, 0x39, 0x67, 0x22, 0x5a, 0x83, 0x9e, 0xd5, 0x21, 0xc0, 0x3f, 0x22, 0x5e, 0xbe, 0xad, 0xeb, 0x5b, 0xd3,
+    0x47, 0x7a, 0x0d, 0xaa, 0xb0, 0x97, 0x7c, 0x87, 0x32, 0xf6, 0x3d, 0x2b, 0x94, 0xe1, 0x49, 0x4b, 0xf6, 0xf6, 0x25,
+    0xaf, 0x0e, 0xa8, 0x97, 0x3c, 0xfd, 0x76, 0x95, 0x4a, 0x20, 0x89, 0xda, 0xc9, 0x59, 0x72, 0x1c, 0x21, 0xa3, 0x31,
+    0x7e, 0xe6, 0x35, 0xc6, 0x8b, 0x52, 0x63, 0xfc, 0x5c, 0x93, 0xc5, 0x86, 0xc6, 0xf8, 0x0f, 0x41, 0x9e, 0xeb, 0xde,
+    0x73, 0xaf, 0x4d, 0x7f, 0x23, 0x73, 0x9e, 0xdd, 0xc5, 0x51, 0xce, 0x75, 0x13, 0x6e, 0x13, 0x23, 0xbc, 0xb4, 0x19,
+    0xa0, 0x6a, 0x34, 0xfa, 0xee, 0xb5, 0x97, 0xff, 0xb0, 0x10, 0x24, 0xba, 0x97, 0x73, 0x7d, 0x2f, 0xc2, 0x53, 0x4d,
+    0xfe, 0x82, 0x5f, 0xf7, 0x96, 0xf1, 0xaf, 0x54, 0x4f, 0x93, 0x82, 0x8a, 0x91, 0x9c, 0xc5, 0xa8, 0x11, 0x45, 0x28,
+    0x51, 0x46, 0x08, 0x79, 0x80, 0xd6, 0xf7, 0xfe, 0xc2, 0xaf, 0x24, 0x89, 0x7a, 0x51, 0x63, 0xaa, 0xb1, 0xa6, 0xe4,
+    0xaf, 0x8b, 0x7b, 0xcb, 0x57, 0x72, 0x7d, 0xf9, 0x17, 0x7e, 0xaa, 0x4b, 0xb5, 0x3e, 0xbe, 0x65, 0x24, 0x46, 0xe4,
+    0xf2, 0xa9, 0x1f, 0xd2, 0x63, 0x39, 0xb3, 0x0a, 0xfe, 0x08, 0xe1, 0x2f, 0xa0, 0xd7, 0xbd, 0xe4, 0x15, 0x11, 0x72,
+    0x77, 0x30, 0xfb, 0x24, 0x92, 0x46, 0x79, 0x10, 0x1d, 0x1c, 0x04, 0x69, 0x25, 0x0b, 0x81, 0xff, 0x96, 0xa4, 0x26,
+    0xaa, 0x63, 0x46, 0xa1, 0xa5, 0xbf, 0x65, 0xcc, 0x91, 0x6f, 0x26, 0xf6, 0x9a, 0x6a, 0xb7, 0x63, 0x79, 0xdf, 0xea,
+    0x1e, 0x12, 0xae, 0x59, 0x41, 0xb5, 0x2c, 0x06, 0x28, 0x64, 0x4b, 0xf0, 0x57, 0x4e, 0xfe, 0xea, 0xef, 0xfd, 0x3f,
+    0xff, 0xe3, 0xcf, 0xf1, 0x9f, 0xc5, 0xe0, 0x2f, 0x2c, 0x18, 0x39, 0xba, 0x88, 0x7b, 0x69, 0xbc, 0xdf, 0x6c, 0xae,
+    0xfe, 0x3c, 0xea, 0xff, 0x37, 0x6d, 0x7e, 0x7d, 0xd8, 0xfc, 0x34, 0x40, 0xab, 0xf8, 0xcf, 0xa3, 0x5e, 0xdf, 0x7d,
+    0xf5, 0xff, 0xfb, 0xf2, 0x4f, 0x35, 0x38, 0xb4, 0x89, 0xf7, 0x10, 0x3a, 0x9a, 0xe0, 0x5f, 0x04, 0x39, 0x6a, 0x36,
+    0x2f, 0x8f, 0x26, 0xf8, 0x27, 0x41, 0x8e, 0xe0, 0xef, 0x9d, 0x26, 0x6f, 0xd9, 0xe4, 0xe9, 0xed, 0x3c, 0xfe, 0xeb,
+    0x72, 0x75, 0x6f, 0xf9, 0x95, 0xaf, 0xa1, 0xdd, 0xfe, 0x7f, 0xff, 0xf9, 0xa7, 0x8a, 0x7e, 0xbc, 0x24, 0x47, 0x83,
+    0x06, 0x8a, 0x4d, 0xf2, 0x21, 0xb1, 0x7f, 0xe2, 0x5e, 0xda, 0xff, 0x6f, 0x37, 0x94, 0xe8, 0xc7, 0x3f, 0xff, 0xba,
+    0xb8, 0x24, 0x83, 0x55, 0x1c, 0xad, 0x7e, 0x44, 0x2b, 0x84, 0x56, 0xf7, 0xd0, 0x5f, 0x38, 0x9a, 0x44, 0x08, 0xff,
+    0x26, 0xc8, 0xd1, 0x8f, 0x47, 0x13, 0xfc, 0x49, 0x90, 0xa3, 0xe8, 0x68, 0x82, 0xdf, 0x4b, 0x72, 0xf4, 0xdf, 0x71,
+    0x2f, 0xb5, 0x4a, 0xb8, 0x95, 0x51, 0x7f, 0xac, 0xe0, 0x26, 0x84, 0x16, 0x8c, 0xae, 0x34, 0xd7, 0x39, 0x43, 0xf7,
+    0x8e, 0x38, 0x7e, 0x24, 0x01, 0x58, 0xb1, 0x06, 0x25, 0x8d, 0xb9, 0x84, 0x5d, 0x5e, 0xc3, 0xc2, 0x03, 0x06, 0xdd,
+    0x4b, 0x39, 0xb6, 0x7a, 0x02, 0x95, 0x6a, 0x7b, 0x7b, 0xab, 0xe0, 0xfa, 0x16, 0x3f, 0x26, 0x8f, 0x64, 0xdc, 0x46,
+    0x98, 0x53, 0xf8, 0xd1, 0x41, 0xf8, 0x83, 0x76, 0x17, 0x9e, 0xb0, 0xcd, 0x2d, 0x86, 0x09, 0x69, 0xf9, 0x99, 0x08,
+    0xe1, 0x97, 0x3b, 0x32, 0xf5, 0x14, 0xd4, 0x0f, 0x08, 0xff, 0x5c, 0xbb, 0x1e, 0xc5, 0x8f, 0x35, 0x29, 0x91, 0xe3,
+    0x5d, 0xc1, 0xd8, 0x07, 0x9a, 0x7f, 0x66, 0x45, 0xfc, 0x54, 0xe3, 0x76, 0xe7, 0x01, 0x36, 0xaa, 0xea, 0xfd, 0x36,
+    0xea, 0x96, 0xb7, 0x5b, 0xcf, 0xa5, 0xbd, 0x4f, 0x80, 0x53, 0xb8, 0xae, 0xaf, 0x81, 0xb5, 0xdf, 0xe7, 0x5b, 0x4a,
+    0xad, 0x82, 0xde, 0x44, 0xa8, 0x7e, 0x95, 0xca, 0xc5, 0x17, 0x9a, 0xf3, 0xd1, 0x9e, 0x66, 0xb3, 0x79, 0x4e, 0x35,
+    0xdb, 0x73, 0x73, 0xde, 0xa3, 0xd0, 0x50, 0x54, 0xf2, 0x14, 0x7f, 0x88, 0x6a, 0xd3, 0xfe, 0x21, 0x92, 0x6a, 0xef,
+    0xc4, 0x70, 0x9f, 0xe5, 0xf8, 0x12, 0x41, 0xcb, 0xeb, 0xb2, 0xcd, 0x1b, 0xc1, 0x66, 0x1b, 0x94, 0x65, 0x03, 0x73,
+    0x7e, 0x2b, 0x0c, 0xf7, 0x9b, 0x84, 0x74, 0x7a, 0xd1, 0x85, 0xfa, 0x32, 0xb9, 0x8c, 0xe0, 0x26, 0xa7, 0x20, 0x82,
+    0x19, 0xe5, 0x11, 0x94, 0xa0, 0xa4, 0xd5, 0xa5, 0x17, 0xac, 0x4b, 0x1b, 0x0d, 0xcf, 0x66, 0x67, 0x84, 0xf7, 0xa9,
+    0xad, 0x9f, 0xe3, 0x29, 0x1e, 0x91, 0x66, 0x1b, 0x2f, 0x48, 0xcb, 0x54, 0xe9, 0x2e, 0x2e, 0x32, 0xd7, 0xcf, 0xc1,
+    0x41, 0x5c, 0x24, 0x39, 0x55, 0xfa, 0x05, 0x68, 0x04, 0xc8, 0x02, 0x4f, 0x49, 0x91, 0xb0, 0x5b, 0x96, 0xc5, 0x19,
+    0xc2, 0x53, 0x47, 0x83, 0x50, 0x17, 0x2d, 0x48, 0x50, 0x0c, 0xe4, 0x0c, 0x22, 0x58, 0x6f, 0xda, 0x6f, 0x0f, 0x08,
+    0x21, 0xd1, 0x7e, 0xb3, 0x19, 0xf5, 0x0a, 0xf2, 0x8b, 0x48, 0x21, 0x25, 0x60, 0xa7, 0xc9, 0x4f, 0x90, 0xd4, 0x09,
+    0x92, 0xe2, 0xf7, 0x32, 0xd1, 0x4c, 0xe9, 0x18, 0x92, 0x41, 0x49, 0xa0, 0x3c, 0x86, 0x47, 0x17, 0x47, 0x51, 0x03,
+    0x52, 0x0d, 0x8a, 0x22, 0x5c, 0x90, 0x3b, 0x8d, 0xd2, 0x69, 0xff, 0x78, 0x10, 0x9e, 0x11, 0x36, 0x15, 0xfa, 0xbf,
+    0xd3, 0xbd, 0x69, 0xbf, 0x65, 0xfa, 0xbf, 0x8c, 0x7a, 0x71, 0x41, 0x94, 0x65, 0xe3, 0x7a, 0x2a, 0x15, 0xcc, 0xcc,
+    0x17, 0xa5, 0x6e, 0x80, 0xae, 0xef, 0x11, 0x69, 0x76, 0xd2, 0x78, 0x14, 0xce, 0xa4, 0x09, 0x1d, 0x3a, 0x50, 0xe0,
+    0x9c, 0x40, 0x79, 0x5c, 0x10, 0xe8, 0xb4, 0xaa, 0x76, 0xa7, 0x53, 0x97, 0xf0, 0x63, 0xf4, 0x63, 0xef, 0x93, 0x48,
+    0x7f, 0x13, 0x76, 0x04, 0x9f, 0xc4, 0x6a, 0x05, 0x7f, 0x7f, 0x13, 0x3d, 0x18, 0x96, 0x49, 0xfb, 0xc5, 0xa5, 0xfd,
+    0x04, 0x69, 0x82, 0xa5, 0x66, 0xc0, 0x58, 0x95, 0xfc, 0x98, 0x5d, 0x9c, 0x31, 0xb1, 0x33, 0x38, 0x38, 0xe0, 0x7d,
+    0xda, 0x68, 0x0f, 0xe0, 0x46, 0xa0, 0xd0, 0xea, 0x03, 0xd7, 0xd3, 0x38, 0x3a, 0xba, 0x8c, 0x50, 0x2f, 0xda, 0x83,
+    0x55, 0xee, 0xca, 0x06, 0x71, 0xb0, 0xce, 0x1a, 0x9a, 0xa6, 0xa3, 0x4b, 0xd2, 0xea, 0xc5, 0xc2, 0x12, 0xf9, 0x1c,
+    0xe1, 0xcc, 0xd1, 0xd4, 0x16, 0x1e, 0xa1, 0x86, 0x10, 0x0d, 0xff, 0x3d, 0x42, 0x8d, 0xa9, 0x6e, 0x8c, 0x51, 0x9a,
+    0xc1, 0xdf, 0x78, 0x44, 0x08, 0x69, 0x76, 0xca, 0x8a, 0xfe, 0xb0, 0xa4, 0x28, 0x1d, 0x7b, 0xf5, 0x68, 0xdf, 0x6c,
+    0x0e, 0xd9, 0x88, 0x79, 0x9f, 0x0d, 0x56, 0xab, 0xe8, 0xa2, 0x77, 0x19, 0xa1, 0x46, 0xec, 0xd1, 0xee, 0xc8, 0xe3,
+    0x1d, 0x42, 0x58, 0x0c, 0xd6, 0xee, 0x06, 0xea, 0x86, 0xd5, 0x6e, 0x9b, 0x96, 0xd5, 0xfe, 0x0f, 0xc8, 0x02, 0x5b,
+    0x97, 0x72, 0x8f, 0xe5, 0x6f, 0xe7, 0x30, 0x55, 0x8f, 0xdb, 0x92, 0xb4, 0x70, 0x41, 0xbc, 0xba, 0x9b, 0x12, 0x5d,
+    0xe1, 0x7f, 0x46, 0xaa, 0xe2, 0xb8, 0x9f, 0xe3, 0xe9, 0x80, 0x08, 0x6a, 0xe4, 0x97, 0xae, 0x57, 0xa6, 0xb3, 0x9c,
+    0xdc, 0xb0, 0x8d, 0xfb, 0xdf, 0x1c, 0xee, 0x64, 0x1e, 0xeb, 0x24, 0x5b, 0x14, 0x05, 0x13, 0xfa, 0x95, 0x1c, 0x39,
+    0xc6, 0x8e, 0xe5, 0x20, 0x5b, 0xc1, 0xc5, 0x2e, 0x06, 0xae, 0xae, 0xe3, 0x77, 0xca, 0x68, 0x2b, 0x7b, 0x41, 0x46,
+    0x96, 0xe1, 0x32, 0xd7, 0xbd, 0xdd, 0x85, 0x13, 0xa5, 0x63, 0x84, 0x47, 0xee, 0x1e, 0x38, 0x4e, 0x92, 0x64, 0x91,
+    0x64, 0x90, 0x0d, 0x1d, 0x28, 0xb4, 0x36, 0xfb, 0x2a, 0x56, 0xe4, 0xb1, 0x4e, 0x04, 0xbb, 0x35, 0xdd, 0xc6, 0xa8,
+    0x3a, 0xc4, 0xfd, 0x7e, 0xbb, 0xa0, 0x5d, 0x43, 0x80, 0x54, 0x22, 0xe4, 0x88, 0x01, 0x84, 0xe0, 0xee, 0xdf, 0x25,
+    0x4d, 0xa9, 0x0a, 0x6f, 0xb6, 0xaa, 0x01, 0xf6, 0x43, 0x95, 0xf7, 0x02, 0xf4, 0xc4, 0x86, 0x3d, 0x2b, 0x0b, 0x5b,
+    0xe5, 0x39, 0x42, 0x7c, 0x1c, 0x2f, 0x12, 0xb8, 0x11, 0x34, 0x98, 0x24, 0x04, 0x5a, 0xad, 0x16, 0x21, 0x6e, 0x4d,
+    0x2b, 0xc5, 0xf4, 0x98, 0x4c, 0xfb, 0x45, 0xa3, 0x61, 0x94, 0xd7, 0x23, 0x8b, 0x17, 0x0b, 0x84, 0xc7, 0xe5, 0x5e,
+    0xf3, 0xe5, 0xe6, 0xa4, 0xde, 0x55, 0x3c, 0xae, 0x2b, 0x81, 0x1b, 0x42, 0x20, 0xa3, 0x5f, 0xd4, 0xd0, 0x3a, 0x9e,
+    0x90, 0xa3, 0xb8, 0x9f, 0xf4, 0xfe, 0xe7, 0x00, 0xf5, 0xe2, 0xe4, 0x10, 0x1d, 0x59, 0x5a, 0x32, 0x46, 0xdd, 0xcc,
+    0xf6, 0xb1, 0x34, 0xb7, 0x9f, 0x6d, 0x6c, 0x14, 0x90, 0xa9, 0xc4, 0x82, 0xce, 0x58, 0x3a, 0x81, 0x5d, 0xef, 0x91,
+    0x67, 0x8e, 0x01, 0x99, 0xd2, 0x89, 0xa3, 0x2d, 0x49, 0xd4, 0x93, 0xb4, 0xfc, 0xea, 0x45, 0x3d, 0x5a, 0x7d, 0xfd,
+    0xcf, 0xa8, 0x97, 0xd1, 0xf4, 0x31, 0x5f, 0x3b, 0x25, 0x79, 0xad, 0x8f, 0x33, 0xdf, 0xc7, 0xda, 0x2e, 0x4e, 0x00,
+    0xbc, 0x11, 0xda, 0xd6, 0x8e, 0x2c, 0xd0, 0x9a, 0x8f, 0x4b, 0xea, 0xa4, 0x12, 0x4d, 0x27, 0x00, 0xd5, 0x60, 0x11,
+    0x54, 0x68, 0x1b, 0x10, 0x4c, 0x19, 0xb0, 0xc5, 0x23, 0x2d, 0x40, 0x73, 0x71, 0xd9, 0x42, 0xcb, 0x5a, 0x61, 0xc7,
+    0x59, 0xd5, 0xef, 0xe2, 0x4b, 0xe2, 0x3d, 0x06, 0xaa, 0x7c, 0xb1, 0xe8, 0x8e, 0x1b, 0x0d, 0xa4, 0x3c, 0x7e, 0x8d,
+    0xfa, 0xe3, 0x01, 0xbe, 0x05, 0x14, 0xc2, 0x35, 0x8c, 0xc2, 0xb5, 0x39, 0x76, 0xdc, 0x1c, 0x1b, 0x0d, 0xb9, 0x46,
+    0xdd, 0xa0, 0xf2, 0xc2, 0x55, 0x5e, 0xaf, 0x2d, 0x64, 0x36, 0x31, 0xee, 0x1c, 0x99, 0x14, 0x30, 0x04, 0x23, 0x84,
+    0xbc, 0x92, 0x68, 0x67, 0xb3, 0xd0, 0x28, 0x54, 0x37, 0xbb, 0x17, 0x28, 0xaa, 0x3d, 0x3d, 0x62, 0x80, 0x05, 0x54,
+    0x2d, 0xd5, 0xc8, 0x53, 0x8d, 0x47, 0x8d, 0xb6, 0x41, 0xf7, 0x66, 0xbb, 0x5b, 0x6f, 0xec, 0x7e, 0xd5, 0x18, 0x1e,
+    0x35, 0xc8, 0xb4, 0xda, 0xe1, 0x6b, 0xd9, 0x68, 0xac, 0xeb, 0xf7, 0xa5, 0x7e, 0x13, 0xd7, 0xee, 0x2f, 0x9e, 0x6e,
+    0x99, 0x78, 0xf8, 0xd3, 0xb7, 0x3a, 0x6f, 0x45, 0xc2, 0x85, 0x60, 0x05, 0x9c, 0xb0, 0x44, 0x63, 0xb1, 0x5e, 0x97,
+    0xa7, 0xfe, 0xef, 0xda, 0xda, 0x8c, 0x11, 0x0e, 0x74, 0xc8, 0x48, 0x6d, 0x58, 0xe2, 0x02, 0x53, 0x43, 0x45, 0x08,
+    0x21, 0x1f, 0xb4, 0x37, 0x8f, 0xd1, 0x86, 0x24, 0x65, 0x24, 0x38, 0xbb, 0x63, 0x45, 0x58, 0x72, 0x7d, 0xef, 0xb1,
+    0xfc, 0xae, 0x48, 0xd7, 0x17, 0x83, 0xd4, 0x14, 0xcb, 0x1d, 0x21, 0xcb, 0xc9, 0x17, 0x90, 0x73, 0xca, 0x0b, 0x96,
+    0xc4, 0x10, 0xc4, 0x27, 0xbc, 0x60, 0x86, 0x71, 0xbf, 0xe7, 0xe5, 0xc6, 0xac, 0xce, 0x69, 0x66, 0xa1, 0xf6, 0x07,
+    0xa0, 0x99, 0x83, 0x72, 0x48, 0x92, 0xad, 0x62, 0xd7, 0xf7, 0x1e, 0xbe, 0xde, 0x25, 0x43, 0xaf, 0x56, 0x4e, 0x7a,
+    0xce, 0x80, 0xf5, 0xc1, 0x79, 0x35, 0xd4, 0xcc, 0xfd, 0x48, 0xe3, 0xcc, 0x30, 0x51, 0x79, 0xcc, 0x01, 0x99, 0xae,
+    0xef, 0x3d, 0x7c, 0x17, 0x73, 0xa3, 0x9b, 0x42, 0x38, 0x9c, 0x77, 0x5c, 0x90, 0x98, 0x12, 0x86, 0xec, 0xe4, 0x4b,
+    0x3a, 0x56, 0x04, 0xa7, 0x7b, 0x4a, 0x4d, 0x26, 0x88, 0x1d, 0x7d, 0x31, 0x20, 0x99, 0x03, 0x01, 0xc9, 0x10, 0xce,
+    0x6a, 0x72, 0x1d, 0x31, 0x6b, 0x60, 0x3a, 0xbb, 0x82, 0xc5, 0x48, 0x2c, 0x7b, 0x88, 0x70, 0x66, 0xba, 0xd5, 0x6b,
+    0x7b, 0x9c, 0x28, 0xba, 0x69, 0xe8, 0x56, 0xc9, 0xb3, 0xef, 0x41, 0xf0, 0xf2, 0x1f, 0xaf, 0x5c, 0xdb, 0x65, 0xc2,
+    0x13, 0x6f, 0x91, 0x76, 0x7d, 0xef, 0xe1, 0xaf, 0xce, 0x28, 0x6d, 0x4e, 0x3d, 0xf9, 0xdf, 0x92, 0x51, 0x1f, 0xfe,
+    0x9a, 0x54, 0xb9, 0xa6, 0xf0, 0xf5, 0xbd, 0x87, 0xbf, 0xef, 0x2a, 0x06, 0xe9, 0xeb, 0x45, 0xa5, 0x24, 0x30, 0xe3,
+    0x5b, 0xb2, 0x3c, 0x5d, 0xba, 0xb3, 0x22, 0x15, 0x6b, 0x6c, 0x4e, 0xa8, 0x54, 0xad, 0x4b, 0xdd, 0xca, 0x13, 0x2c,
+    0x89, 0xb9, 0x4a, 0xaa, 0x2f, 0x9b, 0x43, 0x63, 0x2e, 0xc5, 0x55, 0x26, 0xe7, 0xec, 0x1b, 0xf7, 0x4b, 0x4f, 0x35,
+    0x4a, 0xf8, 0x0c, 0x0c, 0x71, 0xcc, 0xd8, 0x05, 0xde, 0x6f, 0xa1, 0xee, 0xc6, 0x79, 0x26, 0x0d, 0xa2, 0x16, 0xf5,
+    0xc3, 0x06, 0x53, 0xd2, 0xc2, 0x19, 0x69, 0xe1, 0x9c, 0xa8, 0x7e, 0xcb, 0x9e, 0x18, 0xdd, 0xbc, 0x6c, 0xda, 0x9e,
+    0x3b, 0xb0, 0xdd, 0x73, 0xbb, 0x6f, 0xed, 0xa1, 0x3c, 0xed, 0xe6, 0x46, 0x7f, 0x69, 0x0e, 0xfa, 0xa9, 0x41, 0x8d,
+    0x27, 0x2c, 0x2e, 0x70, 0x61, 0x5a, 0xbe, 0xe2, 0xc3, 0x1c, 0xec, 0x54, 0x60, 0x66, 0x58, 0xa3, 0xb4, 0x2c, 0xdb,
+    0x76, 0x65, 0xf3, 0xc4, 0xac, 0x55, 0x81, 0xf3, 0x04, 0x48, 0x39, 0xce, 0x9d, 0x5d, 0x8f, 0xda, 0xae, 0x72, 0x76,
+    0x70, 0x10, 0xbb, 0x4a, 0x34, 0x2e, 0x7c, 0x7e, 0x75, 0x03, 0xf8, 0xde, 0x52, 0x8d, 0x29, 0x32, 0x13, 0x68, 0x34,
+    0xb2, 0xc1, 0x9a, 0xee, 0x13, 0x12, 0xe7, 0x75, 0x28, 0xfa, 0xd1, 0x1b, 0x66, 0x70, 0x03, 0x00, 0x8d, 0x46, 0x79,
+    0xdd, 0xbb, 0x01, 0xb1, 0xa7, 0x1a, 0xcb, 0xf5, 0x97, 0xb8, 0xb4, 0x26, 0x6a, 0x6d, 0xd9, 0x61, 0xf9, 0x51, 0x20,
+    0x11, 0xe2, 0xae, 0xf0, 0xf3, 0x09, 0xb6, 0x86, 0x80, 0x72, 0x2f, 0x9c, 0x0d, 0x04, 0x36, 0x56, 0x5b, 0xae, 0x90,
+    0x27, 0x6d, 0x1d, 0x94, 0xfa, 0x42, 0x70, 0xc1, 0x05, 0x85, 0x1a, 0x6b, 0x87, 0xe5, 0x4f, 0xd8, 0xb6, 0x39, 0x27,
+    0x56, 0xc8, 0x69, 0xcb, 0xcc, 0x30, 0x0c, 0xc0, 0x3a, 0x25, 0x60, 0x9e, 0x93, 0x97, 0xdf, 0x46, 0xfd, 0x87, 0x01,
+    0xea, 0x3f, 0x22, 0x2c, 0xd8, 0x06, 0x56, 0x57, 0x92, 0x48, 0xa7, 0xa0, 0x50, 0x3e, 0xeb, 0xf1, 0x9c, 0x80, 0x36,
+    0xae, 0x0e, 0xd5, 0xda, 0x15, 0xe5, 0x37, 0x28, 0x4b, 0xb8, 0x53, 0x8c, 0x3e, 0x13, 0xfb, 0xfb, 0xe4, 0xb8, 0xba,
+    0xa0, 0x83, 0xae, 0x77, 0x29, 0x07, 0x43, 0x52, 0xf8, 0xf0, 0xf7, 0xef, 0xdf, 0xad, 0x3e, 0x9e, 0x6f, 0xef, 0xe0,
+    0xc0, 0xac, 0x14, 0x66, 0x1d, 0x6c, 0xe0, 0xba, 0x91, 0x29, 0xf4, 0x5f, 0xde, 0x89, 0xd7, 0xa9, 0xd0, 0xc6, 0x66,
+    0xf4, 0xc7, 0x21, 0x8c, 0xb6, 0xdd, 0x36, 0x25, 0x58, 0xd0, 0x2c, 0xd0, 0x25, 0x6b, 0xdc, 0x4a, 0x8b, 0x6f, 0x90,
+    0x91, 0x87, 0xa6, 0x00, 0x13, 0xa3, 0xdd, 0xd9, 0x8f, 0xd6, 0x0e, 0x4f, 0xec, 0xd0, 0xd0, 0xd2, 0x10, 0x42, 0x8b,
+    0xf7, 0x80, 0x39, 0xf6, 0x88, 0x00, 0x10, 0xbd, 0x34, 0x90, 0xaa, 0x40, 0x16, 0x45, 0x95, 0x22, 0xff, 0xf9, 0x3e,
+    0x21, 0x2f, 0x2b, 0x45, 0xe6, 0xdb, 0xca, 0x98, 0x0b, 0x10, 0x03, 0xa5, 0x70, 0x91, 0x50, 0x26, 0xd8, 0xcb, 0xd0,
+    0x0f, 0xda, 0x97, 0x37, 0xd2, 0x66, 0x52, 0x71, 0xe3, 0xc1, 0x4d, 0xa9, 0x51, 0xf1, 0xd9, 0x7c, 0x0f, 0x89, 0x8d,
+    0xdc, 0x7b, 0x90, 0xcb, 0xa8, 0x19, 0x24, 0x7c, 0xbf, 0x33, 0xa5, 0x7d, 0xbb, 0xeb, 0xcf, 0x9b, 0x16, 0x31, 0x1b,
+    0xeb, 0x92, 0x70, 0xa1, 0x58, 0xa1, 0x1f, 0xb1, 0xb1, 0x2c, 0xe0, 0xfe, 0xa3, 0x04, 0x0b, 0x5a, 0xdf, 0x0b, 0x74,
+    0x80, 0x66, 0x82, 0xc1, 0xa5, 0xc3, 0xc6, 0x0c, 0xcd, 0xaf, 0xcf, 0xe6, 0x0e, 0xfc, 0x7a, 0xb3, 0xd6, 0xcb, 0x83,
+    0x83, 0x2f, 0xac, 0x02, 0x94, 0x1b, 0xa6, 0x19, 0x46, 0x40, 0xbc, 0x2c, 0x97, 0xe3, 0x6e, 0x86, 0xef, 0xc5, 0x95,
+    0xca, 0xc0, 0x13, 0x8e, 0x90, 0x08, 0x3d, 0x27, 0x7a, 0x3d, 0xd9, 0xa4, 0xf7, 0x4e, 0x9b, 0x21, 0x42, 0xb1, 0x06,
+    0xc8, 0x3d, 0xc8, 0xe5, 0x56, 0xc9, 0xa4, 0x2a, 0x5b, 0xdb, 0x72, 0x10, 0x8f, 0x01, 0x5c, 0xb1, 0x11, 0x52, 0x02,
+    0x34, 0xdc, 0x2d, 0xb4, 0x3c, 0x97, 0xc0, 0xfe, 0x63, 0x95, 0x80, 0x48, 0x8b, 0x6a, 0x1b, 0x17, 0x21, 0x6c, 0x4d,
+    0x7d, 0x02, 0xe3, 0x84, 0x87, 0xcf, 0x77, 0x69, 0xa8, 0x3d, 0x6a, 0x33, 0x73, 0x06, 0x41, 0x09, 0x89, 0xca, 0x0a,
+    0xc9, 0x97, 0x58, 0x38, 0x6e, 0xce, 0xdf, 0xc3, 0x01, 0x29, 0x56, 0x34, 0xb6, 0x77, 0x5b, 0x70, 0x7c, 0x14, 0xc9,
+    0x22, 0xae, 0x75, 0xdd, 0x2d, 0x4c, 0x35, 0xec, 0x40, 0x47, 0x43, 0x38, 0x15, 0xe6, 0x9e, 0xf0, 0x71, 0x45, 0x52,
+    0x7f, 0xb6, 0x26, 0xda, 0xda, 0x13, 0xc3, 0xca, 0x34, 0x25, 0x98, 0xff, 0xcf, 0xd6, 0xea, 0xba, 0x2c, 0x84, 0x99,
+    0x19, 0xc6, 0x8d, 0x5d, 0x05, 0xb6, 0x06, 0x1c, 0x5b, 0xfe, 0x2d, 0x83, 0x45, 0xf5, 0x4a, 0x71, 0xd3, 0x69, 0xc0,
+    0x04, 0xbc, 0x05, 0xeb, 0x99, 0xcd, 0xad, 0xff, 0xdc, 0x1c, 0x8c, 0x02, 0xab, 0x1a, 0x81, 0x97, 0x86, 0xc0, 0x23,
+    0x60, 0xdc, 0xbc, 0x69, 0x79, 0xcf, 0x19, 0xd1, 0x08, 0x7f, 0xe2, 0x39, 0x3c, 0xb3, 0x2c, 0xf7, 0xd6, 0xc7, 0xc6,
+    0x8a, 0xa4, 0x82, 0x80, 0x6d, 0x11, 0x76, 0x44, 0x5e, 0x22, 0xac, 0x1a, 0x8d, 0xae, 0xba, 0x60, 0x95, 0x56, 0xa5,
+    0x1a, 0xa6, 0x80, 0x5b, 0x62, 0xc0, 0xfb, 0xda, 0x89, 0x0a, 0x86, 0x04, 0xde, 0xfa, 0x5b, 0x81, 0xfa, 0xfe, 0xe1,
+    0xdb, 0x38, 0xa4, 0x6f, 0x61, 0xd9, 0xf2, 0x22, 0x16, 0xa6, 0x14, 0x57, 0x77, 0x38, 0x6f, 0xbe, 0x6f, 0x36, 0x02,
+    0xe3, 0xde, 0x6f, 0x63, 0xb0, 0x71, 0x43, 0x5d, 0x6d, 0x49, 0x43, 0xb9, 0x09, 0xbb, 0xa8, 0xb2, 0x77, 0x0c, 0x3b,
+    0xeb, 0xea, 0x4a, 0xda, 0xd5, 0x44, 0xad, 0xd7, 0x8a, 0x55, 0x46, 0x03, 0x1b, 0x86, 0x9d, 0xe6, 0x98, 0xd9, 0x56,
+    0xe0, 0x3f, 0x9e, 0x13, 0x8d, 0x03, 0x64, 0x7d, 0xf3, 0xad, 0xeb, 0x94, 0x6a, 0x98, 0xb0, 0xbd, 0xdd, 0xf9, 0xf8,
+    0x98, 0xef, 0x3a, 0x1f, 0xb1, 0x74, 0x5b, 0xdf, 0x9c, 0x8d, 0xed, 0x7f, 0xe3, 0x6c, 0x74, 0x6a, 0x7b, 0x7f, 0x3c,
+    0x02, 0x77, 0x52, 0x3b, 0x1e, 0xeb, 0x6b, 0x4a, 0x24, 0x16, 0x6e, 0x39, 0x2e, 0x3b, 0xab, 0x95, 0xe8, 0xb7, 0x40,
+    0xed, 0x14, 0x45, 0xf0, 0xb3, 0x6d, 0x7f, 0x06, 0x24, 0xd9, 0xea, 0x90, 0x63, 0x51, 0x8a, 0x32, 0x28, 0x01, 0x03,
+    0xea, 0xd8, 0xd8, 0x7a, 0x19, 0xc4, 0x76, 0x38, 0xe4, 0xb0, 0x9c, 0x88, 0xf2, 0xea, 0x0a, 0x46, 0x6c, 0x8e, 0x0d,
+    0x27, 0x60, 0xc6, 0x3b, 0xad, 0x0a, 0xbd, 0xf8, 0xf9, 0xaf, 0x99, 0xd3, 0xda, 0x11, 0x63, 0x39, 0x89, 0x9a, 0x15,
+    0x83, 0x1b, 0x81, 0x63, 0x18, 0xf7, 0x8d, 0x84, 0x5a, 0x9d, 0xea, 0xa8, 0x76, 0x24, 0xe1, 0x16, 0xa8, 0xdd, 0xf6,
+    0xcd, 0xb9, 0xb4, 0x5a, 0xed, 0x3c, 0x58, 0x70, 0x11, 0xe0, 0xf6, 0x73, 0xa2, 0x6b, 0x24, 0x85, 0x12, 0x27, 0x41,
+    0xe1, 0xdc, 0xa0, 0xaa, 0x26, 0xb2, 0xdf, 0x1a, 0x00, 0x4f, 0xda, 0xcd, 0x2e, 0x64, 0x25, 0x24, 0x67, 0x8d, 0x06,
+    0xca, 0xcb, 0x8e, 0x69, 0x5f, 0x34, 0xb2, 0x01, 0x66, 0x38, 0xb3, 0x02, 0x0b, 0x9c, 0x5e, 0x71, 0x5e, 0x75, 0xdd,
+    0xcf, 0x06, 0x08, 0x17, 0xab, 0x55, 0x6c, 0x87, 0x96, 0xa3, 0xd5, 0x2a, 0x0f, 0x87, 0x66, 0xf2, 0xa1, 0xe2, 0xcb,
+    0x9e, 0x26, 0x2f, 0xcd, 0x79, 0xf8, 0x12, 0x06, 0xd9, 0x20, 0x71, 0xee, 0x54, 0x82, 0x39, 0x68, 0xae, 0x1a, 0xb2,
+    0x9f, 0x35, 0xda, 0x83, 0x80, 0x86, 0xf5, 0xb3, 0x01, 0xc9, 0xd7, 0x60, 0x39, 0xab, 0xdc, 0x81, 0xf9, 0x37, 0x1c,
+    0x6c, 0x7f, 0x9b, 0x73, 0xc6, 0x36, 0x18, 0xae, 0xc9, 0xa6, 0xca, 0xa0, 0xc4, 0x2b, 0xb7, 0xb8, 0xbe, 0x5c, 0xcd,
+    0xc0, 0xa2, 0x2c, 0x84, 0xdd, 0x35, 0x73, 0x0f, 0x84, 0xff, 0x12, 0xdb, 0x25, 0x2d, 0x8d, 0xb8, 0x37, 0x10, 0xdf,
+    0xdb, 0x6e, 0x27, 0x49, 0x42, 0x8b, 0x89, 0xb9, 0x12, 0xf1, 0x37, 0xbc, 0x66, 0x0f, 0x1c, 0xbb, 0x71, 0x06, 0x3d,
+    0xf7, 0xcb, 0xce, 0x06, 0xc4, 0x8e, 0xdf, 0x33, 0x3b, 0xde, 0x71, 0xa5, 0xa0, 0xbb, 0x75, 0x11, 0x76, 0x30, 0xf4,
+    0x7f, 0x79, 0x30, 0x27, 0x6e, 0x30, 0x16, 0x4d, 0x36, 0xe0, 0xf6, 0x0d, 0x78, 0x14, 0x74, 0x03, 0x6e, 0xdf, 0x86,
+    0xaf, 0x87, 0x56, 0xf6, 0xcd, 0x01, 0x06, 0x64, 0xc2, 0x8e, 0xb4, 0x4a, 0x08, 0x86, 0x79, 0xba, 0xc9, 0x91, 0x59,
+    0xb2, 0x0a, 0x87, 0xab, 0x26, 0xb1, 0xd8, 0xd8, 0x0b, 0x15, 0x93, 0x1a, 0x08, 0xc6, 0x22, 0x7d, 0x89, 0x42, 0xa5,
+    0x41, 0xdd, 0x38, 0x06, 0xb0, 0xca, 0x69, 0xeb, 0x5f, 0x1e, 0x1c, 0x80, 0xd0, 0x00, 0xac, 0x5d, 0x92, 0xd1, 0xb9,
+    0x5e, 0x14, 0xc0, 0x5f, 0x29, 0xff, 0x1b, 0x92, 0xc1, 0xed, 0xc4, 0xa4, 0xc1, 0x0f, 0x48, 0x98, 0x53, 0xa5, 0xf8,
+    0x17, 0x9b, 0xe6, 0x7e, 0xe3, 0x82, 0x78, 0x8c, 0x56, 0x96, 0x53, 0x94, 0xa8, 0x2b, 0x1d, 0xba, 0xd6, 0x21, 0xf7,
+    0xf4, 0x0b, 0x13, 0xfa, 0x25, 0x57, 0x9a, 0x09, 0x00, 0x40, 0x85, 0x78, 0x30, 0x25, 0x85, 0x60, 0xeb, 0xd6, 0x6a,
+    0xd1, 0xd1, 0xe8, 0xbb, 0x55, 0x74, 0x9d, 0x2d, 0x9a, 0x52, 0x31, 0xca, 0x6d, 0x27, 0xa1, 0xcd, 0xa4, 0xb7, 0x13,
+    0x2d, 0x4b, 0x86, 0x16, 0x3b, 0x15, 0xfb, 0x61, 0x68, 0x7d, 0x2c, 0x88, 0x3f, 0x17, 0xfc, 0x59, 0xfa, 0x5d, 0x3e,
+    0x06, 0xae, 0xd4, 0xbf, 0xb1, 0x0a, 0xe1, 0x4c, 0xb0, 0x0e, 0xc8, 0x6b, 0x52, 0x1f, 0xa7, 0x47, 0x9d, 0x7c, 0x4b,
+    0xb9, 0x50, 0x1a, 0x85, 0x6d, 0x9c, 0x14, 0x06, 0x53, 0xce, 0xbe, 0x2d, 0x71, 0xfd, 0xea, 0x8f, 0x11, 0x7f, 0x74,
+    0x88, 0x7f, 0x97, 0x4a, 0xa3, 0x65, 0x89, 0x60, 0xc8, 0xef, 0x48, 0xad, 0xe0, 0x2a, 0x36, 0xe7, 0xfa, 0xb9, 0x9e,
+    0xe5, 0x1b, 0x9e, 0x38, 0x5d, 0xad, 0x4a, 0xa9, 0x40, 0xc5, 0x37, 0x0c, 0x3f, 0x61, 0x70, 0x6f, 0xfc, 0x8c, 0x07,
+    0x55, 0xb6, 0xef, 0x8b, 0x9f, 0x05, 0xf7, 0xc5, 0xcf, 0x78, 0xba, 0x5d, 0x34, 0xb8, 0x27, 0xee, 0x24, 0xe7, 0x49,
+    0x2b, 0xf2, 0x7c, 0xd4, 0x94, 0x56, 0xfe, 0x95, 0x76, 0x6b, 0xe0, 0xca, 0x26, 0x0e, 0x8c, 0xf3, 0xea, 0x22, 0x14,
+    0x73, 0xe6, 0x8c, 0x96, 0xc3, 0xff, 0xd6, 0x3a, 0xb9, 0x93, 0x47, 0x5a, 0x29, 0xe4, 0x0d, 0x2d, 0xf4, 0x3d, 0xd8,
+    0x70, 0xc5, 0x96, 0x0f, 0x20, 0x25, 0xa0, 0x6c, 0xfb, 0xf7, 0xba, 0x08, 0xc4, 0x71, 0x65, 0x9d, 0x8f, 0xc2, 0xf6,
+    0x49, 0x51, 0x72, 0x75, 0x75, 0x21, 0xe4, 0xd6, 0x68, 0x09, 0x10, 0xa6, 0xde, 0x35, 0x8f, 0x39, 0x9a, 0xcc, 0xd2,
+    0xe5, 0xba, 0x54, 0x1d, 0x14, 0x96, 0xab, 0xe3, 0x08, 0x17, 0x6b, 0x73, 0x83, 0xfe, 0x8a, 0xe3, 0xbf, 0xb9, 0xa3,
+    0x91, 0x9f, 0x4a, 0x0a, 0xf4, 0x68, 0xb7, 0xaf, 0xcd, 0x0e, 0x12, 0x69, 0xe7, 0x50, 0x5a, 0x0a, 0x00, 0x56, 0x1b,
+    0x7c, 0x5d, 0x7b, 0x9c, 0x7a, 0x22, 0xdd, 0x6c, 0xbe, 0x69, 0x08, 0x8b, 0x59, 0x69, 0xc1, 0x63, 0xba, 0xd9, 0x61,
+    0x39, 0xea, 0x65, 0x71, 0x5d, 0xee, 0xb1, 0x5a, 0xbf, 0xe8, 0x1b, 0xa0, 0xac, 0x0c, 0xd1, 0x56, 0xab, 0xb8, 0x0e,
+    0x6f, 0x22, 0x82, 0x6b, 0x10, 0x84, 0x45, 0x60, 0xc0, 0x51, 0x63, 0xbc, 0x6d, 0x9d, 0x18, 0x6d, 0xda, 0x2f, 0x79,
+    0xd6, 0xbd, 0x36, 0x8e, 0x50, 0xd1, 0x60, 0xab, 0x87, 0x9a, 0x07, 0x6c, 0x67, 0x57, 0x76, 0x14, 0x40, 0x68, 0x4a,
+    0xbd, 0x71, 0x6e, 0x65, 0x45, 0xbb, 0x03, 0xbe, 0xe8, 0x3b, 0xe6, 0xb9, 0x0e, 0x74, 0xdb, 0xf9, 0x81, 0x6d, 0xd3,
+    0x13, 0xf9, 0x2d, 0xdb, 0xa6, 0x1a, 0x27, 0xbc, 0xdf, 0x42, 0xdf, 0x37, 0x84, 0xb5, 0x7d, 0xed, 0x2e, 0xf2, 0xbf,
+    0xd0, 0x5d, 0x1b, 0xd0, 0xd3, 0x82, 0xd9, 0xd3, 0x98, 0x0f, 0x7a, 0xbd, 0xfe, 0x54, 0xfa, 0x2f, 0x18, 0x5b, 0xa1,
+    0x4f, 0x76, 0x17, 0x38, 0xb1, 0xd2, 0x38, 0x04, 0xc7, 0xaf, 0x38, 0x99, 0xe4, 0x72, 0x48, 0xf3, 0x77, 0xd0, 0x63,
+    0x95, 0xfb, 0xfc, 0x6e, 0x54, 0x50, 0xcd, 0x1c, 0xad, 0xa9, 0x46, 0xf1, 0x8a, 0x07, 0xc3, 0x78, 0xc5, 0x2d, 0xe5,
+    0xae, 0x5a, 0xc0, 0xcb, 0x97, 0x65, 0x13, 0xe9, 0xa7, 0x75, 0x29, 0x83, 0xa9, 0xdd, 0xbd, 0x6c, 0x92, 0x34, 0x56,
+    0x92, 0x34, 0xa6, 0xe2, 0xcd, 0xa6, 0xe2, 0xf8, 0xef, 0x6f, 0x0c, 0x76, 0x9b, 0xcc, 0xfd, 0x1d, 0x90, 0xb9, 0xbf,
+    0x79, 0xfa, 0xdd, 0x5a, 0x01, 0xc5, 0x3b, 0x4e, 0x8e, 0x8d, 0x65, 0x8c, 0x1d, 0xf5, 0x5b, 0x0d, 0x06, 0x0d, 0x9a,
+    0x5c, 0x06, 0xde, 0x0e, 0xd5, 0xe9, 0xe5, 0xed, 0x8f, 0xe2, 0x6c, 0xa1, 0xb4, 0x9c, 0xb9, 0x46, 0x95, 0xf3, 0x71,
+    0x32, 0x99, 0xa0, 0xc0, 0x36, 0x77, 0xf8, 0x69, 0xdd, 0x8d, 0x6c, 0xf9, 0x99, 0x8b, 0x51, 0xaa, 0xb0, 0x3b, 0x5b,
+    0x54, 0x2a, 0xd7, 0xc4, 0x9b, 0x39, 0x6f, 0xe7, 0xe1, 0x31, 0x17, 0x5c, 0x4d, 0x59, 0x11, 0x17, 0x68, 0xf9, 0xad,
+    0xce, 0x0a, 0xb8, 0xcd, 0xb1, 0x9d, 0xe1, 0x51, 0x69, 0x39, 0xa0, 0x13, 0x68, 0x0d, 0x74, 0x46, 0x33, 0xa6, 0xa7,
+    0x72, 0x04, 0x86, 0x2f, 0xc9, 0xa8, 0x74, 0xa7, 0x3a, 0x38, 0xd8, 0x8f, 0x23, 0xa3, 0xbf, 0x00, 0x1f, 0xf4, 0x30,
+    0x07, 0xf5, 0x96, 0xe0, 0x18, 0x54, 0x75, 0xcd, 0xd0, 0x92, 0x6d, 0xfa, 0xd0, 0xe8, 0xe4, 0x33, 0xbb, 0xc3, 0x1c,
+    0xad, 0xd7, 0xa9, 0x1d, 0x75, 0x34, 0xe6, 0x2c, 0x1f, 0x45, 0xf8, 0x33, 0xbb, 0x4b, 0x4b, 0xb7, 0x75, 0xe3, 0x65,
+    0x6d, 0x16, 0x31, 0x92, 0x37, 0x22, 0xc2, 0x55, 0x27, 0xe9, 0x72, 0x8d, 0x65, 0xc1, 0x27, 0x80, 0xa3, 0xbf, 0xb0,
+    0xbb, 0xd4, 0xb5, 0x17, 0xb8, 0x0a, 0xa2, 0xa5, 0x07, 0x7d, 0x12, 0x24, 0x87, 0xcb, 0xe0, 0x04, 0x8e, 0xbe, 0xa9,
+    0x3b, 0x20, 0xb5, 0x72, 0x95, 0x08, 0x89, 0xd0, 0xfa, 0xdf, 0x9d, 0x0a, 0x5e, 0x84, 0xe7, 0x9c, 0xae, 0x59, 0xdc,
+    0x6e, 0x54, 0x62, 0x50, 0xa1, 0xb2, 0x20, 0xf9, 0x18, 0x73, 0xbf, 0xfb, 0x9c, 0xf7, 0x43, 0xa0, 0x33, 0x5b, 0x50,
+    0xd7, 0x68, 0x3a, 0x32, 0xbf, 0x50, 0x75, 0x07, 0x35, 0xd3, 0x55, 0xc5, 0xbd, 0x8f, 0x31, 0x00, 0x1e, 0xac, 0x65,
+    0xa8, 0x71, 0x08, 0x5d, 0x7b, 0x33, 0xd5, 0x31, 0x25, 0xf1, 0xd2, 0xcf, 0x21, 0xe5, 0x21, 0x18, 0xf5, 0x1a, 0xd0,
+    0xd0, 0x21, 0x98, 0xb5, 0x3c, 0xe4, 0xe3, 0x58, 0x6c, 0x9d, 0xa1, 0xd2, 0x9c, 0xa1, 0x49, 0x00, 0xf2, 0x6f, 0x9c,
+    0x99, 0xcc, 0x40, 0xc3, 0xf0, 0x96, 0xe6, 0x00, 0x74, 0xab, 0xeb, 0x70, 0x28, 0x5c, 0xd1, 0xd2, 0x79, 0xcf, 0x2e,
+    0xba, 0xac, 0x0d, 0x2b, 0x36, 0xed, 0xa0, 0x75, 0x0a, 0x53, 0x62, 0xb6, 0xc0, 0xda, 0xeb, 0x7d, 0xb8, 0xb7, 0xab,
+    0x8d, 0x8b, 0xc4, 0x4f, 0x8b, 0x78, 0x98, 0xc4, 0x14, 0x2d, 0x79, 0x4c, 0xb1, 0x04, 0x3b, 0xc8, 0x62, 0x5d, 0x8e,
+    0x9f, 0x85, 0xcb, 0x51, 0xb3, 0x92, 0xde, 0xed, 0x60, 0x08, 0x5c, 0xbe, 0x06, 0xdb, 0x50, 0xcc, 0x3d, 0x61, 0xe1,
+    0xb1, 0xf1, 0xf4, 0x0b, 0xd6, 0x6d, 0x6e, 0x17, 0xc4, 0xaf, 0xc0, 0x98, 0xc6, 0xcb, 0x60, 0x16, 0xa1, 0x53, 0xb9,
+    0x73, 0x38, 0x74, 0xd7, 0x84, 0x95, 0xf1, 0x6a, 0xac, 0xc8, 0xc6, 0xd1, 0xf3, 0x7d, 0x1b, 0xcf, 0x7f, 0x16, 0xac,
+    0xb8, 0xbb, 0x62, 0x60, 0x63, 0x2d, 0xc1, 0xdd, 0xb8, 0x5a, 0x86, 0xca, 0x40, 0xbe, 0x27, 0x0d, 0xeb, 0xb2, 0xc6,
+    0xdf, 0x8d, 0x8a, 0xb1, 0x36, 0xf7, 0x94, 0x81, 0xb6, 0xc6, 0x6e, 0x17, 0xf6, 0x4d, 0xd7, 0x4d, 0xd6, 0x35, 0x8a,
+    0xb8, 0x0a, 0xd2, 0xee, 0x6e, 0x01, 0x17, 0xa1, 0x3f, 0x6c, 0x5f, 0x0d, 0x36, 0x55, 0x37, 0x90, 0x04, 0xd7, 0x7e,
+    0xf2, 0xdb, 0x53, 0xdd, 0x65, 0xad, 0xfb, 0xed, 0xa9, 0xd6, 0x2e, 0x0b, 0x8d, 0x21, 0x11, 0x76, 0xfd, 0x94, 0xfe,
+    0xd3, 0x62, 0xbd, 0x46, 0x6b, 0x18, 0xde, 0x7b, 0xde, 0x8d, 0xe3, 0xf7, 0xde, 0x42, 0x31, 0x81, 0x8b, 0xdc, 0xab,
+    0x5c, 0x7a, 0x42, 0x5e, 0x8d, 0xe0, 0x3d, 0xdf, 0x1a, 0xc2, 0x7b, 0x1e, 0x38, 0xbd, 0x82, 0xd4, 0x34, 0x11, 0x6c,
+    0xe4, 0xe9, 0x27, 0xb2, 0x48, 0x68, 0xf8, 0xb8, 0xd7, 0x9c, 0x70, 0xfd, 0x57, 0x0a, 0xfc, 0x17, 0x1e, 0x2e, 0xb4,
+    0x96, 0x02, 0x73, 0x31, 0x5f, 0x68, 0xac, 0xcc, 0xe8, 0x97, 0x63, 0x29, 0x74, 0x73, 0x4c, 0x67, 0x3c, 0xbf, 0x4b,
+    0x17, 0xbc, 0x39, 0x93, 0x42, 0xaa, 0x39, 0xcd, 0x18, 0x56, 0x77, 0x4a, 0xb3, 0x59, 0x73, 0xc1, 0xf1, 0x73, 0x96,
+    0x7f, 0x61, 0x9a, 0x67, 0x14, 0xbf, 0x95, 0x43, 0xa9, 0x25, 0x7e, 0x7d, 0x7b, 0x37, 0x61, 0x02, 0xff, 0x3e, 0x5c,
+    0x08, 0xbd, 0xc0, 0x8a, 0x0a, 0xd5, 0x54, 0xac, 0xe0, 0xe3, 0x6e, 0xb3, 0x39, 0x2f, 0xf8, 0x8c, 0x16, 0x77, 0xcd,
+    0x4c, 0xe6, 0xb2, 0x48, 0xff, 0xab, 0x75, 0x4c, 0x1f, 0x8c, 0x4f, 0xba, 0xba, 0xa0, 0x42, 0x71, 0x58, 0x98, 0x94,
+    0xe6, 0xf9, 0xde, 0xf1, 0x69, 0x6b, 0xa6, 0xf6, 0xed, 0x85, 0x1f, 0x15, 0x7a, 0xfd, 0x17, 0xfe, 0x20, 0x61, 0x94,
+    0xc9, 0x50, 0x0b, 0x37, 0xc8, 0x65, 0xb6, 0x28, 0x94, 0x2c, 0xd2, 0xb9, 0xe4, 0x42, 0xb3, 0xa2, 0x3b, 0x94, 0xc5,
+    0x88, 0x15, 0xcd, 0x82, 0x8e, 0xf8, 0x42, 0xa5, 0x27, 0xf3, 0xdb, 0x6e, 0xbd, 0x07, 0x9b, 0x9f, 0x0a, 0x29, 0x58,
+    0x17, 0xf8, 0x8d, 0x49, 0x21, 0x17, 0x62, 0xe4, 0x86, 0xb1, 0x10, 0x8a, 0xe9, 0xee, 0x9c, 0x8e, 0xc0, 0x0e, 0x38,
+    0x3d, 0x9f, 0xdf, 0x76, 0xcd, 0xac, 0x6f, 0x18, 0x9f, 0x4c, 0x75, 0x7a, 0xda, 0x6a, 0xd9, 0x6f, 0xc5, 0xbf, 0xb2,
+    0xb4, 0xdd, 0x49, 0x3a, 0xa7, 0xf3, 0x5b, 0xe0, 0xe0, 0x35, 0x2b, 0x9a, 0x00, 0x0b, 0xa8, 0xd4, 0x4e, 0x5a, 0x0f,
+    0x8e, 0xef, 0x43, 0x06, 0xd8, 0x38, 0x34, 0xcd, 0x84, 0xc0, 0xd8, 0x3d, 0x5d, 0xcc, 0xe7, 0xac, 0x00, 0x2f, 0xfa,
+    0xee, 0x8c, 0x16, 0x13, 0x2e, 0x9a, 0x85, 0x69, 0xb4, 0x79, 0x3e, 0xbf, 0x5d, 0xc3, 0x7c, 0x52, 0x6b, 0xb6, 0xea,
+    0xa6, 0xe5, 0xbe, 0x96, 0xc1, 0x10, 0x4d, 0x4c, 0x9a, 0xb4, 0x98, 0x0c, 0x69, 0xdc, 0xee, 0xdc, 0xc7, 0xfe, 0x7f,
+    0x49, 0x07, 0x05, 0x60, 0x6b, 0x8e, 0x16, 0x85, 0xb9, 0x45, 0x4d, 0xdb, 0xca, 0x36, 0x3b, 0x95, 0x5f, 0x58, 0xe1,
+    0x5b, 0x35, 0x1f, 0xcb, 0xad, 0x79, 0xff, 0x27, 0x8d, 0xfe, 0x85, 0x27, 0x14, 0xd6, 0xc0, 0x20, 0x47, 0xdf, 0xc8,
+    0x83, 0x30, 0xd3, 0xc1, 0xf2, 0x86, 0x8f, 0xf4, 0x34, 0x6d, 0xb7, 0x5a, 0x3f, 0x54, 0x2b, 0xd6, 0x9d, 0x5a, 0xd0,
+    0xb5, 0x0b, 0x36, 0xab, 0xad, 0xe3, 0x8c, 0x96, 0xd8, 0xb6, 0x9c, 0x4b, 0xb7, 0xe4, 0x05, 0xcb, 0x4d, 0x34, 0x99,
+    0xb5, 0x43, 0xb9, 0xad, 0x71, 0x72, 0x31, 0x65, 0x05, 0xd7, 0xdd, 0xfa, 0x57, 0xd5, 0xf1, 0xf6, 0xea, 0xaf, 0xad,
+    0x1c, 0xba, 0xb4, 0x35, 0xdc, 0xa5, 0xe7, 0x63, 0xf8, 0xd8, 0x5e, 0xfd, 0x2f, 0xb4, 0x88, 0x37, 0x10, 0x13, 0x87,
+    0x35, 0xd0, 0x3a, 0x98, 0x73, 0x01, 0x26, 0x99, 0x03, 0xfc, 0x0d, 0x28, 0x64, 0x34, 0xcf, 0x62, 0x18, 0xd1, 0x5e,
+    0x73, 0xef, 0xb8, 0x60, 0x33, 0xe4, 0x01, 0x91, 0xdc, 0x3f, 0x2d, 0xd8, 0x6c, 0x9d, 0x98, 0xea, 0x4b, 0x83, 0x22,
+    0x34, 0xe7, 0x13, 0x91, 0x66, 0x0c, 0xd0, 0x77, 0x9d, 0x30, 0xa1, 0xb9, 0xbe, 0x6b, 0x16, 0xf2, 0x66, 0x39, 0xe2,
+    0x6a, 0x9e, 0xd3, 0xbb, 0x74, 0x9c, 0xb3, 0xdb, 0xae, 0x29, 0xd5, 0xe4, 0x9a, 0xcd, 0x94, 0x2b, 0xdb, 0x85, 0xf4,
+    0xe6, 0xc8, 0x9a, 0x4d, 0x00, 0xf4, 0xe4, 0xcd, 0xe6, 0xfe, 0x49, 0x8e, 0xd5, 0x1e, 0xa3, 0x8a, 0x35, 0xe5, 0x42,
+    0xef, 0xb5, 0x54, 0x77, 0xc6, 0x45, 0xd3, 0x0d, 0xe4, 0xa4, 0x35, 0xbf, 0xed, 0x6e, 0x43, 0x3e, 0xe8, 0x3f, 0x61,
+    0xb7, 0x73, 0x2a, 0x46, 0x6c, 0xb4, 0x0c, 0xaa, 0x75, 0xa0, 0x5e, 0x58, 0x2a, 0x15, 0x7a, 0xda, 0x34, 0xb6, 0x5e,
+    0x71, 0x47, 0xa0, 0x6f, 0xa0, 0xd6, 0x83, 0x16, 0xb6, 0xff, 0x9f, 0xb4, 0x51, 0x58, 0x79, 0x0f, 0xc2, 0x2e, 0xf1,
+    0xf1, 0x5d, 0x13, 0xfe, 0x2e, 0xc1, 0xb7, 0x88, 0x67, 0x34, 0x77, 0x10, 0x99, 0xf1, 0xd1, 0x28, 0xaf, 0x8d, 0xe8,
+    0x32, 0xe8, 0xac, 0x8d, 0x96, 0x30, 0xff, 0xb4, 0xb5, 0xd7, 0xda, 0x33, 0x73, 0x71, 0xdb, 0xfc, 0xe4, 0xe4, 0xfe,
+    0xf1, 0x03, 0xd6, 0xcd, 0xb9, 0x60, 0xb5, 0xa9, 0x7e, 0x17, 0xd4, 0x61, 0xc3, 0x1d, 0xd7, 0x70, 0x7b, 0xaf, 0xbd,
+    0x77, 0xd2, 0xfa, 0xc1, 0xef, 0xd6, 0x9c, 0x8d, 0x75, 0xda, 0x3e, 0x9b, 0xdf, 0xd6, 0xb7, 0xef, 0xb9, 0x6f, 0xfa,
+    0xa6, 0xa0, 0xf3, 0x54, 0x48, 0xf8, 0xd3, 0x85, 0x4d, 0x36, 0xce, 0xe5, 0x4d, 0x3a, 0xe5, 0xa3, 0x11, 0x13, 0xb6,
+    0x40, 0x99, 0xc8, 0xf2, 0x9c, 0xcf, 0x15, 0xb7, 0xab, 0xe1, 0x70, 0xf7, 0x74, 0x03, 0xaa, 0xe1, 0x80, 0x8e, 0x83,
+    0x01, 0x9d, 0x56, 0x03, 0xaa, 0xfa, 0x0f, 0x47, 0xd8, 0xd9, 0x98, 0xab, 0x29, 0xd5, 0xad, 0x61, 0xd2, 0xdf, 0x0b,
+    0xa5, 0x01, 0xe6, 0xde, 0x48, 0xc3, 0x50, 0xf1, 0xe6, 0x90, 0xe9, 0x1b, 0xc6, 0xc4, 0xb7, 0x07, 0x71, 0x99, 0x4a,
+    0x91, 0xdf, 0xd9, 0xcf, 0x65, 0xd8, 0x25, 0x5d, 0x68, 0xb9, 0x4e, 0x86, 0x5c, 0xd0, 0xe2, 0xee, 0x5a, 0x31, 0xa1,
+    0x64, 0x71, 0x2d, 0xc7, 0xe3, 0xe5, 0xb7, 0x48, 0xcb, 0x7d, 0xb4, 0x4e, 0x14, 0x17, 0x93, 0x9c, 0x59, 0xa2, 0x64,
+    0x10, 0xc1, 0x11, 0x73, 0xdb, 0xae, 0x69, 0xb2, 0x36, 0xe8, 0x70, 0xe7, 0x99, 0x76, 0x07, 0x69, 0xda, 0xbc, 0x61,
+    0xc3, 0xcf, 0x5c, 0x5b, 0x3c, 0x6b, 0xaa, 0x1b, 0xf0, 0x78, 0x31, 0xcb, 0x30, 0x67, 0xc5, 0xd2, 0xd3, 0xf0, 0x56,
+    0x8d, 0xea, 0x5c, 0x09, 0x73, 0x7a, 0x68, 0x3a, 0x6c, 0x42, 0xfc, 0x2f, 0x56, 0x94, 0x7b, 0x8c, 0x0b, 0x83, 0x31,
+    0x06, 0x40, 0x9b, 0xbb, 0x24, 0x3c, 0x03, 0x4e, 0x5a, 0x2d, 0x7f, 0x3e, 0x34, 0x6d, 0x9d, 0xb4, 0x9d, 0x9c, 0xb2,
+    0xd9, 0xae, 0xfd, 0x59, 0x27, 0x46, 0xed, 0xce, 0xfc, 0x76, 0xcf, 0xfc, 0xd3, 0xda, 0x6b, 0x6d, 0x13, 0x9f, 0x6d,
+    0x38, 0x1d, 0x23, 0xbf, 0xb2, 0x5a, 0xce, 0xd3, 0x36, 0x9b, 0x75, 0x17, 0x0a, 0x0e, 0x1a, 0x43, 0x1b, 0xcd, 0x01,
+    0xb6, 0x36, 0x33, 0x81, 0x75, 0xa4, 0x5c, 0x00, 0x5d, 0xb7, 0x67, 0x1b, 0xf4, 0xa1, 0x24, 0x18, 0x62, 0xef, 0x6c,
+    0xb4, 0x3e, 0xac, 0xd6, 0x5e, 0x35, 0x30, 0xf8, 0x67, 0xfd, 0x57, 0xc5, 0x19, 0xbe, 0x60, 0x01, 0x67, 0xce, 0x1b,
+    0xc9, 0xe9, 0xaa, 0xe5, 0xb8, 0xf1, 0x91, 0xae, 0x84, 0x04, 0xe3, 0xcb, 0x30, 0xa3, 0xb7, 0xd6, 0xa9, 0x61, 0xc6,
+    0x05, 0x98, 0x4c, 0x21, 0xac, 0x03, 0xe3, 0xf2, 0x69, 0xd8, 0xd0, 0x48, 0xc7, 0xd0, 0xf0, 0x61, 0x27, 0x39, 0x3d,
+    0x45, 0xb8, 0x85, 0x3b, 0xa7, 0xa7, 0x81, 0x34, 0x30, 0xd6, 0xbb, 0x8a, 0xee, 0x2a, 0xa9, 0x76, 0x94, 0x3c, 0x32,
+    0x8d, 0x1e, 0xb5, 0x5b, 0x2d, 0x6c, 0x1c, 0xb7, 0xcb, 0xc2, 0x5c, 0xed, 0x68, 0xb6, 0xdd, 0x6a, 0x41, 0xb3, 0xf0,
+    0xc7, 0xcd, 0xeb, 0x17, 0xb2, 0x6c, 0xa5, 0x2d, 0xdc, 0x4e, 0xdb, 0xb8, 0x93, 0x76, 0xf0, 0x71, 0x7a, 0x8c, 0x4f,
+    0xd2, 0x13, 0x7c, 0x9a, 0x9e, 0xe2, 0xb3, 0xf4, 0x0c, 0xdf, 0x4f, 0xef, 0xe3, 0xf3, 0xf4, 0x1c, 0x3f, 0x48, 0x1f,
+    0xe0, 0x87, 0x69, 0xbb, 0x85, 0x1f, 0xa5, 0xed, 0x36, 0x7e, 0x9c, 0xb6, 0x3b, 0xf8, 0x49, 0xda, 0x3e, 0xc6, 0x4f,
+    0xd3, 0xf6, 0x09, 0x7e, 0x96, 0xb6, 0x4f, 0x31, 0x85, 0xdc, 0x21, 0xe4, 0x66, 0x90, 0x3b, 0x82, 0x5c, 0x06, 0xb9,
+    0xe3, 0xb4, 0x7d, 0xba, 0xc6, 0xca, 0x06, 0x7b, 0x88, 0x5a, 0xed, 0xce, 0xf1, 0xc9, 0xe9, 0xd9, 0xfd, 0xf3, 0x07,
+    0x0f, 0x1f, 0x3d, 0x7e, 0xf2, 0xf4, 0x59, 0x34, 0xc0, 0x43, 0xe3, 0x73, 0xa1, 0x44, 0x9f, 0x1f, 0xb4, 0x4f, 0x07,
+    0xf8, 0xda, 0x7f, 0xc6, 0xfc, 0xa0, 0x73, 0xd2, 0x42, 0x97, 0x97, 0x27, 0x83, 0x46, 0x99, 0xfb, 0xde, 0xb8, 0x7a,
+    0x54, 0x59, 0x84, 0x90, 0x18, 0x72, 0x10, 0xbe, 0x33, 0xf5, 0xde, 0xb3, 0x98, 0x27, 0x05, 0x3a, 0x38, 0x30, 0x3f,
+    0x26, 0xfe, 0xc7, 0xd0, 0xff, 0xa0, 0xc1, 0x22, 0xdd, 0xd2, 0xd8, 0xf9, 0xfa, 0xea, 0xd2, 0xd2, 0xbe, 0x34, 0x62,
+    0xd9, 0xe3, 0xce, 0x9c, 0xfc, 0xbf, 0x22, 0x6b, 0x2e, 0x42, 0x4e, 0xac, 0x4a, 0xe6, 0xb4, 0xc7, 0xc8, 0xb2, 0x48,
+    0x3b, 0xa7, 0xa7, 0x07, 0xbf, 0xf4, 0x79, 0xbf, 0x3d, 0x18, 0x1c, 0xb6, 0xef, 0xe3, 0x49, 0x99, 0xd0, 0xb1, 0x09,
+    0xc3, 0x32, 0xe1, 0xd8, 0x26, 0xd0, 0xd4, 0xd6, 0x86, 0xa4, 0x13, 0x93, 0x04, 0x25, 0xd6, 0xa9, 0x69, 0xfb, 0xbe,
+    0x6d, 0xfb, 0x01, 0xd8, 0x31, 0x99, 0xe6, 0x5d, 0xd3, 0x17, 0x17, 0x27, 0x2b, 0xd7, 0x28, 0x9e, 0xa4, 0xae, 0x35,
+    0x9f, 0x78, 0x32, 0x18, 0xe0, 0xa1, 0x49, 0x3c, 0xad, 0x12, 0xcf, 0x06, 0x03, 0xd7, 0xd5, 0x03, 0xd3, 0xd5, 0xfd,
+    0x2a, 0xeb, 0x7c, 0x30, 0x30, 0x5d, 0x22, 0xe7, 0xb5, 0xae, 0xf4, 0xde, 0x97, 0x52, 0x73, 0xc0, 0x2f, 0x3a, 0xa7,
+    0xa7, 0x3d, 0xc0, 0x30, 0x63, 0x8d, 0xea, 0x61, 0x74, 0x13, 0xc0, 0xe8, 0x0e, 0x7e, 0xf7, 0x86, 0x34, 0xbd, 0xa6,
+    0x25, 0x90, 0x7a, 0xd1, 0x7f, 0x45, 0x0d, 0x6d, 0x60, 0x6e, 0xfe, 0x4c, 0xec, 0x9f, 0x21, 0x6a, 0x7c, 0xa1, 0x00,
+    0x6e, 0xd0, 0x85, 0x78, 0x65, 0xa6, 0xe9, 0xf1, 0x33, 0x05, 0xe7, 0x92, 0xa9, 0xca, 0x69, 0x6f, 0x35, 0xbd, 0x19,
+    0xae, 0xa6, 0xea, 0x0b, 0xfa, 0x33, 0xfe, 0x53, 0x1d, 0xc6, 0xfd, 0x66, 0x23, 0x61, 0x7f, 0x8e, 0xc0, 0x8b, 0xa5,
+    0x97, 0x8e, 0xd8, 0x04, 0xf5, 0xfa, 0x7f, 0x2a, 0x3c, 0x68, 0x04, 0x19, 0x3f, 0x6c, 0xa7, 0x80, 0x8f, 0xcb, 0x66,
+    0x62, 0xfc, 0x03, 0xea, 0xa1, 0xde, 0x9f, 0xea, 0xf0, 0x4f, 0x74, 0xef, 0xa8, 0x9a, 0xcb, 0xef, 0xd2, 0x6d, 0xe1,
+    0x2a, 0xf0, 0xcd, 0x61, 0xb9, 0x85, 0x19, 0x6e, 0x37, 0x19, 0x84, 0x09, 0x03, 0x27, 0x68, 0x12, 0xcb, 0x06, 0x3f,
+    0x3a, 0x6e, 0xa1, 0x1f, 0xda, 0x1d, 0x10, 0xeb, 0x9b, 0xe2, 0x70, 0x7b, 0xd3, 0x17, 0xcd, 0x63, 0xfc, 0xa0, 0x59,
+    0xe0, 0x36, 0xc2, 0xcd, 0xb6, 0xd7, 0xb7, 0xf6, 0x55, 0xdc, 0x42, 0x58, 0xc5, 0xe7, 0xf0, 0xcf, 0x09, 0x1a, 0x54,
+    0x1b, 0xf2, 0x8a, 0x6e, 0xf6, 0x0e, 0x1e, 0x9b, 0x24, 0x56, 0x0d, 0x7e, 0x74, 0xd6, 0x42, 0x3f, 0x9c, 0x99, 0x8e,
+    0xd8, 0xa1, 0xde, 0xd1, 0x95, 0xc4, 0x27, 0x4d, 0x09, 0x1d, 0xb5, 0xca, 0x7e, 0x44, 0x7c, 0x8a, 0xb0, 0x88, 0x8f,
+    0xe1, 0x9f, 0x76, 0xd8, 0xcf, 0xaf, 0x5b, 0xfd, 0x98, 0x79, 0xb7, 0x71, 0x72, 0x6a, 0x1d, 0x40, 0x95, 0xbd, 0x8d,
+    0x6d, 0xb0, 0xcb, 0xb6, 0xb9, 0x46, 0x6a, 0x1f, 0xc1, 0x07, 0xc2, 0xfa, 0x90, 0x28, 0xcc, 0x0e, 0xc1, 0x73, 0x14,
+    0x0c, 0x26, 0xd4, 0xc5, 0x71, 0x57, 0x35, 0x1a, 0x48, 0xf4, 0xd5, 0xe0, 0x90, 0xb4, 0x9b, 0xba, 0xc9, 0x30, 0xfc,
+    0x6e, 0x90, 0x32, 0x1c, 0x99, 0xa8, 0x7a, 0x7d, 0xec, 0x7a, 0xb5, 0x77, 0xce, 0x1e, 0x3b, 0x08, 0x21, 0xaa, 0x17,
+    0xeb, 0x26, 0x43, 0x47, 0xa2, 0x11, 0xeb, 0x0b, 0xd6, 0x3b, 0x4b, 0x5b, 0xc8, 0x60, 0xa7, 0xea, 0xc5, 0xac, 0xc9,
+    0x21, 0xbd, 0x93, 0xc6, 0xbc, 0xa9, 0xe1, 0xd7, 0x49, 0x30, 0x0b, 0x01, 0x78, 0x57, 0xf9, 0xc1, 0x14, 0x47, 0x9d,
+    0xd3, 0x53, 0x2c, 0x08, 0x4f, 0x26, 0xe6, 0x97, 0x22, 0x3c, 0x19, 0x9a, 0x5f, 0x92, 0x94, 0xf0, 0xb2, 0xbd, 0xe3,
+    0x82, 0x04, 0xab, 0x6a, 0x52, 0x28, 0x2c, 0x68, 0x81, 0x8e, 0x3a, 0xfe, 0x42, 0x1a, 0x4f, 0xfd, 0x1c, 0x40, 0x00,
+    0x2f, 0x8c, 0x2d, 0xa2, 0x6c, 0x16, 0x38, 0x27, 0xf4, 0x32, 0x39, 0xed, 0x4d, 0x8f, 0xe2, 0x4e, 0x53, 0x36, 0x0b,
+    0x94, 0x4e, 0x8f, 0x4c, 0x4d, 0x9c, 0x91, 0xc7, 0xd4, 0xb6, 0x86, 0xa7, 0x70, 0x8b, 0x98, 0x91, 0xec, 0xf0, 0xac,
+    0xd5, 0x48, 0x4e, 0x11, 0xee, 0x67, 0xab, 0x16, 0xce, 0x57, 0xab, 0x16, 0xa6, 0xc1, 0x32, 0x3c, 0x16, 0x1e, 0x20,
+    0xa5, 0x8e, 0x68, 0x33, 0x2a, 0x4c, 0x8f, 0xc7, 0x1a, 0x6e, 0xc4, 0x35, 0xf8, 0x99, 0x68, 0xf0, 0x80, 0x49, 0xb9,
+    0xbb, 0x8a, 0x42, 0x26, 0x2e, 0xde, 0x38, 0xd4, 0x1a, 0xbd, 0x16, 0x7e, 0x5d, 0xbd, 0x4d, 0xa3, 0x88, 0x7f, 0x97,
+    0xd8, 0xa6, 0x05, 0xc5, 0xe8, 0x76, 0xb1, 0x5f, 0xe9, 0x56, 0xb1, 0x37, 0x3b, 0x8a, 0x5d, 0x6d, 0x17, 0xfb, 0x28,
+    0x03, 0x1d, 0x17, 0xff, 0xe1, 0xf8, 0xac, 0xd5, 0x38, 0x06, 0x64, 0x3d, 0x3e, 0x6b, 0x55, 0x85, 0xee, 0xd1, 0x6a,
+    0xad, 0x34, 0xf9, 0x4c, 0xad, 0x95, 0x3f, 0xf7, 0xee, 0xc6, 0x66, 0xe1, 0xac, 0xb3, 0x73, 0xe9, 0xd9, 0xdc, 0x3f,
+    0x05, 0x2b, 0x0a, 0x61, 0xa8, 0x9d, 0xee, 0x9f, 0x0d, 0x7a, 0x53, 0x16, 0x37, 0x20, 0x15, 0xa5, 0x63, 0xed, 0x7e,
+    0xa1, 0xf2, 0x32, 0xf5, 0xa3, 0x84, 0xa4, 0xce, 0x00, 0x61, 0x49, 0x1a, 0xba, 0x7f, 0x3c, 0x30, 0xe7, 0x5d, 0x01,
+    0xbf, 0x4f, 0xcc, 0xef, 0x52, 0x95, 0xe1, 0x5c, 0x01, 0xa6, 0x37, 0xc3, 0xa8, 0x27, 0xc8, 0x6b, 0x1a, 0x1b, 0xeb,
+    0x6e, 0x94, 0x96, 0x19, 0xea, 0x0b, 0x64, 0xbc, 0x29, 0x33, 0x04, 0x79, 0x2d, 0xdc, 0x6f, 0xbc, 0x2c, 0x52, 0xb0,
+    0xf4, 0xc0, 0x93, 0x14, 0xac, 0x3c, 0xf0, 0x30, 0x15, 0xe0, 0x89, 0x40, 0x53, 0x16, 0xd8, 0x8f, 0x3f, 0x74, 0xba,
+    0x23, 0x73, 0xdf, 0x49, 0x0c, 0x96, 0x76, 0x19, 0x9c, 0x14, 0x1f, 0x65, 0x0c, 0x7f, 0x1b, 0x1a, 0x61, 0x06, 0x6d,
+    0x32, 0x84, 0x79, 0x52, 0x10, 0x48, 0xc3, 0x3c, 0x99, 0x10, 0x06, 0x4d, 0xf2, 0x64, 0x48, 0x58, 0xbf, 0x13, 0xa0,
+    0xc9, 0x53, 0x03, 0x3b, 0x00, 0x0e, 0xaf, 0x5f, 0x21, 0x6b, 0xdb, 0x38, 0xdc, 0x4d, 0x43, 0x13, 0x82, 0x70, 0x15,
+    0xc3, 0x2c, 0x60, 0x73, 0x9a, 0x9f, 0x9d, 0x2a, 0xf0, 0x22, 0x4f, 0xa8, 0xa1, 0xde, 0x7f, 0x01, 0x59, 0x8d, 0xef,
+    0x2d, 0xd9, 0x1a, 0xef, 0xdd, 0x5b, 0x8a, 0xf5, 0x0f, 0xf0, 0x47, 0xb9, 0x3f, 0xda, 0x9c, 0x7e, 0x6b, 0xf4, 0x57,
+    0x0a, 0xc5, 0x76, 0x94, 0x42, 0x7f, 0x79, 0x47, 0x34, 0x45, 0x96, 0xb7, 0x69, 0x34, 0xa2, 0xc5, 0xe7, 0x08, 0x7f,
+    0x4a, 0xa3, 0x1c, 0x18, 0xc1, 0x08, 0x7f, 0x4c, 0xa3, 0x82, 0x45, 0xf8, 0x8f, 0x34, 0x1a, 0xe6, 0x8b, 0x08, 0x7f,
+    0x48, 0xa3, 0x49, 0x11, 0xe1, 0xf7, 0xa0, 0x26, 0x1c, 0xf1, 0xc5, 0x2c, 0xc2, 0xbf, 0xa7, 0x91, 0x32, 0x76, 0xf8,
+    0xf8, 0x61, 0x1a, 0x31, 0x16, 0xe1, 0x77, 0x69, 0x24, 0xf3, 0x08, 0x5f, 0xa5, 0x91, 0x2c, 0x22, 0xfc, 0x28, 0x8d,
+    0x0a, 0x1a, 0xe1, 0xc7, 0x69, 0x04, 0x85, 0x26, 0x11, 0x7e, 0x92, 0x46, 0xd0, 0xb2, 0x8a, 0xf0, 0xdb, 0x34, 0xe2,
+    0x22, 0xc2, 0xbf, 0xa5, 0x91, 0x5e, 0x14, 0xff, 0x2c, 0x24, 0x57, 0x11, 0x7e, 0x9a, 0x46, 0x53, 0x1e, 0xe1, 0x37,
+    0x69, 0x54, 0xc8, 0x08, 0xbf, 0x4e, 0x23, 0x9a, 0x47, 0xf8, 0x55, 0x1a, 0xe5, 0x2c, 0xc2, 0xbf, 0xa6, 0xd1, 0x88,
+    0x45, 0xf8, 0x65, 0x1a, 0xdd, 0xb1, 0x3c, 0x97, 0x11, 0x7e, 0x96, 0x46, 0x4c, 0x44, 0xf8, 0x97, 0x34, 0xca, 0xa6,
+    0x11, 0xfe, 0x29, 0x8d, 0x68, 0xf1, 0x59, 0x45, 0xf8, 0x79, 0x1a, 0x31, 0x1a, 0xe1, 0x17, 0xb6, 0xa3, 0x49, 0x84,
+    0x7f, 0x4e, 0xa3, 0x9b, 0x69, 0xb4, 0xc6, 0x4a, 0x91, 0xe5, 0x6b, 0x9e, 0xb1, 0x3f, 0x58, 0x1a, 0x8d, 0x5b, 0xe3,
+    0xf3, 0xf1, 0x38, 0xc2, 0x54, 0x68, 0xfe, 0xcf, 0x82, 0xdd, 0x3c, 0xd5, 0x90, 0x48, 0xd9, 0x70, 0x74, 0x3f, 0xc2,
+    0xf4, 0x9f, 0x05, 0x4d, 0xa3, 0xf1, 0xd8, 0x14, 0xf8, 0x67, 0x41, 0x67, 0xb4, 0x78, 0xcb, 0xd2, 0xe8, 0xfe, 0x78,
+    0x3c, 0x1e, 0x9d, 0x44, 0x98, 0x7e, 0x5d, 0x7c, 0x34, 0x2d, 0x98, 0x02, 0x43, 0xc6, 0x27, 0x50, 0xf7, 0x74, 0x7c,
+    0x3a, 0xca, 0x22, 0x3c, 0xe4, 0xea, 0x9f, 0x05, 0x7c, 0x8f, 0xd9, 0x49, 0x76, 0x12, 0xe1, 0x61, 0x4e, 0xb3, 0xcf,
+    0x69, 0xd4, 0x32, 0xbf, 0xc4, 0x2f, 0x6c, 0xf4, 0x7a, 0x26, 0x8d, 0x12, 0x7d, 0xcc, 0x86, 0xd9, 0x28, 0xc2, 0x66,
+    0x30, 0x63, 0xf8, 0xfb, 0x85, 0xbf, 0x63, 0x3a, 0x8d, 0xce, 0x69, 0x67, 0xc8, 0x3a, 0x11, 0x1e, 0xbe, 0xb9, 0x11,
+    0x69, 0x44, 0x4f, 0x3b, 0xb4, 0x43, 0x23, 0x3c, 0x5c, 0x14, 0xf9, 0xdd, 0x8d, 0x94, 0x23, 0x00, 0xc2, 0xf0, 0xfc,
+    0xfc, 0x7e, 0x84, 0x33, 0xfa, 0xab, 0x86, 0xda, 0xa7, 0xe3, 0x07, 0x8c, 0xb6, 0x22, 0xfc, 0x0b, 0x2d, 0xf4, 0xc7,
+    0x85, 0x72, 0x03, 0x6d, 0x41, 0x8a, 0xcc, 0xde, 0x81, 0x82, 0x39, 0x1a, 0x75, 0xce, 0x1e, 0xb4, 0x59, 0x84, 0xb3,
+    0xab, 0xd7, 0xd0, 0xdb, 0xfd, 0xf1, 0x69, 0x0b, 0x3e, 0x04, 0x48, 0x6a, 0xac, 0x80, 0x46, 0xce, 0x4e, 0x1e, 0x9c,
+    0xb2, 0x91, 0x49, 0x54, 0x3c, 0xff, 0x6c, 0x66, 0x7f, 0x0e, 0xf3, 0xc9, 0x0a, 0x3e, 0x53, 0x52, 0xa4, 0xd1, 0x28,
+    0x6b, 0x9f, 0x1c, 0x43, 0xc2, 0x1d, 0x15, 0x1e, 0x38, 0xb7, 0x50, 0xf5, 0x7c, 0x18, 0xe1, 0x5b, 0x9b, 0x7a, 0x3e,
+    0x34, 0x1f, 0x93, 0x77, 0xbf, 0x8a, 0x37, 0xa3, 0x34, 0x1a, 0x9e, 0x9f, 0x9f, 0xb5, 0x20, 0xe1, 0x03, 0xbd, 0x4b,
+    0x23, 0xfa, 0x00, 0xfe, 0x83, 0xec, 0x8f, 0xcf, 0xa0, 0x43, 0x18, 0xe1, 0xed, 0xe4, 0x63, 0x98, 0xf3, 0x79, 0x4a,
+    0x3f, 0xf3, 0x34, 0x1a, 0x8e, 0x86, 0xf7, 0xcf, 0xa0, 0xde, 0x8c, 0x4e, 0x9e, 0x69, 0x0a, 0xed, 0xb6, 0x5a, 0xa6,
+    0xe5, 0x77, 0xfc, 0x0b, 0x33, 0xd5, 0x4f, 0x4f, 0xcf, 0x86, 0x1d, 0x18, 0xc1, 0x15, 0xa8, 0x18, 0x60, 0x3c, 0xe7,
+    0x99, 0x69, 0xf0, 0x2a, 0x7b, 0x3a, 0x4a, 0xa3, 0x07, 0x0f, 0x8e, 0x3b, 0x59, 0x16, 0xe1, 0xdb, 0x8f, 0x23, 0x5b,
+    0xdb, 0xe4, 0x29, 0x80, 0x7d, 0x1a, 0xb1, 0x07, 0x0f, 0xce, 0xee, 0x53, 0xf8, 0x7e, 0x6e, 0xda, 0x3a, 0x1f, 0x0f,
+    0xb3, 0x73, 0x68, 0xeb, 0x77, 0x98, 0xce, 0xc9, 0xf9, 0xf1, 0xc8, 0xf4, 0xf5, 0xbb, 0x19, 0x75, 0x67, 0x7c, 0x32,
+    0x3e, 0x31, 0x99, 0x66, 0xa8, 0xe5, 0xe7, 0x6f, 0x2c, 0x8d, 0x32, 0x36, 0x6a, 0x47, 0xf8, 0xd6, 0x2d, 0xdc, 0x83,
+    0x93, 0x56, 0x6b, 0x74, 0x1c, 0xe1, 0xd1, 0xc3, 0xf9, 0xfc, 0xad, 0x81, 0x60, 0xfb, 0xe4, 0x81, 0xfd, 0x56, 0x9f,
+    0xef, 0xa0, 0xe9, 0xa1, 0x01, 0xda, 0x88, 0xcf, 0x4c, 0xcb, 0x67, 0x0f, 0xe0, 0x3f, 0xf3, 0x6d, 0x9a, 0x2e, 0xbf,
+    0xe5, 0x68, 0x62, 0x17, 0xa5, 0xcd, 0x1e, 0xb4, 0xa0, 0xc6, 0x98, 0x7f, 0x1c, 0x16, 0x1c, 0xd0, 0x68, 0xd8, 0x81,
+    0xff, 0x8b, 0xf0, 0x38, 0xbf, 0x7a, 0xed, 0x70, 0x76, 0x3c, 0xa6, 0xe3, 0x56, 0x84, 0xc7, 0xf2, 0xa3, 0xd2, 0x1f,
+    0x1e, 0x8a, 0x34, 0xea, 0x74, 0xce, 0x87, 0xa6, 0xcc, 0xe2, 0x17, 0xc5, 0x0d, 0x1e, 0xb7, 0x4c, 0x2b, 0x13, 0xfa,
+    0x56, 0x0d, 0xaf, 0x24, 0xac, 0x24, 0xfc, 0x17, 0xe1, 0x09, 0xe8, 0xa5, 0x5c, 0x2b, 0xe7, 0x76, 0x3b, 0x4c, 0xde,
+    0x19, 0xd4, 0x1c, 0xdd, 0x07, 0x78, 0xf9, 0x65, 0x1c, 0x51, 0x7a, 0xda, 0x69, 0x45, 0xd8, 0x8c, 0xfa, 0xbc, 0x05,
+    0xff, 0x45, 0xd8, 0x42, 0xce, 0xc0, 0x75, 0xf2, 0xf1, 0xd9, 0xcb, 0x9b, 0x34, 0xa2, 0xa3, 0xf1, 0x18, 0x96, 0xc4,
+    0x4c, 0xc6, 0x17, 0x9b, 0x4a, 0xc1, 0xee, 0x7e, 0xbd, 0x71, 0xdb, 0xc5, 0x24, 0x68, 0x07, 0x9d, 0xb3, 0x07, 0xc3,
+    0x93, 0x08, 0xbf, 0x1d, 0x71, 0x2a, 0x60, 0x95, 0xb2, 0xd1, 0x69, 0x76, 0x9a, 0x99, 0x84, 0x89, 0x4c, 0xa3, 0x13,
+    0x58, 0xf2, 0x4e, 0x84, 0xf9, 0x97, 0xab, 0x3b, 0x8b, 0x6e, 0x50, 0xdb, 0x21, 0xc8, 0xb8, 0xc5, 0xce, 0xce, 0xb3,
+    0x08, 0xe7, 0xf4, 0xcb, 0xb3, 0x5f, 0x8b, 0x34, 0x62, 0x67, 0xec, 0x6c, 0x4c, 0xfd, 0xf7, 0x1f, 0x6a, 0x6a, 0x6a,
+    0xb4, 0xc6, 0xa7, 0x90, 0x74, 0x23, 0xcc, 0x58, 0xef, 0x67, 0x63, 0x83, 0x21, 0xaf, 0x66, 0x52, 0x64, 0x4f, 0xc7,
+    0x63, 0x69, 0xb1, 0x98, 0xc2, 0x26, 0xfc, 0x04, 0xd0, 0xa6, 0xa3, 0xd1, 0x39, 0x3b, 0x8b, 0xf0, 0x27, 0xbb, 0x4b,
+    0xdc, 0x04, 0x3e, 0x59, 0xcc, 0x66, 0x6e, 0xb7, 0x7f, 0xb2, 0x40, 0x81, 0xf9, 0x8e, 0xe9, 0x98, 0x8e, 0x3a, 0x11,
+    0xfe, 0x64, 0xe0, 0x32, 0x3a, 0x86, 0xff, 0xa0, 0x00, 0x74, 0xf6, 0xa0, 0xc5, 0xd8, 0x83, 0x96, 0xf9, 0x0a, 0xf3,
+    0xdc, 0xcc, 0x87, 0x67, 0x59, 0x3b, 0xc2, 0x9f, 0x1c, 0x3a, 0x8e, 0xc7, 0xb4, 0x05, 0xe8, 0xf8, 0xc9, 0xa1, 0x63,
+    0xa7, 0x35, 0xec, 0x50, 0xf3, 0x6d, 0xb1, 0xe6, 0xfc, 0x7e, 0xc6, 0x60, 0x72, 0x9f, 0x2c, 0x42, 0xde, 0xbf, 0x7f,
+    0x7e, 0xfe, 0xe0, 0x01, 0x7c, 0x9a, 0xb6, 0xcb, 0x4f, 0xa5, 0x1f, 0xe6, 0x06, 0xc9, 0x5a, 0xd9, 0x09, 0xd0, 0xc9,
+    0x4f, 0x66, 0x8c, 0xe3, 0xf1, 0x98, 0xb5, 0x22, 0x9c, 0xf3, 0x19, 0xb3, 0x98, 0x60, 0x7f, 0x9b, 0x8e, 0x8e, 0x3b,
+    0xd9, 0xe8, 0xb8, 0x13, 0xe1, 0xfc, 0xed, 0x33, 0x33, 0x9b, 0x16, 0xcc, 0xde, 0x6f, 0x39, 0x8f, 0x35, 0x33, 0xfa,
+    0x06, 0x06, 0x09, 0x2b, 0x0d, 0x95, 0xdf, 0x07, 0xf4, 0xf0, 0xec, 0x2c, 0x1b, 0xc1, 0x40, 0xdf, 0x43, 0xb7, 0x00,
+    0xc6, 0xf7, 0x76, 0xf3, 0x0d, 0xe9, 0xe9, 0x29, 0x4c, 0xf7, 0xfd, 0x7c, 0x51, 0xcc, 0x5f, 0xa5, 0xd1, 0x83, 0xe3,
+    0xfb, 0xad, 0xd1, 0x30, 0xc2, 0xef, 0xdd, 0x04, 0x8f, 0xb3, 0xe1, 0xf1, 0xfd, 0x76, 0x84, 0xdf, 0x9b, 0xfd, 0x76,
+    0x7f, 0x78, 0x76, 0x0e, 0xe7, 0xc6, 0x7b, 0x35, 0x2f, 0xde, 0x4e, 0x4c, 0x81, 0x31, 0x7d, 0x00, 0xcd, 0xfe, 0x66,
+    0x76, 0xe3, 0xa8, 0x0d, 0x1b, 0xf9, 0xbd, 0xd9, 0x64, 0x06, 0x4f, 0xee, 0xb7, 0x4f, 0xcf, 0x4f, 0x23, 0x3c, 0xe3,
+    0x23, 0x01, 0x04, 0xde, 0x6c, 0x94, 0x07, 0xed, 0x07, 0xf7, 0x5b, 0x11, 0x9e, 0xbd, 0xd5, 0xd9, 0x47, 0x3a, 0x33,
+    0xd4, 0x78, 0x0c, 0x30, 0x9b, 0x71, 0xa5, 0xef, 0xde, 0x28, 0x47, 0x8f, 0x59, 0x3b, 0xc2, 0x33, 0x99, 0x65, 0x54,
+    0xbd, 0xb5, 0x09, 0xc3, 0xd3, 0x08, 0x0b, 0xfa, 0x85, 0xfe, 0x2d, 0xfd, 0x66, 0x1a, 0x31, 0x3a, 0x32, 0x69, 0x06,
+    0x87, 0x23, 0xfc, 0x6e, 0x04, 0xd7, 0x60, 0x69, 0x34, 0x1e, 0x8d, 0x4f, 0x01, 0x3c, 0x40, 0x80, 0x2c, 0x76, 0x03,
+    0x34, 0xe0, 0x6b, 0xf4, 0x68, 0x98, 0x46, 0x67, 0xc3, 0x73, 0xd6, 0x39, 0x8e, 0x70, 0x49, 0x8d, 0xe8, 0x29, 0xe4,
+    0x9b, 0xcf, 0x8f, 0x66, 0x4b, 0x9d, 0xd8, 0x04, 0x03, 0xa0, 0x11, 0xbd, 0xdf, 0x1a, 0x9d, 0x45, 0x78, 0xfe, 0x9a,
+    0xf9, 0x3d, 0xc6, 0x18, 0x3b, 0x07, 0x58, 0x42, 0x92, 0x41, 0xa0, 0xf3, 0xf1, 0xf0, 0xc1, 0xb9, 0xf9, 0x06, 0x30,
+    0xd0, 0x31, 0x63, 0x00, 0xa4, 0xf9, 0x6b, 0x56, 0x02, 0x62, 0x34, 0xbc, 0xdf, 0x02, 0xfa, 0x32, 0xa7, 0x73, 0x7a,
+    0x47, 0x6f, 0x9e, 0xce, 0xcd, 0x9c, 0xc6, 0xa3, 0xd3, 0x08, 0xcf, 0x9f, 0xff, 0x32, 0x5f, 0x8c, 0xc7, 0x66, 0x42,
+    0x74, 0xf8, 0x20, 0xc2, 0x73, 0x56, 0x2c, 0x60, 0x8d, 0xce, 0x4f, 0x8f, 0xc7, 0x11, 0x76, 0x68, 0x98, 0xb5, 0xb2,
+    0x21, 0xdc, 0xf3, 0x2d, 0x66, 0x69, 0x34, 0x1a, 0xd1, 0xd6, 0x08, 0x6e, 0xfd, 0xe4, 0xcd, 0xaf, 0x85, 0x45, 0x23,
+    0x66, 0xf0, 0xc1, 0xad, 0x21, 0xcc, 0x17, 0xe0, 0xf1, 0x71, 0xc8, 0xb2, 0x8c, 0xba, 0xc4, 0xb3, 0xb3, 0xe3, 0x63,
+    0xc0, 0x3d, 0x3b, 0x43, 0x8b, 0x20, 0x6f, 0xd4, 0xdd, 0xb0, 0x90, 0x70, 0x74, 0x01, 0x51, 0x05, 0xb2, 0xfa, 0xe6,
+    0xee, 0xb5, 0xa1, 0xab, 0xed, 0xb3, 0x07, 0xb0, 0x00, 0x8a, 0x8e, 0x46, 0xaf, 0xec, 0xe1, 0x76, 0x3e, 0x3c, 0x39,
+    0x6d, 0x1f, 0x47, 0xd8, 0x6f, 0x04, 0x7a, 0xde, 0xba, 0xdf, 0x81, 0x12, 0x62, 0x74, 0x67, 0x4b, 0x8c, 0x4f, 0xe8,
+    0xc9, 0x59, 0x2b, 0xc2, 0x7e, 0x6b, 0xb0, 0xf3, 0xe1, 0xe9, 0x7d, 0xf8, 0x54, 0x53, 0x96, 0xe7, 0x06, 0xbf, 0x4f,
+    0x01, 0x2e, 0x8a, 0x3f, 0x13, 0x34, 0x8d, 0x68, 0xeb, 0xb4, 0xd3, 0x19, 0xc1, 0x67, 0xfe, 0x85, 0x15, 0x69, 0x94,
+    0xb5, 0xe0, 0xbf, 0x08, 0x07, 0x3b, 0x89, 0x0d, 0x23, 0x6c, 0xf0, 0xee, 0x8c, 0x9e, 0x9a, 0xbd, 0xef, 0x76, 0x55,
+    0xeb, 0xbc, 0x05, 0x1b, 0xd6, 0x6d, 0x2a, 0xf7, 0xa5, 0x84, 0xbc, 0x71, 0x24, 0x96, 0x46, 0x38, 0x40, 0xd0, 0xf1,
+    0xfd, 0x71, 0x84, 0xfd, 0x8e, 0x3b, 0x39, 0x3b, 0xef, 0x00, 0x29, 0xd3, 0x40, 0x28, 0x46, 0x9d, 0xe1, 0x09, 0x90,
+    0x26, 0xcd, 0x5e, 0x5b, 0x3c, 0x89, 0xb0, 0x7e, 0xaa, 0xf4, 0xab, 0x34, 0x1a, 0x9d, 0x0f, 0xc7, 0xa3, 0xf3, 0x08,
+    0x6b, 0x39, 0xa3, 0x5a, 0x1a, 0x0a, 0x78, 0x7c, 0x72, 0x3f, 0xc2, 0x06, 0xcd, 0x5b, 0xac, 0x35, 0x6a, 0x45, 0xd8,
+    0x1d, 0x25, 0x8c, 0x9d, 0x77, 0x60, 0x5a, 0x3f, 0x3f, 0xd7, 0x80, 0xcb, 0x23, 0x36, 0x3c, 0x8e, 0x70, 0x49, 0xef,
+    0x0d, 0x21, 0x82, 0x2f, 0x35, 0x93, 0x9f, 0x1d, 0xeb, 0x01, 0xa4, 0xce, 0x6f, 0x78, 0x58, 0x86, 0x97, 0x37, 0x16,
+    0x8d, 0xa8, 0xd9, 0xe2, 0xc1, 0x3d, 0xe8, 0x13, 0x1a, 0x7b, 0xb6, 0x9d, 0x93, 0xe5, 0x1a, 0x97, 0xe1, 0x45, 0x3f,
+    0xb3, 0x3b, 0x15, 0x2b, 0x65, 0x38, 0xd9, 0x20, 0x05, 0x5c, 0x00, 0x9c, 0x41, 0xbd, 0xf3, 0x99, 0x04, 0x41, 0x52,
+    0x90, 0x56, 0x57, 0x5c, 0x78, 0x3f, 0xce, 0xae, 0x80, 0xa0, 0x03, 0x90, 0x5e, 0x10, 0x4a, 0x34, 0xc4, 0x66, 0xb1,
+    0xc2, 0xa4, 0x37, 0x6f, 0x37, 0x32, 0xa5, 0xb4, 0x06, 0xf3, 0x94, 0x50, 0x1f, 0x95, 0x1d, 0x2e, 0x69, 0x21, 0x6e,
+    0x11, 0xea, 0x4a, 0x62, 0x62, 0x2c, 0xbf, 0x10, 0x3a, 0x56, 0xaa, 0x5f, 0x0c, 0x70, 0xfb, 0x0c, 0x61, 0x88, 0x5e,
+    0x40, 0xfa, 0xf2, 0xf2, 0xb2, 0x7d, 0x76, 0x60, 0x84, 0xbe, 0xcb, 0xcb, 0x73, 0xfb, 0x03, 0xfe, 0x1d, 0x54, 0x11,
+    0xa3, 0x61, 0x7c, 0x8f, 0x58, 0xa0, 0xd1, 0x33, 0xfc, 0xf5, 0x23, 0xb6, 0x5a, 0xc5, 0x8f, 0x18, 0x81, 0x19, 0xe3,
+    0x47, 0x2c, 0x31, 0xb7, 0x06, 0xd6, 0x37, 0x85, 0xf4, 0x41, 0x73, 0xd6, 0xc2, 0x10, 0xc7, 0xdc, 0x73, 0xde, 0x8f,
+    0x58, 0x9f, 0xd7, 0xfd, 0x9a, 0xab, 0xe0, 0xc1, 0x07, 0x07, 0xcb, 0x22, 0xd5, 0x56, 0x4c, 0xd0, 0x56, 0x4c, 0xd0,
+    0x56, 0x4c, 0xd0, 0x55, 0xf8, 0xf6, 0x93, 0x1e, 0x48, 0x29, 0x46, 0xd9, 0xe2, 0x78, 0xea, 0x77, 0xa0, 0xf6, 0x00,
+    0xed, 0x64, 0xaf, 0x52, 0x76, 0x94, 0xba, 0x8a, 0x9d, 0x0a, 0x8c, 0x9d, 0x89, 0x4e, 0xdb, 0x71, 0xf4, 0xef, 0xa8,
+    0x3b, 0x5e, 0xd6, 0xc4, 0xb2, 0x77, 0x3b, 0xc5, 0x32, 0x58, 0x49, 0x23, 0x9a, 0xed, 0xdb, 0x48, 0x18, 0xba, 0x7f,
+    0xdf, 0x08, 0x66, 0x55, 0x78, 0xb6, 0x06, 0x24, 0x75, 0x41, 0x0a, 0x39, 0x37, 0x52, 0x5a, 0x81, 0xd2, 0x91, 0x8e,
+    0x0b, 0xd0, 0x50, 0x7a, 0x05, 0x65, 0x19, 0x45, 0xb4, 0x61, 0x00, 0xa2, 0xac, 0x8c, 0x66, 0x65, 0xb5, 0x53, 0x10,
+    0x5d, 0x40, 0x13, 0x66, 0x24, 0x16, 0x68, 0x40, 0x98, 0x06, 0x84, 0xab, 0x0c, 0xe2, 0x8c, 0xcb, 0x3e, 0x31, 0xd9,
+    0xca, 0x64, 0xab, 0x32, 0x5b, 0xfa, 0x6c, 0x2b, 0x24, 0x4a, 0x93, 0x2d, 0xcb, 0x6c, 0x90, 0xd9, 0xf0, 0x24, 0x55,
+    0x78, 0x98, 0x4a, 0x2b, 0xaa, 0x55, 0xb2, 0xd5, 0x5b, 0x1a, 0x6a, 0x73, 0x0f, 0x0e, 0xe2, 0x52, 0x4e, 0x32, 0x6a,
+    0xe2, 0x7b, 0x4b, 0x9e, 0x14, 0x46, 0x06, 0xe2, 0xc9, 0xc4, 0xfd, 0x1d, 0xae, 0x37, 0x65, 0xa5, 0x62, 0x32, 0xfc,
+    0x46, 0x49, 0xf4, 0x97, 0x57, 0xa2, 0x3e, 0xe2, 0x26, 0xfe, 0xcc, 0x05, 0x49, 0x5a, 0xad, 0xe3, 0xf6, 0x71, 0xeb,
+    0xbc, 0xc7, 0x0f, 0xdb, 0x9d, 0xe4, 0x41, 0x27, 0x35, 0x8a, 0x88, 0xb9, 0xbc, 0x01, 0x05, 0xcc, 0x51, 0x27, 0x39,
+    0x41, 0x87, 0xed, 0xa4, 0x75, 0x7a, 0xda, 0x84, 0x7f, 0xf0, 0x7b, 0x5d, 0x56, 0x3b, 0x69, 0x9d, 0x9c, 0xf6, 0xf8,
+    0xd1, 0x46, 0xa5, 0x98, 0x37, 0xa0, 0x20, 0x3a, 0x32, 0x95, 0x30, 0xd4, 0xaf, 0x96, 0xf7, 0xd9, 0x96, 0x9e, 0xe7,
+    0xbd, 0x8e, 0x95, 0x55, 0xc5, 0x01, 0x54, 0xfd, 0xd7, 0xc4, 0x00, 0xd1, 0x7f, 0x0d, 0xcb, 0x18, 0xb1, 0xcb, 0x02,
+    0x44, 0xed, 0x47, 0x3c, 0x16, 0x0d, 0x76, 0x18, 0xdb, 0x7c, 0x0d, 0x75, 0x9b, 0x10, 0xb7, 0x0d, 0x4f, 0x5c, 0xae,
+    0x0a, 0x73, 0x27, 0x08, 0x35, 0x15, 0xe4, 0x0e, 0x5d, 0xae, 0x0c, 0x73, 0x87, 0x08, 0x35, 0x25, 0xe4, 0xd2, 0x94,
+    0x27, 0x14, 0x72, 0x74, 0x42, 0x9b, 0x06, 0x92, 0xd5, 0xa2, 0x3c, 0x67, 0x7e, 0xd8, 0x7c, 0x0c, 0xcb, 0x63, 0x08,
+    0x8a, 0x13, 0xa4, 0x05, 0xbc, 0xed, 0x51, 0x6a, 0x73, 0x5a, 0xb8, 0x54, 0xe3, 0x40, 0x46, 0x03, 0xfe, 0x39, 0x64,
+    0xe6, 0xc1, 0x87, 0x56, 0xef, 0xf8, 0xac, 0x95, 0xb6, 0xc1, 0x49, 0x19, 0x64, 0x6d, 0x61, 0x65, 0x6d, 0xe1, 0x65,
+    0x6d, 0xe1, 0x65, 0x6d, 0x10, 0xe0, 0x83, 0xbe, 0xff, 0x91, 0x35, 0xc3, 0x0f, 0x5e, 0x5a, 0x91, 0x58, 0x33, 0x81,
+    0x58, 0xaf, 0x56, 0xcb, 0x35, 0xd8, 0xf8, 0x94, 0x35, 0xa4, 0xaa, 0xd4, 0x9f, 0xcb, 0x22, 0x6d, 0xe1, 0x49, 0x0a,
+    0x5a, 0xee, 0x16, 0xa6, 0x66, 0x73, 0x7b, 0xaa, 0xb0, 0x19, 0x3f, 0xa6, 0xe7, 0xd5, 0xc9, 0x97, 0xe4, 0xd8, 0x68,
+    0x8f, 0x97, 0x45, 0xca, 0x2d, 0xcd, 0xe0, 0x96, 0x66, 0x70, 0x4b, 0x33, 0xa0, 0x11, 0x5c, 0x16, 0x36, 0x65, 0x13,
+    0x4a, 0xe0, 0x4a, 0xa0, 0x7f, 0x3c, 0x80, 0xf0, 0x79, 0xb1, 0x26, 0x66, 0xd4, 0x1b, 0x9d, 0xb7, 0x21, 0x5c, 0x98,
+    0x2d, 0xa9, 0x13, 0x6a, 0xbc, 0xa6, 0xcb, 0x31, 0x7f, 0xad, 0xa1, 0x7d, 0x02, 0x6f, 0xb9, 0x3c, 0xd4, 0x71, 0x0b,
+    0x8c, 0x26, 0xa2, 0x22, 0xea, 0x19, 0xb2, 0x90, 0x1a, 0x9d, 0x8d, 0x33, 0x86, 0xfe, 0xbc, 0xe1, 0x83, 0x6a, 0x29,
+    0x41, 0xf8, 0x82, 0xc1, 0x67, 0x56, 0x39, 0xc5, 0x97, 0xb6, 0x9e, 0xce, 0x50, 0xcb, 0x1e, 0x09, 0x5d, 0x30, 0xd8,
+    0xf6, 0xd1, 0x96, 0x7a, 0x82, 0x48, 0x65, 0xdc, 0x05, 0x49, 0x15, 0x2f, 0x18, 0xdc, 0x67, 0xc9, 0x2d, 0x35, 0xce,
+    0x24, 0x2f, 0xec, 0x9f, 0xaf, 0x34, 0xf0, 0xb6, 0x2b, 0x26, 0x43, 0xef, 0xa4, 0x7a, 0x6d, 0xa2, 0xea, 0x90, 0xfd,
+    0x7d, 0x6b, 0x4b, 0x6d, 0xbe, 0x36, 0x8d, 0xa9, 0x4d, 0xa2, 0xc9, 0x86, 0x1d, 0xea, 0xd7, 0xe8, 0x1f, 0xef, 0x2b,
+    0x56, 0x4c, 0x86, 0x28, 0xa0, 0xd9, 0x06, 0xac, 0xaa, 0x02, 0x96, 0x72, 0xf5, 0x4a, 0x17, 0x42, 0xe8, 0xdd, 0x8c,
+    0x79, 0x5d, 0x4c, 0x86, 0x3b, 0x1f, 0xfd, 0xb0, 0x3d, 0xf6, 0xde, 0xd2, 0xa0, 0x07, 0xaf, 0xda, 0x9e, 0xb2, 0xdb,
+    0xef, 0xd5, 0xb9, 0xd9, 0x59, 0x47, 0xe5, 0xdf, 0xab, 0xf3, 0x74, 0x57, 0x9d, 0x19, 0xbf, 0x8d, 0xfd, 0xde, 0xd1,
+    0x81, 0x1a, 0xdb, 0x18, 0xe8, 0x4c, 0x86, 0x10, 0xa5, 0x1d, 0xfe, 0xda, 0x58, 0x2a, 0x5d, 0x4f, 0xc2, 0x61, 0x15,
+    0x64, 0x2f, 0x39, 0x4d, 0x19, 0xa6, 0xa4, 0x73, 0x58, 0x98, 0x68, 0x2a, 0x22, 0xa1, 0x4d, 0x95, 0x50, 0x9c, 0x93,
+    0x38, 0xa6, 0x87, 0x19, 0xc4, 0x84, 0x69, 0xf7, 0x68, 0x1a, 0xd3, 0x46, 0x86, 0x8e, 0xe2, 0x76, 0x83, 0x1e, 0x66,
+    0x08, 0x35, 0xda, 0xa0, 0x33, 0x95, 0xa4, 0xdd, 0xcc, 0x21, 0x4a, 0xa4, 0x21, 0xc5, 0xf9, 0xa1, 0x48, 0x8a, 0x86,
+    0x3c, 0x54, 0x49, 0xd1, 0x48, 0x4e, 0xb1, 0x48, 0x26, 0x65, 0xf2, 0xc4, 0x24, 0x4f, 0x6c, 0xf2, 0xb0, 0x4c, 0x1e,
+    0x9a, 0xe4, 0xa1, 0x4d, 0xa6, 0xa4, 0x38, 0x14, 0x09, 0x6d, 0xc4, 0xed, 0x66, 0x81, 0x0e, 0x61, 0x04, 0x7e, 0xf4,
+    0x44, 0x84, 0xc1, 0xb9, 0xd7, 0xc6, 0xba, 0x65, 0x2e, 0x73, 0x17, 0x2e, 0xb3, 0x02, 0x52, 0xe9, 0x72, 0x04, 0x75,
+    0x9e, 0x05, 0x60, 0xc2, 0xda, 0xfe, 0xf1, 0xc1, 0xe0, 0xd6, 0x59, 0x2e, 0x45, 0xe0, 0x52, 0x05, 0x56, 0xe0, 0x9f,
+    0x9d, 0x23, 0x09, 0x40, 0x75, 0x4d, 0xf3, 0xf9, 0x94, 0x6e, 0xf9, 0xad, 0x16, 0x93, 0xa1, 0xdb, 0x59, 0x65, 0x33,
+    0x8c, 0x16, 0x36, 0xc8, 0x72, 0xdd, 0xc3, 0x10, 0x40, 0xed, 0xbd, 0x1a, 0x13, 0x6a, 0x94, 0xe4, 0xb6, 0xc6, 0xa4,
+    0x60, 0x77, 0x2a, 0xa3, 0x39, 0x8b, 0xab, 0x03, 0xb8, 0x1a, 0x26, 0x23, 0x2f, 0xc0, 0x16, 0xbd, 0x38, 0x4c, 0x8e,
+    0x1b, 0x3a, 0x99, 0x1c, 0x26, 0xa7, 0x0f, 0x1a, 0x3a, 0x19, 0x1e, 0x26, 0xed, 0x76, 0x85, 0xb3, 0x49, 0x41, 0x74,
+    0x32, 0x21, 0x1a, 0x34, 0x86, 0xb6, 0x51, 0x39, 0xa7, 0x60, 0x5c, 0xf5, 0x6f, 0x0c, 0xa3, 0xe1, 0x86, 0x21, 0xd8,
+    0xc4, 0xc6, 0x9b, 0xdc, 0x1a, 0x43, 0xd8, 0x4d, 0xe7, 0xf4, 0xb4, 0xa9, 0x93, 0x02, 0x6b, 0xbb, 0x92, 0x4d, 0x9d,
+    0x4c, 0xb0, 0xb6, 0xcb, 0xd7, 0xd4, 0xc9, 0xd0, 0x36, 0x65, 0x74, 0x80, 0x4c, 0x04, 0xc0, 0x7a, 0xce, 0x02, 0xc8,
+    0x77, 0xbc, 0x7b, 0xc8, 0x1a, 0xb4, 0x86, 0xdf, 0x2b, 0xd7, 0xf4, 0x05, 0x15, 0xd5, 0x60, 0x64, 0xc3, 0xbe, 0x55,
+    0xb4, 0x5d, 0x35, 0xc9, 0xfe, 0x75, 0xd9, 0xb2, 0xd9, 0x42, 0xea, 0x7a, 0xc1, 0x87, 0x35, 0x0c, 0x71, 0xa5, 0xdc,
+    0xc1, 0xfd, 0x8a, 0x92, 0x18, 0xa2, 0xca, 0x99, 0x53, 0x88, 0x13, 0xaf, 0x47, 0x86, 0x24, 0xde, 0x68, 0xac, 0x51,
+    0x1c, 0x9c, 0xb7, 0x4f, 0x43, 0xaa, 0xba, 0x15, 0x6a, 0x8e, 0x90, 0x68, 0x21, 0xac, 0x31, 0xe2, 0x28, 0x0a, 0x58,
+    0x10, 0xa7, 0xdd, 0xad, 0x1d, 0x10, 0x07, 0x07, 0x9b, 0xe7, 0x85, 0x0f, 0xfa, 0xbf, 0x15, 0xe8, 0xbf, 0xb2, 0x64,
+    0xf3, 0x4f, 0x11, 0x59, 0x1b, 0x57, 0x1e, 0x20, 0x8a, 0x0f, 0xfa, 0x74, 0xdf, 0x50, 0xf8, 0x7e, 0x15, 0xf1, 0xce,
+    0xe5, 0x34, 0xcf, 0x4c, 0x86, 0xe9, 0x6b, 0x10, 0x8c, 0xed, 0x4d, 0x38, 0xa1, 0xd2, 0x4a, 0xef, 0x5f, 0x76, 0x1c,
+    0x74, 0xe2, 0x9e, 0x4a, 0x09, 0x1b, 0xfd, 0x3b, 0xb4, 0x89, 0xad, 0x60, 0xe3, 0xbc, 0xa1, 0x57, 0xab, 0xda, 0xc3,
+    0x38, 0xf6, 0xf9, 0x15, 0x74, 0x70, 0xc0, 0xd5, 0x33, 0x30, 0xe3, 0x65, 0x71, 0x23, 0x3c, 0x7c, 0xff, 0xa9, 0x9d,
+    0xd6, 0x7f, 0x9b, 0x73, 0x35, 0x0d, 0x0e, 0xba, 0x87, 0xb5, 0xfc, 0x9d, 0x2b, 0xd1, 0xd3, 0x29, 0x77, 0x6b, 0xfd,
+    0x77, 0x65, 0x24, 0xbd, 0xf5, 0x44, 0xd3, 0xc1, 0x01, 0xaf, 0x02, 0x25, 0x45, 0x3f, 0x44, 0xa8, 0x67, 0x64, 0x90,
+    0x67, 0xb9, 0xa4, 0x70, 0x23, 0x0a, 0x57, 0x0c, 0x69, 0x83, 0x1f, 0x69, 0xfc, 0x87, 0xfc, 0xff, 0xd4, 0xc8, 0xa1,
+    0x4e, 0x1b, 0x3c, 0x10, 0xc0, 0x42, 0x56, 0xa8, 0x0a, 0x51, 0x68, 0x20, 0x1d, 0xda, 0x3c, 0xa3, 0xf2, 0x30, 0xa7,
+    0xf3, 0x79, 0x7e, 0x67, 0x5e, 0xa9, 0x0a, 0x38, 0xaa, 0xea, 0xa2, 0xc9, 0xc5, 0x87, 0xc3, 0x05, 0xf0, 0xf4, 0x80,
+    0x7b, 0xc8, 0xf8, 0x77, 0x96, 0x97, 0xdb, 0x02, 0x81, 0x64, 0xa6, 0x88, 0x6c, 0xb6, 0xbb, 0xea, 0x12, 0xe4, 0xb2,
+    0x66, 0x13, 0x69, 0x17, 0x36, 0x1b, 0x73, 0x90, 0xc9, 0x94, 0xf5, 0xe1, 0xdc, 0xb3, 0x05, 0x41, 0x72, 0x93, 0x46,
+    0x64, 0xdb, 0x5d, 0x8a, 0x8f, 0x63, 0x40, 0x23, 0x64, 0x05, 0xbe, 0x50, 0x58, 0xe4, 0xc0, 0x75, 0x16, 0xbe, 0xe3,
+    0x6f, 0xb4, 0x54, 0xf4, 0xd5, 0x60, 0x80, 0x0b, 0xf3, 0x30, 0x43, 0x39, 0x9f, 0x42, 0x05, 0x0f, 0xfd, 0x04, 0x22,
+    0x0a, 0x5f, 0xad, 0xf6, 0xe1, 0x1d, 0x1d, 0xd7, 0x26, 0x38, 0x7d, 0xba, 0x9f, 0xd5, 0x9b, 0x19, 0x30, 0x0e, 0x46,
+    0x5a, 0xe6, 0xa2, 0xd0, 0xc9, 0x9b, 0xec, 0x42, 0x74, 0x1b, 0x0d, 0x66, 0x42, 0x1c, 0x11, 0x88, 0x67, 0x06, 0x1e,
+    0x79, 0xf0, 0xc7, 0x46, 0x2d, 0x52, 0xcc, 0xc6, 0x7e, 0x83, 0xa0, 0xd4, 0xb5, 0x84, 0xd5, 0x4a, 0xd9, 0xd8, 0x22,
+    0x26, 0xc7, 0x46, 0x19, 0x29, 0xfb, 0x29, 0x83, 0x98, 0x56, 0x66, 0x1c, 0xdc, 0x6d, 0xf5, 0xb7, 0xd5, 0x7e, 0xde,
+    0xe3, 0xf6, 0x1a, 0x8f, 0x1b, 0x8f, 0x7d, 0x03, 0xa8, 0xe5, 0xc6, 0x06, 0xb7, 0x16, 0xe6, 0xb1, 0x35, 0x87, 0x65,
+    0x9b, 0x10, 0x14, 0xa5, 0x87, 0xba, 0xbd, 0xb9, 0xf5, 0x11, 0xfb, 0x94, 0x99, 0x93, 0x42, 0xba, 0x0f, 0x72, 0xf4,
+    0x80, 0x40, 0xe7, 0xf6, 0x67, 0x45, 0x17, 0x2a, 0x99, 0xb8, 0x1c, 0xe3, 0x2f, 0xc1, 0x6d, 0x5e, 0x3f, 0xba, 0xbe,
+    0x36, 0x9b, 0xfc, 0xfa, 0x3a, 0xc2, 0xa1, 0x59, 0x77, 0x14, 0xf0, 0x82, 0xd1, 0xa0, 0x0c, 0xea, 0x64, 0x36, 0x7e,
+    0xb3, 0x5d, 0x35, 0xf6, 0x9e, 0x56, 0x78, 0x07, 0xcb, 0x63, 0x1a, 0xdf, 0x72, 0x83, 0xec, 0x73, 0x80, 0x37, 0xeb,
+    0xf3, 0x41, 0xf7, 0x4d, 0xac, 0xd0, 0xc1, 0xc1, 0x9b, 0x58, 0xa2, 0xde, 0x15, 0x33, 0x77, 0x6e, 0xe0, 0x07, 0xdd,
+    0xe7, 0x66, 0xf8, 0x32, 0x40, 0x80, 0x2b, 0xb6, 0x29, 0xd9, 0xbc, 0x35, 0x51, 0x27, 0x52, 0x88, 0x6a, 0x0d, 0xb1,
+    0x75, 0x1d, 0x48, 0xa0, 0xd7, 0x37, 0x21, 0xb4, 0xbb, 0x8c, 0x30, 0x60, 0xe1, 0x4b, 0x2f, 0x35, 0x96, 0xcc, 0x58,
+    0x31, 0x61, 0xc5, 0x6a, 0xf5, 0x9e, 0x5a, 0xcf, 0xb3, 0x8d, 0x20, 0x89, 0xaa, 0xdb, 0x68, 0x50, 0x33, 0x7e, 0x10,
+    0x1f, 0xe8, 0x00, 0xef, 0xbf, 0x89, 0x0b, 0x84, 0xc0, 0xc2, 0x88, 0x8b, 0x85, 0xf7, 0xb2, 0xca, 0x6a, 0xeb, 0x52,
+    0xa0, 0xb2, 0x91, 0x9c, 0xb4, 0xf0, 0x94, 0x64, 0xe5, 0x1a, 0x5d, 0x4c, 0xbb, 0x8d, 0x46, 0x8e, 0x64, 0x9c, 0xf5,
+    0xf3, 0x01, 0xe6, 0xb8, 0x80, 0xcb, 0xd4, 0xed, 0x75, 0x98, 0xb3, 0x1a, 0xe5, 0x72, 0xf3, 0x5d, 0xda, 0xb1, 0xa6,
+    0x8f, 0xe8, 0x3a, 0x00, 0xc6, 0x23, 0x1a, 0x10, 0x89, 0x5d, 0x40, 0x16, 0x16, 0xc8, 0xca, 0x03, 0x59, 0x18, 0x20,
+    0x2b, 0xd4, 0x9b, 0x43, 0xb8, 0x20, 0x85, 0xd2, 0x2d, 0x8a, 0x5e, 0x0f, 0x6c, 0xe9, 0x9c, 0x26, 0x30, 0x37, 0xb1,
+    0x15, 0xdc, 0x72, 0x80, 0x03, 0x85, 0xf3, 0xc3, 0x53, 0x64, 0x19, 0x45, 0x26, 0xc6, 0x2b, 0xbe, 0x35, 0x7f, 0x92,
+    0x5b, 0x7c, 0x67, 0x7f, 0xdc, 0x05, 0xca, 0xa4, 0xe7, 0x35, 0x6d, 0x03, 0x77, 0x11, 0xd1, 0xa2, 0x24, 0x02, 0xb4,
+    0x76, 0xe1, 0xfd, 0x44, 0xfd, 0xc5, 0x33, 0x65, 0x03, 0x31, 0x88, 0x06, 0x51, 0x58, 0x04, 0xa4, 0xf3, 0xcf, 0x3f,
+    0x23, 0xd4, 0x13, 0x10, 0x47, 0xc7, 0x9d, 0x6c, 0xcd, 0x36, 0x6a, 0x44, 0x49, 0x94, 0xc6, 0x3e, 0x4c, 0x03, 0xec,
+    0x8c, 0x28, 0x0a, 0x5e, 0x3b, 0x29, 0x87, 0xf1, 0xa1, 0x36, 0x0c, 0x33, 0xa8, 0x2a, 0xf0, 0xc4, 0xe5, 0x72, 0x33,
+    0xcc, 0x8f, 0x81, 0xaa, 0x30, 0x31, 0x56, 0x90, 0x7d, 0x02, 0x8c, 0x11, 0x76, 0x70, 0xc0, 0xfa, 0x62, 0x10, 0xbc,
+    0xe9, 0x55, 0x5d, 0x87, 0xeb, 0x70, 0xe1, 0x62, 0x0a, 0x71, 0xd6, 0x57, 0x2b, 0xfb, 0x97, 0x7c, 0x30, 0xd2, 0x0c,
+    0x3c, 0xce, 0x16, 0x9c, 0xb1, 0x62, 0xb7, 0x2c, 0x96, 0x68, 0xf9, 0x3b, 0x98, 0xed, 0xb9, 0xa8, 0x79, 0xdc, 0x4d,
+    0xb5, 0xed, 0xa1, 0x3e, 0x37, 0x1a, 0x85, 0x20, 0x66, 0x6d, 0x75, 0xa4, 0xe1, 0xb9, 0x0e, 0xf3, 0x6a, 0xb1, 0x67,
+    0x33, 0x55, 0x86, 0x10, 0x85, 0x23, 0x25, 0x01, 0xbb, 0x6d, 0x43, 0x27, 0xe1, 0x47, 0x9d, 0x4a, 0x3a, 0x16, 0x12,
+    0xa0, 0xc0, 0x91, 0xb9, 0x9c, 0x37, 0x21, 0xe2, 0x19, 0xda, 0x41, 0xe4, 0x02, 0x13, 0x9a, 0xba, 0x6c, 0xe9, 0x62,
+    0x39, 0x45, 0x33, 0xb9, 0x50, 0x6c, 0x31, 0x87, 0xf3, 0xbd, 0x4c, 0xcb, 0x72, 0x9e, 0x7d, 0xae, 0xa7, 0x80, 0xfd,
+    0xe5, 0xad, 0x9e, 0x31, 0xb1, 0x88, 0xdc, 0x3c, 0xbf, 0x5a, 0x71, 0xff, 0xcd, 0x0b, 0xfc, 0x88, 0x74, 0x0e, 0xbf,
+    0xe2, 0x8f, 0x94, 0x3c, 0x6a, 0x7c, 0xc5, 0x13, 0x4e, 0x2c, 0x6f, 0x90, 0xbc, 0x79, 0x7d, 0xf5, 0xe2, 0xdd, 0x8b,
+    0xf7, 0x4f, 0xaf, 0x5f, 0xbc, 0x7a, 0xf6, 0xe2, 0xd5, 0x8b, 0x77, 0x1f, 0xf1, 0x3f, 0x94, 0x7c, 0x3d, 0x6a, 0x9f,
+    0xb7, 0xf0, 0x07, 0xf2, 0xf5, 0xa8, 0x83, 0x6f, 0x35, 0xf9, 0x7a, 0x74, 0x82, 0x73, 0x45, 0xbe, 0x1e, 0x76, 0x8e,
+    0x8e, 0xf1, 0x42, 0xdb, 0x26, 0x73, 0x39, 0x69, 0xb7, 0xf0, 0x3f, 0xee, 0x0b, 0xc4, 0xfb, 0x6a, 0x16, 0x13, 0xb6,
+    0x61, 0xfc, 0x60, 0xca, 0xd0, 0xa1, 0x32, 0x86, 0x28, 0x17, 0x01, 0x3a, 0x4d, 0x55, 0x88, 0x4e, 0x36, 0x88, 0x31,
+    0xd8, 0x30, 0x02, 0x5a, 0x71, 0xe2, 0xda, 0xe1, 0x47, 0x6d, 0x76, 0x0c, 0xf4, 0x89, 0x97, 0xc2, 0x71, 0xa9, 0xc2,
+    0x69, 0x3b, 0x2d, 0xc6, 0x38, 0x97, 0xb2, 0x88, 0x17, 0xc0, 0x08, 0x18, 0xad, 0x05, 0x3f, 0x2a, 0xa3, 0x25, 0x89,
+    0x0b, 0xd2, 0xee, 0xb5, 0x53, 0x71, 0x41, 0x3a, 0xbd, 0x0e, 0xfc, 0x39, 0xed, 0x9d, 0xa6, 0xed, 0x16, 0x3a, 0x0c,
+    0xc6, 0xf1, 0x47, 0x0d, 0xad, 0xfb, 0x03, 0xec, 0xba, 0x50, 0xff, 0x14, 0xda, 0xab, 0xf4, 0x84, 0x53, 0xc7, 0xb6,
+    0xbb, 0xe2, 0x82, 0x19, 0x3d, 0x2c, 0xff, 0x01, 0x50, 0xdb, 0x38, 0x74, 0x94, 0x1b, 0xc7, 0xfd, 0xe2, 0x47, 0x02,
+    0xd5, 0x42, 0xb2, 0xc4, 0x6c, 0xd5, 0x42, 0xc0, 0x34, 0x9a, 0x6c, 0x30, 0x07, 0x4a, 0x94, 0x2c, 0xb4, 0x0f, 0x2b,
+    0xaf, 0x9a, 0x12, 0x25, 0x73, 0x39, 0x8f, 0x6b, 0xaa, 0x86, 0x5f, 0x03, 0x33, 0xc7, 0x7d, 0xae, 0x5e, 0xd1, 0x57,
+    0x71, 0x8d, 0xe7, 0x09, 0x59, 0xbb, 0x70, 0x5b, 0xfc, 0xe2, 0xac, 0x28, 0x6a, 0xe0, 0x2a, 0x01, 0xeb, 0x47, 0xd5,
+    0xd4, 0x17, 0xf0, 0x7e, 0x1e, 0x6b, 0xe8, 0x4b, 0x12, 0x50, 0xcf, 0x9f, 0x4a, 0x33, 0xae, 0x52, 0x19, 0xed, 0x15,
+    0xd1, 0xc6, 0x2c, 0xc8, 0x2b, 0xa2, 0x2f, 0x94, 0x01, 0x82, 0x24, 0xbc, 0x2f, 0x06, 0x70, 0xe0, 0xdb, 0x01, 0x4a,
+    0x43, 0xe7, 0x40, 0xad, 0x54, 0x99, 0x09, 0x99, 0x4f, 0x13, 0x1c, 0x00, 0x34, 0x4f, 0x95, 0x0a, 0xca, 0x7c, 0x62,
+    0x89, 0x82, 0xa1, 0xff, 0x16, 0x6e, 0x80, 0xc3, 0xd8, 0xa0, 0x62, 0x90, 0x7d, 0x4f, 0xd4, 0xf3, 0xdb, 0xe7, 0xad,
+    0xa3, 0xaf, 0x41, 0xfe, 0x48, 0x79, 0x7b, 0x8f, 0xbf, 0x03, 0x4a, 0x6e, 0xc3, 0x59, 0xb5, 0xb1, 0x8f, 0x44, 0xd6,
+    0x0d, 0x01, 0x72, 0xa8, 0xd1, 0x91, 0x79, 0x4a, 0xb0, 0x8b, 0xf4, 0x21, 0x69, 0xb7, 0x20, 0x7c, 0xd8, 0x0e, 0xca,
+    0xf7, 0xd3, 0x06, 0x4c, 0x75, 0x72, 0xdb, 0x04, 0x5a, 0x0d, 0xaf, 0x0b, 0xdd, 0x35, 0x79, 0x72, 0x87, 0x55, 0x80,
+    0x33, 0xec, 0x90, 0x35, 0xc4, 0xa1, 0x40, 0x2e, 0xec, 0xaa, 0xdd, 0x00, 0x9a, 0x8a, 0x8e, 0x7d, 0xe5, 0xce, 0x1b,
+    0x47, 0x5d, 0x34, 0x93, 0xd3, 0xc3, 0xaf, 0x07, 0x07, 0xb1, 0x6c, 0x90, 0x47, 0x08, 0x2f, 0x29, 0x58, 0x31, 0x83,
+    0xd7, 0x17, 0xb7, 0x4c, 0x7c, 0xaa, 0x02, 0xea, 0xb8, 0x50, 0xb5, 0x63, 0xad, 0xea, 0xac, 0xdc, 0x0d, 0x7e, 0x4c,
+    0x1d, 0xd4, 0x08, 0xd2, 0xec, 0xe8, 0x3a, 0x35, 0x28, 0xd7, 0x5c, 0xb4, 0x60, 0x5b, 0x36, 0x3e, 0x52, 0xf4, 0xc3,
+    0xa3, 0xe6, 0xd7, 0x60, 0xc2, 0x35, 0xd3, 0xa4, 0x47, 0x8d, 0x47, 0xe8, 0x87, 0x47, 0x81, 0x93, 0x1d, 0xaf, 0xd8,
+    0x13, 0xcf, 0x8d, 0xfc, 0x64, 0xb9, 0xd2, 0x9f, 0x40, 0xb2, 0x2f, 0xc8, 0x4f, 0x80, 0xe5, 0x94, 0xfc, 0x14, 0xcb,
+    0x26, 0x04, 0x1f, 0x24, 0x3f, 0xc5, 0x05, 0xfc, 0xc8, 0xc9, 0x4f, 0x31, 0x60, 0x3b, 0x9e, 0x9a, 0x1f, 0x45, 0x09,
+    0x0c, 0x70, 0xec, 0x92, 0xd6, 0xbf, 0xab, 0x58, 0xad, 0xc4, 0xc1, 0x81, 0xb4, 0xbf, 0xe8, 0x65, 0x76, 0x70, 0x90,
+    0x5f, 0x4c, 0xab, 0xbe, 0x99, 0xde, 0x45, 0x5f, 0x0c, 0x42, 0xe1, 0xc0, 0x34, 0x8d, 0x87, 0x33, 0xfe, 0x14, 0x52,
+    0x56, 0xd3, 0x40, 0xf3, 0xb8, 0x73, 0xff, 0xec, 0x1c, 0xc3, 0xbf, 0xf7, 0x83, 0x82, 0x3f, 0x97, 0x7c, 0x17, 0x69,
+    0xb3, 0xe6, 0x59, 0x85, 0x6c, 0x97, 0x01, 0x3e, 0x63, 0x86, 0x9a, 0xe2, 0xe0, 0x80, 0x5f, 0x04, 0xb8, 0x8c, 0x19,
+    0x6a, 0x04, 0x16, 0x7b, 0x0f, 0x4b, 0x7b, 0x32, 0xc3, 0x35, 0xc1, 0xb3, 0xb2, 0xbc, 0x5f, 0x0c, 0x2e, 0xb4, 0xa3,
+    0x26, 0x61, 0xf0, 0x69, 0x45, 0x5a, 0x6e, 0x93, 0x75, 0x45, 0x53, 0x5d, 0xb6, 0xbb, 0x48, 0x12, 0xd5, 0x10, 0x97,
+    0x97, 0x6d, 0x0c, 0x2a, 0xf9, 0x9e, 0x22, 0x32, 0x15, 0xc4, 0x3b, 0xc8, 0x2d, 0x73, 0x99, 0x2a, 0x3c, 0xe5, 0xa9,
+    0xf0, 0x72, 0xf6, 0x6b, 0x6f, 0x3d, 0x6d, 0x5c, 0x16, 0x4d, 0xcf, 0x0c, 0x8b, 0x9e, 0x2a, 0x5d, 0xed, 0x60, 0x93,
+    0xaa, 0x01, 0xbc, 0xda, 0x57, 0x62, 0x1e, 0xb3, 0xfe, 0x65, 0x0c, 0xa2, 0x22, 0xab, 0x46, 0x1b, 0x32, 0xe1, 0x73,
+    0x9d, 0x2a, 0x18, 0xa8, 0x29, 0x7c, 0x01, 0x64, 0x2a, 0xab, 0x0c, 0xb3, 0x7d, 0xc3, 0x50, 0x40, 0x40, 0x81, 0x4b,
+    0xc2, 0x02, 0x09, 0x1e, 0x6e, 0x3f, 0x02, 0xc2, 0x51, 0x27, 0x17, 0x76, 0x72, 0x17, 0x0a, 0xba, 0x13, 0x83, 0x0b,
+    0xdd, 0x45, 0xa2, 0xd1, 0x70, 0xdc, 0xf6, 0xa5, 0x30, 0x83, 0x68, 0xb6, 0x07, 0x97, 0xac, 0x8b, 0x54, 0xb3, 0x59,
+    0x1a, 0x40, 0x5e, 0xb6, 0x56, 0x2b, 0x75, 0xe1, 0x1b, 0xe9, 0xf9, 0x73, 0xdc, 0xf0, 0x5d, 0x5e, 0xf0, 0xfc, 0x4d,
+    0x92, 0x7e, 0x04, 0x54, 0x15, 0xf8, 0x6c, 0x39, 0x8f, 0x70, 0x64, 0x1e, 0x74, 0x83, 0xbf, 0xe6, 0x21, 0xae, 0x08,
+    0x47, 0xee, 0x8d, 0xb7, 0x68, 0x50, 0x0d, 0x96, 0x67, 0x65, 0x78, 0x72, 0x9e, 0x5c, 0x03, 0xe3, 0xa0, 0xff, 0x56,
+    0x68, 0x59, 0xfd, 0x4e, 0x72, 0x17, 0xa8, 0x43, 0xf9, 0x67, 0xc7, 0xdc, 0xa8, 0xd6, 0xbb, 0x5d, 0x23, 0x39, 0x8e,
+    0x7c, 0x55, 0x08, 0xdf, 0xff, 0x9d, 0x77, 0x0f, 0xdb, 0xee, 0xb9, 0xed, 0x65, 0xd9, 0x03, 0x70, 0xde, 0xeb, 0x35,
+    0xc2, 0xbf, 0xc9, 0x9d, 0x6f, 0xef, 0x46, 0xd7, 0x52, 0x3c, 0xa1, 0x9a, 0x46, 0x8d, 0x37, 0xc6, 0xf0, 0xcd, 0xca,
+    0x59, 0xdd, 0x6f, 0x8d, 0x83, 0xfd, 0x5b, 0xdd, 0x43, 0xe8, 0x84, 0xda, 0x33, 0x41, 0x56, 0xf6, 0x35, 0x01, 0x33,
+    0x64, 0x60, 0xfa, 0xb6, 0x03, 0x1e, 0x7e, 0x8c, 0x14, 0x1c, 0x7a, 0x2d, 0x9f, 0x44, 0x21, 0x26, 0x69, 0xcd, 0x8d,
+    0x18, 0x52, 0x6c, 0x1f, 0xc6, 0xe5, 0x74, 0x8d, 0x42, 0xae, 0x7b, 0xac, 0xea, 0xc4, 0xb4, 0xea, 0xc6, 0x48, 0x1d,
+    0x6c, 0x93, 0x05, 0x67, 0x55, 0xef, 0x46, 0x42, 0xa9, 0x5e, 0x54, 0x33, 0xaf, 0x62, 0x36, 0xdb, 0xe6, 0x99, 0x61,
+    0xfb, 0xee, 0x9a, 0x02, 0x43, 0xde, 0xfd, 0x32, 0x5c, 0xd4, 0x25, 0x1c, 0xbb, 0x71, 0x00, 0x59, 0x49, 0x2e, 0x97,
+    0xee, 0x4d, 0x34, 0xde, 0x97, 0x83, 0x75, 0xf9, 0x42, 0x5a, 0x80, 0x07, 0xd5, 0x48, 0x45, 0x16, 0x72, 0x06, 0xfe,
+    0x79, 0xc1, 0x9a, 0x7e, 0x88, 0x7f, 0x85, 0x03, 0xbe, 0x42, 0xd2, 0xd4, 0xaa, 0x9f, 0xe0, 0xe5, 0x22, 0x50, 0x78,
+    0xdb, 0xba, 0x9f, 0x64, 0xe8, 0x22, 0x5a, 0xd7, 0xa9, 0x58, 0x2f, 0xcc, 0xba, 0x62, 0xa5, 0x2c, 0x1c, 0x1c, 0x77,
+    0x31, 0x5a, 0xa7, 0xce, 0x63, 0xd3, 0x3d, 0x77, 0xf4, 0x50, 0xf0, 0x99, 0x71, 0xa4, 0x7b, 0x56, 0x40, 0xfc, 0xaa,
+    0x50, 0x9f, 0xf6, 0xb3, 0x0c, 0xdf, 0xf3, 0xed, 0xc3, 0x3d, 0x61, 0xc9, 0x73, 0x96, 0x6f, 0x50, 0xc3, 0x02, 0x29,
+    0xa0, 0x50, 0x0a, 0x8b, 0xd5, 0x2a, 0x16, 0x26, 0xaa, 0x81, 0x0b, 0x6a, 0xeb, 0x5e, 0xaf, 0x30, 0xfa, 0x3b, 0xa8,
+    0x8b, 0xbd, 0x7a, 0xc4, 0x98, 0xb0, 0xa2, 0xf0, 0xd2, 0x49, 0x65, 0x41, 0x5f, 0xbb, 0xfa, 0x10, 0xd5, 0x94, 0x7b,
+    0xb1, 0xd1, 0xf7, 0xbe, 0xe3, 0x33, 0x26, 0x17, 0xf0, 0x6c, 0x10, 0x66, 0x44, 0x31, 0xed, 0xbf, 0x81, 0x82, 0xc0,
+    0xdb, 0x33, 0x3c, 0xc4, 0x47, 0xe0, 0xab, 0x3c, 0xad, 0x93, 0x99, 0x7f, 0x8c, 0x22, 0x32, 0xc1, 0x22, 0xa3, 0x5e,
+    0x04, 0x5e, 0x43, 0x20, 0x42, 0x11, 0x12, 0x31, 0x31, 0x8a, 0x7a, 0x91, 0x71, 0x52, 0x8a, 0xc0, 0x6a, 0x0c, 0x94,
+    0xdc, 0x11, 0x9e, 0xab, 0x8a, 0x88, 0x85, 0x35, 0x75, 0x50, 0x89, 0xa5, 0xc6, 0x4c, 0xfb, 0xa8, 0x53, 0x81, 0xb0,
+    0xc8, 0x36, 0x05, 0x65, 0xbd, 0xa1, 0x2e, 0xc0, 0x92, 0x18, 0xd3, 0x5b, 0x9e, 0x5c, 0x03, 0x37, 0xc7, 0x46, 0xae,
+    0xe8, 0x92, 0x5f, 0x81, 0x7a, 0x3a, 0x2d, 0xf0, 0xb5, 0x61, 0xd8, 0x46, 0x29, 0x5d, 0x13, 0x8e, 0x33, 0x52, 0x24,
+    0xf4, 0x16, 0xa2, 0x3a, 0xcc, 0xb8, 0x48, 0x73, 0x3c, 0xa3, 0xb7, 0xe9, 0x14, 0xcf, 0xb8, 0x78, 0x62, 0x97, 0x3d,
+    0x1d, 0x41, 0x92, 0xff, 0x58, 0xac, 0x89, 0x79, 0x94, 0xea, 0x77, 0xc5, 0x8a, 0x47, 0xc0, 0xab, 0xa8, 0x18, 0x75,
+    0x47, 0xc6, 0xa6, 0x9c, 0xe9, 0xca, 0x78, 0xfd, 0xb5, 0x8e, 0x29, 0xce, 0x70, 0x8e, 0x92, 0x5c, 0x62, 0xd6, 0x13,
+    0xe9, 0x6b, 0x88, 0xe8, 0x9c, 0x61, 0xfb, 0xa0, 0x15, 0xbf, 0x65, 0xf9, 0x33, 0x59, 0xbc, 0x37, 0x5b, 0x3e, 0x47,
+    0x50, 0x08, 0x5c, 0x54, 0x44, 0x13, 0x6e, 0xf7, 0x16, 0x3d, 0x59, 0x35, 0x45, 0x6f, 0x6d, 0x53, 0x6e, 0x88, 0x53,
+    0x08, 0x85, 0x9b, 0x4c, 0x79, 0xa3, 0x8d, 0x59, 0xaf, 0xf5, 0x9d, 0x46, 0xa7, 0xa8, 0x2c, 0x89, 0x30, 0xac, 0x55,
+    0x53, 0xa5, 0x92, 0x88, 0xa6, 0x72, 0x12, 0xde, 0xd2, 0x00, 0x3b, 0x55, 0x38, 0x93, 0x0b, 0xa1, 0x53, 0x19, 0xe0,
+    0x0d, 0xad, 0x36, 0xd7, 0xf2, 0xd6, 0x42, 0x4c, 0xe3, 0x3b, 0xfb, 0x83, 0xe1, 0x6b, 0xa3, 0xe2, 0x7f, 0x0b, 0x86,
+    0x3d, 0x2a, 0x15, 0x00, 0x3f, 0x30, 0x9c, 0x05, 0xc8, 0x59, 0x7e, 0xf2, 0x16, 0xc0, 0x67, 0x59, 0xc8, 0x3b, 0x48,
+    0x65, 0x26, 0xf5, 0x0e, 0x52, 0x19, 0xa4, 0x1a, 0x5f, 0xee, 0x7d, 0x51, 0x29, 0x8b, 0xc2, 0x06, 0x89, 0xc2, 0xa5,
+    0x3a, 0x58, 0x12, 0x91, 0x40, 0xbb, 0x46, 0x94, 0x9b, 0x71, 0x01, 0x41, 0xfd, 0xa0, 0x71, 0xfb, 0x4d, 0x6f, 0xe1,
+    0xfb, 0xce, 0xe6, 0x33, 0x9f, 0x7f, 0x67, 0xf3, 0x4d, 0x47, 0x1e, 0xe3, 0xeb, 0xb7, 0x9d, 0xc6, 0x32, 0x5e, 0x3a,
+    0xac, 0xfd, 0x50, 0x3e, 0xa1, 0xd2, 0x32, 0x4f, 0x55, 0x93, 0x36, 0x9e, 0x04, 0x48, 0xd9, 0xac, 0x78, 0xb8, 0x0e,
+    0x6e, 0xb7, 0x0e, 0x63, 0xde, 0x24, 0x6d, 0x84, 0x0e, 0x9d, 0x70, 0x25, 0x62, 0x23, 0x39, 0x1d, 0x3e, 0x3a, 0x82,
+    0xbb, 0x97, 0x99, 0xda, 0xf0, 0x95, 0xb2, 0xd5, 0x9a, 0xed, 0xd6, 0x21, 0xdf, 0x59, 0xa5, 0xd1, 0xc6, 0x33, 0x46,
+    0x96, 0xe0, 0x5c, 0x46, 0x0b, 0xab, 0x6a, 0x00, 0x27, 0xce, 0x17, 0xe2, 0xb7, 0x05, 0x1d, 0x99, 0xef, 0x43, 0x9b,
+    0xf2, 0x7a, 0xa1, 0x7d, 0x52, 0x93, 0xc3, 0x20, 0x3a, 0xc8, 0x95, 0x0c, 0x72, 0x62, 0x7e, 0x44, 0x92, 0x53, 0x74,
+    0xd1, 0xee, 0x25, 0xa7, 0x87, 0xfc, 0x90, 0xa7, 0xc0, 0xc3, 0xc6, 0x4d, 0x5f, 0xa1, 0xd9, 0xf6, 0x75, 0x1e, 0x2f,
+    0x86, 0x3c, 0x73, 0xcd, 0x57, 0x1d, 0x94, 0xa9, 0x76, 0x8e, 0x90, 0x05, 0x28, 0xe6, 0x7b, 0x09, 0xb2, 0xeb, 0xdd,
+    0x1c, 0xf2, 0x14, 0xfa, 0x81, 0x5a, 0x1d, 0x5b, 0xab, 0x1c, 0xdc, 0x6f, 0x0b, 0x40, 0x30, 0xdf, 0x51, 0x6d, 0x2e,
+    0x36, 0xbd, 0x19, 0x57, 0x9d, 0x1d, 0xf2, 0x6a, 0x84, 0x61, 0x99, 0xed, 0xfe, 0xfc, 0xd4, 0xaa, 0x2e, 0x0f, 0x03,
+    0x88, 0xfc, 0xb6, 0xe0, 0x22, 0xec, 0x34, 0xec, 0xd6, 0xe5, 0x84, 0x9d, 0xd6, 0x67, 0x19, 0x14, 0xd9, 0xee, 0x75,
+    0x6b, 0xa6, 0xf5, 0xd9, 0x5e, 0x81, 0x8f, 0x20, 0x4c, 0xca, 0xac, 0x74, 0x06, 0x57, 0xe8, 0x87, 0x1f, 0x90, 0x6b,
+    0xfd, 0xf5, 0x42, 0xfb, 0xfc, 0x12, 0x11, 0x20, 0xbb, 0xea, 0xba, 0xac, 0x0e, 0x7d, 0x94, 0x4d, 0x7c, 0x3d, 0xe4,
+    0xc1, 0xca, 0x3d, 0xbd, 0x9d, 0xcb, 0xd4, 0xe3, 0x6b, 0xaf, 0x95, 0x6e, 0x21, 0x27, 0x10, 0x0f, 0xd7, 0x5d, 0x58,
+    0x16, 0xe4, 0xec, 0xe6, 0x16, 0x4a, 0x86, 0x13, 0xf7, 0xa5, 0x3f, 0x30, 0x7b, 0xdd, 0xc0, 0x2f, 0x92, 0x53, 0x98,
+    0xfa, 0x66, 0x0f, 0x87, 0x1d, 0xe8, 0xc3, 0xc0, 0x61, 0xb3, 0x41, 0x9f, 0x59, 0x41, 0xe4, 0x31, 0x2f, 0x2c, 0x9e,
+    0x5d, 0x92, 0x76, 0x8f, 0xa7, 0x6e, 0x33, 0x19, 0xd1, 0xa8, 0xdd, 0xe4, 0xc1, 0xcc, 0x00, 0xbf, 0x5c, 0xd9, 0xb0,
+    0x88, 0x5f, 0xa7, 0x00, 0x4a, 0xbe, 0x58, 0xb5, 0x3e, 0x15, 0xbc, 0xea, 0x0d, 0xa7, 0x9b, 0xe9, 0x7e, 0xdd, 0xe0,
+    0x76, 0xd7, 0xc3, 0x13, 0x9e, 0x40, 0xb1, 0x68, 0xed, 0x27, 0x3e, 0x01, 0x0e, 0x28, 0x69, 0xdd, 0x3f, 0x05, 0x17,
+    0xca, 0x12, 0x96, 0xdb, 0xe5, 0x66, 0x5b, 0xe5, 0x2c, 0x1c, 0x6d, 0xc9, 0x80, 0x3b, 0xd8, 0x84, 0x28, 0x74, 0x70,
+    0xd8, 0xc1, 0x49, 0xbb, 0xdd, 0x39, 0xc5, 0xc9, 0xc9, 0x29, 0x0c, 0xb4, 0x91, 0x9c, 0x1e, 0xce, 0x94, 0x05, 0x60,
+    0x90, 0xb3, 0x76, 0xed, 0x3e, 0x82, 0x70, 0x49, 0xa1, 0x78, 0xcd, 0x0f, 0xe3, 0xb8, 0x9d, 0xdc, 0x6f, 0xb5, 0x4f,
+    0xcf, 0x1b, 0x00, 0xa0, 0xa6, 0xfb, 0x70, 0x35, 0x5e, 0x2f, 0x74, 0xbd, 0x4a, 0x89, 0xf0, 0xf5, 0x6a, 0x0d, 0x5f,
+    0xad, 0xd1, 0x5e, 0x57, 0x53, 0xf0, 0x55, 0x9d, 0x70, 0x6e, 0x8b, 0x78, 0xa5, 0x4d, 0xb8, 0x2d, 0x62, 0x3b, 0x90,
+    0x18, 0xa4, 0xf3, 0xe4, 0xb4, 0x73, 0x8a, 0xec, 0x58, 0xb4, 0xc3, 0x8f, 0x72, 0x9f, 0x6c, 0x15, 0x69, 0x68, 0x40,
+    0x92, 0x72, 0x76, 0x72, 0x01, 0x12, 0x35, 0x27, 0x97, 0xed, 0xe6, 0x8c, 0x25, 0x7e, 0x02, 0x26, 0x15, 0x96, 0xb3,
+    0x5c, 0x05, 0x97, 0x14, 0x00, 0xe2, 0x02, 0x8c, 0x8b, 0xee, 0x9f, 0xf6, 0xee, 0x27, 0xa7, 0x67, 0x1d, 0x4b, 0xf4,
+    0xf8, 0x45, 0xa7, 0x96, 0x66, 0xa6, 0x9e, 0x9c, 0x9a, 0x34, 0xe8, 0x3a, 0xb9, 0x7f, 0x0a, 0x65, 0x5c, 0x4a, 0x58,
+    0x0a, 0xc2, 0x3c, 0x54, 0xc5, 0x20, 0xb6, 0x43, 0x5a, 0xcb, 0x3d, 0xab, 0x65, 0x9f, 0x9f, 0x1c, 0xdf, 0x3f, 0x0d,
+    0xa1, 0x56, 0xce, 0xc2, 0x2c, 0xb4, 0x9b, 0x88, 0x9f, 0x1d, 0x2c, 0x2d, 0x3a, 0x4c, 0x4e, 0xd3, 0xad, 0x09, 0xda,
+    0x4d, 0x73, 0x68, 0x70, 0x20, 0x50, 0x38, 0x3e, 0x15, 0x4e, 0x5f, 0x12, 0xdc, 0x8f, 0x55, 0x86, 0x26, 0xa1, 0xc2,
+    0xd9, 0xdf, 0x53, 0x06, 0x2f, 0x39, 0x86, 0x57, 0x95, 0x8f, 0xa9, 0xf8, 0x42, 0xd5, 0x1b, 0x0a, 0xb1, 0x2b, 0xc4,
+    0x20, 0x72, 0x91, 0xb5, 0xeb, 0xb9, 0x3f, 0x81, 0x8b, 0x30, 0x13, 0x70, 0xa1, 0xe9, 0x95, 0xa0, 0x15, 0x2f, 0x30,
+    0x0c, 0x1d, 0x6a, 0xcd, 0xb0, 0x7a, 0x3c, 0x75, 0x26, 0x05, 0xa1, 0x6e, 0xeb, 0x39, 0xff, 0x5e, 0xb9, 0xa4, 0xbc,
+    0xca, 0x4e, 0x4e, 0x51, 0xe2, 0x2e, 0xcb, 0x93, 0x36, 0x4a, 0x02, 0x13, 0x12, 0x77, 0x24, 0x67, 0x19, 0xe9, 0x47,
+    0xb7, 0x11, 0x8e, 0xee, 0x22, 0x1c, 0x59, 0x1f, 0xe6, 0x0f, 0xe0, 0x3c, 0x1f, 0xe1, 0xc8, 0xba, 0x32, 0x47, 0x38,
+    0xd2, 0x4c, 0x40, 0x48, 0xab, 0x68, 0x80, 0x73, 0x28, 0x6d, 0x3c, 0xab, 0xcb, 0xd2, 0x8f, 0xfd, 0x57, 0xe9, 0x7a,
+    0x6d, 0x53, 0x02, 0x29, 0x73, 0x6a, 0x76, 0xa8, 0x7d, 0x92, 0x39, 0xa2, 0x9e, 0x59, 0x8f, 0x30, 0x08, 0x20, 0xf4,
+    0xce, 0x3f, 0xe9, 0x56, 0x45, 0xc3, 0x60, 0xc7, 0xb0, 0xd2, 0xe0, 0x67, 0x1e, 0x85, 0x67, 0x58, 0x84, 0xc7, 0xc2,
+    0x17, 0x06, 0xb1, 0xc2, 0xff, 0xce, 0xa5, 0x9c, 0xfb, 0xdf, 0x5a, 0x96, 0xbf, 0xe0, 0x21, 0x10, 0x67, 0xd1, 0x02,
+    0x96, 0x5b, 0x36, 0xf8, 0xce, 0x90, 0xd5, 0x47, 0x70, 0x3d, 0x76, 0x01, 0xd2, 0x40, 0x22, 0xbc, 0x36, 0x02, 0x95,
+    0x97, 0x0f, 0xaf, 0x6d, 0xb0, 0x1e, 0xf3, 0x09, 0xd1, 0xba, 0x20, 0x20, 0xaf, 0x84, 0x0b, 0x8d, 0x49, 0xc1, 0x94,
+    0x8a, 0x6c, 0x14, 0xbb, 0x48, 0x0a, 0xff, 0x2c, 0xa1, 0x4f, 0x19, 0x8b, 0xc8, 0x74, 0x58, 0x9f, 0xad, 0x15, 0x87,
+    0x73, 0x59, 0xa8, 0xd4, 0xbe, 0x51, 0xe2, 0xc1, 0x58, 0x3d, 0x55, 0x9f, 0xe6, 0xd9, 0x1a, 0xdb, 0x3b, 0xec, 0xb2,
+    0x90, 0xbb, 0xd2, 0x0e, 0x4b, 0x65, 0xd9, 0xfa, 0x5b, 0x13, 0x52, 0xb5, 0x19, 0x05, 0x13, 0xad, 0x06, 0x54, 0x85,
+    0xb2, 0x80, 0xc2, 0x36, 0x1c, 0x4a, 0xba, 0x2c, 0x4b, 0xa6, 0xcb, 0x72, 0x19, 0x4e, 0x5a, 0xad, 0xf5, 0x1a, 0x17,
+    0xcc, 0x84, 0x65, 0xd9, 0x59, 0x02, 0xf2, 0xd5, 0x54, 0xde, 0x04, 0xb9, 0x2a, 0x2d, 0x67, 0x69, 0x96, 0x28, 0x0a,
+    0x8c, 0x60, 0xa3, 0x35, 0xfe, 0xc2, 0x15, 0x07, 0x78, 0xba, 0xd9, 0x0d, 0xa5, 0xcc, 0x19, 0x85, 0xe8, 0x5d, 0x41,
+    0x93, 0x6b, 0x3c, 0xe5, 0x23, 0xb6, 0xbb, 0x4d, 0x30, 0x63, 0xfe, 0xf7, 0x5a, 0xf4, 0x08, 0x64, 0xd9, 0x3d, 0x83,
+    0x3a, 0xb0, 0x88, 0x2b, 0xe8, 0x20, 0x94, 0xc1, 0x47, 0x21, 0x6e, 0xe6, 0xf4, 0x4e, 0x2e, 0x34, 0xc0, 0x65, 0xa1,
+    0xe5, 0x1b, 0x17, 0xeb, 0x60, 0xbf, 0x85, 0x7d, 0xd8, 0x83, 0x25, 0x84, 0x0c, 0x68, 0x61, 0x1b, 0x23, 0xa2, 0x85,
+    0x87, 0x52, 0x6b, 0x39, 0x4b, 0x5b, 0xd8, 0x04, 0x6c, 0x68, 0xad, 0xcb, 0xa8, 0x5a, 0xd7, 0xe5, 0x63, 0x8e, 0xd5,
+    0x26, 0x58, 0x38, 0xe9, 0x50, 0x13, 0x1d, 0xdc, 0x1e, 0x32, 0xc2, 0x1b, 0x3f, 0x5f, 0xbd, 0x7e, 0xe5, 0x62, 0x26,
+    0xf3, 0x31, 0xb8, 0x6c, 0x3a, 0xd5, 0xd8, 0xb5, 0x79, 0x05, 0x29, 0xae, 0x14, 0xa5, 0x56, 0x38, 0x85, 0x96, 0x5f,
+    0x08, 0x9d, 0x27, 0xf6, 0xf2, 0xe2, 0x99, 0x2c, 0x66, 0xd4, 0xde, 0x18, 0xe1, 0x6b, 0xe5, 0x9e, 0x3d, 0x37, 0x2f,
+    0xab, 0x54, 0x93, 0x7c, 0xb7, 0x79, 0x15, 0xb1, 0xc8, 0x8c, 0xfc, 0x0a, 0xda, 0x00, 0x53, 0xb9, 0x7c, 0xb5, 0xb6,
+    0x20, 0x2e, 0xf2, 0x7c, 0x40, 0x5e, 0xde, 0x5a, 0xea, 0x12, 0x45, 0x0d, 0x6e, 0xf0, 0x93, 0x15, 0x3c, 0x0b, 0xae,
+    0x0b, 0x0d, 0x7b, 0xe4, 0xc4, 0x8b, 0xa8, 0x15, 0xd5, 0x5f, 0x7d, 0x35, 0xaa, 0x04, 0x1f, 0xb5, 0x34, 0xc9, 0x25,
+    0x88, 0x1e, 0xe5, 0x03, 0x73, 0x1c, 0x44, 0x13, 0x7f, 0xf7, 0x7c, 0xd9, 0xf6, 0x74, 0x36, 0xaf, 0xd4, 0x89, 0xe5,
+    0x95, 0x09, 0x78, 0x38, 0xda, 0x27, 0x5c, 0x10, 0x0e, 0x12, 0x59, 0xa9, 0x3d, 0xf4, 0xb9, 0xa8, 0x1b, 0xe7, 0x17,
+    0x6d, 0xd6, 0x3c, 0x59, 0xad, 0xf2, 0xcb, 0x36, 0x6b, 0x9f, 0xda, 0x07, 0xdf, 0x22, 0x95, 0x01, 0xcd, 0xe5, 0x63,
+    0x9e, 0x45, 0xa0, 0x9d, 0x1d, 0x67, 0x26, 0x9c, 0x82, 0x0f, 0x51, 0x4c, 0x16, 0xba, 0xea, 0x4b, 0x82, 0x71, 0x29,
+    0xb1, 0x7a, 0xfc, 0x02, 0xf5, 0xda, 0xe9, 0xb6, 0xab, 0x74, 0xb3, 0x7d, 0x18, 0x5c, 0xb8, 0x14, 0x08, 0x77, 0x20,
+    0xe4, 0x01, 0xe8, 0x77, 0x97, 0x02, 0x4c, 0x83, 0x00, 0x95, 0x15, 0x88, 0xb4, 0x7c, 0xb6, 0x98, 0x3d, 0x2b, 0xa8,
+    0x59, 0x86, 0x27, 0x7c, 0xc2, 0xb5, 0x4a, 0x29, 0x48, 0xb7, 0xbb, 0xd2, 0xd7, 0xbb, 0x25, 0xa8, 0xac, 0x16, 0xf9,
+    0x35, 0xd1, 0x3c, 0xfb, 0xac, 0xdc, 0xc2, 0x21, 0x6c, 0x56, 0x56, 0xe0, 0x0c, 0xad, 0x71, 0x2e, 0x27, 0xb4, 0xe0,
+    0x7a, 0x3a, 0xfb, 0xb7, 0x56, 0x87, 0xf5, 0xf5, 0xc0, 0x5c, 0x58, 0x01, 0x48, 0xa8, 0x18, 0xad, 0x56, 0xfc, 0xe8,
+    0xfb, 0xf7, 0x49, 0xde, 0x27, 0xbc, 0x8d, 0x3b, 0xf8, 0x18, 0x9f, 0xe2, 0x76, 0x0b, 0xb7, 0x4f, 0xe1, 0xea, 0x3e,
+    0xcb, 0x17, 0x23, 0xa6, 0x62, 0x78, 0xf9, 0x4b, 0x5f, 0x26, 0xe7, 0x87, 0x65, 0xbc, 0x7b, 0x5d, 0x24, 0x0e, 0x5d,
+    0x82, 0xb0, 0xeb, 0x2e, 0x5e, 0x5d, 0x14, 0x85, 0xc1, 0xd2, 0xc6, 0xa1, 0xea, 0xa4, 0xd4, 0x2f, 0x5c, 0x1e, 0xf7,
+    0xc0, 0x9e, 0xdb, 0xae, 0x6c, 0x13, 0xcc, 0xbe, 0xed, 0xcf, 0xb4, 0xfa, 0xd9, 0xd4, 0x25, 0x62, 0x78, 0xe8, 0x55,
+    0xe8, 0x81, 0x2e, 0x49, 0xfb, 0xe0, 0x00, 0xac, 0x8e, 0x82, 0xd9, 0x70, 0x1b, 0xfd, 0x80, 0x37, 0x6b, 0x69, 0x10,
+    0xac, 0x00, 0x8c, 0x3b, 0xdf, 0x70, 0xb2, 0xb4, 0xb0, 0xd5, 0x40, 0x85, 0x75, 0x11, 0x46, 0x74, 0x0b, 0x49, 0x85,
+    0x11, 0xa2, 0xe1, 0x08, 0x73, 0x91, 0x4e, 0xf6, 0x5b, 0x58, 0x8e, 0xc7, 0x8a, 0x69, 0x38, 0x3a, 0x0a, 0xf6, 0x85,
+    0x15, 0xca, 0x9c, 0x22, 0x43, 0x36, 0xe1, 0xe2, 0xa1, 0xfe, 0xc4, 0x0a, 0x69, 0x3e, 0x8d, 0x06, 0x23, 0x8d, 0xcc,
+    0x2a, 0x46, 0x38, 0xcb, 0xf9, 0x1c, 0xaa, 0x4e, 0x0a, 0x70, 0xfa, 0x81, 0xbf, 0x7c, 0x94, 0x86, 0x6d, 0x02, 0xf9,
+    0xfa, 0x60, 0x83, 0xd9, 0xe0, 0x51, 0x41, 0x6f, 0x5e, 0x8b, 0xc7, 0xb0, 0xa3, 0x1e, 0x16, 0x8c, 0x42, 0x36, 0x24,
+    0xbd, 0x83, 0xa6, 0xe0, 0x03, 0xda, 0x7c, 0x69, 0x00, 0x97, 0x9e, 0x9b, 0x0f, 0x5b, 0xd1, 0x47, 0x0d, 0x4c, 0xca,
+    0xb6, 0x4c, 0xa6, 0x39, 0xa5, 0xab, 0x4c, 0x1b, 0x97, 0xa9, 0x9c, 0xc2, 0x1a, 0xbb, 0xa8, 0x27, 0xe1, 0x60, 0x46,
+    0x54, 0x4d, 0xd3, 0xfe, 0xc0, 0xfc, 0x7d, 0x6d, 0x4b, 0xb6, 0xb0, 0x0b, 0xb5, 0xb3, 0xc6, 0xe6, 0xc9, 0xce, 0xa0,
+    0x7c, 0x1b, 0xc3, 0x3d, 0x2c, 0xbc, 0x1b, 0x59, 0x23, 0x9f, 0x27, 0x9e, 0x6c, 0x9e, 0xac, 0xd7, 0x66, 0x20, 0x2a,
+    0x05, 0x3d, 0xd0, 0x5b, 0xbf, 0x6d, 0x5a, 0xb0, 0x3d, 0xca, 0xaf, 0xd3, 0x16, 0x9e, 0x71, 0x78, 0x06, 0xd3, 0xb7,
+    0x77, 0xa5, 0x0b, 0xf9, 0xd9, 0x81, 0xa4, 0x15, 0xa4, 0xd8, 0xe9, 0x04, 0x9d, 0x1d, 0xe3, 0x60, 0xe4, 0x40, 0xcf,
+    0xaf, 0x3e, 0x5b, 0x58, 0xfb, 0xdf, 0x6f, 0xca, 0x82, 0x39, 0x1d, 0xb2, 0xbc, 0x9c, 0x50, 0xe6, 0xcf, 0xcf, 0x37,
+    0x3c, 0xa9, 0x50, 0xc1, 0xbd, 0x1f, 0x05, 0x7b, 0xda, 0x86, 0x98, 0x9c, 0xd1, 0xbf, 0xed, 0x0f, 0x1b, 0x11, 0xa8,
+    0xd4, 0xb2, 0x65, 0x85, 0x54, 0xea, 0xa1, 0x4d, 0xb3, 0x47, 0x0f, 0x1c, 0x91, 0x2f, 0xa1, 0x0b, 0xe0, 0xf5, 0x47,
+    0x85, 0x9c, 0x1b, 0x44, 0x70, 0xbf, 0xdd, 0xb8, 0x8d, 0xaf, 0x00, 0x78, 0x3b, 0xec, 0x55, 0xff, 0xb4, 0x80, 0xfd,
+    0x8d, 0xca, 0x92, 0x7e, 0xbc, 0x1d, 0x7b, 0xfc, 0x17, 0x12, 0xe2, 0x95, 0x5b, 0x3c, 0x4c, 0x1c, 0x3a, 0x95, 0xac,
+    0x59, 0xf9, 0x73, 0xab, 0x24, 0x60, 0x58, 0xbd, 0x60, 0xc8, 0xc6, 0x6d, 0x15, 0xb7, 0x99, 0xff, 0x41, 0x05, 0x83,
+    0x05, 0xdf, 0x1a, 0x49, 0xc5, 0xb2, 0xf8, 0xed, 0x53, 0xe7, 0xbf, 0xea, 0x1c, 0xd7, 0xbe, 0xae, 0xbd, 0x51, 0x39,
+    0x34, 0xf1, 0x81, 0x23, 0x74, 0x70, 0xb0, 0x91, 0x41, 0xc7, 0x00, 0x78, 0xe4, 0xd8, 0x2f, 0xbf, 0x7c, 0x9e, 0x1d,
+    0x33, 0x9a, 0xc7, 0x22, 0x0a, 0x99, 0x3b, 0xcf, 0xcd, 0xd9, 0x89, 0x3c, 0xa1, 0x6a, 0xea, 0x0b, 0x03, 0x1c, 0x1f,
+    0x6d, 0xa5, 0x02, 0xbe, 0x47, 0xeb, 0x1d, 0x13, 0xd8, 0xe0, 0xb7, 0xec, 0xa4, 0x76, 0x15, 0xf4, 0x0b, 0xb4, 0xdc,
+    0xc5, 0x54, 0x6e, 0x2c, 0x70, 0xb4, 0x39, 0x91, 0x9d, 0x43, 0xdf, 0xa8, 0x53, 0xb2, 0x1e, 0x4f, 0x76, 0x1b, 0x7d,
+    0x49, 0xb1, 0x2b, 0xb9, 0xa2, 0x6d, 0x43, 0x56, 0xbd, 0x53, 0xab, 0x2b, 0x53, 0xa7, 0xea, 0x9a, 0xb7, 0xb2, 0xb4,
+    0x29, 0xed, 0x92, 0xec, 0xdd, 0x16, 0x0b, 0xaf, 0xc2, 0x1b, 0x8d, 0xf2, 0x22, 0x14, 0xec, 0xb1, 0xc4, 0xa0, 0xcb,
+    0x09, 0x5c, 0x2f, 0xac, 0x56, 0x31, 0xfc, 0xd9, 0x35, 0x86, 0x5d, 0xa6, 0x4b, 0x1f, 0xf8, 0x06, 0xbf, 0x12, 0x84,
+    0xca, 0x75, 0x76, 0x90, 0x60, 0xdd, 0xe5, 0x06, 0x0d, 0xc7, 0x89, 0xff, 0x82, 0x87, 0x9a, 0xb5, 0x77, 0x39, 0x98,
+    0x64, 0xdf, 0x78, 0xdc, 0xad, 0x64, 0x2d, 0x6b, 0x71, 0xd6, 0x37, 0x24, 0x18, 0x62, 0x37, 0xa5, 0x73, 0xdc, 0x4a,
+    0xda, 0x28, 0x72, 0xc5, 0x2a, 0xf4, 0xff, 0x56, 0x91, 0xcc, 0x66, 0xfe, 0xd7, 0xd9, 0xd9, 0x99, 0x4b, 0x71, 0x36,
+    0x7f, 0xca, 0x78, 0xc0, 0x99, 0x04, 0xf6, 0x85, 0x67, 0xcc, 0xe8, 0x90, 0xdf, 0xc2, 0x50, 0x88, 0x20, 0x97, 0xc2,
+    0xb1, 0x4b, 0xf0, 0xce, 0x20, 0x50, 0x1e, 0x60, 0xff, 0x9e, 0x6c, 0x94, 0xf3, 0x0f, 0x15, 0xf9, 0x40, 0xbe, 0x65,
+    0x83, 0xec, 0x8b, 0xf9, 0xec, 0x5b, 0x33, 0x19, 0x88, 0xcd, 0x1f, 0x61, 0xfb, 0xdb, 0xb0, 0xb4, 0xce, 0x52, 0x06,
+    0x47, 0x5a, 0x2e, 0xb2, 0xa9, 0xd5, 0xfc, 0xbb, 0x0f, 0x53, 0xd6, 0x3d, 0x72, 0x03, 0x41, 0xb9, 0xc8, 0xd2, 0xc5,
+    0xa3, 0x8c, 0x7e, 0x2c, 0x43, 0x4f, 0xee, 0xbd, 0x62, 0x0b, 0xf6, 0x23, 0xde, 0xab, 0x52, 0xe0, 0xe3, 0x61, 0xc1,
+    0x69, 0xfe, 0x23, 0xde, 0xab, 0x42, 0x50, 0x82, 0x2b, 0xa4, 0x89, 0xe2, 0x88, 0xcd, 0x83, 0xce, 0x69, 0x24, 0x80,
+    0x82, 0xe6, 0x91, 0x39, 0xc8, 0x9e, 0xbb, 0xa8, 0x85, 0x49, 0x07, 0xbb, 0xb8, 0x5f, 0x36, 0x16, 0xa9, 0x0d, 0xe1,
+    0x0d, 0x91, 0xdc, 0xca, 0xd9, 0x98, 0xaf, 0x47, 0x1b, 0x0b, 0x62, 0x94, 0xc9, 0xe4, 0xf2, 0x39, 0x8f, 0xb7, 0x16,
+    0x0b, 0x85, 0xd5, 0x82, 0x05, 0xaa, 0x55, 0xa9, 0xd2, 0xc3, 0xe2, 0xdb, 0x05, 0xb3, 0xa0, 0x88, 0xd9, 0x7a, 0x0f,
+    0x6f, 0xb9, 0x22, 0x20, 0x25, 0xbb, 0x24, 0x78, 0x93, 0xdb, 0x60, 0xaa, 0x7f, 0x82, 0x1d, 0x08, 0x3d, 0x53, 0x3a,
+    0xc2, 0x26, 0x4f, 0x41, 0x24, 0xb1, 0xfd, 0x16, 0x76, 0xac, 0xd1, 0x0b, 0xe1, 0x85, 0x14, 0x38, 0x57, 0x4d, 0x13,
+    0x33, 0xca, 0x4d, 0x74, 0xb1, 0x87, 0x6a, 0xce, 0x32, 0x6d, 0x11, 0x60, 0xdf, 0xa1, 0xa1, 0x14, 0xcf, 0x0d, 0x28,
+    0xcc, 0x63, 0xd2, 0x2e, 0xe5, 0x31, 0x2c, 0x5e, 0x90, 0x02, 0x44, 0x8d, 0x8b, 0x49, 0x59, 0x67, 0x9e, 0x2f, 0x26,
+    0x5c, 0x54, 0xc8, 0x50, 0x30, 0x35, 0x97, 0x02, 0xde, 0x72, 0x28, 0x8b, 0x18, 0x3a, 0x54, 0xc3, 0x77, 0x4b, 0xc2,
+    0xca, 0x3a, 0xe6, 0x98, 0xe2, 0xa2, 0xaa, 0x01, 0xcc, 0xc5, 0xc3, 0xf0, 0xd1, 0x77, 0xf5, 0x5a, 0xbc, 0x93, 0xf3,
+    0x2a, 0xdf, 0xd3, 0x38, 0x1f, 0x32, 0xdd, 0xd9, 0x0d, 0xa3, 0xb5, 0x79, 0x6e, 0x29, 0xd8, 0xbe, 0x1f, 0x78, 0xf5,
+    0x04, 0xd9, 0xda, 0x3c, 0xd8, 0x54, 0x66, 0x0d, 0x59, 0xf9, 0x3a, 0x41, 0xd5, 0x5e, 0xbd, 0xaa, 0x14, 0xb6, 0x22,
+    0x40, 0xa5, 0xe0, 0xa3, 0xad, 0xfc, 0x27, 0xda, 0xe6, 0xdb, 0x73, 0xa8, 0x0c, 0x0f, 0xe4, 0xc9, 0x50, 0xd5, 0x03,
+    0x2e, 0xca, 0x0f, 0x01, 0x2c, 0x7e, 0x64, 0x22, 0xd7, 0xee, 0xba, 0x40, 0xe6, 0x4c, 0xc5, 0x12, 0x2f, 0xfb, 0x74,
+    0x90, 0x5a, 0x79, 0x28, 0x95, 0x60, 0xdb, 0x73, 0x53, 0x70, 0xed, 0x43, 0xe4, 0xe2, 0x3e, 0x1b, 0xa4, 0xcb, 0x7a,
+    0x18, 0x5d, 0x1b, 0xc8, 0xd7, 0x9b, 0x73, 0x9a, 0xb8, 0xb3, 0x74, 0x80, 0x73, 0x02, 0xb6, 0xc7, 0x9e, 0x3d, 0x7d,
+    0x13, 0x67, 0xa8, 0x57, 0xe7, 0xf0, 0x97, 0x6b, 0x9c, 0xe3, 0x0c, 0xa5, 0x0f, 0x63, 0xb8, 0xc0, 0x5a, 0x63, 0x00,
+    0x5f, 0x66, 0x49, 0x15, 0x78, 0xa4, 0x66, 0x46, 0x62, 0x75, 0x17, 0x81, 0x68, 0xa9, 0xc3, 0xdb, 0x71, 0xe6, 0x03,
+    0x51, 0x1b, 0xee, 0xf5, 0x99, 0x11, 0x0e, 0x27, 0x59, 0x5c, 0x3b, 0x67, 0x38, 0xb9, 0xdc, 0xe7, 0xb5, 0x13, 0x13,
+    0xac, 0xbd, 0xc3, 0x53, 0x05, 0xf4, 0x68, 0x70, 0xaa, 0x58, 0x1a, 0x02, 0x31, 0x13, 0xc0, 0x9b, 0x39, 0x3c, 0xda,
+    0x02, 0x9c, 0x8f, 0xd6, 0x38, 0xf8, 0x4a, 0x6b, 0x5d, 0x6d, 0x2a, 0x51, 0xd6, 0x6b, 0xdc, 0x9f, 0x66, 0x78, 0x94,
+    0xe1, 0x79, 0x36, 0x08, 0x8e, 0x9b, 0x59, 0x16, 0x9a, 0x74, 0xad, 0x56, 0x4f, 0x9d, 0x19, 0x21, 0xb2, 0x3f, 0x2d,
+    0xfd, 0x41, 0x3d, 0x40, 0xf8, 0x14, 0xb2, 0x80, 0x96, 0xf4, 0xdc, 0xdf, 0x86, 0x7d, 0xa7, 0x1a, 0x35, 0x62, 0x9e,
+    0x58, 0x32, 0xd2, 0xf3, 0x3f, 0xca, 0x2c, 0xdb, 0x5a, 0x23, 0x9a, 0xdf, 0xee, 0x45, 0x0d, 0xdf, 0x5e, 0xa0, 0x65,
+    0x2b, 0xcd, 0x76, 0x00, 0x51, 0xac, 0x71, 0x92, 0x0e, 0xd6, 0x48, 0xae, 0x56, 0xb1, 0x4d, 0x21, 0x3c, 0x99, 0x31,
+    0xaa, 0x16, 0x85, 0x79, 0xba, 0x2d, 0x56, 0x28, 0x31, 0xfc, 0x2e, 0x76, 0x36, 0xa2, 0xf0, 0x52, 0x9a, 0x04, 0xc3,
+    0x8d, 0x58, 0x10, 0x59, 0x13, 0xb9, 0x87, 0x59, 0x65, 0x19, 0x24, 0x88, 0x30, 0x22, 0xbf, 0xbd, 0x2e, 0x15, 0xf6,
+    0x71, 0x38, 0xfb, 0xc7, 0xf8, 0x02, 0xc2, 0xcd, 0xdb, 0x84, 0x16, 0x43, 0x3a, 0x01, 0x36, 0x16, 0xe2, 0x10, 0x6e,
+    0x25, 0xac, 0x56, 0xfd, 0x41, 0x57, 0x18, 0xf2, 0xec, 0x9e, 0xae, 0x2b, 0x1b, 0xda, 0xdd, 0x00, 0x5c, 0x75, 0x5b,
+    0x6a, 0xae, 0x8d, 0xee, 0x87, 0x9a, 0xd7, 0xb5, 0xb8, 0x4b, 0x72, 0x0f, 0x64, 0x54, 0x6f, 0x60, 0xd7, 0x2c, 0xc0,
+    0x4d, 0xe8, 0x2a, 0x3c, 0xc2, 0x0b, 0x6b, 0xc3, 0x69, 0x9e, 0x52, 0xa2, 0xe6, 0x05, 0x25, 0x78, 0xb8, 0x99, 0xb0,
+    0x7e, 0x36, 0xc0, 0x23, 0x1f, 0x68, 0x7b, 0xff, 0x6d, 0x3c, 0x42, 0xa8, 0x20, 0x06, 0xa6, 0xd6, 0x65, 0x7b, 0x54,
+    0xd9, 0xed, 0x9b, 0x4c, 0xc3, 0x30, 0x18, 0x23, 0xe6, 0x51, 0x68, 0xc4, 0x9c, 0x37, 0x1a, 0x68, 0x41, 0x46, 0x60,
+    0xc4, 0xbc, 0x08, 0x5a, 0x5b, 0xd8, 0x67, 0x36, 0x83, 0xf6, 0x16, 0x08, 0x75, 0x39, 0xd0, 0x34, 0x0d, 0x0f, 0x6a,
+    0x54, 0x0f, 0x9a, 0xfb, 0xe7, 0x9d, 0x8e, 0x3a, 0xa0, 0x48, 0x18, 0x5f, 0xfa, 0x49, 0x58, 0xd7, 0x70, 0x3b, 0xee,
+    0xb1, 0x19, 0xb7, 0xb3, 0x6d, 0x50, 0x7d, 0xd9, 0xcf, 0x06, 0x83, 0xae, 0xf4, 0x56, 0x12, 0x2d, 0x3c, 0xae, 0x9e,
+    0xe0, 0xa8, 0x16, 0xef, 0x8b, 0xde, 0xbc, 0xf2, 0xe6, 0xfe, 0x65, 0xcf, 0xcd, 0xf3, 0x18, 0x38, 0xa0, 0x7d, 0xb8,
+    0x1f, 0xaa, 0xe2, 0x83, 0x1d, 0x75, 0x20, 0x0a, 0x5a, 0xda, 0xaa, 0x09, 0xa4, 0xd6, 0xcc, 0x2e, 0xd6, 0x4d, 0x85,
+    0x0e, 0x05, 0x84, 0x21, 0x53, 0x55, 0x77, 0x77, 0x2a, 0x50, 0x0d, 0x71, 0x38, 0xf5, 0x1f, 0x5b, 0x23, 0xd6, 0x38,
+    0xea, 0x8c, 0x22, 0x63, 0x24, 0x69, 0x97, 0x0f, 0x5e, 0xdd, 0x01, 0x2b, 0x01, 0x1f, 0xfd, 0xd8, 0x24, 0x19, 0x43,
+    0x82, 0xb7, 0x2c, 0xd3, 0x86, 0x0f, 0xe1, 0x0e, 0x41, 0x79, 0x62, 0x63, 0x6d, 0xba, 0x4a, 0x16, 0x72, 0x55, 0x97,
+    0xd7, 0x01, 0x7a, 0xde, 0x95, 0xbf, 0xb1, 0xe1, 0xc8, 0x82, 0x81, 0x65, 0x5b, 0xfb, 0x04, 0x3c, 0xf2, 0x71, 0x85,
+    0x20, 0x7e, 0x29, 0x74, 0x62, 0x22, 0x45, 0x5f, 0xc1, 0x06, 0xc5, 0x73, 0x70, 0x10, 0x74, 0x12, 0x1c, 0x06, 0xef,
+    0x32, 0xab, 0x49, 0x36, 0xb8, 0x35, 0x23, 0xf1, 0x7c, 0xb5, 0x6a, 0xa1, 0xc3, 0x7f, 0xcc, 0x63, 0xc8, 0xe3, 0x52,
+    0xe1, 0x3e, 0xae, 0x14, 0xee, 0x60, 0x09, 0x48, 0xc6, 0x81, 0xae, 0x1d, 0xcb, 0x50, 0x8d, 0x0e, 0x71, 0xba, 0x5f,
+    0x40, 0xd4, 0x66, 0x77, 0x2c, 0x81, 0x9e, 0x7d, 0xab, 0x80, 0xd5, 0xb5, 0x97, 0x25, 0x90, 0x11, 0xdc, 0xfd, 0x26,
+    0x30, 0x2a, 0x44, 0xe3, 0xf3, 0x67, 0xde, 0x53, 0xe0, 0x89, 0xf3, 0xe7, 0x9a, 0x19, 0xd6, 0xbd, 0xa0, 0x37, 0xa6,
+    0xf9, 0x78, 0x8c, 0x9b, 0x63, 0x0b, 0xce, 0xa3, 0x0e, 0xfc, 0xb4, 0x10, 0x3d, 0xea, 0x60, 0x97, 0x8a, 0xc7, 0x25,
+    0x90, 0x43, 0xf4, 0x74, 0x06, 0x52, 0xc0, 0x4a, 0xc7, 0x56, 0x8b, 0x34, 0x41, 0xab, 0xd5, 0xe4, 0x82, 0xb4, 0x10,
+    0x5a, 0xaa, 0x1b, 0xae, 0xb3, 0x29, 0xf8, 0x48, 0x83, 0x62, 0xe0, 0x0d, 0xd5, 0xd3, 0x18, 0xe1, 0x31, 0x5a, 0x8e,
+    0xd8, 0x98, 0x2e, 0x72, 0x9d, 0xaa, 0x1e, 0x4f, 0x6c, 0x28, 0x5b, 0x66, 0x23, 0xc1, 0x1d, 0x75, 0xf0, 0xc4, 0xf0,
+    0x97, 0x8f, 0x8c, 0x39, 0x48, 0x91, 0x99, 0xe4, 0x89, 0x49, 0xc0, 0x3c, 0xc9, 0x72, 0xa9, 0x98, 0x6d, 0xa6, 0x6b,
+    0x6d, 0xcb, 0x21, 0x18, 0x76, 0xa4, 0x0b, 0x6e, 0xac, 0x28, 0xa3, 0x74, 0x4a, 0x54, 0x4f, 0x1d, 0x75, 0xd2, 0x09,
+    0xe6, 0x09, 0x70, 0x7a, 0xef, 0x64, 0xcc, 0x1a, 0xe5, 0xad, 0xe8, 0x0c, 0x1d, 0x4e, 0xb1, 0xa8, 0x2e, 0x51, 0x67,
+    0xe8, 0x70, 0x82, 0xf0, 0xac, 0x41, 0x72, 0x05, 0x1e, 0xc3, 0x5c, 0xfc, 0x1f, 0x29, 0xff, 0xcd, 0x61, 0x43, 0xd0,
+    0xe5, 0xb7, 0xb0, 0x53, 0xd8, 0x28, 0x4a, 0x73, 0x02, 0x5e, 0x8b, 0xed, 0x33, 0x9c, 0x91, 0x49, 0x33, 0xf7, 0x01,
+    0xf7, 0x4c, 0x2b, 0x8d, 0x5b, 0x8d, 0x0e, 0x33, 0x3c, 0xda, 0x4c, 0x8a, 0xcd, 0x5c, 0x9b, 0x79, 0x9a, 0xc1, 0xf9,
+    0x5e, 0x8d, 0xc2, 0x95, 0x5f, 0x6c, 0x26, 0x85, 0xe5, 0x1d, 0x70, 0x9b, 0x23, 0x2c, 0x9a, 0x14, 0xe7, 0x78, 0xd6,
+    0xfc, 0x8a, 0x67, 0xcd, 0x0f, 0x65, 0x46, 0x63, 0x81, 0x05, 0x04, 0xef, 0x83, 0x44, 0x3c, 0xab, 0x92, 0x47, 0x58,
+    0x34, 0x4c, 0x79, 0x3c, 0x6b, 0x54, 0xa5, 0x9b, 0x0b, 0x2c, 0x1a, 0xa6, 0x74, 0xe3, 0x03, 0x9e, 0x35, 0xbe, 0xfe,
+    0x8b, 0x49, 0x47, 0x29, 0xa0, 0xcb, 0x1c, 0x2d, 0x33, 0x3b, 0xc4, 0xab, 0xdf, 0xde, 0xbe, 0x6b, 0x5f, 0x77, 0x0e,
+    0x27, 0xd8, 0xaf, 0x5f, 0x66, 0x70, 0x2c, 0xd3, 0x31, 0x6b, 0x02, 0x44, 0x33, 0xdc, 0x39, 0x9c, 0xe2, 0xce, 0x61,
+    0xe6, 0x9a, 0x5a, 0xcf, 0x1a, 0xe4, 0x56, 0x87, 0x50, 0xd4, 0x51, 0x1a, 0xc2, 0xc7, 0x4f, 0x36, 0x9d, 0xa0, 0x1a,
+    0x28, 0xd1, 0xe1, 0xa4, 0x06, 0x2a, 0xf8, 0x5e, 0xd4, 0xbe, 0xab, 0x7a, 0x15, 0x06, 0x59, 0x28, 0xa1, 0x70, 0xcd,
+    0x0d, 0x78, 0x6a, 0x29, 0x06, 0x32, 0x61, 0x8a, 0x05, 0xca, 0x77, 0x40, 0x61, 0x94, 0x27, 0x66, 0xe8, 0xc1, 0x74,
+    0x4c, 0xe2, 0xff, 0xcf, 0x93, 0x29, 0x87, 0x5e, 0x6e, 0x99, 0xad, 0xe9, 0xb9, 0xc9, 0x84, 0xc3, 0x07, 0x1e, 0xeb,
+    0xff, 0xda, 0x81, 0x62, 0x03, 0x52, 0xfc, 0x7f, 0xe9, 0xe8, 0x42, 0x30, 0x42, 0x56, 0x94, 0x16, 0x0e, 0xf1, 0xbf,
+    0x3f, 0xac, 0xa0, 0xfb, 0x62, 0xab, 0xfb, 0xc2, 0x74, 0x1f, 0x36, 0x6d, 0x54, 0x39, 0x69, 0x55, 0xc9, 0x92, 0xff,
+    0x3a, 0xdd, 0xda, 0x02, 0x8d, 0xa8, 0xd1, 0xb3, 0x49, 0xd8, 0xe0, 0x7e, 0x3b, 0xdd, 0x81, 0xcc, 0x6b, 0x6e, 0xdf,
+    0xe6, 0x84, 0xc3, 0x37, 0xb8, 0x53, 0xbd, 0x6c, 0x81, 0xf7, 0xa6, 0x32, 0xfa, 0xca, 0x38, 0xb4, 0x1c, 0x2c, 0x36,
+    0x4d, 0xb9, 0x8d, 0xb1, 0x74, 0x72, 0x8a, 0x8d, 0x2b, 0x22, 0x54, 0xba, 0xbd, 0x04, 0xa5, 0xf8, 0x58, 0x37, 0x99,
+    0xf9, 0xba, 0xd0, 0x89, 0xb9, 0x84, 0x6a, 0x98, 0xcf, 0xbb, 0x4b, 0x9d, 0x68, 0x39, 0xb7, 0x79, 0x77, 0x17, 0xd0,
+    0x27, 0x68, 0x58, 0x1b, 0x81, 0xdd, 0x3e, 0x2b, 0x9c, 0x7e, 0xa7, 0x3a, 0x04, 0xc3, 0x03, 0xc8, 0x91, 0x16, 0xdb,
+    0x07, 0x36, 0xad, 0x61, 0xd7, 0x45, 0xb3, 0x4c, 0xb4, 0xad, 0x36, 0x4d, 0xae, 0xdd, 0xc3, 0x7c, 0x1e, 0xf2, 0x14,
+    0xbc, 0xb0, 0xfa, 0xf1, 0x1d, 0xec, 0xc6, 0x6d, 0x8d, 0x91, 0xa8, 0x2b, 0x99, 0x4a, 0xe8, 0x27, 0xb7, 0x98, 0x25,
+    0x77, 0xc6, 0x8b, 0x51, 0x19, 0x7f, 0x1f, 0x13, 0xa9, 0x3e, 0xaa, 0x24, 0x39, 0xb0, 0xec, 0x6f, 0xb0, 0xe4, 0x16,
+    0xcc, 0x13, 0xcb, 0x6a, 0x12, 0xeb, 0xe4, 0x2e, 0x58, 0x44, 0x69, 0x1a, 0x59, 0x1b, 0x06, 0xd4, 0x34, 0x63, 0xd5,
+    0x83, 0xfb, 0x10, 0xe8, 0xa1, 0x57, 0x96, 0xd2, 0xae, 0xb3, 0xb4, 0xd6, 0xbd, 0x36, 0xdd, 0x6f, 0x0e, 0x28, 0xe0,
+    0x0b, 0x03, 0xae, 0xe9, 0x5f, 0x4d, 0x22, 0x19, 0xb2, 0xaf, 0x9c, 0x15, 0x8f, 0x17, 0x85, 0xc1, 0x34, 0xd1, 0xd3,
+    0x49, 0x36, 0x6f, 0x83, 0xa9, 0x5e, 0x36, 0xef, 0xdc, 0x62, 0xf7, 0x7d, 0x67, 0xbf, 0xef, 0xb0, 0xe8, 0x31, 0x93,
+    0x91, 0x32, 0x53, 0xcc, 0x7f, 0xdf, 0xd9, 0xef, 0x3b, 0xbc, 0x3d, 0x98, 0x1b, 0x7f, 0xa1, 0x58, 0xb2, 0x33, 0x5c,
+    0x82, 0x09, 0x79, 0xc0, 0xdd, 0xd4, 0xb2, 0x4c, 0x10, 0xd8, 0x5a, 0x02, 0xc4, 0xf9, 0x7c, 0x1a, 0x57, 0xbc, 0x1a,
+    0x02, 0xee, 0xd3, 0xbb, 0xb6, 0x57, 0xa9, 0xc0, 0x63, 0x82, 0x46, 0xc4, 0xc4, 0xb6, 0x31, 0xef, 0x6a, 0x01, 0x97,
+    0x47, 0x74, 0xa9, 0x27, 0x49, 0x80, 0x57, 0x35, 0x2a, 0x6f, 0x53, 0xa4, 0xfc, 0x22, 0x41, 0x8e, 0x2f, 0xf6, 0x88,
+    0x2a, 0x06, 0xb0, 0x2a, 0x4b, 0xfa, 0x04, 0x52, 0xcf, 0x0f, 0x26, 0xfa, 0x79, 0x13, 0x79, 0xec, 0x0b, 0xb3, 0x9f,
+    0x99, 0x9e, 0x16, 0x72, 0x31, 0x99, 0x82, 0x0f, 0x2d, 0xb0, 0x0c, 0x85, 0xa9, 0x57, 0xd9, 0xfa, 0xd7, 0x24, 0x37,
+    0x01, 0x14, 0x4e, 0x37, 0x65, 0x42, 0x33, 0xbd, 0xa0, 0xb9, 0xb1, 0x24, 0xe5, 0x62, 0xf2, 0x48, 0xde, 0xbe, 0x04,
+    0xec, 0xa6, 0x44, 0x37, 0x76, 0xe4, 0xbd, 0x85, 0x1d, 0x80, 0x33, 0xc2, 0x76, 0x55, 0x7c, 0xa8, 0x40, 0xe7, 0x8f,
+    0x73, 0xc2, 0x76, 0x55, 0x7d, 0xc2, 0x6c, 0xf6, 0x94, 0x6c, 0x0c, 0xb7, 0x17, 0x67, 0x8d, 0x1c, 0x1d, 0x75, 0xd2,
+    0xbc, 0xeb, 0x89, 0x81, 0x05, 0x68, 0x00, 0xdc, 0xad, 0xed, 0x59, 0xde, 0xdd, 0x10, 0xd0, 0xbb, 0x64, 0xd2, 0x5e,
+    0x97, 0x9b, 0x94, 0xd5, 0xaa, 0x53, 0x51, 0xc1, 0x02, 0x4f, 0x83, 0xbd, 0x40, 0xed, 0xd7, 0x0e, 0x8a, 0x73, 0x95,
+    0x6d, 0x9a, 0x9e, 0x97, 0x7d, 0x77, 0x77, 0x2c, 0x32, 0xb6, 0x69, 0x6f, 0x77, 0x10, 0x09, 0xcb, 0x09, 0xeb, 0x80,
+    0x13, 0xae, 0x6a, 0x07, 0x04, 0xe8, 0x3a, 0x10, 0xb9, 0xb1, 0x24, 0xcb, 0x75, 0x65, 0x74, 0x1f, 0xf8, 0xdd, 0x52,
+    0x22, 0xdd, 0x68, 0x4b, 0x82, 0xe9, 0x13, 0x8c, 0x9a, 0xce, 0x3c, 0x8a, 0x5c, 0x7b, 0xef, 0x77, 0x53, 0xb4, 0xf5,
+    0xaf, 0x0f, 0x63, 0xb3, 0x3d, 0x4c, 0x0c, 0x65, 0x10, 0x03, 0xbd, 0x8f, 0x78, 0xb7, 0xd1, 0xc8, 0x10, 0x28, 0x64,
+    0xb2, 0x01, 0x96, 0x89, 0xd7, 0xa2, 0x1f, 0x1c, 0x18, 0x78, 0x54, 0x09, 0x08, 0x53, 0x10, 0x42, 0xc2, 0xae, 0x0d,
+    0xc2, 0x86, 0xcb, 0x55, 0xcb, 0x85, 0x8d, 0x54, 0x1b, 0x3a, 0xf8, 0x7f, 0x85, 0xcb, 0x56, 0xcf, 0x2c, 0x17, 0xc5,
+    0xe0, 0x66, 0x6e, 0xc0, 0x22, 0x41, 0x7a, 0xb4, 0xd9, 0x1e, 0x8a, 0xbb, 0x73, 0xb1, 0xd9, 0x10, 0x90, 0x98, 0xc3,
+    0x04, 0x45, 0xc3, 0xb9, 0x31, 0xc6, 0x2a, 0xa9, 0xb4, 0xac, 0x35, 0x89, 0x39, 0xf0, 0xa5, 0x0b, 0xd7, 0x7d, 0x79,
+    0x9b, 0x32, 0x7c, 0x97, 0x0a, 0x7c, 0x03, 0x9e, 0x34, 0xa9, 0xc4, 0xee, 0xf1, 0x82, 0x62, 0x4d, 0x74, 0xd7, 0xb3,
+    0xb7, 0x05, 0xac, 0xb3, 0xd9, 0x23, 0x22, 0xf8, 0x5d, 0xfd, 0x6a, 0x83, 0xef, 0x16, 0xfe, 0x0a, 0xd6, 0xcf, 0xc1,
+    0x49, 0x8a, 0x45, 0x43, 0x36, 0x0b, 0x77, 0x64, 0x40, 0xb9, 0x8a, 0x5f, 0x0e, 0x53, 0xb7, 0x8a, 0xe1, 0xda, 0xc7,
+    0x57, 0xfc, 0x61, 0xa3, 0xdd, 0x86, 0x2a, 0x8b, 0xdb, 0xbd, 0x29, 0x1a, 0xb2, 0x6a, 0x7a, 0x47, 0xe6, 0x46, 0x4a,
+    0xfd, 0xeb, 0x03, 0x6e, 0x6d, 0xb5, 0xef, 0xa7, 0xf9, 0xd6, 0xa3, 0x73, 0xd5, 0xb4, 0x4f, 0xad, 0x15, 0xc1, 0xc1,
+    0xcf, 0x16, 0x6e, 0x6e, 0x0d, 0x38, 0x80, 0x9f, 0xbf, 0xa3, 0x79, 0x9c, 0x41, 0x74, 0x7a, 0xab, 0x19, 0x5f, 0xc5,
+    0x7f, 0x8e, 0x1a, 0x71, 0x2f, 0xfd, 0x33, 0xf9, 0x73, 0xd4, 0x40, 0x3d, 0x14, 0xcf, 0x6f, 0x57, 0x6c, 0xb6, 0x82,
+    0x60, 0x6b, 0xf7, 0x8e, 0xf0, 0xeb, 0xb0, 0x24, 0xd7, 0x34, 0xe7, 0xd9, 0xca, 0x3d, 0x45, 0xb7, 0x72, 0xef, 0xf4,
+    0xac, 0xcc, 0xeb, 0x4a, 0xab, 0x58, 0x0e, 0x73, 0x08, 0x2c, 0x1c, 0xef, 0x35, 0x7b, 0xfd, 0x56, 0xf3, 0xc1, 0xc0,
+    0xfe, 0x6b, 0x22, 0xdc, 0xa3, 0x5a, 0xc4, 0xb6, 0x37, 0x1b, 0x5b, 0x3f, 0x06, 0xc3, 0x0e, 0x08, 0x05, 0x0e, 0x72,
+    0xe9, 0xe3, 0x0c, 0x59, 0xdf, 0x93, 0xd5, 0x8a, 0xb9, 0x68, 0xd6, 0x4e, 0x83, 0x5f, 0xc6, 0x66, 0x3a, 0x6c, 0x27,
+    0x9d, 0xae, 0x17, 0x63, 0x49, 0x03, 0x22, 0x4d, 0x63, 0x06, 0x81, 0xa4, 0x96, 0x86, 0xc3, 0x9a, 0xdf, 0x46, 0x69,
+    0x75, 0x7f, 0x04, 0x29, 0x3f, 0x44, 0x29, 0x3f, 0x22, 0x10, 0x40, 0xdb, 0x32, 0x47, 0x65, 0x43, 0xde, 0x77, 0xe9,
+    0x9e, 0x71, 0x66, 0x68, 0xf0, 0xd5, 0xaa, 0x55, 0x0d, 0x53, 0x14, 0xf5, 0x61, 0x2e, 0xd7, 0x58, 0x90, 0x37, 0xa0,
+    0x6b, 0x56, 0x44, 0xf4, 0x42, 0x57, 0x79, 0x78, 0x89, 0x17, 0x4b, 0x02, 0x4e, 0xfa, 0x3d, 0xd1, 0x2b, 0xc8, 0xe5,
+    0xc3, 0x18, 0x7c, 0xcc, 0x30, 0xef, 0xeb, 0x7e, 0x31, 0x18, 0xa0, 0xd4, 0x39, 0x9d, 0xa5, 0x26, 0xe2, 0x4a, 0xe0,
+    0x97, 0x5c, 0x80, 0x5f, 0xb2, 0x42, 0xac, 0x5f, 0x0c, 0xc8, 0xbd, 0x2c, 0x96, 0xe0, 0x94, 0xbf, 0xc3, 0xe7, 0xf1,
+    0x61, 0x68, 0x60, 0x6a, 0x86, 0x65, 0x2e, 0xb2, 0xc1, 0x62, 0xce, 0x5a, 0x02, 0xc1, 0xcd, 0x80, 0xbb, 0xd4, 0x86,
+    0x44, 0x63, 0x0d, 0x14, 0xdd, 0x46, 0xa1, 0x99, 0xd1, 0xd3, 0xad, 0x36, 0xfa, 0x91, 0xc3, 0x0b, 0x73, 0x0d, 0x63,
+    0x11, 0xc8, 0x5c, 0xae, 0x7a, 0xec, 0x2f, 0x3f, 0x6c, 0x56, 0x18, 0xbc, 0xc2, 0x98, 0xec, 0x94, 0x56, 0x89, 0x66,
+    0x7c, 0x95, 0x27, 0x8e, 0x21, 0xc8, 0xc4, 0x52, 0xe9, 0x86, 0x63, 0xe2, 0x4a, 0xfa, 0x4c, 0x0c, 0xd9, 0x6e, 0x78,
+    0x66, 0x2e, 0x74, 0xb3, 0xfd, 0xc3, 0xb9, 0x9d, 0x73, 0xc2, 0x8d, 0x56, 0xd2, 0x68, 0xa3, 0x9e, 0x19, 0xaa, 0xea,
+    0x82, 0xf9, 0x3d, 0x74, 0x5a, 0x5a, 0xec, 0x5c, 0xbd, 0xbb, 0xe1, 0xbb, 0x70, 0x65, 0xfc, 0x2d, 0x56, 0x85, 0x56,
+    0x64, 0xb8, 0xdd, 0x42, 0xde, 0x9c, 0xe9, 0xa1, 0x57, 0xe4, 0x42, 0x75, 0xf8, 0x8b, 0xba, 0xc2, 0x3c, 0x15, 0x19,
+    0x35, 0x84, 0x47, 0xbf, 0xd7, 0x19, 0x28, 0xff, 0x60, 0x62, 0x32, 0x67, 0xc9, 0x0d, 0x2d, 0x44, 0xfc, 0xe3, 0x0b,
+    0x61, 0x62, 0x55, 0xed, 0xc1, 0x40, 0xf6, 0x4c, 0xc5, 0x3d, 0xb8, 0x35, 0xe1, 0x63, 0xce, 0x46, 0xe9, 0x5e, 0xf4,
+    0x63, 0x43, 0x34, 0x7e, 0x8c, 0x7e, 0x04, 0x77, 0x67, 0xf7, 0x2e, 0x61, 0x19, 0x17, 0xc2, 0xdf, 0x63, 0x3d, 0x2c,
+    0x55, 0xca, 0x58, 0x7b, 0xdd, 0x72, 0x78, 0x21, 0xf5, 0x26, 0x8b, 0x1f, 0x3a, 0x62, 0x6d, 0x53, 0xb0, 0x0e, 0x29,
+    0x29, 0x3c, 0xbb, 0x62, 0x6e, 0xb5, 0x98, 0xbb, 0xd4, 0x12, 0xfe, 0xfa, 0xea, 0x61, 0xa9, 0x82, 0x86, 0x83, 0xd0,
+    0x95, 0xb6, 0x90, 0x00, 0x03, 0x97, 0xd2, 0xa7, 0xd3, 0x9d, 0x49, 0x64, 0x96, 0xc5, 0xf0, 0xee, 0x41, 0x05, 0xf3,
+    0xdf, 0xd9, 0x46, 0x58, 0x15, 0xb8, 0x5c, 0xa9, 0xa2, 0x5e, 0x4a, 0x02, 0x01, 0xe8, 0x4b, 0xef, 0x41, 0x79, 0x51,
+    0x74, 0x1b, 0x0d, 0x09, 0x5a, 0x58, 0x6a, 0xae, 0x55, 0x31, 0xdd, 0x0f, 0xdf, 0xd3, 0x0b, 0x3e, 0xbc, 0x43, 0xda,
+    0xc6, 0xa3, 0x96, 0x94, 0x50, 0xbb, 0x83, 0xf6, 0xc1, 0x2a, 0x3b, 0x28, 0xff, 0x36, 0xa6, 0xc8, 0xe6, 0xf7, 0xd9,
+    0x0f, 0xd4, 0x75, 0x38, 0x70, 0x05, 0xab, 0x5e, 0xca, 0x28, 0x18, 0xc2, 0x3e, 0x60, 0x1f, 0x8b, 0x24, 0xa3, 0xd9,
+    0x94, 0x81, 0xba, 0xdf, 0x16, 0xad, 0xe6, 0xf6, 0xa4, 0xee, 0x37, 0x64, 0x9c, 0x7d, 0x84, 0x71, 0xf6, 0x51, 0xe0,
+    0xc5, 0x22, 0xc9, 0x1f, 0x32, 0xd6, 0x38, 0x56, 0x4d, 0x81, 0x8e, 0x3a, 0xc0, 0x9d, 0x81, 0x03, 0x0f, 0xd8, 0xa2,
+    0x1c, 0x1c, 0x50, 0x67, 0x71, 0x4f, 0x1b, 0x99, 0xf7, 0xf6, 0x84, 0xda, 0x45, 0x2c, 0x70, 0xb3, 0x66, 0xa6, 0x05,
+    0xad, 0x15, 0xc6, 0x79, 0x3c, 0xe0, 0x6d, 0x9e, 0xd5, 0xe2, 0x27, 0x6c, 0x58, 0x53, 0xd5, 0x6f, 0xa0, 0x39, 0xaa,
+    0x05, 0xb9, 0x79, 0x62, 0xbc, 0x55, 0x49, 0x3f, 0x8a, 0x06, 0x96, 0x53, 0x21, 0x86, 0x64, 0xf4, 0x5b, 0x83, 0xe0,
+    0x56, 0x7b, 0xb5, 0xe2, 0x1e, 0xf1, 0x45, 0xcd, 0x5b, 0xcd, 0xdc, 0x02, 0xd0, 0x22, 0x8e, 0xca, 0x7b, 0x93, 0x08,
+    0xbc, 0x6f, 0xcb, 0x08, 0x69, 0xcb, 0xbe, 0x7d, 0x34, 0xb1, 0x54, 0x6c, 0xbe, 0xa3, 0x93, 0x41, 0x1a, 0xd9, 0x11,
+    0x45, 0xf8, 0xba, 0x84, 0x24, 0x5c, 0x25, 0x5d, 0xab, 0x4c, 0xce, 0x99, 0x4a, 0x39, 0xbe, 0x2e, 0xa4, 0xd4, 0x57,
+    0xf6, 0x4b, 0xe2, 0xea, 0x4e, 0x46, 0xe0, 0xeb, 0x09, 0xd3, 0xef, 0x68, 0x31, 0x61, 0xe0, 0x57, 0xe4, 0x6f, 0xc7,
+    0x52, 0x4a, 0x2e, 0x9f, 0x88, 0xb8, 0x4f, 0x31, 0xbc, 0xf8, 0x39, 0xc0, 0xda, 0x84, 0x40, 0x29, 0x71, 0x11, 0x2e,
+    0x88, 0xde, 0x14, 0xf2, 0xf6, 0x2e, 0x2e, 0xb0, 0x73, 0x00, 0x2c, 0x9d, 0x26, 0x01, 0xfe, 0xe5, 0x63, 0x3e, 0x56,
+    0x63, 0x4e, 0x8d, 0xae, 0xdf, 0xfd, 0x4e, 0xae, 0x81, 0xde, 0x96, 0x8e, 0x82, 0xfd, 0xd6, 0x00, 0x72, 0xe1, 0x2e,
+    0x0c, 0x2e, 0xbe, 0xc2, 0xda, 0xb2, 0x30, 0xde, 0x58, 0x00, 0xbd, 0xbf, 0x33, 0xb0, 0x60, 0xc3, 0x1c, 0x53, 0x78,
+    0x2e, 0x75, 0xc2, 0x74, 0x10, 0x15, 0xe4, 0x49, 0xf9, 0x20, 0x66, 0xad, 0xf6, 0x5b, 0x36, 0x86, 0x3b, 0x8c, 0xe4,
+    0xdb, 0x85, 0x13, 0x07, 0x1e, 0x90, 0x69, 0x32, 0xdb, 0xec, 0x1b, 0x1f, 0x79, 0xe4, 0xf5, 0x38, 0xde, 0xd5, 0x52,
+    0x98, 0x6f, 0x56, 0x74, 0x8d, 0x21, 0x14, 0x45, 0xd8, 0xef, 0x17, 0x15, 0x53, 0x54, 0x19, 0xb4, 0x41, 0xc3, 0xf2,
+    0x46, 0xfc, 0x02, 0x67, 0x0c, 0xad, 0x17, 0xb2, 0x77, 0x74, 0xd6, 0xe1, 0xcc, 0x61, 0xc6, 0x94, 0xc0, 0xa8, 0xb4,
+    0x2c, 0xe8, 0x04, 0x1c, 0x9d, 0xab, 0x0f, 0xa2, 0xe2, 0xea, 0x58, 0x01, 0x78, 0x92, 0x29, 0xfc, 0x93, 0x6f, 0x82,
+    0x75, 0xbf, 0x55, 0x33, 0x4c, 0xfd, 0x45, 0x6f, 0xbb, 0x96, 0x2f, 0x43, 0x1c, 0x69, 0x63, 0x08, 0xad, 0x73, 0x7b,
+    0x07, 0x28, 0xe2, 0x82, 0x5e, 0xa4, 0x1a, 0x5f, 0xab, 0xc5, 0xd0, 0xac, 0xaf, 0x71, 0x1d, 0xd3, 0x06, 0x51, 0xac,
+    0xbb, 0x26, 0xbe, 0xae, 0xde, 0x1f, 0x55, 0xa9, 0x82, 0x33, 0x48, 0x20, 0xac, 0xca, 0xcb, 0x86, 0x54, 0x92, 0x4b,
+    0xd3, 0xa9, 0x34, 0x9d, 0x56, 0x08, 0xe5, 0xd2, 0x93, 0xf2, 0xfe, 0x15, 0x42, 0x18, 0x98, 0x32, 0x3b, 0xb0, 0x4a,
+    0x6d, 0x61, 0x15, 0xbc, 0x7a, 0xb1, 0x81, 0x55, 0x12, 0x8e, 0xe7, 0x12, 0x8d, 0x8a, 0x0a, 0x87, 0x0c, 0xe9, 0x0b,
+    0xb1, 0x08, 0x12, 0x00, 0x8b, 0xde, 0x65, 0x2e, 0xef, 0x7b, 0x38, 0x14, 0xf6, 0x24, 0x93, 0x70, 0xba, 0x09, 0xcd,
+    0xe1, 0x61, 0x5a, 0xd5, 0xf3, 0x08, 0x01, 0x4b, 0xcf, 0x31, 0x3c, 0x48, 0xfc, 0xfd, 0x87, 0x50, 0x9d, 0x05, 0x79,
+    0xfa, 0x2f, 0x51, 0x12, 0x1a, 0xfb, 0xcf, 0xf1, 0xd0, 0x21, 0x61, 0x38, 0xf0, 0xcd, 0x11, 0x56, 0x38, 0xb8, 0x55,
+    0xc4, 0x67, 0x70, 0x87, 0x8f, 0x75, 0xe8, 0x01, 0x60, 0x09, 0xc5, 0x21, 0xc8, 0x37, 0x50, 0xcc, 0xe0, 0x80, 0x26,
+    0xcb, 0xf0, 0x02, 0x17, 0xac, 0x16, 0xca, 0xfb, 0xdb, 0x96, 0x97, 0xd2, 0x6a, 0x97, 0xbc, 0xc6, 0x1c, 0xa8, 0xfc,
+    0x0c, 0x2f, 0x7c, 0x85, 0x79, 0x29, 0xd9, 0x7d, 0xe1, 0x6b, 0x07, 0xf4, 0x14, 0x02, 0x46, 0xba, 0xdf, 0x6b, 0xc2,
+    0x3d, 0x45, 0x2f, 0x73, 0x71, 0xd8, 0x76, 0xd0, 0xbd, 0xc0, 0x5c, 0x5d, 0x55, 0x59, 0x73, 0x30, 0x85, 0x06, 0x07,
+    0x55, 0x38, 0x23, 0x30, 0x57, 0x2f, 0xca, 0x82, 0x73, 0x10, 0xef, 0x7b, 0xc2, 0xe4, 0x94, 0xd1, 0x00, 0x5e, 0x64,
+    0xe5, 0xa3, 0x53, 0x3d, 0x0e, 0x2e, 0xe3, 0x86, 0x4d, 0x7c, 0x21, 0x7c, 0x2a, 0xb0, 0x92, 0xd6, 0x38, 0x34, 0xa2,
+    0x23, 0x3a, 0x07, 0xb3, 0x0d, 0xa0, 0xe0, 0xee, 0x7c, 0xd8, 0x58, 0xa8, 0xe0, 0x31, 0xd8, 0xda, 0xdb, 0xcd, 0x84,
+    0x38, 0x93, 0xa6, 0xe0, 0x6e, 0xdb, 0x20, 0x83, 0x37, 0xbf, 0xfd, 0xb7, 0xc2, 0x22, 0xc1, 0x80, 0x4a, 0x4d, 0x12,
+    0x84, 0x27, 0x28, 0x8d, 0x74, 0x2b, 0x37, 0x13, 0x48, 0x27, 0xa2, 0x66, 0xd4, 0xbd, 0x71, 0xbe, 0x3a, 0x6a, 0x20,
+    0x2a, 0x6a, 0xa0, 0x02, 0x6a, 0x20, 0xeb, 0xdb, 0xbf, 0x80, 0x85, 0xb0, 0x11, 0xaa, 0x44, 0x10, 0x10, 0x61, 0xae,
+    0x0d, 0x1f, 0x50, 0x24, 0x21, 0xe4, 0x0d, 0xa0, 0x62, 0x4a, 0x5e, 0x82, 0xd1, 0x38, 0xbc, 0xde, 0x03, 0xee, 0x97,
+    0x96, 0x61, 0xf0, 0x9c, 0x82, 0xc9, 0x7f, 0xeb, 0xf3, 0xa1, 0x7a, 0xb9, 0x3a, 0x08, 0xe1, 0x17, 0x10, 0x2b, 0xc2,
+    0xf1, 0x17, 0xbf, 0x00, 0xd9, 0x54, 0x58, 0x1e, 0x1c, 0x48, 0x10, 0xf8, 0x21, 0x8a, 0x70, 0xc0, 0x33, 0xbc, 0xcc,
+    0x36, 0x88, 0x9e, 0x9f, 0x95, 0xaa, 0x66, 0x25, 0x83, 0x59, 0x15, 0x9e, 0xc6, 0xd1, 0x35, 0x61, 0x20, 0xb8, 0x50,
+    0xbb, 0x6f, 0x10, 0x02, 0x65, 0xcb, 0x8d, 0xa1, 0x4b, 0x4f, 0xc1, 0x7c, 0x34, 0x8e, 0xde, 0x32, 0x78, 0xd2, 0xd6,
+    0x98, 0xfc, 0x33, 0x6d, 0x1e, 0xb8, 0x4f, 0xf7, 0xa2, 0x46, 0xe0, 0xa4, 0x4e, 0x51, 0xf2, 0xb7, 0xe4, 0x22, 0x8e,
+    0x9a, 0x97, 0x11, 0x6a, 0xc0, 0xbf, 0x0d, 0x8e, 0xba, 0x34, 0xa1, 0xa3, 0x91, 0x0f, 0x7e, 0x93, 0x11, 0xb3, 0xc9,
+    0x56, 0x2b, 0x51, 0x11, 0xf4, 0xc4, 0x6e, 0x30, 0x60, 0x25, 0x5e, 0x00, 0xfb, 0x60, 0x39, 0x58, 0xf2, 0x4e, 0xc4,
+    0xca, 0x9f, 0x52, 0x18, 0xac, 0x9e, 0x33, 0x84, 0x70, 0x16, 0xc4, 0x6c, 0xfc, 0xcf, 0x67, 0x1a, 0xae, 0x9f, 0x9f,
+    0xaf, 0x63, 0x44, 0xa4, 0x0f, 0x22, 0x57, 0x63, 0x47, 0x44, 0x10, 0xb6, 0x4c, 0xf7, 0x5d, 0x99, 0x1f, 0xbc, 0x75,
+    0xf5, 0xc0, 0x86, 0x8b, 0x03, 0x03, 0x6a, 0x14, 0x18, 0xad, 0xe0, 0x9c, 0x94, 0x03, 0x07, 0x25, 0x84, 0x66, 0x45,
+    0x3c, 0x25, 0x97, 0x10, 0x09, 0x2f, 0x43, 0x5d, 0x30, 0x2c, 0x08, 0x24, 0xa8, 0x29, 0x48, 0x50, 0x99, 0xaf, 0x3d,
+    0x82, 0x59, 0xe7, 0x66, 0xb6, 0x53, 0xd4, 0x75, 0x41, 0x7e, 0x7e, 0xd1, 0xf1, 0x08, 0x58, 0xda, 0x83, 0x83, 0x02,
+    0x22, 0x88, 0x01, 0x05, 0x2f, 0x25, 0xc0, 0x40, 0x03, 0x5e, 0x6c, 0x68, 0xc0, 0xe7, 0xda, 0x78, 0x1d, 0x18, 0x5b,
+    0x9f, 0x32, 0xc8, 0xc5, 0xb3, 0x6a, 0x4f, 0x13, 0x42, 0xf6, 0x5b, 0x3d, 0x9d, 0x6e, 0x47, 0x48, 0xec, 0x7d, 0xd4,
+    0x26, 0xd0, 0x98, 0x23, 0xdd, 0xd5, 0xc6, 0xfc, 0x5a, 0xd3, 0x23, 0x56, 0x93, 0x90, 0x2e, 0x48, 0x97, 0xe7, 0xd3,
+    0x9e, 0xc1, 0x15, 0xab, 0x34, 0x72, 0x70, 0x01, 0xfa, 0x6c, 0x40, 0x80, 0x02, 0x95, 0xa6, 0x12, 0x45, 0x11, 0x17,
+    0x49, 0xc9, 0x86, 0x61, 0x06, 0x61, 0x0a, 0xab, 0x95, 0xa0, 0x1b, 0x6b, 0x00, 0xbc, 0x33, 0xb3, 0x7f, 0x4a, 0x1f,
+    0x6c, 0xba, 0xf6, 0xe6, 0x11, 0x40, 0x40, 0xf6, 0xdb, 0x25, 0xbb, 0x2e, 0x36, 0x2a, 0xb3, 0xb0, 0x96, 0xb1, 0x95,
+    0xdb, 0xf6, 0x18, 0x7b, 0x27, 0xb6, 0xf9, 0x04, 0x08, 0x51, 0x5b, 0x32, 0x8d, 0x10, 0x21, 0xb1, 0x88, 0x75, 0x6d,
+    0xc8, 0x46, 0x1b, 0xda, 0x37, 0x4f, 0xc2, 0x43, 0xec, 0x03, 0x50, 0xbc, 0x39, 0x2e, 0xc1, 0x21, 0xbc, 0xf0, 0x08,
+    0x7f, 0x0b, 0x2c, 0x52, 0x81, 0x19, 0x96, 0xab, 0x15, 0xd4, 0xf3, 0x78, 0x9f, 0x6d, 0x06, 0x27, 0x95, 0x1b, 0x63,
+    0x97, 0x76, 0xe2, 0x71, 0xd9, 0x84, 0xc4, 0x19, 0xf4, 0xeb, 0x2b, 0xa2, 0xde, 0x7e, 0x3b, 0x7d, 0xe2, 0xdf, 0x2b,
+    0x73, 0x3b, 0x10, 0x1b, 0xd6, 0x1b, 0xac, 0x3e, 0x80, 0x96, 0xbf, 0xca, 0xfc, 0x43, 0x65, 0xc1, 0x4d, 0x82, 0xda,
+    0x5c, 0xc4, 0x2e, 0xeb, 0x22, 0x46, 0x6a, 0x8b, 0xbb, 0x43, 0x88, 0x7f, 0xb5, 0x15, 0xc5, 0x80, 0x27, 0x15, 0xff,
+    0x1c, 0xa3, 0x2e, 0x84, 0xa2, 0xb6, 0x1e, 0x36, 0x40, 0x69, 0x97, 0xeb, 0x4a, 0x8c, 0x0c, 0x09, 0xe4, 0x5b, 0x17,
+    0x5e, 0xd0, 0x9c, 0x44, 0x0a, 0xe4, 0xe4, 0x20, 0x2a, 0x69, 0xb6, 0x21, 0xcc, 0x75, 0xb7, 0x70, 0xcc, 0x5c, 0x6d,
+    0xd0, 0x22, 0x7e, 0x01, 0xec, 0x0c, 0x37, 0x92, 0xa5, 0x03, 0x9f, 0xaa, 0x81, 0xcf, 0xaf, 0xb9, 0xa1, 0x28, 0x0a,
+    0xf5, 0xde, 0xd9, 0x47, 0xe6, 0xe0, 0x77, 0x1a, 0x88, 0x8f, 0xd4, 0xe9, 0x48, 0x36, 0x42, 0xad, 0x39, 0x3b, 0x5e,
+    0xb6, 0x19, 0x61, 0x50, 0xd8, 0xe8, 0x7d, 0x15, 0xb2, 0x8a, 0x9d, 0x9d, 0x8a, 0x60, 0x4e, 0x5f, 0x54, 0xe5, 0x9c,
+    0xca, 0x2d, 0xa3, 0x5a, 0x6a, 0x1a, 0x20, 0xc2, 0x95, 0x4f, 0x24, 0xef, 0x33, 0x13, 0xfe, 0xc1, 0x60, 0x5c, 0x3d,
+    0x52, 0xf8, 0xfb, 0x5d, 0xb1, 0x43, 0xb6, 0xa3, 0xc3, 0x6d, 0x04, 0xcd, 0x0b, 0x15, 0x3c, 0xe0, 0xa8, 0x64, 0x09,
+    0x91, 0x22, 0x97, 0xfb, 0xaa, 0x66, 0xca, 0x76, 0x1d, 0x21, 0x84, 0xb4, 0xc7, 0x59, 0x37, 0xb4, 0x7a, 0xe8, 0x91,
+    0x2a, 0xca, 0xe1, 0x16, 0xcd, 0x75, 0x01, 0x2a, 0x8c, 0x40, 0xba, 0xfc, 0xcc, 0xee, 0x52, 0x09, 0xd1, 0xcb, 0xd7,
+    0x2e, 0x84, 0xb1, 0xb3, 0xb2, 0xc4, 0x85, 0x19, 0xb5, 0x0d, 0xa3, 0xeb, 0x36, 0x86, 0xb3, 0x81, 0x31, 0xd3, 0xa0,
+    0xa4, 0x05, 0xa1, 0xae, 0xbb, 0xf4, 0x22, 0x33, 0x81, 0x1e, 0x73, 0x42, 0x1b, 0x0c, 0x4f, 0x89, 0x06, 0xcb, 0xa6,
+    0x02, 0x2c, 0xf8, 0x96, 0x45, 0x6a, 0x6d, 0x36, 0x59, 0xfc, 0x51, 0xc7, 0xe6, 0x69, 0xbf, 0xbc, 0x62, 0x9e, 0x0b,
+    0x47, 0xdd, 0x9e, 0x67, 0x3e, 0x1e, 0xdd, 0xd3, 0x37, 0x57, 0x2f, 0x5e, 0xbe, 0x7e, 0xb5, 0x5a, 0xb5, 0x59, 0xb3,
+    0x7d, 0x82, 0x7f, 0xd2, 0x65, 0x3c, 0xd8, 0x32, 0x0a, 0xd0, 0xc1, 0xc1, 0x3e, 0x37, 0x2e, 0x3c, 0x9f, 0xf9, 0x1c,
+    0xe2, 0x06, 0xe9, 0x01, 0xce, 0x8a, 0x32, 0x26, 0xc8, 0x6d, 0xd4, 0x8b, 0xee, 0x22, 0x50, 0x42, 0x55, 0xe4, 0xef,
+    0xc3, 0xe6, 0xec, 0xf7, 0x20, 0x30, 0x11, 0xd4, 0x87, 0x08, 0x20, 0x10, 0xaf, 0x14, 0x17, 0x84, 0xf9, 0x04, 0x88,
+    0xe2, 0xbd, 0x00, 0xce, 0xd4, 0x44, 0xad, 0x5a, 0xa8, 0xb8, 0x00, 0x92, 0x68, 0xc3, 0x51, 0xd2, 0x23, 0x13, 0xc0,
+    0x1b, 0x82, 0x52, 0xda, 0x5f, 0xdd, 0xdc, 0xb9, 0x4b, 0xe5, 0xa8, 0xd7, 0x4a, 0x73, 0x3c, 0x75, 0x9f, 0x53, 0xf8,
+    0x9c, 0x76, 0xfd, 0xe9, 0x20, 0x0e, 0x73, 0xbc, 0x20, 0xe2, 0xd0, 0x3f, 0x8b, 0xb8, 0x9c, 0x17, 0xec, 0x0b, 0x97,
+    0x0b, 0x95, 0x2e, 0x6f, 0x53, 0x99, 0xdc, 0x36, 0x47, 0x87, 0x71, 0x91, 0xdc, 0x36, 0x55, 0x72, 0x8b, 0xf0, 0x5d,
+    0x2a, 0x93, 0x3b, 0x9b, 0x72, 0xd7, 0x54, 0x70, 0xf3, 0x85, 0x05, 0x1c, 0x8a, 0xb6, 0x68, 0x63, 0xb1, 0x59, 0xd4,
+    0xa6, 0xb8, 0xa2, 0x01, 0x06, 0xff, 0xbe, 0x63, 0xe3, 0x87, 0xe1, 0x4b, 0x70, 0x69, 0xd2, 0x44, 0x7e, 0x02, 0xe9,
+    0xa7, 0x55, 0x19, 0xb8, 0x4f, 0x49, 0xab, 0x3b, 0xbd, 0x10, 0xcd, 0x76, 0xb7, 0xd1, 0x98, 0xc2, 0xde, 0xcd, 0x48,
+    0xee, 0x8b, 0x4d, 0x1b, 0x26, 0xbe, 0xce, 0x7e, 0xb6, 0x5a, 0xed, 0xe7, 0xc8, 0x6c, 0xb8, 0x09, 0x8b, 0x75, 0x7f,
+    0x3a, 0xc0, 0x2d, 0xfc, 0x3c, 0x43, 0x68, 0xc9, 0xfa, 0xd3, 0x01, 0x61, 0xfd, 0x69, 0xa3, 0x3d, 0xb0, 0x86, 0x76,
+    0x66, 0x2b, 0xae, 0x21, 0x84, 0xe6, 0x74, 0x70, 0x64, 0x4a, 0x4a, 0x97, 0x6f, 0xbf, 0x68, 0x15, 0xd0, 0x4f, 0xd5,
+    0x82, 0x97, 0x49, 0xdc, 0x81, 0xbe, 0xe8, 0x85, 0x7d, 0xba, 0xb5, 0x20, 0xc7, 0x47, 0x95, 0xab, 0x3d, 0x45, 0xd8,
+    0xf4, 0xa4, 0x0e, 0x8b, 0x43, 0xd3, 0x8c, 0xeb, 0x52, 0xba, 0xef, 0x50, 0x33, 0xf2, 0xd1, 0xc1, 0x02, 0x10, 0xa4,
+    0x82, 0x47, 0x56, 0xb8, 0x70, 0x4a, 0x21, 0x5c, 0x1c, 0x54, 0xb6, 0x60, 0x92, 0x93, 0x56, 0x37, 0x37, 0x96, 0xfe,
+    0xb9, 0x8b, 0x68, 0x4a, 0x31, 0x25, 0x99, 0x2f, 0x99, 0x1b, 0xb0, 0xd0, 0x4d, 0xca, 0x33, 0x05, 0xbd, 0xd2, 0x00,
+    0x8f, 0x08, 0xc4, 0x43, 0xea, 0x16, 0xc6, 0xc0, 0x2b, 0x9e, 0x36, 0x8b, 0x3e, 0x1b, 0xa0, 0xa3, 0x63, 0x4c, 0xfb,
+    0x7f, 0x65, 0xf3, 0x36, 0x3c, 0x16, 0xf8, 0xd7, 0x80, 0x4c, 0x9b, 0xb2, 0x4c, 0x10, 0x90, 0x30, 0x6a, 0xca, 0x43,
+    0xd8, 0x4b, 0x08, 0x67, 0xb6, 0x62, 0xd6, 0x67, 0x83, 0xe6, 0xb4, 0xac, 0xd8, 0xf1, 0x15, 0x1b, 0xb2, 0x4c, 0xb0,
+    0x15, 0x1b, 0xae, 0x62, 0xf8, 0x3a, 0x83, 0x01, 0x41, 0x08, 0x00, 0x06, 0x00, 0xd0, 0x28, 0x88, 0xe6, 0x8b, 0x15,
+    0xf1, 0x9b, 0xdd, 0xde, 0xe3, 0xb7, 0xc0, 0x02, 0xad, 0xb6, 0xff, 0x77, 0xa1, 0x0c, 0xd8, 0x53, 0x16, 0x26, 0x66,
+    0x6e, 0x61, 0x55, 0x74, 0x00, 0x95, 0x12, 0x61, 0x0a, 0x03, 0x99, 0xfd, 0xcc, 0x40, 0x2d, 0xd0, 0x1a, 0xe4, 0x7d,
+    0x3d, 0x68, 0x66, 0x70, 0xc4, 0xc0, 0x3b, 0x34, 0x64, 0x6a, 0x8c, 0x09, 0xe3, 0x1c, 0xa6, 0x98, 0x19, 0xf0, 0x4c,
+    0xd3, 0xd6, 0x5a, 0x1a, 0x59, 0xae, 0x97, 0xf7, 0xfe, 0xd1, 0xb1, 0xea, 0x17, 0xcd, 0xf6, 0x00, 0xed, 0x13, 0x62,
+    0x3f, 0x06, 0xb0, 0xc9, 0x5c, 0x6a, 0xc3, 0x7c, 0x1f, 0x75, 0x52, 0xfb, 0x09, 0x7f, 0x06, 0x6b, 0xb3, 0x03, 0x40,
+    0x47, 0x86, 0xcd, 0xfa, 0xcb, 0x9a, 0xca, 0xeb, 0xe3, 0xce, 0x28, 0x95, 0xbb, 0xde, 0x9d, 0x0e, 0x34, 0xc5, 0xa1,
+    0xb7, 0x1e, 0x2e, 0x1f, 0xea, 0x21, 0x60, 0xc6, 0x60, 0x6e, 0x99, 0xd1, 0xf7, 0x42, 0x24, 0x17, 0x44, 0x62, 0x69,
+    0xb0, 0x86, 0xc1, 0xde, 0x3a, 0x38, 0x30, 0xd5, 0x58, 0x03, 0x9e, 0x27, 0x45, 0x20, 0x18, 0xf8, 0x08, 0xca, 0x80,
+    0x26, 0xca, 0xdc, 0x86, 0x93, 0x8f, 0xcc, 0xfd, 0xc2, 0xe5, 0xed, 0x63, 0xe1, 0xb4, 0xad, 0xe6, 0x7a, 0xbc, 0x2c,
+    0x70, 0x57, 0xde, 0x4b, 0x5a, 0x05, 0x37, 0xb2, 0x37, 0x79, 0xca, 0xdc, 0xad, 0xfb, 0x52, 0x9d, 0xdd, 0xcd, 0x74,
+    0xca, 0x66, 0x3a, 0xdb, 0xcd, 0x84, 0x9a, 0x99, 0x6f, 0x59, 0x45, 0x9a, 0x93, 0x35, 0x51, 0x73, 0x2a, 0x7e, 0xa2,
+    0x73, 0xd0, 0x8e, 0x72, 0x7b, 0xaf, 0x0a, 0x27, 0x57, 0x4e, 0x2e, 0xf7, 0x73, 0x43, 0x5c, 0x91, 0xb9, 0x50, 0x87,
+    0x00, 0x2f, 0x2f, 0xca, 0xc7, 0x07, 0xb8, 0x14, 0xbf, 0xca, 0x91, 0x8b, 0x72, 0x2a, 0xa4, 0x96, 0x82, 0x45, 0xc8,
+    0xa0, 0xaa, 0x8b, 0x81, 0xbd, 0xb4, 0x7b, 0x4f, 0xf4, 0x78, 0xbf, 0x8a, 0x98, 0x37, 0x30, 0xcf, 0x7d, 0x7c, 0x4f,
+    0x53, 0xec, 0xd4, 0xc4, 0x19, 0xf9, 0x90, 0xc5, 0x39, 0xc8, 0x66, 0xfd, 0xea, 0xb5, 0xdf, 0x46, 0x1b, 0x17, 0xcd,
+    0x58, 0xf4, 0xcc, 0x13, 0x27, 0x3f, 0x14, 0xc6, 0x38, 0xc0, 0x3a, 0xfa, 0x23, 0x4c, 0x2d, 0xd8, 0xb3, 0xc4, 0x53,
+    0xe8, 0xe4, 0xd6, 0xa6, 0xdd, 0x85, 0x69, 0x77, 0x26, 0xad, 0x03, 0xe5, 0x80, 0x34, 0xbb, 0x32, 0x9d, 0x3b, 0xff,
+    0x7d, 0x07, 0x2f, 0xdd, 0xae, 0x21, 0x12, 0xf7, 0xfc, 0x91, 0x31, 0x86, 0x78, 0x03, 0x36, 0xa2, 0xea, 0xe0, 0xe0,
+    0x0f, 0xe7, 0x7d, 0x5b, 0xc9, 0x7d, 0xdf, 0x0a, 0x07, 0xb6, 0xc1, 0x54, 0xba, 0xbc, 0x91, 0xcc, 0x16, 0x60, 0xd7,
+    0xb9, 0xff, 0x8d, 0x78, 0xf8, 0x22, 0x64, 0x5a, 0xac, 0xab, 0xf8, 0x2b, 0x39, 0x2a, 0x3d, 0x44, 0x35, 0x44, 0x20,
+    0xad, 0xac, 0x4b, 0x43, 0xd3, 0xd1, 0xab, 0x29, 0x1d, 0xc9, 0x9b, 0xb7, 0x52, 0xea, 0x81, 0x7d, 0x91, 0x5b, 0x27,
+    0xf0, 0x68, 0x61, 0x8d, 0xa1, 0xb9, 0x2b, 0xbd, 0x93, 0x6c, 0x40, 0xd4, 0xfa, 0xb8, 0x43, 0x49, 0x24, 0x16, 0xd5,
+    0x5d, 0x08, 0x87, 0xbb, 0x10, 0xcc, 0xcb, 0xa0, 0x6d, 0x10, 0xbb, 0xdd, 0x05, 0x6d, 0x03, 0xa7, 0x6e, 0x1b, 0xb8,
+    0x3d, 0x18, 0x2c, 0xec, 0x7d, 0x78, 0x39, 0x96, 0x63, 0xe1, 0xaf, 0xc9, 0xec, 0x03, 0x40, 0xa0, 0xf6, 0x61, 0xc5,
+    0x13, 0x07, 0x82, 0xc4, 0x19, 0x8e, 0xbe, 0xe7, 0xec, 0xc6, 0x5a, 0x0e, 0xcf, 0xe6, 0x0b, 0xcd, 0x46, 0xe6, 0x8e,
+    0x1a, 0x54, 0x7c, 0x75, 0x3f, 0xaf, 0x9f, 0xb2, 0x9a, 0x6e, 0xfc, 0x1e, 0x84, 0x91, 0x70, 0xca, 0x0e, 0xa3, 0x90,
+    0xb0, 0xc1, 0xac, 0xca, 0x78, 0x6d, 0xbf, 0x41, 0xbc, 0x07, 0x6d, 0xc2, 0x09, 0x16, 0xb5, 0x0b, 0xaa, 0x08, 0xdb,
+    0x78, 0x63, 0x41, 0x94, 0x87, 0x37, 0x5b, 0x46, 0xd3, 0xcb, 0x35, 0x04, 0x3a, 0xee, 0x45, 0xcd, 0xa8, 0xc1, 0x52,
+    0x17, 0x94, 0xd9, 0x47, 0x18, 0x57, 0x17, 0x27, 0x26, 0x4e, 0x7b, 0xa9, 0x57, 0xff, 0x2d, 0x03, 0x03, 0x7c, 0x01,
+    0x5e, 0x62, 0x61, 0x74, 0xd7, 0xbe, 0x6e, 0x40, 0x7d, 0xd9, 0x60, 0x03, 0xb4, 0x5a, 0xb5, 0xca, 0x67, 0xa0, 0xdc,
+    0x35, 0x97, 0xb0, 0xd7, 0x5c, 0xc2, 0x5d, 0x73, 0x09, 0x7f, 0xcd, 0x25, 0xcc, 0x35, 0x97, 0xf0, 0xd7, 0x5c, 0x1e,
+    0x84, 0x9f, 0x82, 0x38, 0x8e, 0x31, 0x87, 0xb8, 0x8a, 0xda, 0x46, 0xc6, 0x83, 0x0b, 0xcf, 0x7d, 0x96, 0xa8, 0x72,
+    0xf9, 0xc3, 0x18, 0x72, 0x5b, 0xb6, 0x12, 0xc6, 0x6d, 0x8a, 0x29, 0x88, 0x9c, 0x7e, 0x70, 0x50, 0xba, 0x3b, 0x83,
+    0x8f, 0x7a, 0xca, 0xf1, 0xd2, 0x3a, 0xd1, 0xfe, 0x01, 0x3a, 0x79, 0xf3, 0xeb, 0x63, 0x2a, 0xd7, 0x44, 0x38, 0x93,
+    0xfb, 0xfd, 0xb6, 0xa7, 0x14, 0x9f, 0x32, 0x13, 0x9e, 0x9c, 0x27, 0xda, 0x88, 0x20, 0x08, 0x51, 0xa2, 0x70, 0x46,
+    0xa4, 0xdd, 0xef, 0xde, 0x15, 0xde, 0xa8, 0xa2, 0xbc, 0x59, 0xc9, 0xe3, 0x1c, 0x9c, 0xd8, 0x8d, 0x15, 0x06, 0xea,
+    0x82, 0x0b, 0x41, 0x66, 0x12, 0xfe, 0x68, 0xe6, 0x96, 0x9c, 0x65, 0x65, 0xd2, 0xc7, 0x66, 0x6e, 0x08, 0x58, 0x41,
+    0xf6, 0x3d, 0xcc, 0x96, 0xb7, 0x29, 0xc5, 0x77, 0x69, 0x86, 0x87, 0xf2, 0x36, 0x2d, 0x42, 0x5b, 0x10, 0x7f, 0xf1,
+    0x37, 0x8e, 0x23, 0x41, 0xc1, 0xdf, 0x27, 0xe2, 0x62, 0x8f, 0x6f, 0x78, 0x01, 0x2e, 0x33, 0x63, 0x51, 0x9d, 0x32,
+    0xfc, 0x0d, 0x4b, 0x78, 0x08, 0x4e, 0xa6, 0xb1, 0x22, 0xf7, 0x38, 0xb0, 0x13, 0x92, 0x80, 0xc3, 0xd5, 0xed, 0x15,
+    0xff, 0x0a, 0x17, 0x5f, 0xa5, 0xb3, 0x65, 0x73, 0x28, 0x6f, 0x23, 0x5c, 0x90, 0x37, 0xf0, 0xfa, 0xd6, 0xff, 0xcb,
+    0xde, 0xdb, 0x36, 0xb7, 0x6d, 0x64, 0xeb, 0xa2, 0x7f, 0x45, 0x62, 0xd9, 0x0c, 0x60, 0x36, 0x29, 0xca, 0xe7, 0xcc,
+    0x54, 0x5d, 0x50, 0x6d, 0x96, 0x63, 0xc7, 0x13, 0x67, 0x22, 0xdb, 0x63, 0x79, 0x32, 0xc9, 0xb0, 0x78, 0x19, 0x08,
+    0x68, 0x0a, 0x70, 0x40, 0x80, 0x01, 0x40, 0x89, 0x34, 0x89, 0xff, 0x7e, 0x6a, 0xad, 0xd5, 0xaf, 0x20, 0x28, 0x7b,
+    0xf6, 0x3e, 0xfb, 0xd3, 0xbd, 0x5f, 0x6c, 0xb1, 0xd1, 0x68, 0xf4, 0x7b, 0xaf, 0x5e, 0x2f, 0xcf, 0xd3, 0x93, 0xb1,
+    0xba, 0x3d, 0x70, 0xd6, 0xa5, 0x14, 0x1d, 0x6f, 0x8a, 0xc3, 0xdb, 0xf3, 0xd9, 0x7e, 0x1b, 0x44, 0x6c, 0x17, 0x64,
+    0x58, 0xeb, 0xa4, 0xe1, 0x3f, 0xd1, 0xd6, 0xc1, 0x62, 0x84, 0xfd, 0x5f, 0xd6, 0x03, 0x2f, 0x21, 0x35, 0x14, 0xb8,
+    0x18, 0x6c, 0x38, 0x5a, 0xdb, 0x65, 0x1a, 0xb8, 0xa9, 0x41, 0xaf, 0xef, 0x29, 0x44, 0x79, 0xc9, 0x68, 0x6e, 0x04,
+    0xeb, 0xc6, 0x90, 0x8b, 0xc3, 0x71, 0xb3, 0x1c, 0xf2, 0x92, 0xa6, 0xd3, 0x20, 0x94, 0xee, 0x2c, 0x6b, 0x48, 0xa2,
+    0xec, 0x83, 0x50, 0xbb, 0xb6, 0xec, 0xb7, 0x81, 0xed, 0xcb, 0x1f, 0x0d, 0x63, 0xff, 0x62, 0xf9, 0x4c, 0x48, 0x17,
+    0xf1, 0x1c, 0x04, 0x51, 0xfb, 0x79, 0x36, 0xdc, 0xf8, 0x17, 0xeb, 0x67, 0x42, 0xf9, 0x8d, 0xe7, 0xb6, 0x1c, 0x52,
+    0x67, 0x2d, 0x7c, 0x61, 0x3c, 0x3c, 0xb8, 0x32, 0xb4, 0x1d, 0x0e, 0x42, 0xff, 0x6d, 0xd6, 0x08, 0x6e, 0x6c, 0x68,
+    0x9f, 0x2f, 0x7c, 0xd8, 0xda, 0x68, 0xac, 0x29, 0xa6, 0x5b, 0xe8, 0xdf, 0x64, 0xb6, 0xb4, 0xa7, 0x51, 0xc9, 0x8b,
+    0x53, 0xd3, 0x88, 0x85, 0x30, 0x60, 0xe8, 0x27, 0xf3, 0x01, 0x54, 0x73, 0xc7, 0x23, 0x90, 0xc9, 0x07, 0x7a, 0xb0,
+    0x26, 0xb5, 0xea, 0xaf, 0x61, 0x26, 0xff, 0x8f, 0x54, 0x58, 0x8c, 0xee, 0xb6, 0x61, 0xa6, 0xfe, 0x88, 0xe4, 0x1f,
+    0x2c, 0xe7, 0xbb, 0xd4, 0x0b, 0xb5, 0x1f, 0x0b, 0x2b, 0x30, 0x28, 0x51, 0x35, 0xa0, 0x07, 0x22, 0xa8, 0xca, 0x20,
+    0xcd, 0xb0, 0x3a, 0x07, 0xfd, 0xee, 0x69, 0xd5, 0x91, 0x1c, 0xd2, 0x5a, 0x0d, 0xa9, 0x60, 0xaa, 0xd4, 0x20, 0x3f,
+    0x1c, 0xee, 0x52, 0xa6, 0xcb, 0x80, 0x4b, 0xfa, 0x5d, 0xaa, 0x94, 0xc2, 0x7f, 0x22, 0x00, 0x9d, 0x83, 0x7b, 0x7c,
+    0x39, 0x06, 0xd2, 0x0c, 0x0b, 0xbf, 0x35, 0x3b, 0xbe, 0x26, 0xe1, 0x36, 0x09, 0x2e, 0x06, 0x38, 0x47, 0x57, 0x61,
+    0x79, 0x97, 0x42, 0x04, 0x55, 0x09, 0xf5, 0xad, 0x4c, 0x83, 0xd2, 0x56, 0x83, 0xb0, 0x26, 0xa1, 0xce, 0x24, 0x1b,
+    0x95, 0xb6, 0x1b, 0x85, 0xd9, 0x22, 0xae, 0x67, 0x84, 0x35, 0x67, 0x33, 0xd5, 0xc0, 0xa4, 0xe1, 0xb8, 0x69, 0xb4,
+    0x16, 0x15, 0x6a, 0x0a, 0xf3, 0x1a, 0x57, 0x95, 0xaa, 0xee, 0xe6, 0xd4, 0x52, 0x5a, 0xb6, 0x57, 0xdd, 0x24, 0x1b,
+    0x72, 0x19, 0xca, 0x30, 0xd8, 0xc8, 0x11, 0x4c, 0x20, 0x49, 0xce, 0xfc, 0x8d, 0xfc, 0x43, 0x6d, 0xba, 0x16, 0x30,
+    0xc7, 0x98, 0x65, 0xc3, 0x82, 0x5e, 0x81, 0x7b, 0xa0, 0x95, 0x9e, 0x4f, 0xb3, 0x8b, 0x3c, 0x48, 0x86, 0x85, 0x5e,
+    0x36, 0x19, 0xff, 0x53, 0x18, 0x69, 0x32, 0x63, 0x25, 0x8b, 0x6c, 0x57, 0xa7, 0xc4, 0x79, 0x9c, 0xc0, 0xf6, 0x68,
+    0x7a, 0xcb, 0xf7, 0x19, 0x44, 0x05, 0x81, 0x82, 0x19, 0xf3, 0x65, 0x17, 0xcf, 0x7d, 0x9f, 0x59, 0xa6, 0xee, 0xc3,
+    0xc1, 0x98, 0xb1, 0xfd, 0x7e, 0x3f, 0xef, 0xf7, 0xd5, 0x7c, 0xeb, 0xf7, 0x93, 0x17, 0xe6, 0x6f, 0x0f, 0x18, 0x14,
+    0xe4, 0x44, 0x34, 0x15, 0x22, 0xf8, 0x87, 0xe4, 0x19, 0x92, 0xd1, 0x1d, 0xf7, 0xb9, 0xe5, 0x6c, 0x59, 0x1d, 0x81,
+    0x60, 0x1e, 0x0e, 0x97, 0x0a, 0xec, 0x5a, 0xa2, 0x48, 0xc8, 0xf2, 0x9f, 0x81, 0xf1, 0xcc, 0x7d, 0x80, 0x25, 0x03,
+    0x10, 0xb6, 0xca, 0xd3, 0xf5, 0x9e, 0xaf, 0x82, 0x77, 0x3a, 0xde, 0x35, 0x56, 0x64, 0x20, 0x6e, 0x81, 0x8d, 0x58,
+    0x6b, 0x0f, 0xc8, 0x99, 0x02, 0x1c, 0x2f, 0x0e, 0x87, 0x73, 0xf9, 0x4b, 0x37, 0x5b, 0x27, 0x50, 0x29, 0x70, 0x7b,
+    0x74, 0x72, 0xf0, 0xdf, 0x81, 0x66, 0x50, 0x0e, 0xf3, 0x7a, 0xfb, 0x3b, 0x73, 0xf2, 0xd3, 0x53, 0xfc, 0x13, 0x1e,
+    0xa2, 0xd3, 0x6f, 0xf7, 0xe6, 0x0f, 0x8a, 0xca, 0xc3, 0x41, 0x2d, 0xfe, 0x73, 0xce, 0x2b, 0xf8, 0x85, 0x6f, 0x02,
+    0xb3, 0xc9, 0xd4, 0x3b, 0xf9, 0x26, 0xcf, 0x99, 0x7a, 0x8d, 0x57, 0x4c, 0xbe, 0xc3, 0xe1, 0x5c, 0x8c, 0xea, 0xed,
+    0xc8, 0x89, 0x76, 0xca, 0x31, 0x0e, 0x06, 0xff, 0x45, 0xb4, 0x4d, 0x08, 0x30, 0xa4, 0x6e, 0x49, 0x33, 0x1b, 0x57,
+    0x96, 0x78, 0x96, 0xce, 0x2f, 0x27, 0x75, 0xb9, 0xd3, 0x8a, 0xa7, 0x3d, 0xb0, 0xb8, 0xad, 0xc1, 0x0b, 0xe0, 0xde,
+    0x62, 0xeb, 0x4a, 0xc1, 0xe1, 0x02, 0xe2, 0x14, 0x27, 0x20, 0x82, 0xf6, 0xfb, 0x12, 0xef, 0x15, 0xf4, 0x49, 0x3f,
+    0x40, 0x30, 0xe4, 0xcf, 0x12, 0x70, 0xd7, 0xeb, 0xd5, 0x18, 0xdf, 0x4b, 0x21, 0xb8, 0x3e, 0xd3, 0x00, 0xb4, 0xe0,
+    0x77, 0xf9, 0x58, 0x4e, 0xbf, 0x89, 0xc0, 0xb3, 0x65, 0x6f, 0xa2, 0xdc, 0x6d, 0x78, 0xda, 0x3f, 0x5a, 0x08, 0xc0,
+    0x52, 0x3c, 0x53, 0x82, 0x05, 0x39, 0xc5, 0x5c, 0xfc, 0xbf, 0xe0, 0x23, 0xe6, 0x7b, 0xd2, 0x45, 0x6c, 0xbd, 0x7d,
+    0x72, 0x61, 0x20, 0x81, 0xa6, 0x03, 0xf0, 0xe3, 0x55, 0x40, 0x57, 0xc6, 0xcf, 0xcf, 0xb2, 0x1e, 0xeb, 0xe3, 0x3f,
+    0x05, 0xf7, 0xe9, 0x67, 0x0a, 0x1f, 0x1d, 0x8e, 0xab, 0x74, 0xb4, 0xa3, 0x14, 0x44, 0x47, 0xb7, 0xcf, 0xa7, 0x3c,
+    0xfb, 0xa6, 0x02, 0x72, 0xcb, 0x51, 0x7b, 0x2a, 0x00, 0x8b, 0x2d, 0x1d, 0x81, 0x4f, 0xb3, 0x7c, 0x42, 0xbe, 0xd7,
+    0x53, 0x71, 0x75, 0xa9, 0xd3, 0xc5, 0x8b, 0xf1, 0x14, 0xfe, 0x07, 0x62, 0x0f, 0xcb, 0x14, 0xd9, 0xb1, 0xeb, 0xe2,
+    0x07, 0xf1, 0xb6, 0xb6, 0xa3, 0x3f, 0x76, 0x10, 0xe9, 0xb8, 0x27, 0x17, 0xea, 0x4b, 0x48, 0x25, 0x17, 0xea, 0x06,
+    0x62, 0x17, 0x6a, 0xbc, 0xe3, 0x22, 0xd6, 0xfa, 0x75, 0x8d, 0x82, 0x95, 0x80, 0x33, 0xed, 0x1a, 0x0c, 0x36, 0xb0,
+    0x6e, 0x59, 0x06, 0x7f, 0xc3, 0x35, 0x4d, 0xe0, 0x86, 0x45, 0xd6, 0x7b, 0x83, 0xad, 0x74, 0x0d, 0x8e, 0x96, 0x89,
+    0x73, 0x29, 0xc9, 0xca, 0x16, 0x19, 0x57, 0x8f, 0x42, 0xaa, 0xa6, 0xfb, 0x5b, 0x51, 0x3f, 0x08, 0x91, 0x07, 0xab,
+    0x94, 0x45, 0xc5, 0x0a, 0x64, 0xf6, 0xe0, 0x1f, 0x21, 0x23, 0x47, 0x39, 0x70, 0x14, 0xfa, 0x5b, 0x13, 0xe8, 0x3c,
+    0x3f, 0x85, 0x3a, 0x8f, 0x04, 0x5b, 0xa9, 0x87, 0xc2, 0xca, 0x0b, 0x88, 0x0e, 0xb6, 0x30, 0x56, 0x79, 0x12, 0x2a,
+    0x36, 0x65, 0x22, 0x8f, 0x83, 0x5a, 0x02, 0xc6, 0x0a, 0x82, 0x39, 0xcb, 0xa5, 0x0b, 0x52, 0xd5, 0xe8, 0x61, 0x91,
+    0xb9, 0x9f, 0x0a, 0xca, 0xff, 0x54, 0xe5, 0x84, 0xeb, 0xcb, 0x10, 0xe0, 0x68, 0x9f, 0x82, 0x28, 0x31, 0xd6, 0x2f,
+    0x5a, 0xbc, 0x93, 0x99, 0xb3, 0xa9, 0xed, 0x25, 0xc8, 0xd8, 0x0e, 0xbf, 0x42, 0x68, 0xb5, 0x50, 0x64, 0xd1, 0x70,
+    0xc1, 0x74, 0x7b, 0x4a, 0xab, 0xee, 0x61, 0xc3, 0xb3, 0xd2, 0x43, 0xa5, 0xbe, 0x8d, 0x09, 0x2c, 0xab, 0x94, 0xe1,
+    0xdb, 0x09, 0x55, 0x27, 0x06, 0x15, 0xeb, 0x86, 0x2d, 0xe1, 0x10, 0x8b, 0x49, 0x63, 0x9d, 0x0d, 0x78, 0xc4, 0x12,
+    0xf8, 0x67, 0xc3, 0xc7, 0x6c, 0xc9, 0xa3, 0xc9, 0xe6, 0x6a, 0xd9, 0xef, 0x97, 0x5e, 0xe8, 0xd5, 0xb3, 0xec, 0x69,
+    0x34, 0x9f, 0xe5, 0x73, 0x1f, 0x15, 0x17, 0x93, 0xc1, 0x60, 0xe3, 0x67, 0xc3, 0x21, 0x4b, 0x86, 0xc3, 0x49, 0xf6,
+    0x14, 0x5e, 0x7b, 0xca, 0x23, 0xb5, 0xa4, 0x92, 0xab, 0x0c, 0xf6, 0xf7, 0x01, 0x8f, 0x7c, 0xd6, 0xf9, 0x69, 0xd9,
+    0x74, 0xe9, 0x7e, 0x66, 0xc7, 0x5d, 0xe8, 0x0e, 0xb0, 0xf1, 0xb6, 0x41, 0x47, 0xfe, 0xf5, 0x0e, 0x29, 0x75, 0x93,
+    0x01, 0xd8, 0x8d, 0x06, 0x38, 0x64, 0xaa, 0x97, 0x22, 0xab, 0x97, 0x32, 0xd5, 0x4b, 0xb2, 0x72, 0x09, 0x16, 0x12,
+    0x53, 0xe5, 0x36, 0xb2, 0x72, 0xcb, 0x86, 0xeb, 0xe1, 0x60, 0x6b, 0xc5, 0x65, 0x73, 0x07, 0xf7, 0x85, 0x15, 0x05,
+    0xfe, 0xdf, 0xb2, 0x05, 0xbb, 0x97, 0xc7, 0xc0, 0x35, 0x3a, 0x26, 0xc1, 0x05, 0xe2, 0x9e, 0xdd, 0x82, 0x1d, 0x16,
+    0xfe, 0x82, 0xeb, 0xe4, 0x98, 0xed, 0xf0, 0x51, 0xe8, 0x15, 0xec, 0xd6, 0x27, 0xa0, 0x5d, 0xb0, 0x35, 0x40, 0x36,
+    0xb6, 0xc5, 0x47, 0x77, 0x87, 0xc3, 0xb5, 0xe7, 0xb3, 0x07, 0xfc, 0x71, 0x7e, 0x77, 0x38, 0xec, 0x3c, 0xa3, 0xde,
+    0xbb, 0xe1, 0x09, 0x7b, 0xcf, 0x93, 0xc9, 0xcd, 0x15, 0x8f, 0x27, 0x83, 0xc1, 0x8d, 0xbf, 0xe0, 0xf5, 0xec, 0x06,
+    0xb4, 0x03, 0xe7, 0x0b, 0xa9, 0x6b, 0xf6, 0x6e, 0x79, 0xe6, 0x2d, 0x70, 0x6c, 0x6e, 0xe1, 0xe8, 0xed, 0xf7, 0xbd,
+    0x3b, 0x1e, 0x79, 0xb7, 0xa4, 0x62, 0x5a, 0x71, 0xc5, 0xf1, 0xb6, 0xc5, 0xfd, 0x74, 0xc5, 0x43, 0x78, 0x84, 0x55,
+    0x99, 0xde, 0x04, 0xef, 0x7d, 0xb6, 0xd2, 0x2c, 0x70, 0x0f, 0x98, 0x63, 0x4d, 0x76, 0x42, 0x33, 0xf1, 0x57, 0xd8,
+    0x3f, 0x37, 0xaa, 0x7f, 0x68, 0xfe, 0x97, 0xba, 0x9f, 0xc0, 0xed, 0x8b, 0x2c, 0x48, 0xec, 0x3d, 0xbf, 0x61, 0xf7,
+    0xdc, 0xb0, 0xcd, 0x9e, 0x99, 0xb2, 0x4f, 0x94, 0x1a, 0x3f, 0x52, 0xea, 0xda, 0x32, 0xac, 0x64, 0xee, 0xbe, 0x8c,
+    0xc0, 0xe1, 0x80, 0xfc, 0x74, 0x87, 0x38, 0x08, 0xad, 0x9b, 0xac, 0xe6, 0x8a, 0x72, 0x2e, 0xb4, 0x65, 0xe6, 0xe5,
+    0xc0, 0x62, 0x96, 0x52, 0x68, 0x2c, 0x00, 0x10, 0x4c, 0x0a, 0xad, 0xbd, 0x97, 0x01, 0xe4, 0x04, 0x0d, 0x7f, 0x6c,
+    0xae, 0x8a, 0xb2, 0x96, 0x2d, 0x09, 0x51, 0xb6, 0xeb, 0xe1, 0x25, 0x42, 0xa6, 0xf5, 0xfb, 0xe7, 0x44, 0xb2, 0x36,
+    0xa9, 0xae, 0x6a, 0xb4, 0x04, 0x54, 0x64, 0x09, 0x98, 0xf8, 0x95, 0xe6, 0x13, 0x80, 0x27, 0x1d, 0x0f, 0xaa, 0xa7,
+    0xbc, 0x66, 0x82, 0xc8, 0x36, 0x2a, 0x7f, 0x52, 0xbc, 0x40, 0x32, 0x82, 0xe2, 0x69, 0xad, 0x32, 0x16, 0x86, 0x79,
+    0xa0, 0x80, 0xbc, 0x7b, 0x77, 0xea, 0x5b, 0xfb, 0x63, 0xc7, 0x9e, 0xad, 0x55, 0xa8, 0x85, 0x9a, 0xc2, 0x25, 0x87,
+    0xe8, 0x0a, 0x32, 0x50, 0xc8, 0x78, 0xf2, 0x7a, 0x70, 0x39, 0x89, 0xae, 0xb8, 0x40, 0x67, 0x7c, 0x7d, 0xd3, 0x4d,
+    0x67, 0xd1, 0xd3, 0x6a, 0x3e, 0x21, 0x25, 0xd9, 0xe1, 0x90, 0x8d, 0xaa, 0xba, 0x58, 0x4f, 0x43, 0xf9, 0xd3, 0x43,
+    0xf0, 0xf5, 0x82, 0x7a, 0x4d, 0x56, 0xa9, 0x7e, 0x4a, 0x95, 0xf2, 0xa2, 0xe1, 0xa5, 0xff, 0xb4, 0x92, 0xfb, 0x1e,
+    0x90, 0xd6, 0xf2, 0x92, 0xcb, 0xf7, 0x23, 0xc4, 0x18, 0xf1, 0x03, 0xaf, 0xe4, 0x11, 0x0b, 0xd5, 0x14, 0xae, 0x79,
+    0x84, 0x20, 0x6f, 0x99, 0x0e, 0xfe, 0xd6, 0x13, 0xa7, 0xfb, 0x13, 0xa5, 0x5d, 0x7c, 0x61, 0x51, 0xf7, 0x64, 0x6d,
+    0xdd, 0x80, 0x1c, 0x6c, 0x98, 0x2e, 0x0a, 0xb2, 0x4d, 0x69, 0x04, 0x6d, 0xb4, 0x1c, 0xd8, 0x70, 0x2a, 0xb5, 0xe1,
+    0xcc, 0x35, 0x04, 0xf7, 0xf9, 0x79, 0x3a, 0x5a, 0xc0, 0x87, 0x54, 0xb7, 0x97, 0xf8, 0xf9, 0xb0, 0xe1, 0x11, 0x90,
+    0xd9, 0x11, 0x9f, 0xd9, 0x44, 0xd2, 0x49, 0x9d, 0x2b, 0x60, 0xb7, 0xb3, 0x6b, 0x90, 0x23, 0x66, 0xee, 0x2b, 0x54,
+    0xdf, 0xa2, 0x01, 0x57, 0xc6, 0xda, 0xd7, 0x24, 0x63, 0xe1, 0x55, 0x39, 0x0d, 0x07, 0x00, 0x43, 0x97, 0xd1, 0xd7,
+    0x96, 0x9b, 0x2c, 0xfb, 0xb9, 0x80, 0x20, 0x88, 0x92, 0x78, 0x7c, 0xc0, 0xfb, 0xb2, 0x1a, 0x6a, 0x94, 0x7c, 0x2c,
+    0x1b, 0xa9, 0xf4, 0x4a, 0xf4, 0x77, 0x63, 0x2e, 0x31, 0xe0, 0x75, 0xd5, 0x16, 0x14, 0xce, 0xf3, 0xc3, 0xe1, 0x3c,
+    0x1f, 0x19, 0xcf, 0x32, 0x50, 0xad, 0x4c, 0xeb, 0x20, 0x36, 0xf3, 0xc5, 0xc2, 0x5f, 0xec, 0x9c, 0x44, 0x44, 0x41,
+    0x60, 0x47, 0xc2, 0x83, 0x48, 0xfd, 0xaa, 0xf2, 0x74, 0xa7, 0xfa, 0x6c, 0xbf, 0xb0, 0x89, 0xf4, 0x82, 0x92, 0xc9,
+    0x27, 0xc1, 0x5e, 0xf5, 0x77, 0x10, 0x36, 0x84, 0x37, 0xaf, 0x7a, 0x9d, 0x65, 0x6a, 0x56, 0x82, 0x84, 0x19, 0x73,
+    0x04, 0x8f, 0xc3, 0x4e, 0x63, 0x1b, 0x1e, 0x5b, 0x70, 0x74, 0xde, 0x9a, 0xdd, 0xb1, 0x15, 0xbb, 0x55, 0x75, 0x5a,
+    0xf0, 0x70, 0x3a, 0xbc, 0x0c, 0x70, 0xf5, 0xad, 0xcf, 0x39, 0xbf, 0xa3, 0x13, 0x6c, 0x3d, 0xe0, 0xd1, 0x44, 0xcc,
+    0xd6, 0x4f, 0x23, 0xb5, 0x78, 0xd6, 0x43, 0xbe, 0xa0, 0xf5, 0x27, 0x66, 0x77, 0x26, 0xf9, 0x6e, 0xc0, 0x17, 0x93,
+    0xf5, 0xd3, 0x08, 0x5e, 0x7d, 0x0a, 0x56, 0x8c, 0xcc, 0x99, 0x65, 0xeb, 0xa7, 0x11, 0x8e, 0xd9, 0xdd, 0xd3, 0x88,
+    0x46, 0x6d, 0x25, 0xf7, 0xa5, 0xdb, 0x06, 0x84, 0x95, 0x5b, 0x16, 0xc3, 0x6b, 0x20, 0x9e, 0x69, 0x23, 0xe9, 0x5a,
+    0x1a, 0x7a, 0x63, 0x1e, 0x4e, 0xe3, 0x60, 0x4d, 0xad, 0x90, 0x67, 0x86, 0x98, 0xc5, 0x4f, 0xa3, 0x39, 0x5b, 0x61,
+    0x45, 0x36, 0x3c, 0x1e, 0x5c, 0x4e, 0x36, 0x57, 0x7c, 0x0d, 0xe4, 0x67, 0x93, 0x8d, 0xd9, 0xa2, 0x6e, 0xb9, 0x98,
+    0x6d, 0x9e, 0x46, 0xf3, 0xc9, 0x0a, 0x7a, 0xd6, 0x1e, 0x30, 0xef, 0x0d, 0x88, 0x50, 0x12, 0x52, 0x53, 0x6e, 0x7a,
+    0x3d, 0xb6, 0x1e, 0x07, 0x77, 0x6c, 0x7d, 0x19, 0xdc, 0xb2, 0xf5, 0x18, 0x88, 0x38, 0xa8, 0xdf, 0xbd, 0x0d, 0x2c,
+    0xbe, 0x88, 0xad, 0x2f, 0x4d, 0xda, 0xe6, 0x69, 0xc4, 0xdc, 0xc1, 0x69, 0xe0, 0x82, 0xb5, 0xc9, 0xbc, 0x15, 0x83,
+    0x4b, 0xc8, 0xd2, 0x8b, 0xd9, 0x66, 0x78, 0xc9, 0xd6, 0x23, 0x9c, 0xea, 0x89, 0xcf, 0xee, 0xf8, 0x2d, 0x4b, 0xf8,
+    0xaa, 0x89, 0xaf, 0x36, 0xa0, 0x11, 0x3d, 0xca, 0xa0, 0xaf, 0xa0, 0x66, 0xe6, 0xbc, 0xb2, 0x30, 0x2a, 0xf7, 0x2d,
+    0x38, 0xa0, 0x20, 0x6d, 0x03, 0x04, 0x49, 0x3c, 0xbb, 0x57, 0xe1, 0xfa, 0x46, 0x0a, 0x03, 0x6e, 0x02, 0x33, 0x60,
+    0x60, 0xfa, 0x19, 0xfc, 0xb0, 0xd2, 0x25, 0x42, 0x9c, 0xfd, 0x94, 0x92, 0x64, 0x9e, 0x9f, 0x8a, 0x34, 0x77, 0x0b,
+    0xd7, 0x29, 0xcc, 0x8a, 0x02, 0xd5, 0x4f, 0x49, 0x69, 0x60, 0xa1, 0x12, 0x99, 0x4a, 0xc1, 0x2f, 0x9b, 0xf3, 0x28,
+    0x3b, 0x46, 0xe7, 0x3a, 0xbf, 0x9c, 0x38, 0xa7, 0x93, 0xbe, 0xff, 0xc0, 0x31, 0x6c, 0x21, 0x03, 0x17, 0xfe, 0xd4,
+    0x13, 0xc6, 0xa9, 0x15, 0x88, 0xa9, 0xe4, 0xd9, 0x53, 0xf8, 0x4c, 0x68, 0x75, 0x74, 0xe1, 0xfb, 0x41, 0xa1, 0x4d,
+    0xd2, 0x2d, 0x48, 0x52, 0xf0, 0x14, 0x3d, 0xe7, 0xbc, 0x0d, 0x54, 0x8a, 0x11, 0x2d, 0x88, 0xb4, 0xb5, 0xcc, 0x1c,
+    0xa4, 0x2d, 0xcd, 0x77, 0x4d, 0xfc, 0x1c, 0x16, 0x70, 0x11, 0x2d, 0x6c, 0x0d, 0x8f, 0xaa, 0x58, 0xb9, 0x37, 0x79,
+    0x8e, 0x70, 0x46, 0x97, 0x32, 0x01, 0x70, 0xbd, 0x5f, 0x87, 0xb5, 0xc2, 0x2b, 0x6a, 0x16, 0x79, 0x51, 0xd3, 0x27,
+    0x5b, 0xe0, 0x3e, 0x16, 0x25, 0x0a, 0x9c, 0xb5, 0x60, 0xc0, 0x56, 0x58, 0xb2, 0x93, 0xc2, 0xa6, 0x68, 0x09, 0xbd,
+    0x3d, 0x7e, 0x3a, 0xa8, 0x99, 0x0c, 0xa0, 0x09, 0xa0, 0xf1, 0xf8, 0x17, 0x80, 0x9a, 0xde, 0xd4, 0x62, 0x5d, 0x05,
+    0xa5, 0x52, 0x6e, 0xc2, 0xcf, 0xc0, 0x30, 0xc3, 0x0f, 0x85, 0xdc, 0x26, 0x4a, 0xe4, 0xfc, 0x58, 0x94, 0x62, 0x59,
+    0x8a, 0x2a, 0x69, 0x37, 0x14, 0x3c, 0x22, 0xdc, 0x06, 0x8d, 0x99, 0xdb, 0x13, 0x5d, 0xb4, 0x22, 0x94, 0x63, 0xb3,
+    0x8e, 0x91, 0x46, 0x99, 0x9d, 0xec, 0x3a, 0x59, 0x68, 0xbf, 0xaf, 0x72, 0xc8, 0x3a, 0x60, 0x8d, 0xe4, 0xeb, 0x35,
+    0x87, 0x6e, 0x1b, 0xe5, 0xc5, 0x83, 0xe7, 0x2b, 0x38, 0xcd, 0xf1, 0xc4, 0xee, 0x7a, 0xdd, 0x29, 0x12, 0xf1, 0x0a,
+    0x27, 0x55, 0x3e, 0x92, 0x85, 0xe3, 0xce, 0x9d, 0xd6, 0x62, 0x55, 0xb9, 0xac, 0xa7, 0x16, 0x47, 0x04, 0x3e, 0x95,
+    0x47, 0x7b, 0xa1, 0x6d, 0x51, 0x2c, 0x84, 0xd1, 0xa3, 0x13, 0x7e, 0x52, 0x02, 0xeb, 0xeb, 0x70, 0x58, 0xfa, 0x11,
+    0x47, 0xbf, 0xd3, 0x68, 0xb4, 0x20, 0xa4, 0xe1, 0xa9, 0x17, 0x8d, 0x16, 0x75, 0x51, 0x87, 0xd9, 0x8b, 0x5c, 0x0f,
+    0x14, 0x86, 0x11, 0xa8, 0x1f, 0x5c, 0x65, 0xf0, 0x59, 0x84, 0xa8, 0x79, 0x60, 0x9a, 0x0d, 0xe1, 0xa8, 0x0b, 0x3c,
+    0xb4, 0x82, 0x16, 0x33, 0xf3, 0x51, 0x88, 0xe1, 0x43, 0xba, 0x38, 0x7f, 0x42, 0x56, 0x3e, 0xc0, 0xee, 0xd0, 0x5d,
+    0x28, 0xe7, 0x4c, 0xc5, 0x00, 0x3f, 0x0a, 0xc8, 0x47, 0x09, 0xb8, 0x19, 0x20, 0x7b, 0x64, 0x09, 0x20, 0x56, 0x8c,
+    0x8e, 0x26, 0x9f, 0xfb, 0x5e, 0xa4, 0xe0, 0x9d, 0x7d, 0x96, 0xab, 0x09, 0x43, 0xe1, 0x13, 0x03, 0xdd, 0xfc, 0xc6,
+    0x6f, 0xcf, 0x5b, 0x30, 0xb2, 0x4b, 0x52, 0xbc, 0xd6, 0x0c, 0xf7, 0x1b, 0x70, 0x3b, 0x02, 0xca, 0x9a, 0xea, 0x98,
+    0x64, 0x9b, 0x86, 0x48, 0x06, 0xcc, 0x88, 0x11, 0x41, 0x65, 0xb9, 0xf0, 0xbf, 0x7b, 0x59, 0x14, 0x38, 0x80, 0xab,
+    0x99, 0x0c, 0x5e, 0xbb, 0x30, 0x2a, 0x00, 0xce, 0x69, 0xe8, 0x94, 0xf6, 0xaa, 0xea, 0x90, 0xac, 0x9a, 0x1f, 0xcc,
+    0xe6, 0x4d, 0xc3, 0xc4, 0x88, 0x20, 0xba, 0x08, 0x27, 0x98, 0x5e, 0x91, 0xbe, 0x56, 0x72, 0x3a, 0x5a, 0x75, 0xb4,
+    0x96, 0x98, 0x98, 0x2b, 0x8a, 0xbf, 0x06, 0x3c, 0x6e, 0xf0, 0xea, 0x24, 0x4d, 0x27, 0xaa, 0x47, 0x8f, 0x5f, 0xa7,
+    0xe9, 0xa4, 0xc4, 0x5d, 0xe1, 0x37, 0xe0, 0xa2, 0xd9, 0xe6, 0x43, 0x3f, 0x7e, 0x41, 0x11, 0x17, 0x35, 0xb8, 0xf2,
+    0x4e, 0xf5, 0x95, 0xea, 0x23, 0xa8, 0x85, 0x27, 0x46, 0xd6, 0xc2, 0x93, 0x4b, 0xd6, 0x5a, 0x10, 0xcc, 0x6c, 0x0e,
+    0x5c, 0xc8, 0xaf, 0x94, 0x22, 0xde, 0x44, 0x42, 0x2d, 0x06, 0xad, 0xc7, 0xcc, 0x59, 0x35, 0x5a, 0xa8, 0xcc, 0x08,
+    0xed, 0xdb, 0x5a, 0x74, 0x7e, 0x23, 0x3f, 0xe5, 0xa9, 0x7d, 0xd9, 0x1e, 0xe7, 0xe3, 0x3d, 0xba, 0xab, 0xce, 0x32,
+    0x93, 0x32, 0x3e, 0x99, 0x25, 0x28, 0xdc, 0x25, 0xd8, 0x80, 0x24, 0xfb, 0xb5, 0x0e, 0x90, 0x51, 0x7b, 0xed, 0x77,
+    0x9d, 0xe5, 0xab, 0x9b, 0xad, 0xa1, 0xa8, 0xd4, 0x4a, 0x52, 0x1c, 0x64, 0xb8, 0x6e, 0x2b, 0x1f, 0x2e, 0x2e, 0xa0,
+    0x67, 0x8c, 0x44, 0xe6, 0xf9, 0x13, 0xf9, 0x12, 0x9c, 0x33, 0xce, 0x0a, 0x81, 0x09, 0x63, 0xf5, 0xae, 0xb5, 0x54,
+    0x1a, 0x52, 0x8c, 0x1d, 0x8d, 0xb2, 0xac, 0xb2, 0x74, 0x99, 0xad, 0x25, 0x6c, 0x59, 0x4e, 0x6e, 0x61, 0xcb, 0x4c,
+    0x56, 0xf3, 0x7d, 0xc5, 0x1d, 0x94, 0x6f, 0xb6, 0xce, 0xf8, 0x5e, 0x22, 0x7b, 0xb7, 0x81, 0x12, 0x5e, 0x8c, 0xfe,
+    0x82, 0xf4, 0xdb, 0x0c, 0xe3, 0x94, 0xdb, 0x4a, 0x5a, 0x80, 0xd3, 0x3f, 0x1c, 0xde, 0x57, 0x18, 0x34, 0x38, 0xc2,
+    0x38, 0xb2, 0x7e, 0xff, 0xb6, 0xf2, 0x6a, 0x4c, 0xd4, 0xf1, 0x59, 0xfd, 0x7e, 0x45, 0x0f, 0xa7, 0xd5, 0x68, 0x95,
+    0x6e, 0x91, 0x9d, 0xd0, 0xc6, 0xca, 0x0f, 0x6a, 0x05, 0xcc, 0xde, 0xfa, 0x7c, 0x3a, 0x00, 0x1d, 0x0b, 0x90, 0x68,
+    0x36, 0x13, 0x89, 0x39, 0xe9, 0x9e, 0x84, 0xc7, 0x07, 0x16, 0x38, 0xc0, 0x54, 0xfc, 0x9f, 0xc2, 0x9b, 0x81, 0x0d,
+    0x1a, 0x25, 0xfa, 0x1a, 0x5d, 0xd5, 0xe6, 0x46, 0xc7, 0x4b, 0x4f, 0x21, 0x91, 0x15, 0xac, 0x9a, 0xfb, 0x72, 0x03,
+    0xa7, 0x3d, 0xd4, 0x1c, 0x2a, 0x4b, 0xf0, 0xb7, 0x5f, 0xe6, 0x87, 0xc3, 0x3a, 0x83, 0xc2, 0x76, 0x6b, 0xa1, 0xbd,
+    0x31, 0x4b, 0x35, 0x54, 0x84, 0x83, 0xce, 0x57, 0x62, 0x56, 0x8f, 0xe8, 0xef, 0xf9, 0xe1, 0xb0, 0x22, 0x30, 0xe0,
+    0xb0, 0x94, 0x99, 0x68, 0xa1, 0x58, 0x5a, 0x67, 0x33, 0xaa, 0x03, 0x0f, 0x4c, 0xcc, 0x59, 0xb8, 0x03, 0xd0, 0x26,
+    0xb5, 0x0a, 0xf4, 0x2a, 0xa2, 0x9f, 0xb8, 0x5f, 0xdb, 0xaf, 0xd7, 0x23, 0xb3, 0x74, 0xe4, 0xc6, 0x58, 0x00, 0x70,
+    0xe0, 0x79, 0x4d, 0xf2, 0x9c, 0x7c, 0x0d, 0xed, 0x9e, 0x5c, 0xc8, 0x9f, 0xa0, 0x6c, 0xe1, 0xb9, 0x6a, 0x5a, 0x59,
+    0xac, 0xb8, 0xaa, 0x5e, 0x5d, 0xf0, 0xca, 0x64, 0x5a, 0xa5, 0x95, 0xa8, 0x94, 0x60, 0x40, 0x5d, 0xe2, 0xb5, 0xa6,
+    0x19, 0xa5, 0x36, 0xea, 0x4c, 0xd4, 0x80, 0x0d, 0xf6, 0x53, 0xb5, 0xd1, 0xc9, 0xb9, 0x7c, 0x7e, 0x69, 0x1c, 0x3e,
+    0xed, 0xea, 0xcd, 0x4c, 0xe5, 0xc0, 0x5f, 0x2b, 0x1f, 0x5a, 0x3d, 0x06, 0x3a, 0x20, 0xa7, 0x3f, 0x86, 0xc5, 0xc4,
+    0xee, 0xd0, 0xbc, 0xdd, 0x5d, 0x56, 0x17, 0xe9, 0x9d, 0xa6, 0x64, 0x56, 0x6f, 0xf9, 0xcc, 0xea, 0xd1, 0x01, 0x2f,
+    0x1e, 0xeb, 0xbd, 0xc2, 0x4c, 0x22, 0xb8, 0x18, 0xaa, 0x49, 0x64, 0x77, 0xa0, 0x35, 0x8f, 0x2a, 0x26, 0xc0, 0x0f,
+    0x4a, 0xad, 0xe9, 0xbd, 0xdd, 0x15, 0xea, 0x94, 0xc2, 0xe3, 0xd6, 0x92, 0x1f, 0x98, 0x3b, 0xed, 0x5a, 0xe7, 0xe3,
+    0xf9, 0xa5, 0xef, 0x37, 0xf2, 0x84, 0x36, 0x3b, 0x93, 0xd3, 0x3f, 0x79, 0xab, 0x7f, 0x98, 0xea, 0x5b, 0xe8, 0x4e,
+    0xd0, 0x67, 0xe8, 0xaa, 0xea, 0xae, 0xc4, 0x16, 0x86, 0x7a, 0x62, 0x91, 0x17, 0xf2, 0xa4, 0x35, 0x76, 0x1c, 0xec,
+    0x0d, 0x70, 0xe2, 0x97, 0x87, 0x83, 0xb8, 0xca, 0x7d, 0x76, 0xde, 0x35, 0xb2, 0x72, 0x00, 0x2b, 0x88, 0x82, 0x71,
+    0x6b, 0x3e, 0xb6, 0x41, 0xba, 0xc4, 0xd5, 0xf8, 0xf8, 0x0d, 0xc5, 0x32, 0xd9, 0x44, 0x5c, 0x5c, 0xe4, 0x4f, 0x9f,
+    0x03, 0x69, 0x59, 0xbf, 0x1f, 0xbd, 0xb8, 0x9c, 0x3e, 0x1f, 0x46, 0x01, 0x38, 0x76, 0xd9, 0xcb, 0xcb, 0x98, 0xaf,
+    0x2e, 0x99, 0x65, 0x0a, 0x8b, 0x7c, 0x33, 0xa0, 0xba, 0x64, 0xb5, 0x74, 0xbd, 0x02, 0x2c, 0x5d, 0x7e, 0xf3, 0x10,
+    0xa6, 0x06, 0x34, 0xb2, 0xe6, 0xee, 0x34, 0xd7, 0x02, 0xa5, 0x9e, 0xf7, 0x33, 0x43, 0xbe, 0x2e, 0x83, 0xae, 0x20,
+    0xdd, 0xf3, 0x88, 0xf4, 0x72, 0x2f, 0x9d, 0xee, 0xf7, 0xa5, 0x00, 0x4b, 0x7d, 0x29, 0x3e, 0x83, 0xc2, 0xa2, 0xf1,
+    0x8d, 0x00, 0x6d, 0x0d, 0xd5, 0xb4, 0x57, 0x8a, 0xaa, 0x17, 0xf4, 0x4a, 0xf1, 0xb9, 0xa7, 0x87, 0xca, 0x7c, 0x59,
+    0x3a, 0xfa, 0x9f, 0x50, 0x73, 0xc1, 0x09, 0x31, 0x13, 0x73, 0x00, 0x95, 0xa0, 0x8d, 0x6f, 0x75, 0xb4, 0xf1, 0xa9,
+    0x5e, 0xc5, 0x4d, 0x9f, 0xd7, 0xd6, 0x32, 0x27, 0x84, 0x4d, 0xf7, 0x12, 0xa0, 0x22, 0xaf, 0x84, 0x47, 0xb0, 0xfc,
+    0xf2, 0x87, 0x3c, 0x5d, 0x21, 0x5a, 0xc7, 0x3d, 0xcb, 0x5c, 0x1a, 0xfb, 0x37, 0x06, 0xd3, 0xd7, 0xb7, 0xdb, 0x22,
+    0x3f, 0x35, 0x31, 0x61, 0x3d, 0x56, 0xf4, 0xcd, 0xbb, 0x70, 0x25, 0x50, 0xe0, 0x50, 0x22, 0xb1, 0x4d, 0x15, 0x8a,
+    0x78, 0x90, 0xf4, 0xe9, 0xa2, 0xf5, 0x69, 0x80, 0xa9, 0xb5, 0x1c, 0x98, 0x43, 0xb8, 0x8a, 0x0b, 0x1f, 0x3d, 0x7d,
+    0x8b, 0x59, 0x38, 0x9f, 0x78, 0x1f, 0xbd, 0x62, 0x64, 0x3e, 0xee, 0xa3, 0x52, 0x49, 0xff, 0x3c, 0x1c, 0x66, 0xd5,
+    0xdc, 0x77, 0xe8, 0x23, 0x3d, 0x54, 0xb9, 0xa0, 0xec, 0x8d, 0x31, 0x89, 0x40, 0x69, 0x8c, 0xf7, 0x71, 0x70, 0x9c,
+    0xf7, 0x69, 0x00, 0xa9, 0x7d, 0xe2, 0x3d, 0x29, 0x39, 0x3c, 0xe7, 0x98, 0x13, 0x4a, 0x2b, 0xc2, 0x2a, 0xbe, 0xc8,
+    0x50, 0xae, 0x3b, 0xa5, 0x60, 0x92, 0x43, 0x82, 0xe1, 0xaf, 0x9a, 0x37, 0xb1, 0x02, 0x61, 0xd7, 0xcc, 0xab, 0xd1,
+    0x93, 0x2a, 0x09, 0x4b, 0x01, 0x47, 0x65, 0xe6, 0x19, 0xf6, 0x86, 0x27, 0x86, 0x91, 0x83, 0xe5, 0xfe, 0xa8, 0x4e,
+    0x44, 0xee, 0xd1, 0x05, 0x46, 0x65, 0xe1, 0x79, 0x43, 0x57, 0x1a, 0x54, 0x92, 0x1d, 0x7f, 0xc5, 0x35, 0xa0, 0xb6,
+    0xc6, 0x88, 0xa1, 0x80, 0x51, 0xf0, 0xda, 0xfe, 0x10, 0xb2, 0x28, 0x5b, 0xbf, 0xc1, 0x31, 0x9f, 0x95, 0xdc, 0xf5,
+    0x0e, 0x67, 0xa1, 0x25, 0xe4, 0xc9, 0x1d, 0x83, 0x34, 0x8d, 0xa5, 0x11, 0x70, 0x22, 0x92, 0x6d, 0x2c, 0x85, 0x23,
+    0x80, 0x80, 0x40, 0x37, 0x65, 0x86, 0x31, 0x1d, 0x8c, 0x3c, 0x4f, 0x7a, 0xc6, 0x7b, 0x15, 0x9e, 0x42, 0x9a, 0x6c,
+    0x5f, 0xcf, 0xdf, 0x1b, 0x41, 0x56, 0x6e, 0x39, 0xc7, 0xc3, 0xe2, 0x1b, 0x67, 0x5f, 0xe5, 0xe4, 0x29, 0x66, 0x19,
+    0xe9, 0x9d, 0x62, 0x5e, 0xc0, 0x9f, 0xca, 0x52, 0x9f, 0xa3, 0xf4, 0x96, 0xf9, 0x64, 0x15, 0x49, 0x97, 0xde, 0xa6,
+    0xdf, 0x8f, 0x47, 0xea, 0x50, 0xf3, 0xf7, 0xf1, 0x48, 0x9e, 0x61, 0x1b, 0x96, 0xb0, 0xd0, 0x2a, 0x18, 0x03, 0x48,
+    0x62, 0x23, 0xa2, 0xc1, 0x68, 0x6f, 0x0e, 0x87, 0xf3, 0x8d, 0x39, 0x4b, 0xf6, 0xe0, 0xfa, 0xca, 0x13, 0xf3, 0x0e,
+    0x7c, 0x99, 0xc7, 0x04, 0x11, 0x9b, 0x79, 0x1b, 0x56, 0x83, 0x07, 0x3b, 0xb8, 0x3e, 0x62, 0x8b, 0x62, 0xad, 0x63,
+    0xa9, 0xac, 0x83, 0xd3, 0x3a, 0x36, 0xcd, 0x48, 0x29, 0xb2, 0xcf, 0xb1, 0xbf, 0x77, 0x83, 0xab, 0x6b, 0x63, 0x50,
+    0x6b, 0xdc, 0x61, 0xee, 0x9c, 0x0a, 0xa8, 0xc7, 0x74, 0x05, 0xd5, 0xb3, 0x9c, 0x7c, 0xf9, 0xad, 0x9d, 0x03, 0x82,
+    0x46, 0x20, 0x70, 0xd1, 0x40, 0xab, 0x76, 0x29, 0xe7, 0x5d, 0x40, 0x88, 0x6f, 0x52, 0xd0, 0xa7, 0x33, 0xd8, 0xc4,
+    0xe6, 0x13, 0x88, 0x45, 0xd3, 0x7d, 0xae, 0x35, 0xf3, 0xc5, 0x88, 0x76, 0x66, 0xdd, 0x2d, 0x72, 0xab, 0x85, 0x48,
+    0x46, 0xcf, 0x36, 0x13, 0x2e, 0x3a, 0x94, 0x33, 0x12, 0x30, 0x41, 0x6b, 0x2b, 0x25, 0x9f, 0xeb, 0x5e, 0x27, 0x68,
+    0x0f, 0x24, 0xad, 0xfb, 0x37, 0x8b, 0xce, 0x28, 0x39, 0xb9, 0xde, 0xe4, 0x0c, 0x52, 0xb0, 0x60, 0x7b, 0x99, 0x13,
+    0x6e, 0x80, 0x4f, 0x6c, 0x96, 0x9c, 0xa6, 0x41, 0x1e, 0x0b, 0xe3, 0x91, 0xd7, 0xe6, 0x97, 0x05, 0x74, 0x28, 0x59,
+    0x34, 0x42, 0x3c, 0xc0, 0xce, 0x21, 0xb9, 0x2a, 0x50, 0x37, 0x0d, 0x74, 0xe5, 0xca, 0x99, 0x62, 0x0a, 0x5c, 0x08,
+    0x05, 0x51, 0x3b, 0x3a, 0x89, 0xca, 0x79, 0x9f, 0x54, 0x97, 0xf9, 0xb4, 0x90, 0xa6, 0x81, 0x7c, 0x5a, 0x39, 0xe6,
+    0x81, 0x9d, 0x6d, 0x5c, 0x13, 0x18, 0xe8, 0xd4, 0xbe, 0x16, 0xe5, 0x1c, 0xab, 0x88, 0xde, 0xe7, 0x1f, 0x2a, 0x7b,
+    0xfa, 0x20, 0xc2, 0x46, 0x05, 0x1a, 0x4b, 0x89, 0xb1, 0x91, 0xe3, 0xdf, 0x12, 0x65, 0x43, 0x86, 0x80, 0x10, 0xd2,
+    0x46, 0x4e, 0x3f, 0xac, 0x2f, 0x6f, 0x33, 0xed, 0xff, 0x49, 0xe2, 0xb7, 0xc1, 0x5e, 0x4e, 0xfd, 0xa9, 0x47, 0x3c,
+    0x5e, 0x6b, 0xf4, 0x98, 0x92, 0x6e, 0x83, 0x3c, 0x55, 0x9e, 0x82, 0x64, 0xc2, 0x58, 0x42, 0xb0, 0x28, 0x17, 0x3c,
+    0xe7, 0x15, 0x97, 0x70, 0x1f, 0xb5, 0xac, 0x88, 0x50, 0x95, 0xc8, 0xe9, 0xf3, 0x15, 0xf0, 0x4c, 0x40, 0xa0, 0x63,
+    0x8c, 0x34, 0xaa, 0xe0, 0x4b, 0x60, 0xac, 0x03, 0x65, 0xa7, 0x19, 0x09, 0x2e, 0xbb, 0x37, 0x48, 0x94, 0xfa, 0x9a,
+    0x94, 0xa4, 0xd7, 0xa2, 0xc6, 0x2b, 0xb1, 0x8a, 0x48, 0x20, 0x43, 0x0d, 0x11, 0xab, 0xea, 0xa9, 0x7b, 0x55, 0x4c,
+    0x06, 0x83, 0xca, 0x97, 0xd3, 0x13, 0x6f, 0x68, 0xa8, 0xbc, 0xeb, 0x8a, 0x76, 0x7a, 0xa2, 0x95, 0xf2, 0x16, 0xd2,
+    0x12, 0x34, 0x0d, 0x23, 0xcd, 0xa1, 0xd4, 0x95, 0x74, 0x37, 0x06, 0xf1, 0x25, 0x13, 0x3d, 0xdb, 0xa9, 0x1d, 0xa5,
+    0x2d, 0x69, 0x0f, 0x21, 0x3d, 0x77, 0xc9, 0xc7, 0x2c, 0xe4, 0xea, 0x4e, 0x39, 0x29, 0xaf, 0x42, 0x74, 0x72, 0xdf,
+    0x63, 0x48, 0x04, 0xfa, 0x9c, 0x63, 0x58, 0x17, 0x0d, 0x75, 0x0e, 0x2b, 0xc4, 0x6c, 0xa1, 0x84, 0xf9, 0x92, 0xf1,
+    0x54, 0x32, 0x68, 0x00, 0x64, 0xc0, 0x67, 0x2f, 0x03, 0xcb, 0x5f, 0x41, 0xfc, 0x68, 0xe3, 0xc3, 0xe1, 0xcf, 0x9a,
+    0x42, 0x6c, 0xff, 0x84, 0xcd, 0x10, 0x1e, 0xd5, 0x03, 0x9e, 0xf9, 0x26, 0x4e, 0xd0, 0x0a, 0x48, 0xca, 0xec, 0x68,
+    0x22, 0x7b, 0xd5, 0x43, 0x38, 0x95, 0x15, 0xa8, 0xa3, 0xac, 0xb3, 0x12, 0x7e, 0x84, 0xa9, 0x6e, 0x25, 0xd6, 0x02,
+    0x6d, 0xae, 0x56, 0xac, 0x05, 0x70, 0xe0, 0xe7, 0x10, 0x3c, 0x91, 0xcf, 0xc1, 0xc5, 0xa0, 0x00, 0x9f, 0x03, 0xe0,
+    0x45, 0xee, 0xc2, 0x83, 0x79, 0x64, 0x59, 0x8d, 0x30, 0x1c, 0x55, 0xc4, 0xfa, 0x35, 0xdb, 0x91, 0x0f, 0xdc, 0x8e,
+    0xf1, 0xb9, 0xf6, 0x58, 0xb2, 0x1c, 0x8c, 0x32, 0xf7, 0x6a, 0x89, 0x9e, 0x37, 0x69, 0xdc, 0x8c, 0x9e, 0xec, 0x6b,
+    0xf9, 0xbf, 0xa0, 0x97, 0x41, 0x7f, 0x0b, 0xb7, 0xbc, 0xe6, 0x77, 0x0b, 0x22, 0xcd, 0xf4, 0x0a, 0x22, 0x65, 0xd4,
+    0x88, 0x8c, 0x21, 0x6c, 0x52, 0xdd, 0xdc, 0x26, 0xd5, 0x85, 0x80, 0xa7, 0x23, 0x52, 0x5d, 0x0b, 0x69, 0x23, 0x9f,
+    0xd6, 0x81, 0x8c, 0x45, 0x7a, 0xf7, 0xc3, 0xdf, 0x5e, 0x7e, 0x7a, 0xfb, 0xcb, 0x0f, 0x8b, 0xb7, 0xef, 0xde, 0xbc,
+    0x7d, 0xf7, 0xf6, 0xd3, 0x6f, 0x04, 0xe1, 0x31, 0x15, 0x2a, 0xc3, 0x87, 0xf7, 0x37, 0x6f, 0x9d, 0x0c, 0xb6, 0x37,
+    0x43, 0xd6, 0xbe, 0x91, 0x83, 0x21, 0x10, 0xd9, 0x20, 0x64, 0x90, 0x9d, 0xda, 0xf6, 0x67, 0x62, 0x8e, 0xb1, 0x77,
+    0x02, 0x93, 0x2d, 0xe0, 0x1c, 0xcb, 0xbc, 0x64, 0x44, 0xae, 0x0a, 0xad, 0x1f, 0xd0, 0x82, 0x6b, 0x70, 0x91, 0x49,
+    0xf3, 0xbb, 0x5f, 0x08, 0x62, 0x9f, 0x56, 0x52, 0xee, 0xab, 0x6d, 0xcd, 0xf3, 0xed, 0xfd, 0x5e, 0xc2, 0xf9, 0xcf,
+    0xa5, 0x11, 0xb5, 0x00, 0x07, 0xe0, 0x73, 0xf8, 0xe3, 0x4a, 0x5b, 0xd2, 0x64, 0x16, 0xed, 0x67, 0x0c, 0x41, 0x97,
+    0x06, 0x1f, 0xc4, 0x1e, 0x79, 0xa9, 0x4f, 0x16, 0x12, 0xb8, 0x23, 0x86, 0x4f, 0x2b, 0x82, 0x5e, 0x31, 0xa2, 0xb8,
+    0xe4, 0x0a, 0x95, 0x52, 0xf2, 0x6f, 0x94, 0x5d, 0x54, 0xc8, 0x59, 0xc1, 0xee, 0x15, 0x39, 0x32, 0x7e, 0x10, 0x4c,
+    0x7c, 0x39, 0xb8, 0xff, 0x12, 0xef, 0x70, 0xa6, 0x38, 0x92, 0x13, 0xfe, 0x90, 0x61, 0x60, 0x7f, 0x0e, 0x3e, 0xaf,
+    0x0e, 0xf3, 0xf2, 0x46, 0x9f, 0x72, 0x4b, 0x3e, 0x9e, 0x2c, 0xaf, 0xc0, 0x60, 0xbf, 0x54, 0xcd, 0x5d, 0xf3, 0x7a,
+    0xb6, 0x9c, 0xb3, 0xfd, 0x2c, 0x9a, 0x07, 0x77, 0x6c, 0x96, 0xcd, 0x83, 0x55, 0xc3, 0xd7, 0xec, 0x96, 0xaf, 0xad,
+    0xaa, 0xad, 0xed, 0xaa, 0x4d, 0x36, 0xfc, 0x16, 0x24, 0x84, 0x9b, 0xcc, 0x03, 0xde, 0xe3, 0x3b, 0x9f, 0x6d, 0x40,
+    0xa2, 0x5d, 0xb1, 0x0d, 0x5c, 0xc4, 0xd6, 0xfc, 0x87, 0xca, 0xdb, 0xb0, 0x92, 0x9d, 0x8f, 0x59, 0x8e, 0xf3, 0xcf,
+    0x87, 0x07, 0xb4, 0x17, 0xea, 0x67, 0x97, 0xea, 0xd9, 0x44, 0xd9, 0xcd, 0x36, 0xa3, 0xc5, 0x7d, 0x5a, 0x6d, 0xc2,
+    0x0c, 0x3d, 0xcb, 0xe1, 0xa3, 0xad, 0x14, 0xfc, 0xf4, 0x02, 0xbf, 0x64, 0x47, 0x6d, 0xa5, 0x6d, 0xbb, 0x2a, 0xb1,
+    0x15, 0xb4, 0x28, 0xb2, 0x5a, 0xe1, 0x81, 0x39, 0x7f, 0x01, 0x0b, 0x18, 0x7b, 0x8e, 0x73, 0x5e, 0xfb, 0x23, 0x64,
+    0xbc, 0x77, 0x00, 0xd0, 0x32, 0xc7, 0x01, 0x1e, 0xb1, 0x62, 0x14, 0x0d, 0xde, 0xf9, 0xa5, 0xb2, 0x5a, 0x69, 0x4e,
+    0x42, 0xdb, 0x88, 0x55, 0xcb, 0x91, 0xaa, 0x19, 0x91, 0x3e, 0x48, 0xcf, 0xfb, 0x1e, 0x51, 0x0d, 0xf6, 0x64, 0x5e,
+    0x07, 0xf6, 0xe9, 0x55, 0x6b, 0x55, 0x77, 0x7e, 0x4f, 0x95, 0x2e, 0x39, 0xb2, 0xe5, 0xa7, 0xcb, 0xf0, 0x41, 0xfd,
+    0x29, 0xb9, 0x3e, 0x14, 0x38, 0xc2, 0x63, 0x15, 0x70, 0xbe, 0x5e, 0x89, 0x76, 0x27, 0xc2, 0xae, 0x5c, 0x02, 0x42,
+    0x7c, 0x49, 0xd3, 0x1c, 0x8f, 0x23, 0x9a, 0x88, 0xb0, 0x89, 0xd1, 0x5f, 0xd8, 0x7d, 0x28, 0xb1, 0x9c, 0xe7, 0x1a,
+    0x94, 0x5c, 0x32, 0x78, 0x4f, 0xda, 0x6b, 0xd0, 0x2c, 0xaf, 0x4a, 0x4d, 0x26, 0x72, 0x50, 0x3e, 0x1c, 0x0a, 0xd8,
+    0x4b, 0x8d, 0x9f, 0x26, 0xfc, 0x84, 0xe5, 0xad, 0xbd, 0x35, 0xa5, 0xa8, 0xa4, 0x01, 0x2a, 0xf0, 0x31, 0x83, 0xff,
+    0xdd, 0x19, 0x62, 0xc1, 0x14, 0x1d, 0x3f, 0x9c, 0x89, 0xb9, 0xf5, 0xdc, 0x2a, 0xeb, 0x28, 0x5b, 0xa3, 0x9c, 0x80,
+    0x7f, 0x4b, 0x75, 0x9c, 0x24, 0xc2, 0xa9, 0xf7, 0x88, 0x8b, 0xba, 0x97, 0x43, 0xd4, 0x0d, 0x7b, 0x5b, 0xe9, 0x60,
+    0xcb, 0x69, 0x1a, 0x1c, 0x89, 0x5f, 0xa9, 0xcf, 0xde, 0x67, 0x16, 0x8f, 0x3a, 0xb2, 0x11, 0x25, 0x69, 0x1c, 0x8b,
+    0x1c, 0xb6, 0xf7, 0x85, 0xdc, 0xff, 0xfb, 0x7d, 0x08, 0x27, 0xad, 0x82, 0xa4, 0xf4, 0x04, 0x22, 0xc2, 0xd1, 0xe1,
+    0x47, 0x84, 0x27, 0x52, 0x55, 0xf8, 0xa4, 0x3e, 0x71, 0x63, 0x76, 0x2f, 0xcc, 0x51, 0xbd, 0x05, 0x18, 0xc6, 0x7a,
+    0x6b, 0x11, 0x92, 0x68, 0xa5, 0x19, 0x6d, 0x3d, 0x20, 0x46, 0xbc, 0x5f, 0x5b, 0x64, 0x30, 0xd6, 0x96, 0x44, 0x02,
+    0xf8, 0x1d, 0x09, 0x19, 0xda, 0x36, 0x02, 0x33, 0x86, 0xb7, 0xb3, 0xe2, 0xd2, 0x75, 0xd8, 0xe6, 0x1c, 0xbe, 0x90,
+    0x85, 0x66, 0x1d, 0x51, 0x9a, 0x20, 0xe4, 0x1f, 0x70, 0xb2, 0x50, 0x18, 0xcd, 0xeb, 0xa3, 0x74, 0x92, 0x58, 0xdf,
+    0x77, 0x95, 0x0a, 0x36, 0x9b, 0x1b, 0xd4, 0x97, 0x1d, 0x25, 0xbf, 0x02, 0x27, 0x1d, 0x27, 0x59, 0xe4, 0x20, 0x6a,
+    0x51, 0x39, 0x37, 0x49, 0x58, 0xda, 0xd5, 0xa9, 0x36, 0xeb, 0x75, 0x51, 0xd6, 0xd5, 0x6b, 0x11, 0x29, 0x7a, 0x1f,
+    0xf5, 0xe8, 0x89, 0x84, 0x54, 0x68, 0x55, 0x6a, 0x97, 0x47, 0xe0, 0xb6, 0xa9, 0x15, 0xdb, 0x72, 0x09, 0x4b, 0xd4,
+    0xf8, 0x4f, 0xd0, 0x47, 0xb9, 0x78, 0x90, 0x01, 0x1a, 0x1d, 0x4f, 0xcd, 0x5b, 0x8f, 0xbc, 0x72, 0x94, 0x5f, 0x5a,
+    0x6d, 0xd2, 0x2f, 0x80, 0xcc, 0x68, 0xff, 0x68, 0x29, 0x81, 0xcc, 0xc0, 0x4c, 0x5a, 0x1a, 0x12, 0x39, 0x8a, 0x59,
+    0x9a, 0xff, 0x81, 0x2b, 0xb6, 0x42, 0xa4, 0x61, 0x35, 0xf7, 0xf8, 0xcb, 0xca, 0xab, 0xe5, 0x5a, 0x66, 0x9a, 0x9b,
+    0x25, 0x8e, 0x15, 0x8b, 0x8b, 0x7a, 0x5d, 0x89, 0x2c, 0x10, 0xe2, 0x08, 0xd3, 0x58, 0x4f, 0xbd, 0x51, 0x5a, 0x7d,
+    0x40, 0x42, 0x99, 0x1f, 0xb0, 0xb7, 0x63, 0xaf, 0x07, 0x59, 0x88, 0x63, 0xcb, 0xc1, 0x66, 0xeb, 0x7d, 0x2a, 0x53,
+    0x11, 0x9f, 0xd5, 0xc5, 0xd9, 0xa6, 0x12, 0x67, 0x75, 0x22, 0xce, 0xbe, 0x83, 0x9c, 0xdf, 0x9d, 0x51, 0xd1, 0x67,
+    0x0f, 0x69, 0x9d, 0x14, 0x9b, 0x9a, 0x9e, 0xbc, 0xc1, 0x32, 0xbe, 0x3b, 0x23, 0xae, 0x9a, 0x33, 0x1a, 0xc9, 0x78,
+    0x74, 0xf6, 0x21, 0x03, 0x92, 0xd7, 0xb3, 0x74, 0x05, 0x83, 0x77, 0x16, 0xe6, 0xf1, 0x59, 0x29, 0xee, 0xc0, 0xe2,
+    0x54, 0x76, 0xbe, 0x07, 0x19, 0x56, 0xe1, 0x1f, 0xe2, 0x0c, 0xa0, 0x5d, 0xcf, 0xd2, 0xfa, 0x2c, 0xad, 0xce, 0xf2,
+    0xa2, 0x3e, 0x53, 0x52, 0x38, 0x84, 0xf1, 0xc3, 0x7b, 0xfa, 0xca, 0x2e, 0x6f, 0xb3, 0xb8, 0xcb, 0x22, 0x7f, 0x8a,
+    0x5e, 0x45, 0xc4, 0xa4, 0x51, 0x09, 0xaf, 0xdd, 0xdf, 0x36, 0xf7, 0x0f, 0xaf, 0x1b, 0xbb, 0x9f, 0xdd, 0x31, 0xa2,
+    0x0b, 0xea, 0xf1, 0x4a, 0x52, 0x2a, 0x28, 0x20, 0x70, 0xa2, 0x59, 0xe3, 0xc1, 0x1d, 0x07, 0xbc, 0x1a, 0xd8, 0x92,
+    0xad, 0x7d, 0xfe, 0x22, 0x96, 0x61, 0xda, 0x9b, 0x00, 0xff, 0x2a, 0x7b, 0xd3, 0x75, 0xb0, 0xc4, 0xfb, 0x16, 0xb2,
+    0x0d, 0xbd, 0x7d, 0xcd, 0x5f, 0x7a, 0xb9, 0xfa, 0x9b, 0xfd, 0x13, 0x80, 0x30, 0x20, 0x66, 0xd5, 0x47, 0x13, 0xf7,
+    0xce, 0xca, 0xb2, 0x73, 0xb2, 0xec, 0x7a, 0xe8, 0xd7, 0x24, 0x46, 0xa5, 0x95, 0xa5, 0x74, 0xb2, 0x94, 0x90, 0x05,
+    0x7c, 0x62, 0x34, 0xb5, 0x11, 0x40, 0xd8, 0x8e, 0x52, 0xf9, 0x42, 0xe5, 0x45, 0x14, 0xce, 0x09, 0x9e, 0x27, 0x62,
+    0x74, 0x6f, 0x25, 0x03, 0x86, 0x43, 0x08, 0xe6, 0xa0, 0x2d, 0xf6, 0x86, 0x6e, 0x22, 0xfe, 0x7a, 0x53, 0x94, 0x6f,
+    0x63, 0xf2, 0x29, 0xd8, 0x9d, 0x7c, 0x5c, 0xc2, 0xe3, 0xf2, 0xe4, 0xe3, 0x10, 0x3d, 0x12, 0x4e, 0x3e, 0x06, 0xdf,
+    0x23, 0x39, 0xaf, 0xbb, 0x1e, 0x27, 0xc8, 0x2d, 0xa4, 0xfb, 0xdb, 0x31, 0x09, 0xd0, 0xbc, 0x86, 0xe5, 0xa8, 0xa9,
+    0xb8, 0x66, 0x66, 0x8c, 0xe7, 0x8d, 0xde, 0x1f, 0x3b, 0xde, 0x32, 0x85, 0x62, 0x16, 0xf3, 0x1a, 0x7e, 0xcf, 0xaa,
+    0x40, 0xdd, 0xf5, 0x36, 0xc9, 0x2d, 0xb3, 0x7a, 0x8e, 0x76, 0xdf, 0xf7, 0x75, 0x22, 0xa8, 0xfd, 0x1d, 0xf6, 0x3c,
+    0xb3, 0xde, 0x55, 0x31, 0x70, 0xa9, 0x92, 0x1d, 0x32, 0x55, 0x4d, 0x0f, 0x54, 0x4a, 0x83, 0xa7, 0x97, 0xd6, 0xe5,
+    0x4b, 0xa5, 0x8d, 0x3c, 0xd3, 0xfc, 0x06, 0xf0, 0x62, 0xea, 0xb2, 0xd8, 0x7d, 0x75, 0x5f, 0xc1, 0x6d, 0xbc, 0xdf,
+    0x5f, 0x56, 0x9e, 0xf9, 0x89, 0x0b, 0xc0, 0xde, 0x54, 0x68, 0x9d, 0x40, 0xa9, 0x61, 0x1d, 0xbe, 0x4a, 0x44, 0xf4,
+    0x47, 0xbb, 0x5c, 0x67, 0xae, 0x03, 0x46, 0x14, 0xf1, 0xdb, 0x78, 0xf4, 0x07, 0x28, 0xae, 0x8d, 0x3d, 0x20, 0xac,
+    0x43, 0x42, 0x9f, 0x11, 0x80, 0xd4, 0x63, 0x8e, 0x12, 0xd0, 0xac, 0x68, 0xee, 0x98, 0xfc, 0x5c, 0x5f, 0x29, 0xfd,
+    0xfd, 0xb2, 0xf2, 0xc8, 0x9c, 0xd2, 0x36, 0xd3, 0x58, 0xad, 0xa9, 0x04, 0xc2, 0x2b, 0x2a, 0x59, 0x85, 0xcf, 0xe6,
+    0x8d, 0xe8, 0xf7, 0xe5, 0x11, 0x9e, 0x56, 0x3f, 0x6c, 0x31, 0xbe, 0x15, 0x10, 0x8d, 0x04, 0x40, 0x3f, 0x01, 0xcc,
+    0x8b, 0x6c, 0x66, 0xf7, 0x71, 0x40, 0x95, 0x12, 0x4d, 0xe3, 0x6c, 0x9e, 0xdf, 0xd2, 0x9b, 0xb2, 0x83, 0x4e, 0x9d,
+    0x2a, 0x70, 0xc1, 0x55, 0xc9, 0x78, 0x65, 0x3d, 0x91, 0xcf, 0x6f, 0x6e, 0x37, 0x69, 0x16, 0xbf, 0x2f, 0xff, 0x89,
+    0x63, 0xab, 0xeb, 0xf0, 0xc8, 0xd4, 0xe9, 0xda, 0x79, 0xa4, 0xb5, 0x17, 0x02, 0x22, 0xda, 0x35, 0xd4, 0x7a, 0x61,
+    0xa1, 0x47, 0x7a, 0x22, 0x9c, 0x93, 0x44, 0x4d, 0x3b, 0xd0, 0xd2, 0x08, 0x7d, 0x7d, 0xcd, 0xe9, 0x2f, 0x0c, 0xd6,
+    0x3e, 0x1f, 0x33, 0x20, 0x2b, 0xd1, 0x8f, 0xd5, 0x43, 0x63, 0x33, 0x87, 0x9e, 0xb5, 0x2a, 0xcf, 0xbc, 0xea, 0x70,
+    0x40, 0x7c, 0x18, 0xfd, 0x25, 0xbf, 0xdf, 0x7f, 0x4d, 0xf3, 0x8f, 0x09, 0x35, 0x7e, 0xb6, 0x19, 0xa0, 0x6b, 0xdf,
+    0x95, 0x07, 0xa2, 0x9e, 0x6b, 0x95, 0x20, 0xc4, 0x1b, 0xc4, 0x44, 0x33, 0x62, 0x0e, 0x4e, 0x3b, 0xd4, 0xfc, 0x93,
+    0xd4, 0x80, 0x10, 0x25, 0x5e, 0xc7, 0x94, 0x05, 0x39, 0x6d, 0xe2, 0x48, 0x3f, 0x0a, 0x27, 0xf2, 0xa3, 0xa8, 0x8a,
+    0xec, 0x1e, 0x2e, 0x18, 0x4c, 0xbd, 0xa7, 0xfd, 0x12, 0xfd, 0x96, 0x70, 0xe4, 0x1c, 0xad, 0x0a, 0x41, 0xe4, 0x84,
+    0xb0, 0xd6, 0x10, 0x26, 0x88, 0x0d, 0xe2, 0x65, 0xdf, 0x25, 0x19, 0x8e, 0x14, 0x5c, 0xd6, 0xb1, 0x63, 0xcc, 0xd5,
+    0x51, 0xf5, 0x1a, 0xc0, 0x78, 0xe5, 0x08, 0x9a, 0x8d, 0x22, 0xbb, 0x84, 0xa8, 0x22, 0xc7, 0x13, 0x50, 0x3b, 0x28,
+    0x8d, 0xcd, 0xf4, 0x7c, 0x1c, 0xe4, 0xa3, 0x45, 0x85, 0x3a, 0x27, 0x96, 0xf1, 0x1a, 0x80, 0xb5, 0x73, 0xd5, 0xcf,
+    0xb3, 0x1a, 0x3c, 0x69, 0x88, 0xcf, 0xc7, 0x68, 0x7b, 0x65, 0x73, 0x50, 0x6d, 0xa7, 0xb3, 0xf2, 0x8a, 0xe9, 0x72,
+    0x60, 0xdc, 0x37, 0xbc, 0xa2, 0x38, 0xc3, 0x8f, 0x1e, 0x6c, 0x71, 0xfe, 0x74, 0x43, 0xed, 0xc7, 0xdc, 0xa8, 0x87,
+    0x81, 0xd6, 0x82, 0x37, 0x05, 0xb1, 0xfe, 0x7e, 0xe8, 0xc8, 0xf6, 0x5e, 0x8b, 0x8c, 0x26, 0x9f, 0xfd, 0xfc, 0x43,
+    0x99, 0xae, 0x52, 0xb8, 0x2f, 0x39, 0x59, 0x34, 0xf3, 0x10, 0xd8, 0x1b, 0x62, 0xb8, 0x3e, 0x2a, 0x3c, 0xa2, 0xac,
+    0xdf, 0x87, 0xdf, 0x57, 0x19, 0x98, 0x62, 0xe0, 0xba, 0x42, 0x30, 0x1e, 0x02, 0x41, 0x3c, 0x4c, 0xa3, 0x93, 0x41,
+    0x0d, 0xda, 0xf0, 0x0d, 0x40, 0x66, 0x80, 0x47, 0xe6, 0xd2, 0x23, 0xe0, 0x2e, 0x70, 0xed, 0xc9, 0x78, 0xec, 0x4f,
+    0x4c, 0x43, 0xa3, 0xa6, 0x34, 0xd3, 0x73, 0xe3, 0x37, 0x1d, 0xd5, 0x72, 0xed, 0xfc, 0xc7, 0x97, 0xfc, 0x06, 0xbd,
+    0xa0, 0xe5, 0xe5, 0x3e, 0x52, 0x97, 0xfb, 0x8c, 0xe2, 0x32, 0x91, 0x1c, 0x16, 0xc4, 0xb2, 0x84, 0x03, 0x8f, 0x51,
+    0xc9, 0x62, 0x4b, 0x8f, 0x55, 0xd1, 0xf2, 0x45, 0xb9, 0x41, 0x3a, 0x74, 0x42, 0xb0, 0x44, 0x05, 0xc1, 0x12, 0x18,
+    0x17, 0xb1, 0xe6, 0x9b, 0x41, 0xce, 0xe2, 0xd9, 0x66, 0xce, 0x91, 0xb0, 0x2e, 0x39, 0x1c, 0x0a, 0x09, 0x36, 0x93,
+    0xcd, 0xd6, 0x73, 0xb6, 0xf6, 0x19, 0x28, 0x01, 0x4a, 0x99, 0x26, 0x28, 0x4d, 0x2b, 0xb6, 0xe2, 0xa6, 0x35, 0x58,
+    0xad, 0xa6, 0x6c, 0x55, 0x53, 0x76, 0x4e, 0x53, 0x8e, 0x2a, 0x28, 0x39, 0xa1, 0x14, 0x65, 0x18, 0xc0, 0x88, 0x4d,
+    0xa2, 0xab, 0x0c, 0x7d, 0xbc, 0x13, 0x1e, 0x41, 0x15, 0x11, 0xf9, 0x84, 0x21, 0x04, 0x26, 0xa2, 0xb8, 0x50, 0x85,
+    0x62, 0x80, 0x8c, 0x48, 0x20, 0x98, 0xa8, 0xd4, 0x29, 0x30, 0x1f, 0x4d, 0x15, 0xc3, 0xa6, 0x3d, 0x51, 0xbe, 0xa5,
+    0x8e, 0x7b, 0x94, 0x6d, 0xfe, 0x2e, 0x76, 0x41, 0x88, 0xdc, 0x8d, 0x3b, 0xf5, 0x33, 0xe2, 0xbd, 0xdd, 0x11, 0xc6,
+    0x4f, 0x76, 0xdc, 0x22, 0x5c, 0x11, 0x6c, 0xa9, 0xe6, 0x10, 0x8b, 0x79, 0x35, 0x49, 0x50, 0xcb, 0x92, 0xf8, 0x1b,
+    0x9e, 0x0c, 0x72, 0xb6, 0x04, 0x0f, 0xda, 0x39, 0xcb, 0x00, 0x7f, 0xc5, 0x6a, 0xd1, 0x6f, 0xb5, 0xb7, 0x04, 0xf9,
+    0x69, 0x63, 0x37, 0x0a, 0x13, 0x23, 0x48, 0xd4, 0xed, 0xca, 0x40, 0x7e, 0xf8, 0x80, 0xd3, 0xf1, 0xd8, 0x53, 0xc6,
+    0xdc, 0xca, 0xf4, 0x32, 0x9d, 0x2b, 0xf9, 0x46, 0xee, 0xa5, 0x8f, 0xbd, 0x04, 0x3b, 0x07, 0xbc, 0x81, 0xb4, 0x81,
+    0x37, 0xb0, 0x5d, 0x78, 0x6d, 0x90, 0x30, 0x23, 0xc0, 0x16, 0xc7, 0xc7, 0x48, 0x09, 0x0c, 0xe1, 0x38, 0x4b, 0x01,
+    0x98, 0x46, 0x5f, 0x66, 0x2b, 0xfb, 0x32, 0xab, 0x35, 0x5b, 0x2a, 0xa7, 0x7b, 0xe7, 0xd6, 0xed, 0x7c, 0x22, 0x01,
+    0xc0, 0xa4, 0xce, 0x81, 0x38, 0x33, 0xc1, 0x2e, 0x4d, 0x22, 0xcb, 0xc7, 0x30, 0xbf, 0x13, 0x6f, 0xca, 0x62, 0xa5,
+    0xba, 0xa2, 0xed, 0x33, 0x93, 0xcf, 0x48, 0x27, 0xa1, 0x02, 0x0a, 0x0a, 0xb9, 0xd6, 0xa7, 0xef, 0xc2, 0x77, 0x41,
+    0xa1, 0x81, 0xd9, 0x2a, 0xdc, 0xd3, 0x64, 0x8d, 0xd4, 0x1b, 0x55, 0xbf, 0x4f, 0xae, 0x81, 0x54, 0x67, 0x0e, 0x2d,
+    0x7b, 0x52, 0x61, 0x80, 0xd8, 0x51, 0x9f, 0x91, 0x50, 0x07, 0x52, 0x0f, 0x18, 0x42, 0xb4, 0x4d, 0x1f, 0x7f, 0x32,
+    0x24, 0xba, 0x00, 0x5b, 0x88, 0x36, 0xf0, 0xe3, 0x4f, 0xb0, 0xcf, 0x82, 0xf0, 0x98, 0xe6, 0xd7, 0x90, 0x74, 0x6c,
+    0xe0, 0xb4, 0xfa, 0x14, 0x7c, 0x90, 0xe4, 0x60, 0xa2, 0x0e, 0x5e, 0xee, 0x2f, 0xfd, 0x3e, 0x6c, 0xd9, 0xb9, 0x94,
+    0xea, 0x58, 0xa9, 0xb7, 0x6d, 0xed, 0x07, 0xd1, 0x16, 0x1c, 0x59, 0xc4, 0xdf, 0x67, 0x88, 0x08, 0x66, 0x06, 0x11,
+    0x76, 0x2d, 0xd4, 0xdd, 0x9e, 0x52, 0xcb, 0xa2, 0xde, 0xf6, 0x94, 0x52, 0xb7, 0x61, 0xf8, 0x6e, 0x82, 0x99, 0xe2,
+    0x86, 0xff, 0x91, 0x79, 0xa1, 0xde, 0x78, 0x2c, 0x0a, 0x74, 0xcf, 0xdf, 0x2f, 0x79, 0x35, 0xdb, 0x28, 0x13, 0xe6,
+    0x1d, 0x5f, 0xce, 0x42, 0xd9, 0xd5, 0xd2, 0xb8, 0xf3, 0xd9, 0x5b, 0xaa, 0xf9, 0xe0, 0x1f, 0x0e, 0x09, 0xc4, 0x1b,
+    0xc5, 0x57, 0x77, 0x8d, 0xdc, 0xba, 0x26, 0x9b, 0xab, 0x12, 0x50, 0xbf, 0xcf, 0xd7, 0xb8, 0xdf, 0x62, 0xfd, 0xbb,
+    0xa7, 0x41, 0xc6, 0x6a, 0x86, 0x2b, 0xa6, 0xf0, 0x29, 0x00, 0x0c, 0x0e, 0xa7, 0x82, 0xb4, 0xc0, 0x1b, 0x5e, 0x0e,
+    0x2f, 0x27, 0x1b, 0x32, 0xe9, 0x6e, 0x7c, 0xe4, 0xce, 0x02, 0x55, 0xef, 0x37, 0x14, 0x27, 0x0d, 0x12, 0x8d, 0xbd,
+    0x06, 0x5f, 0x66, 0x19, 0xe5, 0xa2, 0x89, 0xfb, 0x98, 0x7c, 0xa5, 0x07, 0x30, 0x57, 0xa1, 0x04, 0x88, 0x7e, 0x63,
+    0x59, 0x6c, 0x44, 0xdb, 0x62, 0x03, 0x4b, 0xa9, 0x9a, 0xeb, 0xd5, 0xf4, 0xd9, 0x2b, 0xd1, 0xbc, 0x8f, 0x66, 0x9c,
+    0xd2, 0x68, 0xc0, 0x71, 0x1a, 0x85, 0xdb, 0xf7, 0xf7, 0xa2, 0x5c, 0x66, 0x60, 0xc9, 0x56, 0xe1, 0x14, 0x97, 0x8d,
+    0x3a, 0x23, 0x5e, 0xe6, 0xb1, 0x02, 0xe8, 0x78, 0x4c, 0x00, 0x54, 0x17, 0x04, 0x54, 0x44, 0x4b, 0xe9, 0xad, 0xd0,
+    0x62, 0xa1, 0xde, 0x70, 0x94, 0xc2, 0x1f, 0xe9, 0xcf, 0x83, 0x7c, 0x0a, 0x40, 0xec, 0xfa, 0x38, 0x7a, 0x53, 0x94,
+    0xf4, 0xa9, 0x62, 0x96, 0xcb, 0xc1, 0x04, 0x76, 0x75, 0x22, 0x43, 0xad, 0x20, 0x6f, 0xd5, 0x95, 0xb7, 0x32, 0x79,
+    0x1b, 0xe3, 0x94, 0xfc, 0xc8, 0x4d, 0xc7, 0x1a, 0x31, 0xf0, 0xca, 0xd3, 0x3a, 0x4d, 0x90, 0x26, 0x17, 0xc0, 0x30,
+    0xc4, 0xb7, 0x99, 0xf7, 0xd2, 0x73, 0xa4, 0x2a, 0x48, 0x66, 0xbb, 0xcc, 0x53, 0x17, 0x51, 0x7d, 0xe5, 0xd4, 0xd2,
+    0x99, 0xd3, 0x8f, 0x00, 0xde, 0x63, 0x6a, 0xd2, 0x90, 0x8f, 0x70, 0x5b, 0x8a, 0xaf, 0xb7, 0xea, 0x1a, 0x2f, 0x8d,
+    0xce, 0xdd, 0xcb, 0x97, 0xee, 0x34, 0xe8, 0xa7, 0x20, 0x28, 0xe7, 0xcb, 0x52, 0xc0, 0x9e, 0x32, 0x9b, 0xeb, 0xd5,
+    0xaa, 0x15, 0x5a, 0x87, 0xc3, 0x58, 0x3b, 0x0a, 0x69, 0x75, 0x16, 0xb0, 0xd5, 0x48, 0xa7, 0x04, 0x08, 0xc1, 0x71,
+    0x1a, 0x76, 0x82, 0x71, 0x97, 0x4e, 0x23, 0xb2, 0x5e, 0x29, 0x49, 0x17, 0x66, 0x90, 0xfc, 0x93, 0xbc, 0x9e, 0x01,
+    0x2d, 0x01, 0x1c, 0x8a, 0x58, 0xc2, 0xc3, 0x49, 0x72, 0x05, 0xd0, 0xe9, 0x70, 0x50, 0x69, 0x68, 0xce, 0x6a, 0x96,
+    0xcc, 0x27, 0xb1, 0x54, 0x55, 0x1e, 0x0e, 0x9e, 0x72, 0x33, 0xe8, 0xf7, 0xb3, 0x69, 0xa9, 0x5c, 0x00, 0x82, 0x58,
+    0x17, 0x06, 0x88, 0x47, 0x5a, 0x78, 0xb2, 0xe8, 0x53, 0x12, 0xbf, 0x9c, 0x25, 0x73, 0x93, 0x0d, 0xef, 0xc0, 0x08,
+    0x36, 0xe3, 0xba, 0xa4, 0x4c, 0x7b, 0x54, 0x7e, 0xcf, 0xe8, 0xa9, 0xed, 0x6b, 0xad, 0xb6, 0x88, 0x75, 0x1d, 0x5c,
+    0x95, 0xa8, 0xa7, 0xf8, 0xa0, 0x24, 0xc1, 0xfb, 0xb5, 0x73, 0x33, 0x52, 0xbe, 0x16, 0xb9, 0x1f, 0xb4, 0x33, 0xb5,
+    0x72, 0xe0, 0x08, 0xe4, 0x58, 0x45, 0x25, 0xaf, 0x77, 0x1d, 0x82, 0x47, 0x77, 0xa5, 0x02, 0xe5, 0xe0, 0x17, 0x20,
+    0x46, 0xd7, 0x57, 0x9d, 0x35, 0xd4, 0x4c, 0xa3, 0xca, 0x23, 0xe8, 0xd4, 0x01, 0x3c, 0x29, 0x78, 0xa9, 0xd5, 0x8f,
+    0x87, 0x83, 0x67, 0x7e, 0xf0, 0x57, 0x99, 0xbe, 0x85, 0x98, 0x28, 0xa7, 0x1a, 0x21, 0x71, 0xa5, 0x24, 0x11, 0x1f,
+    0x2f, 0x5a, 0x56, 0x8c, 0xca, 0xf0, 0x81, 0x57, 0xaa, 0x7c, 0x75, 0xaa, 0xf2, 0x62, 0xa4, 0x6d, 0x09, 0xbc, 0x26,
+    0xff, 0x10, 0xb9, 0xe6, 0xad, 0xaf, 0xbb, 0xca, 0xd0, 0x6b, 0x59, 0x81, 0x8e, 0x60, 0x2b, 0x4b, 0xc9, 0x01, 0x9f,
+    0x54, 0x77, 0xd5, 0xaa, 0xf5, 0x39, 0x65, 0x1b, 0xe1, 0x26, 0xbf, 0x8e, 0x1d, 0x1c, 0x29, 0xbf, 0xc1, 0x73, 0x01,
+    0xec, 0x35, 0x60, 0x6f, 0xce, 0x59, 0xd1, 0x3c, 0x3a, 0xa4, 0x6d, 0x81, 0x46, 0x66, 0x6e, 0xe7, 0xea, 0xbe, 0x2d,
+    0x8f, 0xd2, 0x18, 0x22, 0xd3, 0x1e, 0x99, 0x0e, 0x36, 0xa3, 0xfc, 0xb7, 0x94, 0xdf, 0x2a, 0x1c, 0x03, 0xdf, 0x4e,
+    0xbd, 0x03, 0xa8, 0x7a, 0xda, 0x20, 0x63, 0xcd, 0x30, 0xb4, 0xb2, 0xcb, 0xa5, 0xd0, 0x12, 0xb4, 0xd4, 0x4d, 0x10,
+    0x9c, 0x1f, 0x11, 0xe5, 0x08, 0x40, 0x17, 0x29, 0x60, 0x82, 0x9f, 0xd2, 0x76, 0xf7, 0xfb, 0xeb, 0xd4, 0x23, 0xf7,
+    0xae, 0x50, 0xa3, 0x84, 0x12, 0x8c, 0xfd, 0x44, 0x63, 0x06, 0x1d, 0x5d, 0x91, 0x13, 0x9e, 0xb5, 0x3a, 0xac, 0xeb,
+    0xa6, 0x0c, 0xca, 0xe2, 0x98, 0x57, 0xd3, 0xd9, 0xef, 0x4f, 0xf6, 0x75, 0x83, 0x2c, 0xe4, 0xbf, 0xb3, 0x1e, 0x92,
+    0x41, 0xf7, 0x20, 0x14, 0xa2, 0x37, 0x0f, 0x66, 0xf8, 0x1f, 0xdb, 0xf0, 0xec, 0x1b, 0x6e, 0xd4, 0x09, 0x60, 0x8e,
+    0xb8, 0x5e, 0x7a, 0x8a, 0xb6, 0x1e, 0x6e, 0x81, 0x6c, 0x8d, 0x97, 0xb7, 0xf6, 0x1a, 0xc8, 0x29, 0x8e, 0xff, 0x8e,
+    0x67, 0x6a, 0x65, 0x83, 0x9f, 0x9e, 0xb2, 0x1d, 0x78, 0x78, 0x11, 0x02, 0x8a, 0x61, 0xd9, 0xf8, 0x3b, 0xcb, 0x71,
+    0x46, 0xff, 0xcd, 0x23, 0x86, 0xc1, 0x22, 0xf2, 0xe3, 0xcb, 0x52, 0x88, 0x2f, 0xc2, 0x7b, 0x5b, 0x79, 0x77, 0xe4,
+    0x94, 0x79, 0xa7, 0x87, 0xd1, 0x75, 0x49, 0xfa, 0x26, 0xf9, 0xd8, 0x1a, 0xb6, 0xdf, 0xb5, 0xfb, 0xcd, 0x10, 0x41,
+    0x08, 0xe5, 0xf8, 0x39, 0xa3, 0x13, 0x1a, 0x1f, 0x56, 0xb3, 0xd3, 0xeb, 0xf7, 0xce, 0xf1, 0x82, 0xad, 0xd1, 0x00,
+    0x8f, 0x87, 0x2e, 0xe6, 0x89, 0x1a, 0x3a, 0x5d, 0xd7, 0xce, 0xc1, 0x03, 0x83, 0x2c, 0x4f, 0xbe, 0x61, 0x58, 0x62,
+    0x7f, 0x12, 0xf1, 0xa4, 0xad, 0xda, 0xd8, 0x1c, 0xa9, 0x36, 0x6a, 0x06, 0x7e, 0xf0, 0x0a, 0x0a, 0x8c, 0x2e, 0x48,
+    0x2b, 0x30, 0x0e, 0x47, 0x00, 0xb2, 0x62, 0x1c, 0x8f, 0x0c, 0x26, 0x30, 0xa4, 0x1b, 0x8a, 0x02, 0xf0, 0xf0, 0x38,
+    0x1e, 0x84, 0x0c, 0x20, 0x5d, 0xf0, 0xd0, 0xb0, 0x4d, 0x42, 0xca, 0xcf, 0xf3, 0xbc, 0x56, 0x43, 0xe8, 0x3b, 0x0b,
+    0xd5, 0xb1, 0x1f, 0x69, 0xaf, 0x58, 0xd7, 0xaa, 0x74, 0x64, 0xab, 0x03, 0xf4, 0x0d, 0x19, 0xf8, 0xd6, 0xb1, 0x05,
+    0x40, 0xb4, 0xc4, 0x6f, 0xa9, 0x57, 0xfb, 0x32, 0x66, 0x85, 0x7a, 0x7d, 0x61, 0xda, 0xf5, 0x5a, 0x5a, 0x14, 0x50,
+    0x71, 0xdb, 0xaa, 0xed, 0x91, 0x9c, 0xff, 0xf8, 0xae, 0xa3, 0x1d, 0x9f, 0x9d, 0x1a, 0x5b, 0x42, 0x99, 0x5b, 0x3c,
+    0x91, 0xd5, 0xd1, 0x96, 0xea, 0x54, 0x1f, 0x70, 0xa9, 0x49, 0x75, 0x66, 0x60, 0x78, 0x8d, 0x00, 0xe5, 0x16, 0x22,
+    0x69, 0x1c, 0xf6, 0xce, 0x27, 0x83, 0x82, 0xb9, 0x45, 0x02, 0x12, 0xd8, 0xc6, 0xd6, 0x2e, 0x9a, 0xeb, 0xd7, 0x6f,
+    0xa9, 0x57, 0xb5, 0xa9, 0xea, 0xc1, 0x1b, 0x2f, 0x70, 0xf6, 0x4e, 0x6b, 0x01, 0x01, 0x14, 0xb6, 0x96, 0xe5, 0xe0,
+    0xdc, 0xed, 0xaa, 0x96, 0x8a, 0x32, 0xea, 0xf7, 0xcf, 0x7f, 0x4b, 0x51, 0x11, 0x7b, 0xaa, 0x38, 0x65, 0xfd, 0x76,
+    0xcb, 0x5c, 0x54, 0x96, 0xbc, 0x41, 0x15, 0xad, 0xd5, 0x51, 0x53, 0xb9, 0x6e, 0xae, 0x5a, 0x32, 0x41, 0x8c, 0xee,
+    0xd3, 0xb5, 0xce, 0x9d, 0x7a, 0xef, 0x55, 0x1c, 0x31, 0x10, 0xdc, 0x74, 0x8f, 0x0f, 0x0e, 0x42, 0xa3, 0xa2, 0x5c,
+    0x70, 0xa3, 0xb4, 0xaa, 0xa4, 0x14, 0xf2, 0x56, 0x45, 0x73, 0xa6, 0x8f, 0x00, 0x88, 0x00, 0xab, 0x44, 0xfd, 0x1f,
+    0xbe, 0x34, 0xc6, 0x83, 0x07, 0xbe, 0x26, 0xd7, 0xb1, 0xf5, 0xfe, 0x69, 0x8d, 0xb4, 0xda, 0x38, 0x26, 0xb5, 0xea,
+    0x65, 0xab, 0x78, 0xd9, 0xbd, 0x4e, 0xc5, 0xe0, 0xf9, 0xff, 0xdc, 0x07, 0xa8, 0x11, 0x2d, 0x65, 0x70, 0xeb, 0x6a,
+    0x80, 0xc6, 0x87, 0x63, 0xe1, 0x1b, 0x3f, 0x64, 0x9c, 0x0f, 0x66, 0xe8, 0xa8, 0x36, 0x07, 0x07, 0x04, 0x47, 0x75,
+    0x8f, 0xc6, 0x84, 0x59, 0x38, 0xf7, 0x20, 0x50, 0x7d, 0xe2, 0x3e, 0xe3, 0xda, 0x0b, 0xda, 0x04, 0x3e, 0x59, 0xd7,
+    0x35, 0x45, 0x80, 0x8b, 0xd8, 0x98, 0x88, 0x21, 0x2e, 0x9b, 0x44, 0xea, 0x9b, 0x31, 0x28, 0x00, 0x8a, 0x17, 0x15,
+    0xc9, 0xa5, 0x8b, 0x34, 0xaf, 0x44, 0x59, 0xeb, 0x66, 0x54, 0xac, 0x18, 0x02, 0xc0, 0x43, 0x50, 0x5c, 0x55, 0x66,
+    0x42, 0x23, 0x36, 0x90, 0xca, 0x52, 0xb0, 0x6a, 0x58, 0xf8, 0x4d, 0xfb, 0x4d, 0x72, 0xd2, 0x3b, 0x1f, 0xb7, 0xce,
+    0x1d, 0xfb, 0xde, 0x51, 0x48, 0x69, 0x0f, 0xc5, 0x04, 0x41, 0xf0, 0xd3, 0x3a, 0x9c, 0x3f, 0xe3, 0x2f, 0x08, 0x4c,
+    0x45, 0x36, 0x63, 0xc0, 0x41, 0x88, 0xc8, 0x8c, 0xdf, 0x73, 0xf8, 0x82, 0x97, 0x93, 0x70, 0x38, 0xf4, 0x41, 0x1f,
+    0xca, 0xb3, 0x59, 0x38, 0x14, 0x73, 0xe9, 0xbd, 0x0e, 0xd6, 0xba, 0x90, 0xd7, 0x93, 0x10, 0xd1, 0x42, 0x43, 0x1f,
+    0x9c, 0xd7, 0x5d, 0x73, 0x84, 0x25, 0x00, 0x4d, 0x1c, 0x7d, 0x59, 0xbf, 0x1f, 0x79, 0xda, 0xd0, 0x22, 0xc5, 0x45,
+    0xa3, 0xcc, 0x66, 0xb9, 0xec, 0x84, 0x8d, 0x6b, 0xb7, 0x40, 0x28, 0x1e, 0xa6, 0x2d, 0x54, 0xad, 0xa7, 0x7a, 0x3d,
+    0x37, 0xed, 0xbe, 0x7b, 0x54, 0xad, 0x72, 0xa4, 0xb3, 0x36, 0x5d, 0xa9, 0xd5, 0x2d, 0xa3, 0x6a, 0x9d, 0xa5, 0x11,
+    0x55, 0x6e, 0x92, 0xbb, 0x46, 0x2d, 0xf8, 0x64, 0x43, 0x97, 0x29, 0x3b, 0x5b, 0x83, 0x13, 0x47, 0x9e, 0x4b, 0x6e,
+    0xf9, 0xee, 0xbc, 0xa2, 0xbb, 0x53, 0xed, 0x5b, 0x80, 0x7b, 0x33, 0x6c, 0xc8, 0x9c, 0xd7, 0xd8, 0x69, 0x10, 0x26,
+    0x81, 0x1f, 0xb1, 0x8f, 0x19, 0xb2, 0xc1, 0x80, 0x8e, 0x42, 0xfa, 0x5f, 0x5b, 0xe6, 0x48, 0xc0, 0xe4, 0xaf, 0xe7,
+    0x7e, 0xb3, 0x28, 0x72, 0x58, 0x8c, 0x1f, 0x36, 0x18, 0x69, 0xac, 0xd6, 0x60, 0x58, 0xde, 0x21, 0xf2, 0xa7, 0x76,
+    0xc7, 0x34, 0xd5, 0xf1, 0x66, 0xbd, 0xd6, 0xfc, 0xea, 0xe9, 0x53, 0x5d, 0x9f, 0xff, 0xf6, 0xfd, 0x65, 0x58, 0x33,
+    0xfb, 0x43, 0x10, 0x4a, 0xbb, 0x77, 0x8b, 0x73, 0x47, 0xa2, 0x77, 0xac, 0x34, 0xb3, 0x4b, 0xbb, 0x64, 0x97, 0xa6,
+    0xb4, 0x1b, 0x72, 0xbd, 0xfa, 0x4a, 0x79, 0x63, 0xe7, 0x15, 0xd3, 0xfd, 0x7b, 0xa1, 0x77, 0x94, 0x53, 0x35, 0x81,
+    0x88, 0x26, 0xed, 0x48, 0xdc, 0xee, 0x95, 0xe1, 0xf3, 0x49, 0xde, 0x2e, 0xe1, 0xa8, 0x6b, 0x58, 0x6e, 0xbe, 0xfd,
+    0xcf, 0xbc, 0xea, 0xac, 0x70, 0xfb, 0xa5, 0x31, 0x6b, 0x7f, 0x0a, 0xe2, 0xaa, 0xfe, 0xf0, 0x9e, 0xd4, 0x4c, 0xc9,
+    0xff, 0x55, 0x8f, 0x81, 0xab, 0x9f, 0x4c, 0x3b, 0xba, 0xa7, 0x10, 0x36, 0x98, 0xfd, 0xfc, 0xf8, 0xa1, 0x05, 0xab,
+    0xea, 0x02, 0x45, 0x72, 0x00, 0x9d, 0xbb, 0x64, 0x84, 0xf7, 0x3b, 0xc6, 0xb9, 0x7f, 0xf5, 0xbd, 0x9a, 0x1c, 0x21,
+    0xa2, 0x5d, 0x84, 0x03, 0x80, 0xb8, 0xd3, 0x54, 0xd6, 0xa1, 0x06, 0xe8, 0x03, 0x02, 0xeb, 0xd0, 0xb7, 0x19, 0xc0,
+    0x41, 0x1f, 0x6d, 0x9e, 0x45, 0x20, 0xaf, 0x7b, 0xf7, 0xec, 0x9a, 0xed, 0x7c, 0xfe, 0x62, 0x95, 0x7a, 0xf7, 0xe8,
+    0x10, 0x7c, 0x3e, 0xf6, 0xa7, 0x97, 0x81, 0xc1, 0x85, 0x66, 0xd7, 0xcf, 0x04, 0xdb, 0xb1, 0xdd, 0x33, 0x44, 0x2a,
+    0xea, 0xce, 0x3f, 0xbc, 0x34, 0xd1, 0xf3, 0xce, 0x0b, 0x77, 0x7c, 0x09, 0xe0, 0x81, 0x2c, 0x06, 0x14, 0x9f, 0xa5,
+    0xf7, 0x2f, 0x96, 0x80, 0x9a, 0xfc, 0x96, 0xaf, 0xbd, 0x2f, 0x94, 0xba, 0x80, 0x3f, 0x07, 0x94, 0x3e, 0xc9, 0xb9,
+    0x77, 0x37, 0xbc, 0xf5, 0x2f, 0x9e, 0x83, 0xf3, 0xc4, 0x6a, 0xb8, 0x80, 0xbf, 0x0a, 0x3e, 0xf4, 0xee, 0x06, 0x98,
+    0x58, 0xf2, 0xa1, 0xb7, 0x1a, 0x40, 0xaa, 0xc2, 0x85, 0xc4, 0xd8, 0x87, 0x5f, 0x83, 0x9c, 0xe1, 0x1f, 0xbf, 0x69,
+    0x0c, 0xd6, 0x5f, 0x83, 0x42, 0xa3, 0xb1, 0x96, 0x2a, 0x64, 0x29, 0x16, 0x67, 0x02, 0x6c, 0xc2, 0x71, 0xb7, 0x2f,
+    0x56, 0xb5, 0x59, 0x0b, 0xfa, 0xf3, 0x11, 0xdf, 0xa3, 0xb1, 0xba, 0x2a, 0xe7, 0xa2, 0xfc, 0x88, 0xf4, 0xa9, 0x8e,
+    0x8f, 0x51, 0xb1, 0xa9, 0xbb, 0xd3, 0xa9, 0x56, 0x1d, 0x69, 0xbf, 0x29, 0xd7, 0x60, 0xc7, 0xeb, 0xe4, 0xc8, 0x52,
+    0x78, 0xd6, 0x61, 0xe7, 0xa5, 0x53, 0xa2, 0xc3, 0x30, 0xde, 0x6d, 0xd5, 0x33, 0x86, 0xf2, 0xdc, 0x60, 0x4c, 0x17,
+    0x3c, 0xe2, 0x2f, 0x06, 0xb9, 0x0c, 0x8d, 0xf9, 0x80, 0x6c, 0x18, 0xca, 0x87, 0x16, 0x19, 0x12, 0x22, 0xde, 0x43,
+    0x25, 0x60, 0xdb, 0x82, 0x32, 0x29, 0xe0, 0x2c, 0x1a, 0xfc, 0x56, 0x7b, 0x39, 0xf0, 0x1e, 0x44, 0x7e, 0x23, 0x5d,
+    0xca, 0x25, 0x36, 0x3a, 0x71, 0x2c, 0x0b, 0xed, 0x3c, 0xae, 0xbf, 0x8e, 0x41, 0xfd, 0x5e, 0xe9, 0x37, 0x28, 0x67,
+    0x7f, 0x94, 0xac, 0xd3, 0xc6, 0x13, 0xe3, 0x1f, 0xae, 0xf2, 0x4f, 0xd1, 0x52, 0x0f, 0xff, 0x9f, 0x31, 0x85, 0xd2,
+    0xbf, 0x4a, 0xcb, 0x68, 0xb3, 0x5a, 0x8a, 0x52, 0xe4, 0x91, 0x38, 0xf9, 0x5a, 0x64, 0xe7, 0xf2, 0x9d, 0x4f, 0xa1,
+    0x5f, 0x00, 0x5a, 0xf6, 0x09, 0x32, 0xfa, 0x7b, 0x26, 0xf8, 0xf0, 0x7b, 0xed, 0x5c, 0x9b, 0xf3, 0xf1, 0x24, 0xbf,
+    0xb2, 0xf6, 0x6e, 0xc7, 0x8b, 0xc4, 0x28, 0xc6, 0x72, 0x5f, 0x75, 0xb3, 0x72, 0xa2, 0x92, 0x03, 0x23, 0x5d, 0x93,
+    0xbd, 0x5c, 0xc9, 0xba, 0x9d, 0x6e, 0x25, 0x10, 0x51, 0x05, 0xde, 0x63, 0x5c, 0xc5, 0x3e, 0x82, 0xe9, 0xba, 0xe3,
+    0x32, 0xda, 0xf1, 0x9e, 0xf1, 0xea, 0x44, 0x59, 0xc1, 0xed, 0x46, 0xb4, 0x27, 0x74, 0xf4, 0xd3, 0xa4, 0xb6, 0x2c,
+    0x1c, 0x80, 0xdc, 0x25, 0x8c, 0x65, 0x43, 0xb0, 0x62, 0x50, 0xfa, 0x7a, 0x4d, 0xc9, 0xb2, 0x00, 0x8b, 0xce, 0x2e,
+    0x23, 0x10, 0xc3, 0xba, 0x69, 0x4e, 0xe8, 0x78, 0xe9, 0xe2, 0xbc, 0xd7, 0x2a, 0x52, 0xf0, 0x8c, 0x16, 0x1d, 0x73,
+    0xd3, 0x91, 0x6e, 0x8c, 0xf6, 0xf6, 0x7b, 0x83, 0x90, 0xe2, 0xf9, 0x03, 0x5b, 0xad, 0x8b, 0x8b, 0xc4, 0x2b, 0x64,
+    0xa2, 0x05, 0xb1, 0x14, 0x81, 0x19, 0x2f, 0x34, 0x8d, 0x30, 0x41, 0x99, 0x12, 0x2c, 0x5a, 0xa3, 0x43, 0xfb, 0xc3,
+    0x12, 0x76, 0x8f, 0x31, 0x02, 0x04, 0xaa, 0x4c, 0x9f, 0xc3, 0xd6, 0x84, 0xd9, 0xd4, 0xc5, 0x06, 0x68, 0xab, 0x18,
+    0x1a, 0x84, 0xb5, 0x21, 0xe6, 0x63, 0x9a, 0xdf, 0xfd, 0x0b, 0x8b, 0xb1, 0x3d, 0x81, 0xd8, 0xde, 0xed, 0x9a, 0x84,
+    0xe9, 0x5e, 0x8b, 0x1b, 0xeb, 0xe5, 0xf6, 0x94, 0x63, 0x6a, 0xc7, 0xda, 0xa8, 0x1d, 0x6b, 0xa9, 0x77, 0xac, 0xb5,
+    0xde, 0xb1, 0xee, 0x1a, 0xfe, 0x21, 0xf3, 0x62, 0x96, 0x80, 0x7e, 0x77, 0xc5, 0x55, 0x83, 0xa0, 0x19, 0x1b, 0x76,
+    0x0b, 0xbf, 0x25, 0xd6, 0x6e, 0xe9, 0x5f, 0x2c, 0xd9, 0xc2, 0xf4, 0x81, 0x6e, 0x1d, 0x60, 0x19, 0x51, 0x93, 0xef,
+    0x91, 0x77, 0xd3, 0x59, 0x51, 0xb8, 0x3d, 0xb1, 0x85, 0xcf, 0xae, 0xcd, 0x9b, 0xf7, 0xcf, 0x22, 0xc8, 0xbd, 0xe3,
+    0xde, 0xfd, 0xf0, 0xda, 0xbf, 0xd0, 0x2d, 0x90, 0x93, 0x59, 0xce, 0x40, 0xea, 0x88, 0x4f, 0x10, 0xad, 0xec, 0x29,
+    0xdf, 0x09, 0xb9, 0xb3, 0xad, 0x9f, 0xdd, 0xbb, 0xdb, 0xda, 0xdd, 0xb3, 0x7b, 0x56, 0x8d, 0x28, 0x56, 0x9c, 0xa6,
+    0x48, 0x98, 0x45, 0x1b, 0xe0, 0xa9, 0x97, 0xef, 0x77, 0xec, 0x98, 0xc3, 0xdd, 0xb3, 0x8e, 0x8e, 0x97, 0x73, 0xc0,
+    0xee, 0xfe, 0xa3, 0x4d, 0xd8, 0x58, 0xe9, 0x5a, 0x85, 0x0e, 0x77, 0xcf, 0x32, 0x8d, 0xe7, 0x70, 0x24, 0x9f, 0x8e,
+    0x35, 0x36, 0x08, 0xea, 0xfa, 0x9c, 0x41, 0xed, 0xd8, 0x7d, 0x4d, 0xd8, 0x65, 0xc7, 0xbc, 0xd6, 0x35, 0x6f, 0xaf,
+    0x3c, 0x15, 0x1b, 0x02, 0x3a, 0x7c, 0xad, 0x6e, 0x90, 0x7f, 0x09, 0x9c, 0x22, 0x00, 0xe4, 0x70, 0xbc, 0xe4, 0xb1,
+    0xef, 0xd3, 0x2c, 0xad, 0x77, 0xa8, 0xb5, 0xa8, 0x2c, 0xcb, 0xb0, 0xf6, 0x7e, 0xd0, 0x8a, 0x61, 0xa9, 0xe9, 0x9f,
+    0x8e, 0x03, 0xb7, 0xb3, 0xdd, 0xca, 0xd8, 0x65, 0x3c, 0x2b, 0x2e, 0xbe, 0x3f, 0x2d, 0x94, 0x6b, 0x37, 0x6f, 0xe3,
+    0x37, 0xad, 0x96, 0x2c, 0xad, 0xf5, 0x90, 0x97, 0x96, 0x45, 0x04, 0x02, 0x18, 0x8e, 0x94, 0x5d, 0x2c, 0xe1, 0x1e,
+    0x61, 0x75, 0x0f, 0x42, 0xc9, 0xbc, 0x70, 0xf1, 0x9c, 0xc5, 0x90, 0x08, 0xb0, 0xdd, 0xa1, 0x62, 0x5b, 0xb8, 0x78,
+    0xce, 0x36, 0xbc, 0xe8, 0xf7, 0x33, 0xd5, 0x29, 0x64, 0xdd, 0x59, 0xf2, 0x8d, 0x6a, 0x8e, 0x35, 0xd4, 0x6c, 0x6d,
+    0x92, 0xad, 0x71, 0x6e, 0x2b, 0x3e, 0xee, 0xda, 0x8a, 0x8f, 0x95, 0xb5, 0x2e, 0xdd, 0xeb, 0x3d, 0xaa, 0x0b, 0x60,
+    0xeb, 0xbf, 0x3d, 0x5e, 0xb9, 0x9e, 0xcf, 0x08, 0xe0, 0x6b, 0xc1, 0xc7, 0x93, 0x05, 0x7a, 0x95, 0x2c, 0xfc, 0xdb,
+    0x81, 0x1a, 0x7f, 0xa7, 0x73, 0x17, 0x00, 0x5d, 0x49, 0x79, 0x05, 0xe4, 0x1d, 0xe4, 0x98, 0x5b, 0x76, 0xe5, 0xfd,
+    0xc9, 0x77, 0xd8, 0x35, 0xaf, 0x67, 0x8b, 0x39, 0xdb, 0x81, 0x53, 0x41, 0x32, 0xb0, 0x97, 0x15, 0xdb, 0x05, 0xb1,
+    0x9d, 0xf0, 0x1b, 0x01, 0x53, 0xbe, 0x84, 0x20, 0xae, 0xe0, 0x16, 0xe2, 0xf0, 0xe4, 0x9f, 0x83, 0xfb, 0xd6, 0x66,
+    0x7d, 0xcf, 0xac, 0xce, 0x09, 0xd6, 0xcc, 0xea, 0xc1, 0x60, 0xd9, 0x4c, 0x56, 0xfd, 0xbe, 0xb7, 0xd3, 0x8e, 0x4f,
+    0x77, 0x52, 0x27, 0x76, 0x5a, 0xab, 0xb5, 0x60, 0xd7, 0x52, 0xeb, 0x62, 0x0c, 0x3d, 0x40, 0xfc, 0x74, 0x3b, 0xe0,
+    0xf7, 0x1d, 0x6b, 0xcb, 0xbb, 0x66, 0x0b, 0xb6, 0x83, 0x4b, 0x50, 0xd3, 0x5e, 0xf6, 0x27, 0x95, 0x0b, 0xda, 0xb1,
+    0x4b, 0xe2, 0xe1, 0x8c, 0x59, 0xa5, 0xcc, 0xac, 0x93, 0xea, 0x4a, 0x74, 0xc6, 0x74, 0xd6, 0x7a, 0x3e, 0x57, 0xf3,
+    0x49, 0xa1, 0x41, 0xfd, 0xce, 0x89, 0x8f, 0xa8, 0xe8, 0x3c, 0x81, 0xad, 0x65, 0x05, 0xb1, 0xda, 0xe7, 0x60, 0xad,
+    0xd5, 0x2e, 0xfd, 0x5e, 0x3e, 0xe0, 0x36, 0xe5, 0xb0, 0x0e, 0x0c, 0x6a, 0x4e, 0xac, 0xa8, 0xc7, 0x6c, 0xc7, 0xb8,
+    0xf9, 0xe9, 0xe5, 0x0f, 0x4e, 0x58, 0xb2, 0x62, 0xb5, 0x3f, 0xfd, 0xfe, 0x99, 0xa7, 0xbf, 0x53, 0xfb, 0x17, 0xc2,
+    0x0f, 0xc6, 0xff, 0xa9, 0xdd, 0xd7, 0x5a, 0x8c, 0xca, 0x56, 0x39, 0x42, 0xe3, 0x6e, 0x25, 0x4d, 0x96, 0x9f, 0x84,
+    0x27, 0xac, 0x05, 0xcf, 0x72, 0xbd, 0x44, 0xb3, 0x02, 0x56, 0x58, 0xcb, 0x24, 0x5c, 0x61, 0xac, 0x96, 0xb6, 0xfa,
+    0x16, 0x4d, 0x73, 0x7c, 0x38, 0xd7, 0x06, 0x65, 0xca, 0xd9, 0x19, 0xb1, 0x1a, 0x2e, 0xc3, 0xd2, 0x84, 0x22, 0x64,
+    0xf7, 0x76, 0x70, 0x63, 0xa7, 0x2c, 0xa5, 0x0c, 0xe7, 0x18, 0x4c, 0x78, 0x24, 0x46, 0x55, 0xbe, 0xbf, 0x2f, 0x29,
+    0x72, 0xda, 0x96, 0x83, 0x2a, 0x84, 0x7d, 0x24, 0x51, 0x02, 0xb7, 0x22, 0x2d, 0x14, 0x29, 0x8b, 0xbf, 0x1d, 0xa0,
+    0x0b, 0xbc, 0x80, 0xba, 0x1a, 0x75, 0xfb, 0xc3, 0x11, 0x0f, 0x1f, 0x99, 0xfa, 0xc0, 0x88, 0x25, 0x81, 0xda, 0x5e,
+    0x66, 0xe9, 0x1d, 0xa8, 0xf0, 0x7b, 0xb8, 0x9a, 0x88, 0xfd, 0xdc, 0x92, 0xa2, 0x22, 0x1b, 0xe9, 0x0d, 0xad, 0xc1,
+    0x23, 0xb4, 0xa6, 0x7c, 0xef, 0xa4, 0xda, 0xa4, 0xf3, 0x8e, 0x90, 0x63, 0xf5, 0xad, 0x25, 0x8c, 0x76, 0x45, 0x2f,
+    0xee, 0x1d, 0xbd, 0xe7, 0xe9, 0xaa, 0xe7, 0xfe, 0xc4, 0x15, 0xf3, 0xe4, 0x36, 0x02, 0x75, 0x2b, 0xa8, 0x6e, 0xef,
+    0x55, 0x82, 0x05, 0x4b, 0xda, 0x7d, 0xfc, 0x76, 0xd6, 0x0e, 0x44, 0x65, 0xac, 0xd2, 0xd7, 0x24, 0x61, 0x4f, 0x0c,
+    0x3a, 0x85, 0xaa, 0xdc, 0xee, 0x8e, 0xb6, 0xc0, 0x75, 0xcc, 0x52, 0xf4, 0xd2, 0x16, 0xb9, 0x5b, 0xfe, 0xdd, 0x73,
+    0x45, 0xce, 0x7e, 0x09, 0x08, 0x4e, 0xcd, 0x57, 0xc4, 0x97, 0x23, 0x3c, 0xaa, 0x6e, 0x81, 0xe3, 0xf4, 0x1d, 0xc0,
+    0x3f, 0x1c, 0x2e, 0x41, 0x13, 0x10, 0x0b, 0xd6, 0x4b, 0xe3, 0x1e, 0xeb, 0xc5, 0xc5, 0xe6, 0x2e, 0xc9, 0x37, 0xe0,
+    0xcc, 0x40, 0xa9, 0x96, 0x7e, 0xe0, 0x58, 0x2d, 0xa0, 0xc2, 0xc1, 0xec, 0xa4, 0x5e, 0x58, 0x46, 0x3d, 0xa6, 0xcf,
+    0xcf, 0x60, 0xef, 0x08, 0x09, 0x80, 0xfb, 0x65, 0x1f, 0x90, 0x80, 0x87, 0xce, 0xec, 0x80, 0x70, 0xc2, 0x2c, 0xaa,
+    0x02, 0x89, 0xe4, 0x48, 0x3f, 0x7b, 0xcc, 0x44, 0xf2, 0x07, 0xb3, 0x9e, 0x73, 0x4a, 0xf4, 0x58, 0x4f, 0x1d, 0x21,
+    0x3d, 0xd6, 0xb3, 0x8e, 0x88, 0x1e, 0xeb, 0x59, 0xc7, 0x47, 0x8f, 0xf5, 0xcc, 0xb1, 0xd3, 0x83, 0xc0, 0x04, 0x88,
+    0x3c, 0x60, 0x3d, 0x9a, 0x4c, 0x3d, 0xc5, 0x3d, 0x40, 0x34, 0x08, 0xac, 0x27, 0x85, 0xf3, 0x1e, 0x20, 0x8f, 0x91,
+    0x58, 0x1d, 0xf4, 0xfe, 0x32, 0x7e, 0xda, 0x33, 0x32, 0xf2, 0xb8, 0x75, 0x58, 0xfd, 0xaf, 0xbf, 0x42, 0x00, 0x1c,
+    0x9e, 0x4d, 0xbd, 0xcb, 0x31, 0x64, 0x95, 0x65, 0x04, 0x92, 0x9f, 0x18, 0x7c, 0xf9, 0x02, 0xa0, 0xea, 0x33, 0x5d,
+    0xab, 0xc9, 0x51, 0x7b, 0xcc, 0xa1, 0x2b, 0x06, 0x80, 0x6d, 0x58, 0xa2, 0xaa, 0x16, 0x36, 0x61, 0x71, 0xfb, 0x19,
+    0x46, 0x73, 0xd9, 0xf4, 0x82, 0x06, 0xea, 0x11, 0x82, 0x5f, 0x5a, 0x0f, 0xad, 0xb5, 0x4c, 0x39, 0x74, 0x6d, 0x14,
+    0x55, 0x36, 0xd4, 0x25, 0xac, 0xd6, 0x22, 0xaa, 0x89, 0x22, 0xe5, 0x92, 0x51, 0x14, 0x4b, 0x15, 0xec, 0x33, 0x71,
+    0x07, 0x51, 0xf3, 0xb4, 0xd5, 0x56, 0xc1, 0xfe, 0x0e, 0x10, 0xd6, 0xc2, 0x5a, 0x48, 0x67, 0x50, 0x7b, 0xa7, 0x1f,
+    0x29, 0x7f, 0x79, 0x21, 0xb7, 0x73, 0x0b, 0x45, 0xb8, 0x3d, 0x07, 0xe5, 0x4d, 0x5d, 0x95, 0x8a, 0x68, 0xb4, 0x04,
+    0x4a, 0x99, 0x13, 0x44, 0x16, 0x20, 0x80, 0xe3, 0x06, 0x02, 0x9f, 0xd7, 0xf8, 0x04, 0x1a, 0x85, 0x40, 0x7e, 0x60,
+    0x15, 0xae, 0x3d, 0xa4, 0xa5, 0xd6, 0x88, 0x28, 0x11, 0x3f, 0xba, 0x7a, 0x8e, 0xed, 0xab, 0xa7, 0xb1, 0xb6, 0x94,
+    0x26, 0x88, 0x9f, 0x58, 0x6c, 0x21, 0x26, 0x88, 0xea, 0x10, 0x1d, 0xc1, 0x72, 0x42, 0x88, 0xc2, 0x1f, 0x42, 0x3f,
+    0x35, 0xf0, 0x97, 0x6c, 0x59, 0xe4, 0x35, 0xc1, 0x62, 0x56, 0x0c, 0xd0, 0xaa, 0x08, 0x3c, 0xd3, 0xd9, 0x52, 0x99,
+    0xd3, 0x3c, 0x3a, 0xb2, 0x83, 0xf3, 0xae, 0x83, 0xbd, 0xf4, 0x65, 0xec, 0x64, 0xd9, 0x34, 0x6a, 0x63, 0x43, 0x24,
+    0xbc, 0x22, 0x7f, 0x95, 0xa5, 0xc6, 0x39, 0x32, 0x97, 0xeb, 0xbb, 0x2e, 0xee, 0xee, 0x68, 0x9b, 0xb0, 0x0a, 0x11,
+    0xea, 0xb6, 0xa1, 0x72, 0x29, 0xcc, 0xc6, 0xa6, 0x69, 0x80, 0x2f, 0x14, 0x95, 0x4a, 0x55, 0x6a, 0x2b, 0x95, 0x9c,
+    0xf0, 0xae, 0xaf, 0x6a, 0x91, 0xba, 0x22, 0xd8, 0xc6, 0x0c, 0xf5, 0x50, 0x6e, 0xd4, 0xd8, 0xd7, 0x1d, 0xab, 0xf4,
+    0x0e, 0x13, 0xe4, 0x8c, 0xbc, 0xc8, 0xc1, 0x45, 0x49, 0x41, 0xe6, 0x6a, 0x08, 0xf3, 0x47, 0x0d, 0x9f, 0x16, 0x96,
+    0x7b, 0x28, 0x01, 0xb3, 0xa3, 0x86, 0x97, 0x11, 0x02, 0x11, 0x97, 0xca, 0xbe, 0x62, 0xe2, 0xf7, 0x14, 0xcc, 0x92,
+    0x09, 0xdd, 0x8b, 0x58, 0x18, 0xa1, 0x8d, 0x4f, 0x92, 0x64, 0xea, 0x69, 0x0a, 0x6e, 0xe4, 0x32, 0xcc, 0xd1, 0x08,
+    0x2d, 0xf9, 0xc8, 0x81, 0xf4, 0xb5, 0x9c, 0x4a, 0xf0, 0x11, 0x75, 0x0a, 0x38, 0x9e, 0x9f, 0x17, 0xd6, 0x4f, 0x96,
+    0x4b, 0xcc, 0x65, 0x6d, 0xfe, 0xcb, 0x8e, 0x8e, 0xc1, 0x2e, 0x4f, 0x13, 0xc7, 0xd5, 0x7f, 0x54, 0x25, 0xc5, 0xc3,
+    0xcf, 0x69, 0x0e, 0x28, 0x82, 0x99, 0x3d, 0xc5, 0xf8, 0xd8, 0x67, 0x99, 0x02, 0xfe, 0x76, 0xbd, 0xb5, 0x64, 0x62,
+    0x97, 0xb4, 0x9b, 0x2b, 0xe3, 0x97, 0xda, 0xb0, 0xe3, 0xe0, 0xdc, 0x00, 0x14, 0x67, 0x8d, 0x0e, 0xcb, 0x6b, 0xdd,
+    0xb6, 0x2a, 0x54, 0xa0, 0xd6, 0xff, 0xd9, 0x2d, 0x4c, 0x79, 0x9b, 0x97, 0xca, 0xdb, 0x3c, 0x34, 0x01, 0x02, 0x91,
+    0x19, 0xf2, 0xac, 0xe9, 0x98, 0x24, 0xee, 0x1d, 0x29, 0x69, 0xdf, 0x91, 0xe2, 0x47, 0xef, 0x48, 0xc8, 0xb7, 0x84,
+    0x8e, 0xec, 0x4b, 0x4e, 0x4e, 0xa0, 0xcc, 0x60, 0x2f, 0xaf, 0x99, 0xec, 0x1f, 0xd0, 0x5e, 0x38, 0x97, 0xe5, 0x15,
+    0xbf, 0x16, 0xde, 0xda, 0x9f, 0xae, 0x4f, 0xbb, 0xaa, 0xde, 0x7e, 0x65, 0x66, 0x1e, 0x0e, 0xc5, 0xe1, 0x50, 0x99,
+    0xa0, 0xdd, 0x05, 0x17, 0x83, 0x9c, 0xdd, 0xbb, 0xf1, 0xf1, 0xd7, 0x1c, 0x45, 0x6c, 0xa5, 0x3c, 0x92, 0x2e, 0x54,
+    0x62, 0x78, 0x69, 0xe0, 0x61, 0x76, 0x7c, 0x3c, 0xd9, 0x5d, 0xdd, 0x4f, 0x06, 0x83, 0x9d, 0xea, 0xdb, 0x2d, 0xaf,
+    0x67, 0xbb, 0x39, 0x7b, 0xe0, 0xb7, 0xd3, 0x6d, 0xb0, 0x6f, 0x60, 0xdb, 0xdd, 0x5d, 0x89, 0xc3, 0x61, 0xf7, 0x82,
+    0x2f, 0xfc, 0xfd, 0x03, 0x02, 0x3a, 0xf3, 0xf3, 0x71, 0x1b, 0xe3, 0xe7, 0xa6, 0xed, 0xaa, 0xb5, 0x03, 0x78, 0xfa,
+    0x1f, 0xbc, 0x9b, 0xd9, 0x72, 0xee, 0xb3, 0x27, 0xfc, 0x01, 0xfc, 0xf3, 0x71, 0x93, 0x44, 0xea, 0x13, 0xed, 0x32,
+    0x79, 0x03, 0x0e, 0xe4, 0x3b, 0x9f, 0xbd, 0xe5, 0x0f, 0xb3, 0xe5, 0x9c, 0x17, 0x87, 0xc3, 0xfb, 0x69, 0x88, 0x64,
+    0x4d, 0x61, 0x45, 0x2c, 0x29, 0x9e, 0x1f, 0x84, 0xc7, 0xef, 0x45, 0x64, 0x88, 0xb4, 0xdc, 0xbb, 0x43, 0x76, 0xc3,
+    0x22, 0x3f, 0x80, 0x0f, 0xb2, 0x9d, 0x3f, 0x91, 0x35, 0xa5, 0xfb, 0xc5, 0x13, 0xff, 0x70, 0xa0, 0xbf, 0xde, 0xfa,
+    0x87, 0xc3, 0x7b, 0xf6, 0x80, 0xe0, 0xe8, 0x7c, 0x07, 0xfd, 0xa3, 0x6f, 0x1d, 0x50, 0x95, 0xe1, 0xf5, 0x6c, 0x33,
+    0xf7, 0x5f, 0xac, 0xd8, 0x1d, 0x70, 0xa1, 0x28, 0x2f, 0xb4, 0x1b, 0xf6, 0x80, 0x5e, 0x67, 0xe4, 0x44, 0x34, 0xdb,
+    0xcd, 0x7d, 0x16, 0xe3, 0x73, 0x75, 0x5f, 0x4c, 0xbe, 0x7a, 0x5f, 0xdc, 0xb1, 0x6d, 0xf7, 0x7d, 0x51, 0xbe, 0xe9,
+    0xae, 0x9f, 0x2d, 0xdb, 0xb1, 0x07, 0x98, 0x61, 0xd7, 0xfc, 0xa6, 0x39, 0x76, 0x8c, 0xfd, 0xea, 0x8d, 0x11, 0x40,
+    0x99, 0x2d, 0x58, 0x2c, 0x38, 0x28, 0xd5, 0xaa, 0x6d, 0x49, 0xe4, 0x95, 0x0e, 0x54, 0x9b, 0x11, 0xdc, 0x57, 0x0b,
+    0x39, 0xf3, 0xcc, 0x40, 0xdf, 0x56, 0x88, 0x16, 0x0e, 0x1b, 0xf0, 0x57, 0xda, 0x3a, 0xc6, 0x30, 0xcd, 0x6a, 0xa6,
+    0x6d, 0x51, 0x97, 0xdf, 0xf6, 0x9e, 0xc9, 0x6f, 0x64, 0x60, 0x0b, 0x91, 0x14, 0x8e, 0xe3, 0x8b, 0xe7, 0x27, 0xfc,
+    0x57, 0x2d, 0x8f, 0x5a, 0xed, 0x17, 0x4a, 0x7d, 0xfa, 0x8a, 0x8e, 0x68, 0xe2, 0x5e, 0xb4, 0x65, 0x58, 0xa3, 0xac,
+    0xa9, 0xa5, 0xc3, 0x30, 0xae, 0x61, 0x5f, 0x1e, 0x38, 0xf4, 0x1d, 0x10, 0x68, 0xab, 0x54, 0x0a, 0xb4, 0x70, 0x0c,
+    0xa3, 0x30, 0x0b, 0x29, 0x8f, 0x0b, 0xb3, 0x94, 0xf7, 0x58, 0xa0, 0xc5, 0xad, 0xba, 0xc7, 0xd4, 0x76, 0x0b, 0x22,
+    0xac, 0xde, 0x32, 0xce, 0x2f, 0x1b, 0x55, 0xb8, 0x2d, 0x40, 0x51, 0x04, 0x65, 0xb0, 0x27, 0xb9, 0x6d, 0xa1, 0xa4,
+    0xd9, 0x28, 0xac, 0xc5, 0x5d, 0x51, 0xee, 0x7a, 0x0d, 0x5b, 0xe0, 0x05, 0x55, 0x3f, 0x21, 0x6c, 0xcb, 0x9e, 0x75,
+    0x28, 0x17, 0xe9, 0x7f, 0x64, 0xe9, 0xf9, 0x76, 0x6b, 0xce, 0xff, 0xf4, 0x15, 0x7d, 0x54, 0xfe, 0xe7, 0x97, 0xf4,
+    0x93, 0xc1, 0x32, 0x72, 0x4a, 0x7d, 0x1f, 0x8d, 0x6e, 0xd3, 0x9c, 0x30, 0xb6, 0x7c, 0xfd, 0xf4, 0x1b, 0x64, 0x0a,
+    0x92, 0x43, 0x29, 0x55, 0x39, 0xd9, 0x43, 0x5f, 0x78, 0xdd, 0x87, 0x99, 0x60, 0x00, 0xc2, 0x6b, 0xb4, 0xa9, 0x26,
+    0x4c, 0xe2, 0xd1, 0x15, 0xfc, 0xdf, 0x08, 0x62, 0xd0, 0x3e, 0x51, 0xd4, 0xb1, 0x6d, 0xa4, 0xeb, 0xb6, 0x73, 0x90,
+    0xdc, 0xa9, 0x2b, 0x7f, 0x54, 0x4e, 0xfe, 0x13, 0x0d, 0x91, 0x57, 0x5c, 0x21, 0x56, 0x16, 0x5c, 0x62, 0x31, 0x54,
+    0xa4, 0x00, 0xd7, 0x10, 0x44, 0xca, 0xa2, 0xa4, 0x70, 0xcb, 0x41, 0x55, 0x04, 0x60, 0x5c, 0xad, 0x8e, 0x3a, 0x11,
+    0x3e, 0x6e, 0xad, 0x45, 0x08, 0x56, 0x34, 0x6a, 0x65, 0xad, 0xc0, 0x17, 0xa4, 0x2f, 0x1d, 0x0a, 0x62, 0x7a, 0x14,
+    0x52, 0x55, 0x3a, 0x14, 0x48, 0x73, 0xa8, 0xf8, 0xc6, 0x60, 0xa3, 0xa8, 0x48, 0xcf, 0x5f, 0x9a, 0x94, 0x5c, 0x1a,
+    0x33, 0x3e, 0x88, 0x32, 0x12, 0x79, 0x1d, 0xde, 0x89, 0x69, 0x81, 0x7c, 0xa3, 0xc7, 0x0f, 0x82, 0x4b, 0x78, 0x37,
+    0xe4, 0x5e, 0x01, 0xb6, 0x04, 0xec, 0x00, 0xf7, 0xca, 0x8c, 0x72, 0x9d, 0xd6, 0xf5, 0x5b, 0xeb, 0xa1, 0x18, 0x86,
+    0xcf, 0x2c, 0x81, 0xed, 0x68, 0x1d, 0x1d, 0xe9, 0xe1, 0xc3, 0xff, 0xba, 0xaa, 0x39, 0xea, 0x54, 0x2e, 0x67, 0xc7,
+    0x13, 0x96, 0x22, 0x66, 0xd0, 0xfd, 0x75, 0xfb, 0x4a, 0x00, 0xdd, 0x2e, 0x8b, 0x79, 0x36, 0xda, 0xc9, 0xbf, 0xa5,
+    0x1b, 0x2b, 0x4a, 0x9b, 0x78, 0x97, 0xf5, 0xc6, 0xfe, 0x70, 0xf4, 0x97, 0x67, 0x5f, 0x26, 0x84, 0xaa, 0xb3, 0x61,
+    0x6b, 0x1d, 0xe7, 0xf2, 0xbf, 0xfe, 0x3a, 0x26, 0x2b, 0x08, 0x0a, 0xc2, 0xb2, 0x53, 0x4c, 0x54, 0x30, 0x8a, 0x14,
+    0x6b, 0x3e, 0x9e, 0xac, 0x51, 0x27, 0xbc, 0xf6, 0x97, 0x5a, 0x27, 0x4c, 0x8c, 0xac, 0x54, 0xfe, 0x9a, 0x55, 0xec,
+    0x4e, 0x65, 0x16, 0x90, 0x79, 0x90, 0x4f, 0xd6, 0x46, 0x83, 0xb9, 0xe2, 0xf5, 0x6c, 0x3d, 0x97, 0xca, 0x67, 0x30,
+    0xe5, 0x2c, 0x07, 0x27, 0x4b, 0x61, 0xf7, 0x24, 0x50, 0xb4, 0x66, 0xe8, 0xda, 0x9f, 0x62, 0xab, 0x5e, 0xa7, 0x55,
+    0x0d, 0xf0, 0x80, 0x10, 0x03, 0x43, 0xed, 0xd5, 0xc2, 0x43, 0x6b, 0x01, 0xac, 0xfd, 0x51, 0xe9, 0x07, 0xe3, 0xc9,
+    0x92, 0x2f, 0x90, 0x7f, 0x39, 0x72, 0xd4, 0xee, 0xfd, 0xbe, 0x77, 0x0f, 0x52, 0x70, 0xe4, 0x5a, 0x28, 0x90, 0x08,
+    0x68, 0xc1, 0x37, 0xbe, 0xf2, 0xc1, 0xb8, 0x46, 0x6d, 0x35, 0x28, 0xa8, 0x1d, 0xdd, 0xf2, 0xd8, 0xd1, 0x3b, 0xdf,
+    0x9f, 0xd0, 0x57, 0x2f, 0xb4, 0x70, 0xfc, 0x95, 0x33, 0x72, 0xcd, 0x56, 0x1d, 0x72, 0x44, 0x33, 0xe9, 0x10, 0x22,
+    0x56, 0x6c, 0xcd, 0xae, 0x49, 0xe5, 0xdc, 0x39, 0x64, 0xa7, 0x8f, 0x50, 0xa5, 0xd7, 0x7a, 0x7c, 0x3b, 0x51, 0xba,
+    0xdb, 0xe3, 0xdd, 0xe4, 0x5b, 0x36, 0x11, 0x31, 0x18, 0xd0, 0x06, 0xe1, 0x8c, 0xac, 0x43, 0xa4, 0xd2, 0x01, 0x42,
+    0xe0, 0x98, 0x80, 0xa6, 0xff, 0xf8, 0x9a, 0x44, 0x01, 0x47, 0xda, 0x08, 0x59, 0xcb, 0x0e, 0x87, 0x1c, 0x34, 0xca,
+    0xcd, 0x1f, 0x5e, 0xa1, 0x4e, 0x73, 0x60, 0x9e, 0x2e, 0x61, 0xcf, 0xc1, 0x23, 0xbd, 0x38, 0x3e, 0xd2, 0xff, 0x3b,
+    0x9a, 0xa8, 0xf1, 0x7f, 0xae, 0x89, 0x52, 0x5a, 0x24, 0x47, 0xb5, 0xf4, 0x4d, 0xea, 0x28, 0xb8, 0xc8, 0x3b, 0x6a,
+    0x21, 0x7b, 0x96, 0x8d, 0x1b, 0xd5, 0xbc, 0xff, 0x5f, 0x2b, 0xf3, 0xff, 0x35, 0xad, 0x0c, 0x53, 0xb2, 0x63, 0xa9,
+    0x66, 0x1e, 0x68, 0x15, 0xc3, 0xec, 0x67, 0x92, 0x10, 0x19, 0x2e, 0x0d, 0xf8, 0x51, 0x05, 0xfb, 0x38, 0xad, 0xd6,
+    0x59, 0xb8, 0x43, 0x25, 0xea, 0xad, 0xb8, 0x4b, 0xf3, 0x97, 0xf5, 0xbf, 0x45, 0x59, 0xc0, 0xd4, 0xbe, 0x2b, 0xd3,
+    0x38, 0x20, 0x0b, 0x7f, 0x16, 0x96, 0x38, 0xb9, 0xb1, 0x8d, 0x3f, 0xcb, 0xf1, 0xb4, 0x5f, 0x75, 0x66, 0x1e, 0x48,
+    0xa0, 0x06, 0xe2, 0x8f, 0x9c, 0xcb, 0xca, 0xe2, 0x01, 0xa1, 0x9b, 0x7f, 0x28, 0xcb, 0xa2, 0xf4, 0x7a, 0x9f, 0x92,
+    0xb4, 0x3a, 0x5b, 0x89, 0x3a, 0x29, 0x62, 0x05, 0x65, 0x93, 0x02, 0x8c, 0x3e, 0xac, 0x3c, 0x11, 0x07, 0x67, 0x08,
+    0xd4, 0x70, 0x56, 0x27, 0x21, 0x00, 0x0d, 0x2b, 0x84, 0xfd, 0x33, 0x68, 0xe1, 0x59, 0x18, 0x87, 0x6b, 0x80, 0xc9,
+    0x49, 0xab, 0xb3, 0x75, 0x59, 0xdc, 0xa7, 0xb1, 0x88, 0x47, 0x3d, 0x45, 0xc9, 0xf2, 0x26, 0x77, 0xe5, 0x5c, 0x7f,
+    0xff, 0x07, 0x05, 0xb0, 0x1b, 0x30, 0xdb, 0x16, 0xd8, 0x01, 0x40, 0x82, 0x02, 0xd9, 0x42, 0x9d, 0x46, 0x67, 0x6a,
+    0xa9, 0xc0, 0x7b, 0xae, 0x07, 0xf8, 0x9b, 0x1c, 0xb0, 0x8c, 0xeb, 0x42, 0x06, 0x8c, 0x20, 0x80, 0x11, 0x38, 0x28,
+    0x01, 0x43, 0x67, 0x88, 0xdb, 0xaa, 0x9c, 0xb5, 0xd0, 0x5c, 0xe9, 0xb6, 0xe4, 0xa6, 0x51, 0xce, 0x56, 0x22, 0x80,
+    0xbe, 0xba, 0x29, 0x71, 0xba, 0x5c, 0xb6, 0x92, 0xb0, 0x6f, 0xdf, 0xb7, 0x53, 0x45, 0x1e, 0x1f, 0xa5, 0x21, 0xaf,
+    0xc0, 0x93, 0x8c, 0x23, 0x49, 0x94, 0x08, 0xde, 0xe4, 0x8d, 0x19, 0x87, 0x97, 0x6d, 0xca, 0xa9, 0xbd, 0x59, 0x2f,
+    0x00, 0xe7, 0x09, 0xda, 0x32, 0xc0, 0x58, 0xc0, 0xe0, 0x5c, 0x88, 0x25, 0x4f, 0x11, 0xfc, 0xd2, 0x89, 0x14, 0xc6,
+    0x5d, 0x0e, 0xc3, 0x3c, 0x28, 0x7a, 0x97, 0xd4, 0x1f, 0xfd, 0x3e, 0x6a, 0x93, 0xc1, 0x10, 0x54, 0x02, 0xa8, 0xac,
+    0x1b, 0x24, 0x06, 0x56, 0xa5, 0x85, 0xc4, 0x25, 0xc4, 0xcb, 0x7c, 0x35, 0xad, 0xa3, 0xe0, 0x7d, 0x3d, 0x21, 0x84,
+    0x13, 0x8c, 0x0f, 0x71, 0x03, 0x04, 0x0c, 0x56, 0x71, 0x81, 0x41, 0xf2, 0x5c, 0xa2, 0xfb, 0xe3, 0xf9, 0x8e, 0x01,
+    0xae, 0x9c, 0xf7, 0x54, 0xbb, 0x7a, 0x60, 0x2f, 0x57, 0xe9, 0x92, 0x11, 0xc2, 0x8a, 0xff, 0x8b, 0xc8, 0xfb, 0x76,
+    0x98, 0x80, 0xda, 0x46, 0xfe, 0x18, 0x24, 0xe6, 0x32, 0x51, 0x04, 0xf1, 0x28, 0x2b, 0x58, 0x92, 0x06, 0x9b, 0x51,
+    0x92, 0x82, 0x46, 0x13, 0x63, 0xc8, 0x54, 0x68, 0x87, 0xa4, 0xd1, 0x6c, 0x4c, 0xf6, 0x31, 0xe4, 0x35, 0x5c, 0x2c,
+    0x16, 0x78, 0xdf, 0xcf, 0x42, 0x75, 0xb0, 0x2d, 0xcd, 0x21, 0xe0, 0x24, 0xc1, 0x9e, 0xba, 0x22, 0x25, 0x61, 0x36,
+    0xfa, 0x14, 0x72, 0x6e, 0x40, 0xc7, 0x49, 0x63, 0xa8, 0x3e, 0x30, 0x09, 0xaf, 0x22, 0x74, 0x52, 0x56, 0x08, 0x0b,
+    0xb8, 0x6f, 0x64, 0x34, 0x5a, 0x49, 0x83, 0xc0, 0xdb, 0x0c, 0x5b, 0x81, 0x4d, 0x68, 0xf8, 0xcb, 0xcc, 0xc3, 0xb4,
+    0x9a, 0x95, 0x60, 0xce, 0x37, 0x50, 0x89, 0xf1, 0x64, 0x79, 0xc5, 0x37, 0x2e, 0x56, 0x62, 0x32, 0x5b, 0xce, 0x27,
+    0x6b, 0x49, 0x35, 0x97, 0x7b, 0x6b, 0x96, 0xb1, 0x25, 0xec, 0x1f, 0x06, 0x86, 0xd2, 0x81, 0x1d, 0x4d, 0x35, 0x6d,
+    0x12, 0x60, 0x32, 0x9d, 0x73, 0x3e, 0xbc, 0x44, 0x34, 0x59, 0x9d, 0xba, 0x93, 0xa9, 0x6a, 0x07, 0xd7, 0xe4, 0x4c,
+    0x4e, 0x8f, 0xd4, 0x53, 0xad, 0x7b, 0xc9, 0x47, 0xdb, 0x61, 0x35, 0xda, 0xfa, 0x01, 0xb8, 0x75, 0x0a, 0x3b, 0x7d,
+    0x37, 0xac, 0x46, 0x3b, 0x5f, 0xc3, 0xee, 0x92, 0x42, 0xa0, 0xfa, 0xb3, 0xac, 0xc9, 0x5c, 0xbc, 0x2e, 0x1e, 0xbc,
+    0x82, 0x3d, 0xf7, 0x07, 0xfa, 0x57, 0xc9, 0x9e, 0xfb, 0x36, 0x93, 0xeb, 0x9f, 0x69, 0xd7, 0x68, 0xcc, 0x74, 0xbc,
+    0x76, 0x05, 0x56, 0x68, 0x80, 0xfc, 0x82, 0x1d, 0xed, 0x6d, 0x0e, 0x02, 0x01, 0xba, 0x97, 0xe0, 0x28, 0x0a, 0x88,
+    0x9a, 0x56, 0x95, 0x47, 0xa7, 0x7b, 0x7f, 0x8f, 0x6f, 0x94, 0x80, 0x4d, 0x9e, 0x5a, 0xf7, 0x96, 0xb1, 0x7f, 0x38,
+    0x40, 0x08, 0xbd, 0x9c, 0x7e, 0xa3, 0x2d, 0xab, 0x47, 0x3b, 0x96, 0xfb, 0x86, 0x51, 0x4f, 0xc1, 0x18, 0x86, 0x2e,
+    0xac, 0x62, 0x24, 0xcf, 0x80, 0xac, 0xf1, 0x1b, 0x44, 0x17, 0xb0, 0xe8, 0xf5, 0x5e, 0x1f, 0xd1, 0x20, 0x02, 0x2a,
+    0xbd, 0xe6, 0x2f, 0x45, 0x3e, 0x57, 0x85, 0xe8, 0xbd, 0xb7, 0x76, 0xde, 0xcc, 0x48, 0x96, 0x49, 0x23, 0xd5, 0x6e,
+    0x65, 0xb1, 0xae, 0xbc, 0xd9, 0x09, 0xe9, 0x62, 0x8e, 0xa1, 0x32, 0x78, 0x1c, 0x80, 0xd2, 0xf3, 0x6f, 0xa1, 0x57,
+    0x32, 0x64, 0x9a, 0x25, 0x9a, 0xd9, 0x5d, 0xe3, 0x4f, 0x56, 0xa9, 0x17, 0x23, 0x62, 0x36, 0xb0, 0x85, 0xb8, 0x2d,
+    0x2a, 0xdd, 0x16, 0x85, 0xb2, 0x45, 0x91, 0x3e, 0xd4, 0xce, 0x74, 0x67, 0x16, 0x3e, 0xab, 0x4c, 0xfb, 0xde, 0x66,
+    0x66, 0x6c, 0x80, 0xb6, 0x8b, 0xf0, 0x0d, 0x74, 0xa0, 0x42, 0xc8, 0x7f, 0x40, 0x44, 0x24, 0x02, 0x76, 0x39, 0x75,
+    0x27, 0x36, 0x1d, 0x92, 0x79, 0x88, 0x59, 0xa1, 0x46, 0x79, 0xc9, 0x93, 0xa3, 0x01, 0xa9, 0x08, 0x75, 0xbb, 0xdf,
+    0x3f, 0x5f, 0xba, 0xa0, 0xf6, 0x6b, 0x8a, 0x1d, 0xa3, 0x9b, 0x02, 0xce, 0x05, 0x8f, 0xf2, 0x9e, 0x7b, 0xe7, 0x80,
+    0xe6, 0xd8, 0x9e, 0x22, 0x6b, 0xc0, 0xe9, 0x6d, 0x17, 0x02, 0x6c, 0x9f, 0x35, 0x5b, 0xfb, 0x93, 0xd5, 0x55, 0x34,
+    0xf5, 0x4a, 0x3e, 0xd3, 0x5d, 0x94, 0xb8, 0x5d, 0x14, 0xcb, 0x2e, 0xda, 0x34, 0x10, 0xec, 0xb8, 0xf2, 0x03, 0xe0,
+    0x0d, 0x8d, 0xfa, 0xfd, 0xb2, 0xd5, 0xb3, 0x27, 0x5f, 0x3b, 0xee, 0xd9, 0xcc, 0x67, 0xa5, 0xe9, 0xd9, 0x5f, 0x53,
+    0xb7, 0x67, 0xe5, 0x64, 0x2f, 0x3a, 0x27, 0xfb, 0x74, 0x36, 0x0f, 0x04, 0x97, 0x3b, 0xf7, 0x79, 0x3e, 0xd5, 0xd3,
+    0xae, 0xf2, 0x83, 0xd6, 0x10, 0x99, 0x2f, 0x7c, 0xaa, 0xba, 0xd7, 0x15, 0x2c, 0x60, 0x09, 0xee, 0xd6, 0x4b, 0xf3,
+    0x5f, 0xb1, 0xfb, 0x7b, 0x41, 0x2f, 0xcd, 0x7f, 0xa3, 0x3f, 0x29, 0x80, 0x03, 0xd0, 0x98, 0xda, 0x2d, 0xf0, 0x10,
+    0x43, 0x05, 0x85, 0xbb, 0x59, 0x39, 0xf7, 0x6a, 0x80, 0xc3, 0x24, 0x7d, 0x43, 0xab, 0x57, 0x5a, 0xec, 0x7a, 0x99,
+    0xec, 0x15, 0xe0, 0xa1, 0x0a, 0x79, 0x78, 0x38, 0x44, 0x1d, 0xc3, 0x0e, 0xea, 0x08, 0x18, 0xf6, 0x10, 0x1a, 0x5b,
+    0xe0, 0xf9, 0xf8, 0x29, 0xe3, 0x7b, 0x01, 0x6a, 0x23, 0x84, 0xc7, 0xab, 0x45, 0x19, 0x62, 0xcb, 0xde, 0x22, 0x95,
+    0xd4, 0xcf, 0x02, 0x51, 0x46, 0xab, 0x80, 0xb6, 0xda, 0x63, 0x96, 0xc6, 0x1b, 0x08, 0x15, 0x4b, 0x7d, 0x0c, 0xa1,
+    0x81, 0xc3, 0xef, 0x70, 0x00, 0x09, 0xbe, 0xe4, 0x9a, 0x6c, 0xee, 0x6d, 0x7e, 0x4f, 0xfb, 0xfc, 0xe1, 0x70, 0x7e,
+    0x89, 0xa0, 0x74, 0x29, 0x7c, 0xa4, 0x12, 0x51, 0x3d, 0xc5, 0x4d, 0x09, 0xd9, 0x2c, 0x59, 0xe9, 0x07, 0xbf, 0xaa,
+    0x5f, 0x00, 0x20, 0x0b, 0x81, 0x36, 0x91, 0xd9, 0x9f, 0xce, 0x54, 0x74, 0x01, 0x70, 0x88, 0x3f, 0x7e, 0x82, 0xe8,
+    0x1b, 0x5a, 0xa6, 0xe5, 0xe3, 0x84, 0x87, 0xa0, 0xb5, 0x25, 0x9d, 0x44, 0xac, 0x14, 0xd8, 0x10, 0x09, 0xdf, 0xef,
+    0x9f, 0xc7, 0x92, 0x0e, 0x34, 0x6a, 0x75, 0x6f, 0xdc, 0xea, 0x5e, 0xf9, 0xba, 0xee, 0xe4, 0xc6, 0x07, 0x45, 0xfb,
+    0x6c, 0xde, 0xa8, 0x7c, 0xdf, 0xd6, 0x39, 0xbb, 0xd3, 0xbd, 0x23, 0xe7, 0xc4, 0xb7, 0xf7, 0x10, 0x8a, 0x1e, 0x9a,
+    0x22, 0xcb, 0x92, 0x30, 0xa0, 0xb5, 0x76, 0xed, 0x59, 0x46, 0x07, 0xaf, 0x7d, 0x43, 0x88, 0xc8, 0x53, 0x7c, 0x12,
+    0x72, 0x8b, 0xe3, 0x83, 0x02, 0xfd, 0x33, 0xe3, 0xcf, 0x9c, 0xf8, 0x61, 0xab, 0x5f, 0x00, 0xe7, 0xa6, 0x7b, 0xef,
+    0x4e, 0xcc, 0x7a, 0x0c, 0xa5, 0x6c, 0xfc, 0xdf, 0xef, 0x13, 0x59, 0xa0, 0xd3, 0x11, 0x0d, 0x03, 0xc1, 0x5d, 0x54,
+    0xff, 0xf7, 0x8a, 0xd7, 0x3d, 0x6b, 0x75, 0xbe, 0xfc, 0xd4, 0xe9, 0x49, 0xaf, 0x5e, 0xc6, 0x3d, 0xa0, 0x42, 0x07,
+    0x08, 0xe7, 0x75, 0xbf, 0x61, 0xbb, 0x6f, 0x7e, 0x79, 0x77, 0xf4, 0x32, 0xb0, 0x49, 0x91, 0xd8, 0x56, 0xf2, 0x59,
+    0x0f, 0x14, 0x7e, 0x3d, 0xd6, 0xab, 0x8b, 0x75, 0x8f, 0xf5, 0x50, 0x0b, 0x88, 0x1e, 0x16, 0xa0, 0xfe, 0xeb, 0xd9,
+    0xa7, 0xa1, 0x70, 0x90, 0x8d, 0x53, 0x05, 0x8a, 0x2c, 0xf8, 0x0b, 0x31, 0x5a, 0x17, 0x04, 0x88, 0x6c, 0x09, 0x69,
+    0xd5, 0xc9, 0xec, 0x71, 0xa9, 0x25, 0x19, 0x7c, 0x13, 0x90, 0xd9, 0x81, 0x95, 0x13, 0x94, 0x8e, 0x5b, 0x03, 0xae,
+    0x6c, 0xf1, 0x68, 0xb7, 0x3f, 0x0d, 0xb2, 0xb3, 0xe6, 0xa4, 0xd1, 0x3e, 0xec, 0xd3, 0x3c, 0x40, 0x20, 0x92, 0xa9,
+    0x08, 0x72, 0xcd, 0xbd, 0x25, 0x7d, 0x74, 0x38, 0xe7, 0x85, 0xfc, 0x73, 0x2a, 0x75, 0x88, 0x43, 0x89, 0x35, 0x10,
+    0xa8, 0x3c, 0x43, 0x95, 0xc3, 0x06, 0x39, 0xfe, 0xd9, 0x91, 0xcc, 0x24, 0x26, 0x8b, 0xdc, 0xad, 0x99, 0x0a, 0x3f,
+    0x10, 0x7c, 0xcc, 0x72, 0x0e, 0x5c, 0x60, 0xb3, 0xb9, 0xaf, 0xa6, 0xb8, 0xb8, 0x02, 0x7f, 0x4c, 0xe1, 0x57, 0x3c,
+    0x85, 0x9d, 0x76, 0xbf, 0x2e, 0xaa, 0x14, 0x75, 0x1b, 0x85, 0x45, 0x25, 0x0b, 0xa6, 0x35, 0xa4, 0x89, 0x0e, 0xa3,
+    0x3f, 0xc8, 0x19, 0x28, 0x08, 0xf9, 0x65, 0xd3, 0x00, 0x23, 0x95, 0x5c, 0x1e, 0x54, 0x49, 0xe0, 0x05, 0xd8, 0x06,
+    0x15, 0x5b, 0x17, 0x10, 0x64, 0x9b, 0x14, 0x65, 0xfa, 0xa5, 0xc8, 0xeb, 0x30, 0x0b, 0xaa, 0x51, 0x5a, 0xfd, 0xa8,
+    0x7f, 0x02, 0xf3, 0x36, 0x15, 0xa3, 0x5a, 0xc5, 0xe4, 0x37, 0xfa, 0xfd, 0x62, 0xd0, 0xfa, 0x90, 0xc1, 0x47, 0xaf,
+    0x4d, 0x83, 0x3f, 0x3a, 0x0d, 0x76, 0x98, 0x68, 0x04, 0x40, 0x32, 0xa7, 0x96, 0x3c, 0x14, 0xfd, 0x11, 0xe4, 0x58,
+    0xa3, 0xca, 0x29, 0x18, 0xac, 0xff, 0x78, 0xb4, 0x03, 0x53, 0x2f, 0x8e, 0xb6, 0x64, 0x07, 0xad, 0x7c, 0x03, 0xdc,
+    0xaf, 0x91, 0x2d, 0x66, 0x39, 0x40, 0xb3, 0xd7, 0x88, 0x8c, 0x4f, 0x5e, 0x00, 0x63, 0xb6, 0xce, 0xc2, 0x48, 0xc4,
+    0xc1, 0x58, 0x35, 0x66, 0xcc, 0xc0, 0xc0, 0x05, 0xba, 0x96, 0x49, 0x49, 0x1a, 0xd2, 0xc1, 0x80, 0x95, 0xb2, 0x85,
+    0x03, 0x5e, 0x34, 0xc7, 0xed, 0x78, 0xd3, 0xa2, 0xf1, 0xc0, 0x76, 0xb1, 0xfd, 0xfd, 0xf7, 0xc5, 0xf6, 0x3a, 0xdc,
+    0x92, 0x5e, 0x21, 0x67, 0x09, 0xfd, 0xfc, 0x51, 0xf6, 0x59, 0xc3, 0xc9, 0xa9, 0xd0, 0x0c, 0x2d, 0x45, 0x42, 0x29,
+    0xde, 0xe9, 0x49, 0x81, 0xb1, 0x8c, 0x85, 0xbf, 0x07, 0xce, 0xe9, 0x42, 0x11, 0xb9, 0x03, 0xc7, 0xf1, 0x0d, 0x54,
+    0x30, 0x6a, 0x38, 0x78, 0x19, 0xc3, 0xb6, 0x28, 0x66, 0x21, 0xe1, 0x14, 0xc2, 0xc5, 0x2a, 0xeb, 0xf7, 0xe5, 0x2f,
+    0xea, 0xa2, 0x8b, 0x4c, 0xd6, 0x7d, 0x12, 0x8e, 0xcc, 0x58, 0x4e, 0xbd, 0x90, 0x3c, 0xef, 0x79, 0x32, 0x4d, 0x9e,
+    0xe5, 0x41, 0x04, 0x90, 0xcf, 0xe1, 0x7d, 0x98, 0x66, 0x60, 0x95, 0x26, 0xe5, 0x47, 0x28, 0x7d, 0xf1, 0x79, 0xe5,
+    0x07, 0x3a, 0x7b, 0x6e, 0x92, 0xe1, 0xcd, 0xaa, 0xf5, 0x26, 0xb5, 0xae, 0x8b, 0x07, 0xfc, 0x8b, 0x33, 0xd8, 0x38,
+    0xd7, 0x99, 0xe0, 0xc0, 0x8b, 0xa4, 0xd6, 0x6b, 0xc6, 0x5f, 0x64, 0xb8, 0x2e, 0x55, 0x1b, 0x7d, 0x14, 0xa2, 0x73,
+    0xc8, 0x54, 0x80, 0x42, 0x91, 0xf6, 0x0f, 0x4a, 0xad, 0x4c, 0x2a, 0x6d, 0x24, 0x80, 0xee, 0x61, 0xd2, 0x60, 0x8b,
+    0xa1, 0x8c, 0xa5, 0x49, 0x94, 0x3b, 0x0d, 0xe2, 0xca, 0xfe, 0x5c, 0x49, 0x1c, 0x5a, 0x16, 0xc9, 0xbf, 0x77, 0x3d,
+    0x7d, 0x85, 0xd4, 0x9d, 0x2c, 0x90, 0x19, 0xe3, 0x65, 0x1e, 0x7f, 0x02, 0xc2, 0x6c, 0xd0, 0x46, 0x45, 0x21, 0x84,
+    0x6c, 0x10, 0x83, 0xc6, 0xcb, 0x3c, 0xfe, 0x5e, 0xd1, 0x78, 0xc8, 0x47, 0x91, 0xaf, 0xfe, 0x2a, 0xf5, 0x5f, 0xa1,
+    0xcf, 0x4c, 0xf0, 0x08, 0xd5, 0x44, 0xff, 0xee, 0xf9, 0xec, 0x1e, 0xd4, 0x86, 0x51, 0x98, 0x99, 0xf2, 0x2b, 0xdf,
+    0x14, 0x67, 0xaf, 0xbf, 0xa2, 0xab, 0x6c, 0xeb, 0x7e, 0xf4, 0xf1, 0x88, 0xc0, 0xda, 0x18, 0x5d, 0x71, 0x63, 0x00,
+    0x39, 0x4c, 0xde, 0xaf, 0x28, 0x2d, 0x87, 0x34, 0x08, 0x1d, 0x34, 0x04, 0xbd, 0x92, 0xe8, 0x03, 0x89, 0x45, 0x8c,
+    0xe1, 0x85, 0x78, 0x46, 0x6a, 0x32, 0xd1, 0x10, 0xaf, 0x88, 0xfd, 0x10, 0x2d, 0x39, 0x35, 0xd1, 0x8d, 0x30, 0xc5,
+    0x40, 0x62, 0x67, 0x90, 0x9c, 0x24, 0xb5, 0xf2, 0x8b, 0x67, 0x92, 0xb0, 0xc4, 0xce, 0x43, 0x0c, 0x26, 0xb5, 0x74,
+    0xa7, 0x37, 0x55, 0x7a, 0x77, 0xa4, 0xe5, 0xa0, 0x7d, 0x00, 0x76, 0x29, 0xe9, 0xfd, 0x93, 0x42, 0x11, 0x1f, 0xc2,
+    0x38, 0x86, 0xf0, 0x2d, 0xa2, 0xba, 0x02, 0xe7, 0x5a, 0x81, 0xc6, 0x6a, 0xe0, 0xa1, 0x99, 0x55, 0xf3, 0x21, 0xa7,
+    0x9f, 0x4a, 0xcb, 0x1f, 0x23, 0x1a, 0x1b, 0xad, 0x9b, 0xc3, 0x61, 0x4f, 0xab, 0x5e, 0x3a, 0x07, 0x5d, 0x36, 0x93,
+    0x98, 0xb8, 0x81, 0x74, 0xfd, 0xe8, 0x37, 0x13, 0xf6, 0x22, 0x2a, 0xe4, 0x52, 0x08, 0x0a, 0x5a, 0x1d, 0x08, 0x1c,
+    0x0a, 0x6f, 0x51, 0xe6, 0x8b, 0x98, 0x36, 0x10, 0x06, 0x9f, 0x1f, 0xc8, 0xcf, 0x37, 0x05, 0xa9, 0xd8, 0xb1, 0xae,
+    0xfd, 0xfe, 0xa6, 0xf4, 0x00, 0x4f, 0xce, 0x24, 0x79, 0xda, 0x0c, 0x61, 0x45, 0x00, 0x8d, 0x59, 0x4d, 0x16, 0x27,
+    0x5c, 0x99, 0xc3, 0x8f, 0x95, 0x57, 0xb2, 0x94, 0xa9, 0xf3, 0x54, 0x2f, 0x80, 0xa8, 0xe3, 0x0d, 0x5a, 0x91, 0xfa,
+    0x15, 0x3a, 0x7b, 0xcd, 0x4a, 0xc8, 0x78, 0x78, 0xce, 0x79, 0x3a, 0x7a, 0x60, 0x09, 0x8f, 0xf0, 0xaf, 0x64, 0xa2,
+    0x0f, 0xbf, 0x07, 0x0e, 0x37, 0xe3, 0x84, 0x47, 0x6e, 0xb3, 0xf7, 0x55, 0xb8, 0x82, 0x9b, 0x69, 0x01, 0x48, 0x6e,
+    0x41, 0xd2, 0x04, 0x94, 0x90, 0xc8, 0x84, 0xcc, 0x9a, 0x92, 0x9f, 0x5b, 0xda, 0x06, 0x6b, 0x98, 0x74, 0x1e, 0xf0,
+    0xa2, 0xd5, 0x47, 0xab, 0x89, 0x76, 0x99, 0xe5, 0xf3, 0x21, 0xce, 0x50, 0xcd, 0x71, 0x77, 0x06, 0x3f, 0x07, 0xbc,
+    0x62, 0x55, 0x93, 0x8e, 0x76, 0x03, 0x2e, 0x3c, 0xb9, 0xce, 0xd3, 0xd1, 0x16, 0x7f, 0xc9, 0xfd, 0x01, 0xa0, 0x83,
+    0xa9, 0x4b, 0xe0, 0x4f, 0xd5, 0x56, 0x53, 0xa9, 0x5f, 0x5a, 0xfb, 0x75, 0xdd, 0x59, 0xad, 0xdc, 0xb3, 0x2e, 0x43,
+    0x7b, 0x64, 0xc8, 0x19, 0x33, 0xe0, 0xcf, 0x19, 0x4b, 0xfe, 0x9c, 0xb1, 0xe2, 0xcf, 0x19, 0x37, 0x46, 0x06, 0x50,
+    0x82, 0x7b, 0xc9, 0x5f, 0xec, 0x11, 0x33, 0xc4, 0x6a, 0x50, 0x09, 0xac, 0x2c, 0xe5, 0xdc, 0x47, 0x4e, 0x31, 0xe5,
+    0x94, 0xe1, 0xa5, 0xd3, 0x99, 0x3b, 0x90, 0xf3, 0x60, 0xe6, 0x0e, 0x93, 0xb3, 0x3e, 0xc5, 0xb1, 0x34, 0x26, 0x45,
+    0x05, 0xe9, 0x9c, 0x0e, 0x37, 0xaf, 0x8e, 0xf3, 0x84, 0x65, 0x7c, 0xdc, 0x3e, 0x53, 0x20, 0xc4, 0x16, 0xcf, 0x90,
+    0x48, 0xa9, 0x9a, 0xe5, 0x36, 0x7f, 0x38, 0xd4, 0xa3, 0x07, 0xbd, 0xd3, 0xc3, 0xaf, 0x84, 0xfd, 0x92, 0x79, 0xf6,
+    0x09, 0x02, 0x98, 0x24, 0xf2, 0x4c, 0xc2, 0xd1, 0x8f, 0xe5, 0xe8, 0x6f, 0x1a, 0xfe, 0x2e, 0x43, 0x75, 0x77, 0x08,
+    0x4c, 0x6c, 0xd9, 0x81, 0x43, 0x70, 0xba, 0xaa, 0x44, 0x02, 0x0e, 0x36, 0x1b, 0x16, 0xe9, 0x3d, 0x1e, 0xe2, 0x7c,
+    0x50, 0xf8, 0x08, 0x0d, 0x33, 0x7a, 0xbf, 0xbf, 0x11, 0x5e, 0x25, 0x5b, 0x79, 0x38, 0x24, 0xd6, 0x5d, 0xd8, 0xd1,
+    0xc7, 0xd1, 0x1e, 0x25, 0xd4, 0x7e, 0x54, 0xeb, 0x4d, 0xa5, 0x1e, 0xe4, 0x66, 0x17, 0x12, 0x83, 0x8a, 0xa5, 0xfa,
+    0xf4, 0x4a, 0xf5, 0xa1, 0x66, 0x9d, 0xdf, 0xd5, 0x71, 0x9f, 0x8a, 0xd1, 0x5a, 0x4e, 0x08, 0x70, 0x1d, 0x24, 0x1a,
+    0x1d, 0x00, 0xe3, 0x6c, 0xb3, 0xe5, 0xa5, 0xb6, 0x4e, 0x94, 0x8e, 0xe3, 0x5c, 0x1f, 0xc7, 0x87, 0x83, 0x14, 0x33,
+    0x2e, 0x8f, 0xc4, 0x8c, 0xcb, 0x06, 0xe0, 0xcd, 0x3a, 0x0f, 0xea, 0xc3, 0xe1, 0x92, 0x2e, 0x45, 0xa6, 0xb3, 0x8d,
+    0xf2, 0xb3, 0x1e, 0x3d, 0x3c, 0x4b, 0xd0, 0xdc, 0x5b, 0x61, 0xef, 0x45, 0xb2, 0x3d, 0x93, 0x75, 0xea, 0x65, 0xe4,
+    0xd3, 0x0b, 0xf7, 0xec, 0x92, 0xab, 0x1f, 0x56, 0x5f, 0x4f, 0x7f, 0x15, 0x5e, 0xc4, 0x2a, 0xda, 0xad, 0x4b, 0x26,
+    0xec, 0x2d, 0xa5, 0x92, 0x56, 0x79, 0xf9, 0x74, 0xe3, 0x07, 0x98, 0x99, 0xf6, 0xf4, 0x41, 0x36, 0xa2, 0xfa, 0xb3,
+    0x12, 0xb5, 0x32, 0x4c, 0x16, 0xce, 0x4b, 0xa6, 0x9e, 0x0c, 0x78, 0xcc, 0x4a, 0x1e, 0xc9, 0x4e, 0x6f, 0x0c, 0x82,
+    0x00, 0xd6, 0x39, 0x69, 0xd5, 0x19, 0x47, 0xa3, 0x55, 0xe5, 0xe2, 0x74, 0x95, 0x0b, 0x0c, 0xb7, 0x5b, 0xb3, 0x8d,
+    0xaa, 0xb3, 0xdc, 0xd4, 0x2a, 0xe5, 0x3b, 0x80, 0x8f, 0x65, 0x95, 0x0b, 0x3a, 0xa6, 0x4c, 0x9d, 0x37, 0x10, 0x8c,
+    0xad, 0x6a, 0x5c, 0x38, 0x35, 0x2e, 0x78, 0x44, 0xed, 0x6e, 0x9a, 0x7a, 0xb4, 0x05, 0x96, 0xd2, 0xd1, 0x8e, 0x97,
+    0xa8, 0x52, 0xf8, 0xbb, 0xe0, 0xfb, 0x30, 0x8e, 0xbf, 0x2f, 0xb6, 0xea, 0x40, 0xbc, 0x2d, 0xb6, 0x48, 0xfb, 0x22,
+    0xff, 0x42, 0x1c, 0xf0, 0x5a, 0xd7, 0x94, 0xd7, 0xd6, 0x9c, 0x06, 0xb6, 0x86, 0x91, 0x92, 0xc2, 0xb9, 0xf9, 0xf3,
+    0x70, 0xa0, 0x95, 0x5d, 0xab, 0xbb, 0x42, 0xad, 0xc7, 0x1c, 0x36, 0xec, 0x45, 0x16, 0xee, 0x44, 0x09, 0x8e, 0x5c,
+    0xf2, 0xaf, 0xc3, 0x41, 0xab, 0x2c, 0xd5, 0x91, 0x3e, 0xdb, 0x7f, 0x09, 0xc6, 0x0c, 0x5d, 0x9a, 0x80, 0x65, 0x63,
+    0x24, 0xff, 0x6a, 0x9a, 0x79, 0xc3, 0x64, 0xcd, 0x14, 0x8e, 0x43, 0xc3, 0x08, 0x69, 0x40, 0xb7, 0x41, 0x6d, 0x78,
+    0x32, 0xdf, 0x54, 0xe5, 0x57, 0x77, 0xa4, 0xda, 0x0f, 0x86, 0x97, 0x13, 0x71, 0x4e, 0x97, 0x24, 0xf5, 0x54, 0x42,
+    0x49, 0x08, 0x76, 0xe9, 0x03, 0x39, 0xb1, 0x02, 0xb2, 0x96, 0xb1, 0xfc, 0x56, 0x0f, 0x08, 0xfd, 0xa7, 0xdd, 0x7a,
+    0xa1, 0xff, 0x34, 0xcd, 0x16, 0xea, 0xfa, 0xc3, 0xe4, 0xbe, 0xa3, 0xd7, 0x1f, 0x1c, 0xde, 0xa9, 0xab, 0x8a, 0xab,
+    0x78, 0x58, 0x1b, 0x26, 0xb9, 0x51, 0x16, 0xee, 0x8a, 0x4d, 0xad, 0x96, 0xa7, 0xe3, 0x30, 0x02, 0x33, 0x82, 0x02,
+    0x64, 0x5d, 0xb7, 0x11, 0x31, 0xac, 0xe4, 0x32, 0x21, 0x9f, 0x10, 0x90, 0x45, 0xa9, 0x71, 0x3e, 0x6e, 0x81, 0x4a,
+    0x04, 0x83, 0xd3, 0xd0, 0x5a, 0x75, 0x93, 0x1f, 0x55, 0x36, 0x76, 0x07, 0xe4, 0x90, 0x64, 0xb2, 0xb8, 0x1b, 0xdd,
+    0x8a, 0x65, 0x51, 0x8a, 0x9f, 0xb1, 0x1e, 0xae, 0xd9, 0xc2, 0x7d, 0x06, 0x84, 0xf6, 0x13, 0xa5, 0xbd, 0x89, 0x34,
+    0x41, 0xf7, 0x1d, 0x5b, 0x01, 0xc8, 0x00, 0x8a, 0xba, 0xda, 0xad, 0xcf, 0xf9, 0x39, 0x92, 0x66, 0x38, 0x8c, 0x6e,
+    0x9f, 0xde, 0x05, 0x77, 0x83, 0x4b, 0xd4, 0x4a, 0x5f, 0xb2, 0xb8, 0x85, 0x41, 0xb5, 0x37, 0x4b, 0x38, 0xa8, 0x99,
+    0xb5, 0x36, 0x02, 0xc1, 0x64, 0x0f, 0x05, 0x15, 0x73, 0x05, 0xfb, 0xa0, 0x60, 0x2d, 0x79, 0x1d, 0x1c, 0x6e, 0xed,
+    0xcb, 0x4a, 0x71, 0xf1, 0xfc, 0x22, 0x69, 0x5d, 0x58, 0xca, 0x8b, 0xe7, 0x0d, 0x18, 0x5c, 0x8e, 0xb0, 0xa9, 0x2a,
+    0x7f, 0xb2, 0x01, 0xd0, 0xad, 0x90, 0x22, 0x5e, 0x94, 0xc2, 0xb6, 0x95, 0xcf, 0x9c, 0xb0, 0xc1, 0x86, 0x3d, 0xc0,
+    0xbd, 0x32, 0x28, 0x19, 0x5c, 0x88, 0x71, 0xbb, 0xd9, 0x05, 0xb8, 0x82, 0xa1, 0x30, 0xb6, 0xe6, 0x6f, 0x32, 0x2f,
+    0x52, 0x02, 0x6e, 0x86, 0x28, 0x5f, 0x1b, 0x38, 0x99, 0xf4, 0xe4, 0x5a, 0xb2, 0x18, 0xb0, 0xa0, 0xc1, 0x77, 0xd4,
+    0xfa, 0x3b, 0x93, 0x7f, 0xe3, 0xe9, 0xa1, 0x1f, 0x7c, 0xce, 0xbc, 0xa5, 0xcf, 0xde, 0x54, 0x32, 0x5a, 0x93, 0x44,
+    0x79, 0xf5, 0x70, 0x09, 0x72, 0xc3, 0x72, 0xf4, 0xc0, 0x96, 0x20, 0x4e, 0x2c, 0x47, 0x09, 0x65, 0x74, 0x85, 0x7b,
+    0x95, 0xd9, 0x32, 0x11, 0x48, 0x71, 0x60, 0x29, 0xe5, 0xde, 0x62, 0x1d, 0x2c, 0x71, 0x7f, 0x22, 0xb9, 0x80, 0x92,
+    0x07, 0x50, 0xae, 0x14, 0x10, 0xf0, 0xe9, 0x00, 0xca, 0x97, 0xf2, 0x22, 0xfc, 0x89, 0x13, 0x35, 0x58, 0x8e, 0x1e,
+    0x1a, 0xf6, 0xa3, 0x17, 0x5a, 0xf6, 0x87, 0x3b, 0xad, 0x69, 0x58, 0xf1, 0x3b, 0x98, 0x16, 0x13, 0xb7, 0x2f, 0x57,
+    0x76, 0x55, 0x7c, 0xb6, 0x52, 0x67, 0x37, 0x35, 0x24, 0x61, 0x5f, 0x91, 0x55, 0x80, 0x83, 0x55, 0x11, 0xf7, 0x2c,
+    0xcb, 0x7d, 0x18, 0xfd, 0xb9, 0x49, 0x4b, 0x61, 0xa1, 0x4a, 0xfa, 0xfb, 0xa6, 0x14, 0x48, 0x65, 0xa2, 0x13, 0x2d,
+    0x04, 0x57, 0x60, 0x10, 0xb8, 0x17, 0x79, 0x0d, 0x80, 0x31, 0xe0, 0x52, 0xa0, 0x2c, 0xdb, 0x12, 0x42, 0xaa, 0xfb,
+    0x19, 0xa8, 0xed, 0xc4, 0x7d, 0x1a, 0x91, 0xb5, 0x10, 0x7d, 0x15, 0x8c, 0x99, 0xf3, 0x52, 0xba, 0xc5, 0xa6, 0xab,
+    0xcd, 0xea, 0x06, 0x9d, 0x4b, 0x5b, 0x6e, 0x7e, 0xc2, 0x16, 0x6b, 0x05, 0xca, 0x26, 0x24, 0x6d, 0xe7, 0x3c, 0x47,
+    0xd9, 0x84, 0x96, 0xf6, 0x9e, 0x7a, 0x54, 0xa8, 0x4e, 0xb6, 0x5e, 0xaa, 0xa6, 0x16, 0x61, 0xb5, 0xb8, 0xa8, 0xfc,
+    0x00, 0x74, 0x53, 0x69, 0xf5, 0xb2, 0xae, 0xd1, 0x14, 0x6a, 0xb5, 0x70, 0xdc, 0x68, 0x67, 0xd3, 0x65, 0x7a, 0x87,
+    0x38, 0xab, 0xd2, 0x0e, 0xfd, 0x7d, 0xa6, 0x5d, 0x2f, 0x3b, 0xfa, 0xcd, 0xb8, 0xba, 0xc0, 0x85, 0xd8, 0x80, 0xcf,
+    0xb9, 0xbf, 0xbc, 0xde, 0xf3, 0xb8, 0xe7, 0x1f, 0x0e, 0xc8, 0x9e, 0xd4, 0xfe, 0x50, 0x7d, 0xec, 0x0a, 0x86, 0x2c,
+    0x8c, 0x52, 0x7f, 0x91, 0xf2, 0xde, 0x13, 0x1c, 0xf7, 0xcf, 0x55, 0x8f, 0xfd, 0x98, 0xf1, 0x7d, 0x5d, 0x6c, 0xa2,
+    0x84, 0xa2, 0x1a, 0x7a, 0xab, 0x62, 0x53, 0x89, 0xb8, 0x78, 0xc8, 0x7b, 0x0c, 0x93, 0x61, 0x2c, 0x64, 0x2a, 0xfc,
+    0x29, 0x53, 0xc1, 0x23, 0x84, 0x12, 0x37, 0xeb, 0x1e, 0x69, 0x37, 0x21, 0x4e, 0xa9, 0x16, 0xa5, 0x4c, 0xc6, 0xbf,
+    0xf5, 0x13, 0x28, 0xcf, 0x29, 0x5a, 0xa6, 0x1f, 0x15, 0x2e, 0xd3, 0x37, 0xeb, 0xe3, 0xd2, 0x33, 0x11, 0xea, 0xcc,
+    0xc5, 0xa6, 0xd6, 0xe9, 0x18, 0x3b, 0xa5, 0x53, 0x1b, 0xf6, 0xa5, 0x52, 0x5c, 0x56, 0x14, 0xfe, 0x8d, 0x44, 0x56,
+    0x3d, 0x23, 0x8e, 0xff, 0x2b, 0x6b, 0x9f, 0x61, 0x15, 0xf8, 0x65, 0x20, 0xef, 0x17, 0x00, 0x1f, 0xd7, 0x75, 0x99,
+    0xde, 0x6e, 0x80, 0x36, 0x84, 0x86, 0xbf, 0xe7, 0x23, 0x03, 0xa6, 0xfb, 0x08, 0x67, 0x48, 0x0f, 0x75, 0xce, 0xe9,
+    0xac, 0x4c, 0xe7, 0x5c, 0x85, 0xb5, 0x04, 0x7b, 0x39, 0x69, 0x72, 0xb9, 0x2e, 0x41, 0xcd, 0x04, 0x6e, 0x1f, 0xda,
+    0x23, 0x42, 0xa8, 0x4d, 0x59, 0x4d, 0x2f, 0xa1, 0xe6, 0x9d, 0x9c, 0x76, 0x34, 0x29, 0xc1, 0x55, 0x43, 0x67, 0xe5,
+    0xfa, 0xaf, 0xc3, 0xa1, 0x77, 0x9b, 0x15, 0xd1, 0x1f, 0x3d, 0xf4, 0x77, 0xdc, 0xde, 0xa4, 0x5f, 0x20, 0x5a, 0xc6,
+    0xfa, 0x1b, 0x32, 0xa0, 0xe3, 0xc9, 0xf0, 0xb6, 0xd8, 0xf6, 0xd8, 0x17, 0xd4, 0x60, 0xe9, 0xeb, 0xc7, 0x1f, 0x20,
+    0xa1, 0xea, 0xda, 0x17, 0x16, 0x4f, 0x98, 0xa7, 0x44, 0xdb, 0xc2, 0x87, 0xb0, 0xd0, 0x2f, 0x10, 0x19, 0x09, 0xe1,
+    0xa6, 0xb2, 0x7b, 0x94, 0xb4, 0x0b, 0x7d, 0xe9, 0x6b, 0xd9, 0x57, 0xbe, 0x73, 0x01, 0xb0, 0xb2, 0xcf, 0x6d, 0xb8,
+    0x27, 0xfd, 0x29, 0xd5, 0x87, 0xed, 0x6f, 0xc9, 0x02, 0x0a, 0x2d, 0xac, 0xa7, 0x72, 0x76, 0xae, 0x4b, 0x9e, 0x66,
+    0xd3, 0xfd, 0x1a, 0xf6, 0xa8, 0x7b, 0xf4, 0x9a, 0x0a, 0xce, 0x2f, 0xcd, 0xe8, 0xfd, 0xd3, 0x50, 0xa8, 0x8e, 0x3a,
+    0x77, 0x90, 0x75, 0x69, 0x5d, 0x72, 0x7e, 0xb3, 0x72, 0x47, 0x61, 0x7e, 0x1f, 0x82, 0x67, 0x58, 0xf7, 0xee, 0xe2,
+    0xbc, 0xf7, 0x67, 0x6b, 0x8e, 0xfc, 0x98, 0xcd, 0x52, 0xc4, 0x22, 0x99, 0x83, 0xd5, 0x0f, 0xfd, 0x3c, 0xf6, 0xdb,
+    0x20, 0x87, 0xe3, 0xa6, 0x01, 0x1d, 0x36, 0x64, 0xd6, 0xbe, 0x44, 0xe0, 0x54, 0x23, 0x48, 0x53, 0x13, 0xd4, 0x2c,
+    0x0f, 0x91, 0xd8, 0x2e, 0x65, 0xdb, 0x20, 0xd7, 0x5d, 0x30, 0xcd, 0x91, 0xf6, 0x0c, 0xde, 0x37, 0x69, 0x92, 0x0a,
+    0xcd, 0x22, 0x6d, 0x95, 0x8c, 0x7f, 0x47, 0xda, 0x4c, 0xc9, 0x1e, 0x5b, 0x03, 0xef, 0x25, 0x28, 0x27, 0xc3, 0x14,
+    0xc3, 0x77, 0x7c, 0xbd, 0xf3, 0x98, 0x7b, 0xce, 0x31, 0xdb, 0xa4, 0xec, 0x08, 0x26, 0xc9, 0xc6, 0x37, 0x14, 0x6f,
+    0xf8, 0xfe, 0xb6, 0x12, 0x25, 0x80, 0x5e, 0x16, 0xfc, 0x85, 0xb4, 0xb9, 0x42, 0xb7, 0xbb, 0x77, 0x94, 0xc2, 0x2f,
+    0x79, 0x79, 0x38, 0x6c, 0x53, 0x2f, 0x84, 0xce, 0x17, 0xf1, 0x3b, 0x30, 0x87, 0x31, 0xc4, 0x66, 0x04, 0x08, 0x73,
+    0x7c, 0x40, 0x1d, 0xac, 0x1f, 0x01, 0x68, 0x9c, 0x40, 0x01, 0x46, 0x5f, 0x6d, 0x0b, 0xfa, 0x96, 0x17, 0x17, 0x11,
+    0xa2, 0x46, 0x01, 0x26, 0x4a, 0x9a, 0xc5, 0x30, 0x1c, 0xe8, 0xfc, 0xbe, 0xb9, 0xad, 0x4b, 0x81, 0x43, 0xef, 0x58,
+    0x86, 0xff, 0xfe, 0x3f, 0xd6, 0x96, 0x56, 0x95, 0xed, 0xd6, 0x38, 0xcd, 0xfc, 0x6f, 0xb7, 0x85, 0xbe, 0xff, 0x4a,
+    0x28, 0x9e, 0x77, 0xbc, 0x6e, 0xbf, 0x83, 0xe8, 0x7d, 0xdd, 0xca, 0xbb, 0x52, 0xbb, 0x61, 0xa6, 0xfc, 0x21, 0xcd,
+    0xe3, 0xe2, 0x61, 0x14, 0xb7, 0x8e, 0xbc, 0x49, 0x7a, 0xce, 0xf9, 0xbb, 0xaa, 0xdf, 0xf7, 0xde, 0x01, 0x19, 0xef,
+    0x2b, 0x61, 0x1c, 0x31, 0x89, 0x83, 0x6f, 0x2f, 0x46, 0xd1, 0xa6, 0x84, 0x0d, 0xb9, 0x7d, 0x5a, 0x82, 0x66, 0xa6,
+    0xdf, 0x47, 0x89, 0xd2, 0x9a, 0xef, 0x7f, 0x93, 0xf3, 0xfd, 0x95, 0x90, 0x37, 0x2b, 0xf9, 0xe1, 0xa3, 0x15, 0x06,
+    0xbe, 0xc7, 0xe9, 0x17, 0xd1, 0x63, 0x77, 0xa5, 0x0f, 0xdf, 0x95, 0x96, 0x3e, 0xab, 0xa8, 0x7f, 0xa0, 0xa2, 0xe6,
+    0x95, 0x18, 0x11, 0xf1, 0x20, 0x68, 0x67, 0xdb, 0xa5, 0x76, 0x2d, 0x41, 0xbb, 0x60, 0x53, 0xd8, 0xbf, 0x1f, 0x1d,
+    0xf2, 0x7e, 0xff, 0x63, 0xee, 0xb5, 0x78, 0xdd, 0x75, 0x68, 0xca, 0x4f, 0x85, 0x87, 0x10, 0xc0, 0x5a, 0x06, 0xca,
+    0x38, 0xc2, 0xa4, 0x8b, 0xbc, 0x46, 0xd9, 0x74, 0x22, 0xf0, 0x31, 0xcb, 0xae, 0x9c, 0x64, 0x1a, 0x60, 0x46, 0x35,
+    0x85, 0x99, 0x00, 0x23, 0xf5, 0x11, 0xeb, 0xa6, 0xa7, 0x55, 0x68, 0xf9, 0x1a, 0x82, 0x75, 0x91, 0x65, 0x1c, 0xc5,
+    0x4c, 0x00, 0xb0, 0xf9, 0x08, 0xf2, 0x15, 0x5d, 0x1d, 0x92, 0x56, 0xaa, 0xbc, 0x5f, 0x67, 0x44, 0x46, 0x93, 0x10,
+    0xcd, 0x6f, 0xe1, 0x81, 0x7d, 0xdb, 0xcc, 0xa8, 0x52, 0xcf, 0xa8, 0xca, 0x67, 0x38, 0x2c, 0x85, 0x63, 0xc4, 0xff,
+    0x7b, 0xaa, 0x7a, 0x44, 0xa0, 0x57, 0x65, 0x5a, 0x45, 0x45, 0x9e, 0x8b, 0x08, 0x11, 0xaa, 0xa5, 0x73, 0x38, 0xf4,
+    0x63, 0xbf, 0x8f, 0x03, 0x61, 0x5e, 0xfc, 0xe9, 0xb1, 0xae, 0xfc, 0xa9, 0xc0, 0xb5, 0x92, 0x02, 0xa7, 0xa2, 0x46,
+    0x88, 0x10, 0xde, 0x9f, 0xc0, 0xb3, 0x9a, 0xfa, 0x7e, 0x63, 0x99, 0xe8, 0xfe, 0x99, 0x01, 0xe5, 0x0f, 0xc8, 0xd7,
+    0x95, 0x14, 0x67, 0xea, 0xe4, 0x31, 0x71, 0xc6, 0x01, 0x88, 0xf9, 0xba, 0x44, 0xa3, 0xb1, 0xff, 0x01, 0x09, 0x86,
+    0xea, 0x07, 0x3b, 0xdd, 0xd4, 0xfb, 0x57, 0x26, 0x71, 0x14, 0x7d, 0xda, 0x26, 0x8f, 0x25, 0x4b, 0xa3, 0x85, 0xa3,
+    0xf7, 0x88, 0x61, 0x1c, 0x4e, 0xe7, 0x63, 0x92, 0x6d, 0x4c, 0x56, 0x01, 0xa4, 0x93, 0x99, 0x3a, 0xa6, 0xd4, 0xd1,
+    0x38, 0xd7, 0x0b, 0xaa, 0xd0, 0x63, 0x5d, 0xf2, 0x1c, 0xac, 0x27, 0x3f, 0x78, 0xa5, 0x3f, 0x15, 0x72, 0x0e, 0x1b,
+    0x89, 0xa0, 0xf0, 0x03, 0x5c, 0x0d, 0x56, 0x0a, 0x18, 0x4c, 0x7d, 0x0b, 0x5f, 0x13, 0xcf, 0x51, 0xf0, 0x28, 0xec,
+    0x62, 0x6c, 0xad, 0x7c, 0xe7, 0x93, 0x82, 0x72, 0xcf, 0x8a, 0x39, 0xaf, 0x80, 0x73, 0x19, 0x14, 0xc2, 0x74, 0x3c,
+    0xcb, 0xff, 0x99, 0xe4, 0xf5, 0xc4, 0x86, 0x00, 0x19, 0xfc, 0x29, 0x71, 0x5a, 0xba, 0x43, 0x77, 0x1e, 0x7a, 0x16,
+    0x71, 0xd8, 0xe8, 0xc9, 0xba, 0x2c, 0xb6, 0x29, 0xea, 0x25, 0xcc, 0x0f, 0xe4, 0xe7, 0x2d, 0xf9, 0x3e, 0x44, 0xf1,
+    0x36, 0xf8, 0x35, 0x63, 0xb1, 0xc0, 0xbf, 0xfe, 0x9e, 0x31, 0x9a, 0x68, 0xc1, 0xbf, 0xb3, 0x06, 0x89, 0x8a, 0x7f,
+    0xca, 0x26, 0x00, 0xeb, 0xc8, 0xd5, 0x87, 0x4f, 0x89, 0xf1, 0xd6, 0x6c, 0x78, 0xe4, 0x9b, 0x15, 0xe8, 0xd4, 0xe7,
+    0xee, 0xca, 0xf6, 0x54, 0x35, 0xfe, 0x9e, 0xea, 0x6a, 0xa4, 0xaa, 0x1a, 0x7f, 0x4f, 0xa9, 0x1a, 0xbf, 0x65, 0x14,
+    0xbf, 0x53, 0xf9, 0x0c, 0x99, 0x93, 0x4d, 0x4c, 0xd2, 0xe9, 0x7b, 0xc3, 0x89, 0x5d, 0xf6, 0xab, 0xb7, 0x89, 0xcc,
+    0x44, 0x0a, 0xb9, 0x37, 0x00, 0x6d, 0xbf, 0xcb, 0x0d, 0xa7, 0xc4, 0xf9, 0xb9, 0x87, 0x2b, 0x36, 0xad, 0x5e, 0xd1,
+    0x82, 0x05, 0x36, 0x2f, 0xb3, 0x3c, 0x45, 0x02, 0xdb, 0xa6, 0xcc, 0xfa, 0x73, 0xee, 0x01, 0x04, 0x33, 0xa9, 0x09,
+    0x00, 0x69, 0x21, 0x2a, 0x85, 0xc8, 0x5f, 0xe1, 0xac, 0x3e, 0xe7, 0xbd, 0x4d, 0x1e, 0x13, 0x69, 0x75, 0xaf, 0xdf,
+    0x4f, 0xcf, 0xd2, 0x9c, 0x82, 0x1a, 0x8e, 0xb3, 0x4e, 0xbf, 0xcf, 0x82, 0x3a, 0x91, 0xab, 0xf4, 0x1f, 0x6e, 0x90,
+    0x97, 0xf1, 0x7d, 0xdd, 0xf6, 0xfc, 0x89, 0xfa, 0x7b, 0x67, 0xfd, 0x6d, 0x81, 0xe0, 0x4e, 0x8e, 0xfd, 0x64, 0x55,
+    0xca, 0x13, 0xe3, 0xd2, 0xde, 0xf3, 0x9b, 0xba, 0x28, 0xb2, 0x3a, 0x5d, 0x7f, 0x90, 0x7a, 0x1a, 0xdd, 0x17, 0x7b,
+    0x30, 0x06, 0xef, 0x00, 0xf0, 0x4c, 0x87, 0x06, 0x48, 0xdf, 0x33, 0xf2, 0x70, 0x9f, 0x5b, 0xf2, 0x93, 0xca, 0xda,
+    0x24, 0x61, 0x45, 0xb1, 0x19, 0xc6, 0x08, 0x25, 0xe3, 0x34, 0xb6, 0x7e, 0xbf, 0xaf, 0xfe, 0xde, 0x61, 0x14, 0x15,
+    0x15, 0x77, 0x8c, 0x46, 0x65, 0x55, 0x8f, 0xb6, 0x83, 0xc3, 0xe1, 0x3c, 0xb7, 0x71, 0xb4, 0xf5, 0x0a, 0xd8, 0x5b,
+    0xa1, 0x52, 0xf6, 0x4a, 0x84, 0xe5, 0x87, 0x2b, 0xbf, 0xdf, 0x87, 0x7f, 0x65, 0xa4, 0x85, 0xe7, 0x4f, 0xf1, 0xd7,
+    0xa2, 0x2e, 0x30, 0x3c, 0x83, 0xd6, 0x68, 0x05, 0xc1, 0x04, 0xff, 0xe8, 0x40, 0xbd, 0xb4, 0xd2, 0x3e, 0x82, 0x6e,
+    0x05, 0x7a, 0x50, 0x0f, 0x7d, 0x9a, 0xb4, 0x2f, 0x24, 0xea, 0xf6, 0x56, 0xa7, 0xd1, 0x1f, 0x15, 0x5c, 0x4e, 0x61,
+    0x72, 0xb8, 0xa1, 0x4f, 0xab, 0x70, 0xfb, 0x09, 0x9e, 0xfe, 0x0c, 0x94, 0x5b, 0x87, 0x43, 0x0e, 0x62, 0x0b, 0xb8,
+    0x79, 0xac, 0xc2, 0xcf, 0x45, 0x29, 0x23, 0xea, 0xe3, 0x69, 0x01, 0xda, 0xbb, 0x00, 0x1d, 0xb0, 0x34, 0x88, 0x57,
+    0x48, 0x9e, 0xb3, 0x11, 0xc0, 0xb2, 0x03, 0xcb, 0x59, 0xc6, 0x29, 0xcc, 0xb3, 0x7c, 0xa1, 0x56, 0xda, 0x59, 0x99,
+    0x78, 0x35, 0xcb, 0xc0, 0x59, 0xe0, 0xa2, 0xf2, 0x59, 0xa6, 0x55, 0x4f, 0x55, 0x82, 0x3e, 0xaf, 0xe4, 0x04, 0x57,
+    0x82, 0x93, 0x0d, 0xc8, 0x2f, 0x40, 0x92, 0xa6, 0x94, 0x35, 0xe5, 0x8b, 0x4b, 0xba, 0x21, 0xa3, 0xe7, 0xbc, 0xe7,
+    0x45, 0xc3, 0xd0, 0xbf, 0xf0, 0x4a, 0x08, 0xdf, 0xc4, 0x6d, 0x1b, 0xa5, 0xb0, 0xbf, 0x09, 0x2c, 0x3e, 0x61, 0x3f,
+    0x78, 0x4b, 0x7f, 0x3a, 0x0e, 0xc2, 0x21, 0x72, 0x43, 0xc5, 0x1c, 0xd8, 0xd3, 0x80, 0xc5, 0x26, 0xbe, 0xda, 0x4c,
+    0xe2, 0xc1, 0xc0, 0xd7, 0x19, 0x8b, 0x59, 0x0c, 0x34, 0xc8, 0xf1, 0xe0, 0x72, 0xae, 0x4f, 0x08, 0xfd, 0x30, 0xa2,
+    0x72, 0x54, 0xa0, 0x73, 0x10, 0x0d, 0x96, 0x80, 0xa7, 0xde, 0xca, 0x06, 0x49, 0xc6, 0x24, 0x93, 0xb8, 0xd6, 0x24,
+    0xd5, 0xe1, 0x84, 0xd6, 0x81, 0x8e, 0xab, 0x0b, 0xe8, 0x7c, 0x5c, 0xf7, 0x3e, 0x5e, 0x0d, 0x17, 0x54, 0xfa, 0x85,
+    0x18, 0x78, 0xf5, 0x74, 0x1c, 0x5c, 0xd2, 0xad, 0x70, 0xb1, 0x0a, 0xb7, 0x3f, 0xcb, 0x07, 0x8e, 0x3b, 0x2a, 0x69,
+    0x08, 0x0c, 0xde, 0x1e, 0xba, 0x9b, 0x19, 0x1a, 0xea, 0xa4, 0x7d, 0x18, 0x87, 0x72, 0x88, 0x55, 0x2b, 0x2e, 0xa4,
+    0x37, 0x82, 0x6f, 0x17, 0x8a, 0xb1, 0x6c, 0xec, 0xd2, 0x50, 0x14, 0xfe, 0x0a, 0x60, 0x87, 0xda, 0x5f, 0xa9, 0xe4,
+    0x63, 0x64, 0x54, 0xd3, 0x40, 0xc7, 0x00, 0x2c, 0x59, 0x9a, 0x48, 0xaa, 0x48, 0x23, 0xf1, 0x47, 0x66, 0xac, 0xa3,
+    0xa6, 0xeb, 0x0b, 0xa6, 0xaa, 0x45, 0xd2, 0xed, 0x4c, 0x62, 0x39, 0x91, 0xa4, 0xb6, 0xfb, 0x88, 0x18, 0x0c, 0x7c,
+    0xb0, 0x11, 0xd3, 0x4c, 0x84, 0x23, 0x1e, 0x95, 0xc8, 0xa2, 0xcb, 0x6f, 0xa3, 0x4c, 0xda, 0xbe, 0xac, 0xc8, 0x16,
+    0x04, 0xd3, 0x93, 0xe8, 0x83, 0x24, 0xe5, 0x54, 0x24, 0xd2, 0x8c, 0x10, 0xe0, 0xc7, 0x93, 0xf2, 0x4a, 0x7f, 0x0e,
+    0x9a, 0x56, 0x82, 0x97, 0x0c, 0x92, 0x47, 0xe2, 0x67, 0x52, 0x30, 0x8b, 0xb1, 0x6a, 0x30, 0xc0, 0x72, 0xaa, 0x67,
+    0x8e, 0x49, 0xfa, 0x6f, 0x9d, 0x4e, 0xd8, 0x2f, 0xbd, 0xdc, 0xd6, 0xf2, 0xa6, 0xb9, 0xf7, 0xd2, 0xab, 0x58, 0xaa,
+    0x61, 0x19, 0xf4, 0x5f, 0x13, 0xed, 0x82, 0xad, 0x2d, 0x63, 0xc2, 0xaa, 0x1f, 0x40, 0xda, 0x23, 0x5d, 0x5e, 0x35,
+    0xcc, 0x99, 0xe0, 0xd1, 0x85, 0x35, 0x0f, 0xa2, 0x0b, 0xe1, 0x23, 0x97, 0xdd, 0x24, 0xb9, 0x1a, 0x4f, 0xfc, 0x70,
+    0x30, 0x50, 0x00, 0xb4, 0xb4, 0x4e, 0x8a, 0x41, 0xf8, 0x4c, 0xc8, 0x81, 0x34, 0x3a, 0xaa, 0x02, 0x2c, 0x96, 0xd9,
+    0x55, 0x39, 0xc9, 0x06, 0x03, 0x1f, 0xc4, 0xc6, 0xc4, 0x6e, 0x68, 0x36, 0xf7, 0xd9, 0x89, 0x82, 0xac, 0x36, 0x87,
+    0xad, 0x99, 0x6e, 0x81, 0x01, 0xc0, 0x20, 0x22, 0x58, 0xee, 0x73, 0x23, 0x1f, 0x51, 0xa7, 0xa7, 0x30, 0x02, 0x82,
+    0x5f, 0x4e, 0x04, 0x22, 0x17, 0x09, 0xd4, 0x03, 0xcc, 0x04, 0x98, 0x51, 0xc5, 0xf0, 0x12, 0xd8, 0xc5, 0x73, 0xf3,
+    0x8a, 0x41, 0xff, 0xa2, 0x49, 0x96, 0x68, 0x2a, 0x71, 0x34, 0x46, 0x4e, 0xa5, 0x31, 0x32, 0x20, 0x76, 0x71, 0xfc,
+    0x7b, 0x4a, 0x8f, 0x82, 0x94, 0x7d, 0xae, 0x0c, 0x71, 0x38, 0x8a, 0xaf, 0x60, 0xd5, 0x38, 0x1c, 0x6a, 0xf3, 0x7a,
+    0x3a, 0xab, 0xe7, 0x03, 0x11, 0xc0, 0x7f, 0x43, 0xc1, 0x7e, 0xd1, 0x54, 0xe4, 0x06, 0xa9, 0xf3, 0x70, 0x48, 0x41,
+    0x3e, 0xd5, 0x4d, 0xfe, 0xbe, 0x72, 0xf7, 0xd3, 0xd9, 0xdc, 0x9a, 0xa3, 0x17, 0x35, 0xae, 0x5b, 0xab, 0x1b, 0x0a,
+    0x89, 0xd6, 0x34, 0x29, 0xae, 0xaa, 0x49, 0x31, 0xe0, 0xb9, 0x2f, 0x54, 0x17, 0x5b, 0x23, 0x58, 0xf8, 0x73, 0x0b,
+    0x84, 0xc9, 0xb8, 0x17, 0x1f, 0x2d, 0xe4, 0x94, 0x76, 0x6d, 0xb5, 0xdb, 0x56, 0x36, 0xa4, 0x68, 0x3e, 0xbc, 0x84,
+    0x5d, 0x3a, 0x45, 0xb4, 0xed, 0x92, 0xe0, 0x0b, 0xd0, 0xb2, 0xba, 0x10, 0x79, 0x4c, 0xbf, 0x42, 0x7e, 0x29, 0x86,
+    0x7f, 0x95, 0xee, 0xcd, 0xa9, 0x0d, 0x72, 0x00, 0xdb, 0xbd, 0x87, 0xdb, 0x31, 0x7a, 0x20, 0x83, 0x37, 0x42, 0xce,
+    0x39, 0xbf, 0x9c, 0x5a, 0x33, 0x26, 0x1a, 0x16, 0xac, 0x1c, 0x46, 0x7e, 0x80, 0x8c, 0x97, 0x53, 0x60, 0x65, 0x3f,
+    0x2a, 0xe2, 0xd2, 0x1f, 0x46, 0xfe, 0xc5, 0xf3, 0x20, 0xe3, 0x5e, 0x34, 0xec, 0xf8, 0x02, 0xec, 0xd5, 0x17, 0xcf,
+    0x59, 0x34, 0xe0, 0xd5, 0x55, 0x3d, 0xcd, 0x82, 0x61, 0xc6, 0xa2, 0xab, 0x62, 0x08, 0x3e, 0xb4, 0x2f, 0xca, 0x41,
+    0xe8, 0xfb, 0x66, 0xe7, 0xd0, 0xdd, 0x90, 0xc8, 0x23, 0xec, 0x47, 0x70, 0xdb, 0xd5, 0x12, 0x33, 0x98, 0x6c, 0xee,
+    0x22, 0x66, 0xb0, 0xe5, 0x2f, 0x9e, 0x1b, 0x2e, 0xa1, 0xea, 0x85, 0xd4, 0x6c, 0x14, 0x68, 0x4e, 0xae, 0xd0, 0x9c,
+    0xac, 0x84, 0x5a, 0xf2, 0x49, 0x85, 0x13, 0x76, 0x3e, 0xc9, 0x95, 0xdd, 0x68, 0x8c, 0x81, 0x8b, 0xf6, 0xdc, 0x16,
+    0x46, 0x66, 0x3a, 0x4b, 0xd1, 0x80, 0x85, 0x67, 0xe2, 0x94, 0xc6, 0x80, 0xf6, 0xe5, 0xc0, 0xd2, 0x86, 0xfc, 0x28,
+    0x67, 0x06, 0xda, 0x86, 0x94, 0x46, 0xcd, 0xc0, 0x9f, 0xa9, 0x09, 0xf3, 0x2b, 0x58, 0x89, 0x20, 0xaa, 0x0b, 0x30,
+    0x49, 0x72, 0x32, 0x1a, 0x29, 0x2b, 0x91, 0x9c, 0x03, 0xde, 0x47, 0xf0, 0x64, 0x11, 0xdb, 0xda, 0x9f, 0xd2, 0xff,
+    0xea, 0xf0, 0xb9, 0xf4, 0x9f, 0x09, 0x60, 0x21, 0x97, 0x06, 0x91, 0x81, 0xc2, 0x21, 0x35, 0x95, 0x88, 0x13, 0xc7,
+    0x33, 0xf0, 0x0d, 0x5c, 0xa0, 0x29, 0xa0, 0x3f, 0xa8, 0x19, 0x45, 0x64, 0xe1, 0xaf, 0x9e, 0xdd, 0xd4, 0x8d, 0x9e,
+    0x67, 0xce, 0x6b, 0xd0, 0xcc, 0x40, 0x48, 0x8f, 0x53, 0xf5, 0x36, 0x24, 0x3a, 0x2f, 0x2f, 0xf5, 0xcb, 0x84, 0x48,
+    0x56, 0x44, 0x9e, 0xbe, 0xcf, 0xc1, 0x3c, 0xa2, 0x08, 0x1d, 0x5c, 0x99, 0x87, 0xc3, 0xb9, 0xa0, 0xf0, 0x1d, 0xe5,
+    0xf9, 0x80, 0xd3, 0x2c, 0x4a, 0x40, 0x1b, 0xc8, 0x72, 0x53, 0xe6, 0x3a, 0x69, 0x99, 0xba, 0xf7, 0x60, 0x25, 0xa8,
+    0xd0, 0xcd, 0x29, 0x28, 0x94, 0x91, 0xa0, 0x94, 0x56, 0x83, 0x50, 0xaa, 0xc3, 0x22, 0x88, 0x1c, 0xb2, 0x10, 0x70,
+    0x33, 0x15, 0x8d, 0x96, 0x34, 0x3c, 0xc2, 0xb9, 0x81, 0x42, 0x00, 0x12, 0x7b, 0xaa, 0x28, 0xe3, 0x72, 0x08, 0xf8,
+    0x28, 0xe1, 0x10, 0x67, 0x4d, 0xda, 0xf2, 0x1c, 0xc4, 0xb1, 0x5c, 0xf2, 0x75, 0x85, 0x60, 0x10, 0xa1, 0xcf, 0x90,
+    0x3f, 0x59, 0xce, 0xbf, 0x5b, 0x87, 0x69, 0x47, 0xf8, 0xb0, 0xab, 0x2d, 0xb8, 0x98, 0xdd, 0xce, 0x27, 0x10, 0xdf,
+    0x72, 0x3b, 0x3f, 0xc6, 0x10, 0x59, 0xf8, 0x83, 0xbb, 0xa1, 0xe4, 0x8a, 0x42, 0x97, 0xf5, 0x88, 0x14, 0xd9, 0xd3,
+    0x35, 0x47, 0x10, 0x1c, 0x68, 0xd5, 0x20, 0x43, 0x23, 0xf1, 0xc5, 0x73, 0xc8, 0x1a, 0xac, 0xf9, 0xe7, 0x8a, 0x9c,
+    0xd5, 0xfd, 0xc9, 0x06, 0xaa, 0x49, 0x26, 0x6b, 0x45, 0xe5, 0xfc, 0xf5, 0xaa, 0x2c, 0x4f, 0x56, 0x65, 0xb8, 0x1a,
+    0x74, 0x55, 0x65, 0xc9, 0x91, 0xda, 0x00, 0xad, 0xe9, 0x0a, 0x31, 0x14, 0xb2, 0x06, 0x4b, 0xab, 0x2a, 0x6b, 0xea,
+    0x13, 0x08, 0xf4, 0x01, 0x96, 0x51, 0xb3, 0x9f, 0x0e, 0xff, 0x15, 0xfc, 0x4b, 0x85, 0x2c, 0xd5, 0x69, 0x9d, 0x89,
+    0x5f, 0x83, 0x25, 0xc3, 0x3f, 0x7e, 0x0b, 0xd6, 0x80, 0x25, 0x40, 0x96, 0xbb, 0x8d, 0x8d, 0xd6, 0x2b, 0xaf, 0x10,
+    0x5f, 0x6a, 0x7d, 0xd1, 0x6f, 0xdd, 0x26, 0x6a, 0x05, 0x18, 0xa1, 0xd0, 0x22, 0xc0, 0x56, 0x0f, 0xdc, 0x53, 0xf0,
+    0x03, 0x31, 0x9c, 0x6b, 0xd2, 0x9a, 0x3a, 0xe1, 0x75, 0x36, 0x8e, 0x44, 0x54, 0x6f, 0xe1, 0xe2, 0x5e, 0x6f, 0x2d,
+    0xfe, 0x46, 0x05, 0x02, 0x20, 0x8b, 0x29, 0xd6, 0xce, 0x1b, 0xd2, 0x2b, 0xc3, 0x4e, 0x42, 0xef, 0x0d, 0x3b, 0x81,
+    0xbc, 0x38, 0xec, 0x14, 0xba, 0x44, 0xdb, 0x29, 0x52, 0x13, 0x6d, 0x27, 0x2d, 0x56, 0x61, 0x09, 0xc1, 0xaf, 0xda,
+    0x5b, 0x47, 0xd9, 0xbe, 0xc8, 0x12, 0xa6, 0x2d, 0x60, 0x94, 0x5b, 0xf5, 0x99, 0x53, 0xc4, 0x4a, 0xd9, 0x3b, 0x9d,
+    0x54, 0xb9, 0x8b, 0x7c, 0x6a, 0x35, 0x45, 0x26, 0x7f, 0x7f, 0xdc, 0x22, 0xf9, 0xe4, 0xe7, 0x76, 0xc3, 0x64, 0xfa,
+    0xc7, 0xa3, 0x2f, 0xa0, 0x2b, 0xb2, 0xd3, 0x27, 0x10, 0x90, 0xa9, 0xa0, 0x5a, 0xdd, 0x2a, 0xa6, 0x79, 0xbb, 0xca,
+    0x6e, 0x2f, 0x94, 0x18, 0x4e, 0x67, 0x27, 0xe1, 0xd1, 0x66, 0xc8, 0xc0, 0x21, 0x08, 0x14, 0x42, 0x45, 0x31, 0x3c,
+    0x02, 0xb5, 0x46, 0xf2, 0x01, 0x7e, 0xb4, 0x3b, 0x15, 0x44, 0x6a, 0x37, 0x15, 0x37, 0x4e, 0x6e, 0xba, 0x5e, 0x0a,
+    0xd4, 0x3a, 0x25, 0x2b, 0x80, 0x12, 0xa2, 0xfe, 0x24, 0xb6, 0xf5, 0x2b, 0xb8, 0x62, 0xf3, 0x7d, 0xa3, 0xe8, 0xc9,
+    0xf5, 0x29, 0xea, 0x56, 0x5c, 0x9d, 0xa6, 0xad, 0xe6, 0xd8, 0x71, 0x86, 0x1c, 0x3c, 0x2b, 0x08, 0xb6, 0xa3, 0x12,
+    0xe5, 0x75, 0xbb, 0xe9, 0x98, 0xd8, 0xea, 0x9f, 0x45, 0xb5, 0xb9, 0x83, 0x8a, 0x88, 0xf8, 0x28, 0xbb, 0x79, 0xd2,
+    0x7e, 0x07, 0x7b, 0xac, 0xd5, 0x20, 0xb2, 0xcf, 0xe0, 0x2a, 0xd7, 0x69, 0x91, 0xdb, 0x32, 0x38, 0xff, 0xf0, 0x6a,
+    0x57, 0x61, 0x93, 0x63, 0x5d, 0x5d, 0xcd, 0x54, 0x27, 0x15, 0x1b, 0x18, 0x6b, 0x5a, 0x4b, 0x35, 0x8f, 0x21, 0xe9,
+    0xae, 0x2c, 0xce, 0xaa, 0xa4, 0x9b, 0x9e, 0x1b, 0x67, 0x0a, 0x31, 0x70, 0xb6, 0x1a, 0x2d, 0x67, 0x18, 0xa2, 0xeb,
+    0xc3, 0x2c, 0xf1, 0x5b, 0x3d, 0xe5, 0x3e, 0x0f, 0xb7, 0x7e, 0x57, 0x2f, 0x38, 0x99, 0xec, 0x27, 0xc7, 0xb9, 0xdb,
+    0x45, 0xda, 0x4f, 0x7c, 0x1b, 0xe6, 0x5f, 0xdf, 0x20, 0xee, 0x44, 0xfd, 0xcf, 0x0a, 0x80, 0x06, 0x37, 0x79, 0x2c,
+    0x51, 0xea, 0xf7, 0xaa, 0xfa, 0x41, 0xcd, 0x54, 0x4d, 0x03, 0xc1, 0x9c, 0x4a, 0x01, 0x7f, 0xb8, 0x5d, 0xb8, 0xe2,
+    0x11, 0x37, 0x2c, 0x8c, 0x7f, 0x7a, 0x35, 0x3b, 0x15, 0x54, 0x06, 0x6e, 0xc6, 0x7f, 0x7a, 0x82, 0x9d, 0xc2, 0x5a,
+    0x01, 0x59, 0xe1, 0x4f, 0x2f, 0x7f, 0xe4, 0xfd, 0x8a, 0xff, 0xe9, 0x55, 0x8f, 0xbc, 0x8f, 0x38, 0x2f, 0x7f, 0x22,
+    0xa9, 0x13, 0xa2, 0xba, 0xfc, 0x49, 0x98, 0x62, 0xab, 0x34, 0x7f, 0x4d, 0x0a, 0x9f, 0xe0, 0x33, 0xf0, 0x1d, 0xae,
+    0xc2, 0xad, 0xf9, 0x0d, 0x1e, 0x3b, 0x16, 0xdb, 0x2e, 0xf5, 0x05, 0x94, 0x23, 0xb0, 0x88, 0xdc, 0x7e, 0xbb, 0xb2,
+    0x5f, 0x2d, 0x8c, 0x32, 0xc6, 0xee, 0x4b, 0x56, 0xa2, 0x74, 0xd6, 0xef, 0x17, 0x52, 0x30, 0xb2, 0x0b, 0x6b, 0xb4,
+    0x47, 0xa9, 0x7a, 0xf5, 0x3a, 0xac, 0xa3, 0x24, 0xcd, 0xef, 0x64, 0xf4, 0x91, 0x0c, 0x3b, 0xd2, 0x57, 0x52, 0xa2,
+    0xbd, 0x56, 0x61, 0x39, 0x9a, 0xfd, 0xba, 0xe4, 0x40, 0x79, 0xdd, 0x0a, 0xca, 0x57, 0x4d, 0x00, 0xbd, 0x52, 0xed,
+    0x33, 0xd0, 0x0a, 0x0a, 0x4b, 0xe5, 0xc1, 0x4a, 0x9c, 0x8b, 0x3e, 0x2b, 0x0e, 0x07, 0x75, 0x31, 0x24, 0x14, 0xa8,
+    0x12, 0x27, 0xa1, 0x11, 0xcf, 0xe1, 0x42, 0x28, 0x5e, 0xe4, 0x18, 0x5b, 0x91, 0x03, 0x07, 0x32, 0xfc, 0x80, 0xc0,
+    0x7b, 0xd9, 0xbf, 0x82, 0xc1, 0x30, 0xc1, 0x8d, 0x8c, 0x3a, 0x39, 0x67, 0x7f, 0x62, 0x60, 0x06, 0xf5, 0xa4, 0x76,
+    0x9f, 0xdd, 0xab, 0xc0, 0x5e, 0x38, 0x03, 0xda, 0xbb, 0x31, 0xfa, 0x59, 0x15, 0x6b, 0x27, 0xfd, 0x53, 0xb1, 0x86,
+    0x64, 0x3a, 0x2c, 0x8e, 0xb6, 0x69, 0x78, 0x24, 0x4f, 0x8e, 0xe3, 0x4d, 0xff, 0x70, 0x18, 0xe3, 0xc7, 0x51, 0x7e,
+    0x6d, 0x01, 0xaf, 0xe2, 0x16, 0xd2, 0x58, 0xa4, 0xe8, 0x1d, 0x88, 0x39, 0x14, 0xbd, 0x64, 0xbf, 0x65, 0xbc, 0x9c,
+    0x08, 0x4a, 0x49, 0x62, 0xc3, 0x3b, 0xd2, 0xd3, 0xb4, 0x1e, 0x6d, 0x65, 0xc0, 0x7e, 0x3d, 0xda, 0xd1, 0x5f, 0xa0,
+    0x78, 0xb4, 0xf0, 0x97, 0xf4, 0x77, 0x71, 0x37, 0xf7, 0x9c, 0x6f, 0x1a, 0xdf, 0x11, 0x17, 0x28, 0xd6, 0xec, 0xfe,
+    0x9a, 0x96, 0xce, 0x3a, 0x10, 0x1c, 0xf0, 0x16, 0xbb, 0x68, 0xdf, 0x6f, 0x5c, 0xa7, 0xa7, 0xfd, 0xb7, 0x6e, 0x8d,
+    0xf2, 0xbd, 0x7f, 0x4a, 0x94, 0x83, 0xfd, 0x6b, 0x17, 0xcd, 0xdf, 0x7e, 0xca, 0x90, 0x54, 0x68, 0x6e, 0xb0, 0x9d,
+    0x6c, 0x11, 0xd6, 0xc6, 0x38, 0xa8, 0xd8, 0x5d, 0x19, 0x46, 0xc0, 0xa0, 0x8e, 0xfd, 0x8f, 0x3e, 0x9b, 0x36, 0x64,
+    0x1f, 0x00, 0x2a, 0x57, 0x21, 0x60, 0x0f, 0xc0, 0x89, 0x46, 0xb8, 0x01, 0x6e, 0x35, 0x5a, 0xd2, 0x41, 0xdd, 0x16,
+    0x0c, 0x44, 0x4b, 0xd8, 0xc8, 0xdb, 0xae, 0x4e, 0x5f, 0x11, 0x3e, 0xd4, 0x4e, 0x4a, 0x87, 0xf2, 0x57, 0xcf, 0xd9,
+    0xff, 0xec, 0xb0, 0xa6, 0xa6, 0xdc, 0x00, 0x66, 0xce, 0x4a, 0xe4, 0x15, 0x42, 0xa7, 0xc8, 0xef, 0x55, 0x5d, 0x89,
+    0xe1, 0xb2, 0x16, 0x65, 0x67, 0x76, 0xeb, 0x44, 0xef, 0x9c, 0x82, 0x5a, 0x2a, 0x1b, 0xe4, 0x24, 0xd5, 0xe6, 0x23,
+    0x6b, 0x05, 0x25, 0xea, 0x1a, 0x05, 0x8e, 0x4f, 0xb9, 0x76, 0xff, 0xef, 0x9c, 0x09, 0x6a, 0xb6, 0x51, 0xdd, 0x5f,
+    0xeb, 0xa7, 0xaa, 0x26, 0xb1, 0x00, 0x97, 0x93, 0x34, 0xef, 0x78, 0x84, 0xd5, 0x3f, 0x4e, 0x96, 0x22, 0xd0, 0xeb,
+    0x88, 0x76, 0x25, 0x20, 0x41, 0x3b, 0x39, 0x0b, 0x15, 0x81, 0x02, 0x7d, 0xfd, 0xfb, 0x4d, 0x9a, 0xc5, 0x72, 0x35,
+    0xdb, 0xc3, 0x44, 0x59, 0xac, 0x87, 0x08, 0x72, 0x66, 0xea, 0x60, 0xbf, 0xa7, 0x19, 0xcd, 0xc2, 0x2b, 0x53, 0x82,
+    0x4b, 0x71, 0x15, 0x15, 0x39, 0xf8, 0x1c, 0xe2, 0x0b, 0x9f, 0x0a, 0xb9, 0x41, 0x44, 0xd3, 0xef, 0x25, 0xaa, 0x1d,
+    0x29, 0x90, 0x43, 0xc9, 0x4f, 0x88, 0xbf, 0x64, 0x6d, 0x8c, 0xfb, 0xa5, 0x53, 0xed, 0x57, 0x0a, 0xc1, 0xfd, 0x67,
+    0x5b, 0x6c, 0x54, 0x79, 0xa2, 0x47, 0x9f, 0x62, 0xfd, 0x4f, 0x16, 0x50, 0xaa, 0xfb, 0x36, 0x38, 0x15, 0x8f, 0xc2,
+    0x4d, 0x5d, 0xdc, 0x20, 0xb4, 0x40, 0x39, 0xaa, 0x8a, 0x4d, 0x19, 0x11, 0x27, 0xec, 0xa6, 0x2e, 0x7a, 0x9a, 0x03,
+    0x9d, 0x3a, 0x2c, 0x4d, 0xe4, 0x89, 0xd0, 0x6e, 0x41, 0xf7, 0x34, 0xc7, 0x4a, 0xbc, 0x94, 0xa5, 0x83, 0xac, 0x13,
+    0x69, 0x42, 0xe5, 0xae, 0xae, 0x3a, 0x2a, 0x95, 0xba, 0xe1, 0x4d, 0xaa, 0x19, 0x7f, 0x97, 0xe6, 0x4f, 0x2c, 0xfb,
+    0x4d, 0xeb, 0xb7, 0x5a, 0xed, 0x8d, 0xd5, 0xa3, 0x92, 0x35, 0xc7, 0xd9, 0x84, 0xa4, 0xf4, 0x09, 0xdb, 0xcd, 0xa4,
+    0x6b, 0x1d, 0x78, 0x12, 0x5c, 0x0e, 0x3d, 0x01, 0x15, 0x83, 0x26, 0xde, 0xee, 0x02, 0xf5, 0x08, 0x3c, 0x03, 0xe5,
+    0x13, 0xb5, 0x0e, 0xf8, 0x79, 0xad, 0xe5, 0x29, 0x23, 0x0c, 0xab, 0x9d, 0x45, 0xcb, 0xc1, 0x79, 0xa7, 0x08, 0x5c,
+    0xbb, 0x12, 0x78, 0x3e, 0x54, 0xef, 0x85, 0x80, 0xe1, 0xfe, 0xa9, 0x50, 0xd9, 0xec, 0x66, 0x38, 0x8f, 0x1a, 0xa7,
+    0x07, 0xda, 0xdb, 0xae, 0xf5, 0x50, 0xef, 0xba, 0x9d, 0xdb, 0x4a, 0xf7, 0x7e, 0xed, 0x64, 0xd2, 0x05, 0xb4, 0x36,
+    0x9f, 0x7d, 0x67, 0x57, 0x5a, 0x37, 0x3d, 0x67, 0x0f, 0xb6, 0x6e, 0x89, 0xce, 0x05, 0xd1, 0xe4, 0xf7, 0x03, 0xcf,
+    0xda, 0x76, 0xf4, 0xdb, 0xb4, 0x63, 0x9b, 0x7b, 0xa8, 0x7b, 0x05, 0xb5, 0xde, 0xd0, 0xbc, 0x7f, 0xe6, 0xda, 0x76,
+    0x7c, 0xf5, 0xeb, 0xba, 0xc3, 0x75, 0xde, 0x04, 0xc7, 0x4d, 0xd7, 0xb6, 0xda, 0xd9, 0xcf, 0xdd, 0xbd, 0xb5, 0x88,
+    0xc2, 0x2c, 0xfb, 0xb1, 0x28, 0xfe, 0xa8, 0xf4, 0x1d, 0x81, 0x8e, 0xee, 0xbc, 0xa8, 0xd3, 0xe5, 0xee, 0x03, 0x61,
+    0x3c, 0x79, 0xf5, 0x11, 0xd1, 0xad, 0xef, 0x33, 0xf7, 0x2b, 0xc0, 0x8d, 0xe0, 0x0e, 0xa2, 0xbd, 0x5b, 0xea, 0x93,
+    0x5a, 0x7d, 0xad, 0xd7, 0xce, 0xd3, 0xf3, 0x9b, 0xce, 0xed, 0x77, 0xdf, 0x1c, 0x6d, 0xbd, 0xc7, 0x85, 0xb5, 0xb2,
+    0xf4, 0x54, 0x15, 0xec, 0xcd, 0xf2, 0x54, 0x15, 0x4c, 0x1e, 0x78, 0xcd, 0x7e, 0x41, 0x83, 0x2b, 0x1d, 0x6d, 0xbc,
+    0x27, 0x6a, 0xe0, 0x16, 0x85, 0xa5, 0xc3, 0x2f, 0xb9, 0x99, 0xbc, 0xc2, 0xfd, 0xa5, 0x22, 0x17, 0xfb, 0xce, 0x19,
+    0xdd, 0x99, 0x59, 0xf7, 0xaa, 0xc2, 0xd5, 0x82, 0x5c, 0x1d, 0xd8, 0x5a, 0x76, 0x71, 0xb8, 0x61, 0x11, 0x05, 0x08,
+    0xc4, 0xf4, 0x4a, 0xad, 0xfd, 0x11, 0x0d, 0x42, 0x3e, 0x18, 0xf8, 0x05, 0x06, 0xab, 0x02, 0x85, 0x0f, 0x14, 0xc9,
+    0x5f, 0x7b, 0x02, 0x76, 0xf1, 0x0c, 0xd0, 0xad, 0xd8, 0xac, 0x18, 0x21, 0x42, 0x26, 0xcb, 0x59, 0x4d, 0x67, 0x90,
+    0x4f, 0x7d, 0xf1, 0x8d, 0xad, 0x3a, 0x9d, 0xb7, 0x35, 0x55, 0x4e, 0x1d, 0x0a, 0xdd, 0xdd, 0xd4, 0x9d, 0x5b, 0x17,
+    0x79, 0xea, 0x10, 0x72, 0xa5, 0x62, 0x25, 0xa6, 0xa1, 0xe6, 0x49, 0x9a, 0x51, 0x7f, 0xb1, 0xf7, 0x7b, 0x8d, 0xc2,
+    0x29, 0x7f, 0x3a, 0x06, 0x55, 0xb8, 0xaa, 0x21, 0x8e, 0xa5, 0x2a, 0x1e, 0xd9, 0x20, 0xd0, 0xbc, 0xba, 0x55, 0x49,
+    0x13, 0x32, 0xb9, 0x11, 0x3e, 0x35, 0x29, 0xe5, 0x69, 0xda, 0xa4, 0x95, 0x22, 0x75, 0xf0, 0x41, 0x9d, 0x6a, 0x3c,
+    0x37, 0xab, 0x17, 0x00, 0x66, 0x9c, 0x5f, 0xf1, 0x4b, 0xc5, 0x65, 0xd4, 0x56, 0x66, 0xd2, 0xfe, 0xe4, 0x68, 0x6c,
+    0xd4, 0xe5, 0xb4, 0x51, 0x46, 0x58, 0x29, 0xcd, 0x49, 0xb1, 0x1c, 0xcf, 0x3f, 0x60, 0xb0, 0xe6, 0x09, 0xec, 0x60,
+    0xa2, 0x52, 0xde, 0x47, 0x40, 0x7c, 0x9d, 0xa4, 0x77, 0x09, 0xa4, 0x48, 0xff, 0xd2, 0x25, 0x77, 0x19, 0x1b, 0x88,
+    0x31, 0x2b, 0x66, 0x46, 0xff, 0x83, 0xbb, 0xa4, 0x3f, 0x09, 0x01, 0x70, 0x13, 0x4d, 0xa1, 0x53, 0xe7, 0xc9, 0x45,
+    0x1e, 0x2c, 0x2f, 0x3c, 0xb4, 0x62, 0xc4, 0x83, 0xbf, 0xbe, 0x08, 0x11, 0xc4, 0x1c, 0x53, 0x3c, 0xfd, 0xc2, 0xe8,
+    0x2f, 0xc1, 0x25, 0x46, 0x10, 0xba, 0x7b, 0xe7, 0x30, 0x84, 0x9b, 0x3d, 0xc8, 0xa0, 0xfe, 0x50, 0x87, 0x44, 0x0d,
+    0x7f, 0xac, 0x3c, 0xe8, 0xff, 0x3a, 0x13, 0x96, 0xda, 0x4f, 0x4f, 0x07, 0x50, 0xc1, 0xfb, 0x8a, 0xb7, 0x11, 0xf1,
+    0x7d, 0xe2, 0x67, 0xf1, 0x60, 0xf3, 0x6c, 0x03, 0xd6, 0xba, 0x27, 0xb9, 0xb1, 0xae, 0x12, 0x36, 0x10, 0xf0, 0x35,
+    0x8a, 0xda, 0xf3, 0xda, 0xed, 0x1e, 0xfc, 0xd5, 0xbf, 0x08, 0x19, 0x30, 0x71, 0xfa, 0x3e, 0x73, 0xb2, 0x46, 0x17,
+    0x99, 0x4c, 0x1f, 0x3a, 0xe9, 0x1b, 0x9d, 0xee, 0x3b, 0xe1, 0x1f, 0x15, 0xb3, 0xf8, 0x70, 0x4b, 0x5f, 0x69, 0x52,
+    0xdc, 0x01, 0x2b, 0x9b, 0x47, 0x05, 0xa1, 0xce, 0x45, 0xf4, 0x95, 0x29, 0xdf, 0x12, 0x6a, 0xf6, 0x8d, 0x25, 0xa5,
+    0x74, 0xaf, 0xa1, 0x37, 0x69, 0xad, 0xdf, 0x46, 0x09, 0xc6, 0x44, 0xc7, 0x93, 0x97, 0xf1, 0x58, 0x79, 0x1f, 0x8f,
+    0x1b, 0xa9, 0x90, 0x07, 0x20, 0x02, 0x15, 0xe3, 0x4f, 0x57, 0x9e, 0x9c, 0xf4, 0xc2, 0x78, 0x15, 0x4a, 0x41, 0x61,
+    0x40, 0x57, 0x20, 0x05, 0x3c, 0x6a, 0x4f, 0x74, 0x16, 0x76, 0x09, 0xf7, 0xe8, 0x26, 0x60, 0xac, 0xcf, 0x3f, 0x02,
+    0x9a, 0xbb, 0x70, 0x87, 0x17, 0x03, 0xd4, 0xa6, 0x5e, 0xdd, 0x7d, 0x5c, 0xab, 0x73, 0x38, 0x04, 0x07, 0xab, 0x41,
+    0x04, 0xa7, 0xf3, 0xa9, 0xa3, 0x59, 0x16, 0xa0, 0x72, 0xb2, 0xdc, 0xc8, 0x9b, 0x47, 0x8b, 0x5e, 0xdd, 0xf7, 0x96,
+    0x69, 0x59, 0xd5, 0x41, 0xc6, 0xb2, 0xb0, 0x02, 0x5c, 0x1d, 0x5a, 0x3f, 0x08, 0x97, 0x85, 0xf3, 0x07, 0x42, 0x10,
+    0xbb, 0x57, 0xdb, 0x92, 0xe7, 0x6a, 0x0e, 0x3f, 0x7b, 0xce, 0xd6, 0x5c, 0xa2, 0x4e, 0x3a, 0x13, 0x01, 0x88, 0x3d,
+    0x35, 0xab, 0xe8, 0x1a, 0x48, 0xea, 0x34, 0xab, 0xe8, 0x9a, 0x9a, 0x6d, 0x8c, 0x03, 0xf9, 0x68, 0x95, 0x02, 0xf6,
+    0xdd, 0x74, 0x1c, 0xac, 0x9e, 0xc5, 0xf2, 0x3a, 0x74, 0xf7, 0x6c, 0xa3, 0x7c, 0x06, 0x75, 0xab, 0x8d, 0x31, 0xb1,
+    0xdd, 0x7c, 0x39, 0xd7, 0x6f, 0x07, 0x4b, 0xdf, 0x0e, 0x9a, 0x73, 0xca, 0xbe, 0xd3, 0x65, 0xaf, 0xec, 0xb2, 0xa9,
+    0xe7, 0x8e, 0x8a, 0x56, 0x63, 0x40, 0x6f, 0x60, 0xc1, 0xfa, 0x5c, 0xa4, 0xd9, 0xaa, 0x54, 0x25, 0xe0, 0x85, 0xb1,
+    0x62, 0x77, 0x7e, 0x23, 0x33, 0x24, 0x61, 0x1e, 0x67, 0xe2, 0x9a, 0xee, 0xb5, 0x30, 0x39, 0x8e, 0x45, 0x32, 0x25,
+    0x74, 0x4a, 0x77, 0xb6, 0xa1, 0x73, 0x15, 0x46, 0x11, 0xad, 0x95, 0x54, 0x1a, 0x09, 0x4c, 0xcd, 0x00, 0x25, 0x73,
+    0x05, 0x4e, 0xe9, 0x72, 0xff, 0x3b, 0x12, 0xe3, 0xcc, 0x17, 0x25, 0x33, 0xa0, 0x5b, 0x7e, 0x5d, 0xac, 0x5b, 0x29,
+    0x32, 0xc2, 0xbc, 0x39, 0x6e, 0xaf, 0xeb, 0x43, 0x20, 0x57, 0xcb, 0x1e, 0x45, 0xe3, 0xa0, 0xd0, 0xe1, 0x52, 0x25,
+    0xc0, 0xbe, 0x48, 0xfc, 0x8c, 0xb0, 0xa5, 0x3d, 0x90, 0xdb, 0xa3, 0x33, 0x61, 0xce, 0x39, 0x29, 0xcb, 0xce, 0xa5,
+    0x19, 0x5c, 0x4e, 0x5c, 0x09, 0x2e, 0xd2, 0xdb, 0xf6, 0x34, 0x69, 0x69, 0xfb, 0xd8, 0x70, 0x8e, 0x86, 0xb6, 0x41,
+    0x77, 0xec, 0x0f, 0xcd, 0xc5, 0x22, 0xb6, 0x2e, 0x16, 0xc3, 0xce, 0xec, 0x47, 0x8b, 0x05, 0xc8, 0x01, 0xe0, 0xa8,
+    0xdb, 0xf0, 0x31, 0x5b, 0x02, 0xa7, 0xd5, 0x34, 0x9b, 0x7a, 0x1b, 0x5e, 0x3d, 0x53, 0x3d, 0xbd, 0xe4, 0xf9, 0x33,
+    0x61, 0xc6, 0x62, 0xc3, 0xf3, 0x67, 0xd6, 0x91, 0x53, 0x3d, 0x13, 0x4a, 0xb4, 0x2e, 0xa0, 0x19, 0x78, 0x4d, 0x01,
+    0x23, 0x96, 0x4c, 0xa6, 0x54, 0x91, 0xc7, 0xbd, 0xe9, 0x46, 0x0d, 0x5e, 0x50, 0x38, 0x04, 0x52, 0x3a, 0xfd, 0xe2,
+    0x39, 0xd3, 0xef, 0x5d, 0x3c, 0xef, 0x90, 0xb5, 0x0d, 0xd3, 0xe5, 0x66, 0x98, 0x0c, 0x4a, 0xff, 0x99, 0x99, 0x18,
+    0x17, 0xd6, 0x24, 0x01, 0xc4, 0xbf, 0xb1, 0xdf, 0x21, 0x85, 0x9b, 0xf7, 0x97, 0xc3, 0xf8, 0x91, 0xf7, 0x63, 0x64,
+    0x4f, 0xd2, 0x0c, 0xb1, 0x66, 0x52, 0x21, 0x77, 0x5f, 0xad, 0x7f, 0x4c, 0xec, 0x26, 0x7b, 0x60, 0x01, 0x88, 0xad,
+    0x69, 0xab, 0x5b, 0xde, 0xef, 0x7b, 0xa6, 0x08, 0xf0, 0x83, 0xf2, 0x8f, 0xee, 0x0c, 0xc9, 0xa0, 0xec, 0xba, 0x21,
+    0xc4, 0x83, 0xb2, 0x69, 0xda, 0xeb, 0x6d, 0xef, 0xcc, 0x63, 0x75, 0x9d, 0x76, 0x16, 0x57, 0x8b, 0x0c, 0xd2, 0xea,
+    0x43, 0x76, 0x9c, 0xd9, 0x67, 0x47, 0x4b, 0xa5, 0xfb, 0x7d, 0x88, 0x88, 0x3b, 0xca, 0xda, 0x7e, 0xbb, 0x05, 0xd7,
+    0x70, 0x34, 0x08, 0x5d, 0xd9, 0xdb, 0x65, 0xb4, 0x71, 0x21, 0x8e, 0x7b, 0xa6, 0xf3, 0x05, 0x5f, 0x1e, 0xa5, 0x9d,
+    0x07, 0xa7, 0x7a, 0xa2, 0xcf, 0x4d, 0x77, 0x95, 0xc9, 0xb5, 0x0e, 0xab, 0x31, 0xa8, 0xcd, 0xc2, 0x16, 0xee, 0xc2,
+    0x36, 0x3a, 0x68, 0xed, 0xcb, 0x82, 0x7f, 0xca, 0x00, 0x7c, 0xe9, 0xd9, 0xb2, 0xed, 0x35, 0x69, 0xf5, 0x46, 0x46,
+    0x21, 0xb6, 0xb4, 0xbd, 0xfa, 0x74, 0x94, 0x8f, 0x9b, 0x13, 0x8a, 0x0b, 0x39, 0xca, 0x8f, 0x5e, 0x43, 0xd4, 0xb5,
+    0xae, 0xe3, 0x62, 0xd1, 0xe1, 0xc6, 0x55, 0xb7, 0xdd, 0xb8, 0x7e, 0x40, 0xbc, 0x35, 0xda, 0xa4, 0x50, 0x2b, 0x63,
+    0x47, 0xf0, 0xb2, 0x7c, 0x38, 0x64, 0x62, 0x38, 0x94, 0x90, 0xa9, 0x8f, 0xdd, 0x1b, 0x9a, 0xf6, 0xf9, 0x69, 0xeb,
+    0x47, 0x2c, 0x35, 0x8e, 0x62, 0xc3, 0x3b, 0x7d, 0xe7, 0xb1, 0x35, 0xae, 0xe4, 0xcb, 0x60, 0xb6, 0x2b, 0xa8, 0xb6,
+    0xc6, 0x1b, 0xf6, 0x72, 0xfe, 0x7d, 0x25, 0x95, 0xfc, 0xed, 0xcf, 0x70, 0x0d, 0x6f, 0x6d, 0xe9, 0xa0, 0xa9, 0x66,
+    0x39, 0xcb, 0xf5, 0xbd, 0xe0, 0xf8, 0xe3, 0xee, 0x15, 0xc1, 0xe0, 0xf7, 0x74, 0x14, 0xe4, 0x62, 0xa9, 0xd6, 0x80,
+    0x82, 0x74, 0x64, 0xc7, 0x54, 0x16, 0x18, 0x06, 0xf0, 0x86, 0x0c, 0x90, 0xc7, 0x14, 0xee, 0x86, 0x0a, 0x2f, 0xfc,
+    0xa5, 0x22, 0xbb, 0x04, 0xb6, 0x35, 0xe3, 0x63, 0x86, 0x3b, 0x08, 0xf9, 0x47, 0xb0, 0x3b, 0xb6, 0x62, 0xb7, 0x6c,
+    0xc1, 0x90, 0x6c, 0x1c, 0x87, 0x31, 0xe6, 0xe3, 0x49, 0x7c, 0x25, 0x26, 0xf1, 0x80, 0x47, 0xe8, 0x18, 0xb1, 0xe6,
+    0xf5, 0x2c, 0x96, 0x03, 0xc8, 0xee, 0xb8, 0xd2, 0x01, 0x21, 0x34, 0x36, 0xb4, 0xe4, 0x4d, 0x61, 0x70, 0xb1, 0x63,
+    0x9f, 0x91, 0x48, 0xc6, 0x21, 0x58, 0xb4, 0xaa, 0x81, 0x85, 0x89, 0xdd, 0xf2, 0x62, 0xb6, 0x9a, 0xe3, 0x3f, 0x87,
+    0x03, 0x02, 0x60, 0x07, 0xfb, 0x86, 0xdd, 0x45, 0x88, 0xf4, 0xb6, 0xe0, 0x77, 0x96, 0xa7, 0x0b, 0xbb, 0xe7, 0xd7,
+    0x7c, 0xcc, 0xce, 0x7f, 0xf0, 0x20, 0x72, 0xf6, 0xfc, 0x23, 0xa0, 0x21, 0xde, 0xf3, 0xdb, 0xd4, 0xab, 0xd8, 0x2d,
+    0x51, 0x10, 0xde, 0x82, 0x33, 0xd0, 0x3d, 0x44, 0xc0, 0x5e, 0xf3, 0x05, 0xc6, 0x8a, 0x9d, 0xa5, 0x4b, 0x0f, 0x33,
+    0x42, 0xed, 0xe9, 0x7c, 0x59, 0xab, 0x49, 0xb8, 0xb9, 0x5a, 0x4e, 0x06, 0x83, 0x8d, 0xbf, 0xe3, 0x6b, 0xe0, 0x83,
+    0x39, 0xff, 0xc1, 0xdb, 0x51, 0xb9, 0xf0, 0x9f, 0xd7, 0x59, 0xf2, 0xce, 0x67, 0xd7, 0x03, 0xbe, 0x00, 0xbc, 0x25,
+    0x74, 0xe0, 0xba, 0xf7, 0x99, 0xc4, 0x6b, 0xbb, 0xd6, 0xd7, 0x08, 0x24, 0xf2, 0x05, 0x60, 0xc4, 0xc4, 0xfc, 0xbe,
+    0x86, 0x08, 0x8c, 0x04, 0x7c, 0x5b, 0xb5, 0x47, 0xfc, 0x96, 0x1b, 0xc0, 0xaf, 0xcc, 0x67, 0x0f, 0x3c, 0xd4, 0x3f,
+    0x13, 0x9f, 0xdd, 0xf0, 0xf7, 0xfc, 0x85, 0x27, 0x25, 0xe9, 0x72, 0xf6, 0x7e, 0x0e, 0xd7, 0x43, 0x29, 0x4f, 0x87,
+    0xf4, 0xb3, 0x31, 0x18, 0x40, 0x28, 0x64, 0xde, 0x78, 0xc0, 0x9a, 0x14, 0xe2, 0x5f, 0xc0, 0xb7, 0xa3, 0x84, 0xcd,
+    0x1b, 0x6f, 0xeb, 0x6b, 0x79, 0xf3, 0xc6, 0x7b, 0xf0, 0x29, 0x0a, 0xb0, 0x0a, 0x4a, 0x59, 0x60, 0x15, 0x84, 0x8d,
+    0x36, 0xc2, 0x18, 0xb8, 0x7a, 0xd7, 0x18, 0xea, 0x7a, 0x8e, 0xd8, 0xb6, 0xd2, 0x77, 0xe1, 0x3b, 0xc8, 0x80, 0x0f,
+    0xde, 0x14, 0x25, 0xd1, 0xe7, 0xd4, 0x14, 0x49, 0xeb, 0x9e, 0xfb, 0xad, 0x75, 0x47, 0x6b, 0x4a, 0x7d, 0xe4, 0x6a,
+    0x7c, 0x38, 0xd4, 0x2f, 0x84, 0x16, 0x09, 0xa6, 0xa0, 0x71, 0x0d, 0xda, 0x02, 0x04, 0x7d, 0x1e, 0x20, 0x6b, 0x49,
+    0xb1, 0xe0, 0xdb, 0x5f, 0x21, 0x06, 0xaf, 0x4c, 0xef, 0x5c, 0xae, 0x32, 0x12, 0xb6, 0x17, 0x7e, 0x39, 0xac, 0xfd,
+    0x89, 0x53, 0x0b, 0x4b, 0xab, 0x39, 0xa8, 0x9f, 0xd9, 0x72, 0x9c, 0xaa, 0xda, 0xbf, 0x25, 0x49, 0xb5, 0xab, 0xb4,
+    0x9c, 0xde, 0xdb, 0x37, 0x5d, 0x26, 0xd8, 0xd8, 0x0f, 0xa8, 0x3a, 0xb2, 0x1a, 0x76, 0x5f, 0xa8, 0x2f, 0x7a, 0x4a,
+    0x26, 0x34, 0x1f, 0x55, 0x34, 0xcf, 0xee, 0x37, 0x3b, 0xea, 0x3f, 0xbd, 0x1c, 0x8a, 0x00, 0xc9, 0x2a, 0x2d, 0x96,
+    0x22, 0x67, 0x63, 0x3f, 0x1e, 0x26, 0x99, 0x0a, 0x2f, 0x48, 0x47, 0x77, 0xbf, 0x71, 0x7f, 0xcb, 0x0d, 0x64, 0x85,
+    0x56, 0x6d, 0x30, 0x56, 0x8a, 0x96, 0xc1, 0xfa, 0x6a, 0xdc, 0xef, 0x8b, 0xab, 0xf1, 0x54, 0x04, 0x35, 0x10, 0x17,
+    0x89, 0x17, 0xe3, 0x69, 0x4d, 0x2c, 0xa9, 0x5d, 0x81, 0x31, 0x7a, 0x5c, 0x15, 0xb5, 0x4f, 0xfd, 0x02, 0x42, 0x91,
+    0x6a, 0xcd, 0x1c, 0x6b, 0xdc, 0x18, 0x11, 0x77, 0x58, 0xb9, 0x76, 0x6a, 0xaf, 0x03, 0xb0, 0xbc, 0x1a, 0x17, 0x84,
+    0x4d, 0x72, 0xec, 0x5c, 0xc0, 0x6a, 0x34, 0xa4, 0xda, 0x0d, 0xb7, 0x5e, 0x76, 0x7e, 0xf3, 0x38, 0xb1, 0xb5, 0x11,
+    0x6e, 0x29, 0xa0, 0x8c, 0xf2, 0x1b, 0xcb, 0x09, 0xbb, 0x53, 0xbd, 0x23, 0x55, 0x3b, 0xe2, 0xc4, 0x05, 0x2c, 0x37,
+    0x3c, 0xb5, 0xfa, 0x26, 0x06, 0x27, 0x42, 0xd5, 0x4a, 0xc7, 0x6b, 0x3f, 0xe2, 0x7e, 0x75, 0x5f, 0xf7, 0x4a, 0xf0,
+    0x93, 0x90, 0xd7, 0x6f, 0x79, 0x07, 0x80, 0x15, 0x1f, 0xf2, 0x62, 0x5a, 0x38, 0x5a, 0x97, 0x41, 0x19, 0x20, 0x42,
+    0x33, 0x00, 0x3a, 0xb9, 0x3a, 0x88, 0xd2, 0xc0, 0x15, 0x77, 0x88, 0xf0, 0xd3, 0xe8, 0x59, 0xfe, 0x22, 0x7c, 0x56,
+    0x4d, 0xc3, 0x8b, 0x3c, 0x88, 0x2e, 0xaa, 0x20, 0x7a, 0x56, 0x5d, 0x85, 0xcf, 0xf2, 0x69, 0x74, 0x91, 0x07, 0xe1,
+    0x45, 0xd5, 0xd8, 0x77, 0xed, 0xee, 0x9e, 0x90, 0xb7, 0x5d, 0xfd, 0x91, 0x73, 0x65, 0x4f, 0x99, 0x9e, 0x9f, 0xd7,
+    0x7a, 0xa5, 0x76, 0x9b, 0xeb, 0x35, 0x6a, 0xa6, 0x3e, 0xca, 0xfe, 0x66, 0x1b, 0x0b, 0x8f, 0xe6, 0x10, 0xfa, 0x8c,
+    0xb4, 0x98, 0x7b, 0x9c, 0xeb, 0xcd, 0x9e, 0x14, 0x06, 0x46, 0x4c, 0x2a, 0x19, 0x39, 0xbd, 0xc0, 0x45, 0xa8, 0x42,
+    0x0c, 0x6b, 0xe9, 0x6a, 0x9f, 0x75, 0xe9, 0x0d, 0xd4, 0x35, 0xc5, 0xbe, 0x86, 0x0c, 0xbc, 0x68, 0x7a, 0x19, 0x8c,
+    0x01, 0x39, 0x02, 0xef, 0xf8, 0x6c, 0x09, 0x07, 0xe6, 0x1a, 0xa0, 0x6f, 0x1e, 0xf5, 0x75, 0xb9, 0xe3, 0x6b, 0xd5,
+    0x37, 0xd3, 0xf5, 0x48, 0x29, 0x3f, 0x56, 0xfc, 0xee, 0xe2, 0x39, 0xbb, 0xe5, 0x1a, 0x15, 0xe5, 0x17, 0xbd, 0x58,
+    0xef, 0x81, 0xab, 0xee, 0x17, 0xb8, 0xcd, 0xe2, 0xb1, 0x2b, 0x0f, 0x58, 0xb6, 0x65, 0x0f, 0xec, 0x86, 0xbd, 0x67,
+    0x4f, 0xd8, 0x5b, 0xf6, 0x8e, 0xfd, 0x84, 0xaa, 0x0d, 0x25, 0xe4, 0xf9, 0x0b, 0x7e, 0x2b, 0x4d, 0x8f, 0x12, 0x95,
+    0xec, 0xc1, 0x36, 0xd3, 0x0c, 0x37, 0xec, 0x3d, 0x5f, 0x0c, 0x57, 0xec, 0x2d, 0x64, 0x43, 0x99, 0x78, 0xb0, 0x62,
+    0x3f, 0x71, 0x05, 0x62, 0xa6, 0xcf, 0xc2, 0xd2, 0x12, 0x15, 0x4d, 0x99, 0x28, 0x43, 0xbf, 0xe5, 0xf8, 0x22, 0xfb,
+    0x09, 0x8b, 0x90, 0x9f, 0x19, 0xae, 0xd8, 0x03, 0x5f, 0x0c, 0x56, 0xec, 0xbd, 0x36, 0x10, 0x0d, 0x36, 0x6e, 0x69,
+    0x84, 0x64, 0xa5, 0xcb, 0x92, 0xd2, 0xf4, 0xd6, 0xbe, 0x06, 0x6e, 0xd8, 0x0d, 0xd6, 0xee, 0x09, 0x16, 0x8d, 0x02,
+    0xff, 0x60, 0xc5, 0xde, 0x71, 0x09, 0xa0, 0xe6, 0x96, 0x27, 0xbd, 0x42, 0x75, 0x81, 0x74, 0x3f, 0x78, 0xc2, 0xe9,
+    0x45, 0xf6, 0x0e, 0xcb, 0xa0, 0xaf, 0x0c, 0x57, 0x6c, 0x8b, 0xb5, 0xbb, 0x31, 0x96, 0x2d, 0xab, 0x7a, 0x12, 0x11,
+    0x18, 0x05, 0x95, 0xd2, 0xf2, 0x6f, 0xc4, 0xb2, 0xa9, 0x9b, 0x06, 0xb5, 0xa1, 0x3f, 0x1f, 0x8c, 0xfe, 0xe2, 0xeb,
+    0x77, 0x3f, 0x78, 0xa5, 0xbe, 0xf6, 0xfe, 0xe2, 0xb8, 0x56, 0x96, 0xe8, 0x5a, 0xf9, 0x2b, 0x2f, 0x67, 0xbf, 0xcc,
+    0x27, 0xba, 0x96, 0xb4, 0xc3, 0x90, 0xaf, 0xe9, 0xec, 0x97, 0x0e, 0x67, 0xcb, 0x5f, 0x7d, 0xbf, 0x31, 0x5d, 0xac,
+    0x3e, 0xab, 0x7b, 0xf7, 0x61, 0xb0, 0x69, 0x9c, 0x7a, 0xef, 0x4e, 0xd7, 0x1b, 0x9b, 0x59, 0x6b, 0xcf, 0xcc, 0xff,
+    0xe1, 0x4a, 0x6f, 0x71, 0xe8, 0x6e, 0xf8, 0x76, 0xb8, 0xb1, 0x47, 0x41, 0x7e, 0x5f, 0x2a, 0x8d, 0xb3, 0x9a, 0xbf,
+    0xf4, 0x3a, 0xa5, 0x58, 0x40, 0x34, 0xfa, 0x64, 0x24, 0xa1, 0x4b, 0x66, 0xe2, 0x19, 0xe2, 0x8b, 0x0c, 0x90, 0xb9,
+    0x40, 0x34, 0xbb, 0xe7, 0xe3, 0xc9, 0xfd, 0x55, 0x3c, 0xb9, 0x1f, 0xf0, 0x4f, 0xa6, 0x05, 0xed, 0xc5, 0x76, 0xef,
+    0xb3, 0x5f, 0x79, 0x61, 0x2f, 0xc7, 0x5f, 0x7c, 0xf6, 0x45, 0xb8, 0x2b, 0xf4, 0x17, 0x9f, 0xbd, 0x13, 0xfc, 0xd7,
+    0x91, 0x26, 0xca, 0x60, 0xef, 0x6a, 0xfe, 0xeb, 0x08, 0x19, 0x3f, 0xd8, 0x67, 0xc1, 0xbf, 0x80, 0xef, 0x77, 0x95,
+    0xa0, 0x55, 0xfc, 0x73, 0xad, 0x7e, 0xbe, 0x97, 0x71, 0x39, 0xf0, 0x26, 0xb4, 0x82, 0xde, 0xbc, 0xad, 0xe5, 0x4f,
+    0xe2, 0xe1, 0x48, 0xd5, 0x53, 0xc3, 0x3f, 0x8b, 0xc5, 0x2c, 0xea, 0xa3, 0x74, 0x2a, 0x6f, 0x72, 0xcd, 0x33, 0x69,
+    0x5d, 0xbe, 0x87, 0x50, 0xe0, 0x6b, 0x1b, 0xa2, 0x60, 0xc7, 0x71, 0x23, 0xb8, 0x66, 0xef, 0x84, 0xcf, 0xb2, 0xe9,
+    0x96, 0xdf, 0xf0, 0x27, 0xfc, 0x1d, 0xdf, 0x05, 0x0f, 0xfc, 0x3d, 0x7f, 0xcb, 0x7f, 0xe2, 0x3b, 0xb6, 0x94, 0x68,
+    0xa7, 0xf5, 0xf6, 0x32, 0xd8, 0xb2, 0x7a, 0x77, 0x19, 0x3c, 0xb0, 0x7a, 0xfb, 0x3c, 0xb8, 0x61, 0xf5, 0xee, 0x79,
+    0xf0, 0x9e, 0x6d, 0x2f, 0x83, 0x27, 0x6c, 0x77, 0x19, 0xbc, 0x65, 0xdb, 0xe7, 0xc1, 0x3b, 0xb6, 0x7b, 0x1e, 0xfc,
+    0x24, 0x31, 0x1e, 0xde, 0x09, 0xc9, 0x71, 0xf2, 0xae, 0x66, 0x86, 0x4f, 0x37, 0xf8, 0x2c, 0xac, 0x5f, 0x54, 0xc7,
+    0xe0, 0x73, 0xcd, 0x74, 0x8b, 0x03, 0x21, 0x98, 0x6e, 0x6f, 0x70, 0x4b, 0x4f, 0x4c, 0xab, 0x82, 0x54, 0xb0, 0xae,
+    0x76, 0x06, 0x8b, 0xba, 0x69, 0x9d, 0xc9, 0x8e, 0x5f, 0x62, 0xdc, 0xe1, 0x97, 0xb8, 0x60, 0xcb, 0xa6, 0xd3, 0x49,
+    0xe7, 0xf4, 0x49, 0xa0, 0x37, 0x7f, 0xbd, 0xeb, 0x57, 0xd2, 0x77, 0xa6, 0x68, 0x78, 0xae, 0xb4, 0xc6, 0xad, 0x9d,
+    0x3e, 0xb4, 0x76, 0x7a, 0x26, 0x55, 0x68, 0x11, 0x8b, 0xca, 0xa2, 0xaa, 0x90, 0x49, 0x3c, 0xc8, 0xb4, 0x3e, 0x2d,
+    0x61, 0xa4, 0xc8, 0x04, 0x34, 0xfa, 0x82, 0x8e, 0x81, 0x9c, 0x2c, 0x0a, 0x6c, 0xc9, 0x37, 0x83, 0x84, 0xad, 0x79,
+    0x3c, 0x1d, 0x26, 0xc1, 0x92, 0xdd, 0xf1, 0x61, 0xb7, 0x40, 0xb0, 0x52, 0x01, 0x4c, 0xfa, 0xe2, 0xd4, 0xde, 0xd7,
+    0x79, 0x6f, 0x95, 0xc6, 0x71, 0x26, 0x50, 0xd9, 0x56, 0xe9, 0x0d, 0x7e, 0xeb, 0xec, 0xe7, 0x6b, 0xb5, 0xbf, 0x83,
+    0xa4, 0xf0, 0x2b, 0x30, 0xec, 0x10, 0xe1, 0x1d, 0x54, 0x18, 0x79, 0x96, 0xcc, 0xa2, 0xaf, 0xec, 0x2d, 0x7d, 0x6b,
+    0xb6, 0xe9, 0xff, 0xb4, 0x08, 0xda, 0xc7, 0x65, 0xe7, 0x7f, 0x32, 0xaf, 0xfe, 0xd6, 0xf1, 0xea, 0xc6, 0x9f, 0x3c,
+    0xf0, 0x4f, 0x18, 0x96, 0x80, 0x89, 0x6c, 0xc7, 0x3f, 0x8d, 0xb6, 0x8d, 0x53, 0x9e, 0xdc, 0xc7, 0xff, 0xaf, 0x14,
+    0x68, 0xef, 0xe4, 0x95, 0xbd, 0x23, 0x6e, 0x79, 0xc7, 0x3e, 0xbe, 0xb4, 0x36, 0x44, 0x03, 0x4d, 0xf2, 0x89, 0xbb,
+    0xd1, 0xd0, 0xb0, 0x21, 0xfe, 0xc2, 0xab, 0xd9, 0xa7, 0xf9, 0x64, 0xcb, 0x8f, 0xb7, 0xc3, 0x4f, 0x1d, 0xdb, 0xe1,
+    0x2f, 0xfe, 0x60, 0xd9, 0x7c, 0xad, 0x57, 0x3b, 0xb7, 0x71, 0xa7, 0xd2, 0x3b, 0x7e, 0xbc, 0x89, 0x0f, 0xff, 0xe3,
+    0x4a, 0xef, 0xbe, 0xb9, 0xd2, 0x76, 0x95, 0xbb, 0x3b, 0xdf, 0x74, 0x7c, 0x23, 0x6b, 0x8d, 0x71, 0x66, 0x46, 0xb3,
+    0xf8, 0x13, 0xcd, 0xd2, 0x20, 0xb2, 0x14, 0x8a, 0x3f, 0x99, 0x69, 0xa7, 0xee, 0x54, 0x59, 0xdd, 0x2d, 0xdf, 0xe2,
+    0x1e, 0x7f, 0xcb, 0xc7, 0x6c, 0x61, 0x3c, 0x35, 0x6f, 0xaf, 0x16, 0x93, 0xc1, 0xe0, 0xd6, 0xdf, 0xdf, 0xf3, 0x70,
+    0x76, 0x3b, 0x67, 0xd7, 0xfc, 0x9e, 0x16, 0xd3, 0x44, 0x35, 0xbd, 0x78, 0x4c, 0xf0, 0xba, 0xf5, 0xfd, 0x89, 0xc5,
+    0xff, 0x6a, 0x5f, 0x34, 0x6f, 0xfd, 0x81, 0xb4, 0x46, 0xcb, 0x5d, 0xfd, 0xfd, 0xe3, 0x8a, 0x89, 0x5b, 0x10, 0x2f,
+    0xde, 0xdb, 0x9a, 0x86, 0xb7, 0xfc, 0xa3, 0x77, 0xed, 0x4f, 0xaf, 0x75, 0xcc, 0xcd, 0x44, 0x1d, 0x49, 0x6f, 0x2f,
+    0x9e, 0xb3, 0x5f, 0xf9, 0x27, 0x79, 0x9c, 0x7c, 0x11, 0x72, 0xd2, 0xde, 0x20, 0x77, 0x13, 0x9d, 0x12, 0xef, 0xdc,
+    0x44, 0xc2, 0x82, 0x40, 0x18, 0x8e, 0x9a, 0x3f, 0x4c, 0xca, 0xa9, 0xb7, 0x03, 0x6e, 0x57, 0x6e, 0xeb, 0x9f, 0x6f,
+    0x39, 0xe7, 0x8b, 0xe1, 0xe5, 0xf4, 0x5d, 0xb7, 0x4b, 0x8f, 0x8a, 0x66, 0x53, 0x81, 0x6e, 0xb7, 0x18, 0x7b, 0x75,
+    0x32, 0xb3, 0xcc, 0x25, 0x5f, 0x7a, 0x57, 0x9b, 0x99, 0xc7, 0xf4, 0x7e, 0x33, 0xcd, 0x90, 0xc8, 0x17, 0x08, 0x99,
+    0x0e, 0x87, 0xbb, 0x73, 0x2c, 0x8f, 0x0f, 0xdf, 0x3e, 0x7b, 0x32, 0x78, 0x82, 0x91, 0x5b, 0x56, 0x34, 0xc8, 0x3b,
+    0x3e, 0xcc, 0xea, 0xd6, 0x6d, 0xe3, 0xe2, 0xf9, 0xf0, 0x17, 0xc8, 0x1b, 0x74, 0x3d, 0x34, 0x45, 0xb4, 0xca, 0xef,
+    0x28, 0xfa, 0x44, 0xc9, 0x41, 0xc7, 0x13, 0xa8, 0x1d, 0x52, 0xe0, 0xbe, 0x7b, 0xc6, 0x41, 0xbf, 0x81, 0xa5, 0xf6,
+    0xfb, 0xe7, 0x9f, 0x88, 0x47, 0x1a, 0xc6, 0xfb, 0xfb, 0x30, 0xfa, 0x23, 0x2e, 0x8b, 0x35, 0x9c, 0xae, 0x03, 0xf8,
+    0xdc, 0x33, 0x7d, 0xfb, 0xba, 0xf3, 0x7d, 0x3f, 0xf0, 0xb6, 0xfc, 0x86, 0xbd, 0xe3, 0xde, 0xe5, 0xf0, 0xad, 0xff,
+    0xec, 0x09, 0x88, 0x4e, 0x30, 0x2e, 0x9f, 0x31, 0x12, 0xb6, 0xa3, 0x18, 0xb5, 0x0a, 0x3f, 0xd7, 0x10, 0xa2, 0xf5,
+    0x09, 0x19, 0xbb, 0x20, 0xfd, 0x83, 0x02, 0xf4, 0x13, 0x02, 0xab, 0x49, 0x6a, 0x14, 0x98, 0xc4, 0xb7, 0x35, 0x24,
+    0x90, 0x82, 0x05, 0x42, 0x6f, 0xa0, 0xf8, 0x54, 0xf0, 0x77, 0xc3, 0xcf, 0x24, 0xf9, 0x2d, 0x6a, 0x3e, 0x86, 0xbf,
+    0x61, 0x68, 0x26, 0xd5, 0x43, 0x5a, 0x47, 0x89, 0xf7, 0x93, 0xbf, 0x8f, 0xc2, 0x4a, 0xa8, 0x63, 0x21, 0x48, 0xc5,
+    0x90, 0x0b, 0x71, 0xf1, 0x7c, 0x72, 0x5b, 0x8a, 0xf0, 0x8f, 0x09, 0x3e, 0x93, 0x0b, 0x4d, 0x3e, 0xa3, 0x27, 0x8d,
+    0x7c, 0xff, 0x41, 0xbe, 0x2f, 0x3b, 0x35, 0x58, 0xd4, 0x43, 0x7e, 0x5b, 0xbb, 0xef, 0xcb, 0x29, 0x41, 0x8f, 0xec,
+    0x07, 0x34, 0x05, 0x03, 0x35, 0x01, 0x29, 0x43, 0x70, 0x0b, 0x57, 0x7d, 0x4f, 0x15, 0xe4, 0xcb, 0xef, 0x7d, 0x16,
+    0x32, 0x5c, 0x65, 0x41, 0x48, 0x72, 0xa9, 0x90, 0xc2, 0xc6, 0x6d, 0x3d, 0xf8, 0xac, 0x31, 0x49, 0x24, 0xe4, 0x94,
+    0x80, 0x24, 0x69, 0x6f, 0x20, 0x49, 0xc4, 0xf4, 0x1f, 0xae, 0x93, 0xa6, 0x59, 0x49, 0xe9, 0x86, 0x38, 0x55, 0xaf,
+    0x91, 0xe6, 0x2c, 0x78, 0xcf, 0x60, 0xe9, 0x48, 0xb1, 0xe2, 0x9d, 0x31, 0x18, 0xeb, 0x60, 0xa1, 0x3b, 0x59, 0xdc,
+    0xaf, 0x92, 0x30, 0x8d, 0x44, 0x95, 0x2f, 0x42, 0xfe, 0xfc, 0x97, 0x12, 0x7f, 0xf4, 0x96, 0x06, 0x22, 0x10, 0xfc,
+    0x00, 0xad, 0x07, 0xac, 0xf1, 0xe0, 0x27, 0x56, 0x97, 0x61, 0x5e, 0x65, 0x54, 0xde, 0x6c, 0xc7, 0xb6, 0x73, 0xa6,
+    0xaa, 0x16, 0x7c, 0x16, 0x86, 0x16, 0xed, 0x6c, 0xd5, 0x9c, 0xdc, 0xe6, 0x0d, 0xbe, 0x33, 0x49, 0x22, 0xb5, 0x94,
+    0x44, 0xda, 0xea, 0xfa, 0x74, 0xe9, 0x75, 0x8b, 0x0a, 0x1a, 0x23, 0x40, 0x2f, 0x49, 0x77, 0x95, 0x4f, 0x28, 0x5e,
+    0x59, 0x0d, 0xab, 0xe1, 0xa5, 0x43, 0x11, 0xc6, 0xda, 0x9b, 0x2b, 0x79, 0x76, 0x07, 0xd6, 0x23, 0xb4, 0x76, 0x55,
+    0xea, 0x10, 0xb6, 0x9f, 0xe8, 0x3d, 0xa7, 0x52, 0x7f, 0x03, 0xaa, 0xc0, 0xa9, 0xa3, 0xa1, 0x3e, 0x6a, 0xa7, 0x90,
+    0xed, 0xdc, 0x5b, 0x12, 0x54, 0xae, 0xe4, 0xa6, 0x4a, 0x8b, 0x52, 0xca, 0x94, 0xaf, 0x65, 0xb6, 0xb2, 0xfb, 0x64,
+    0x00, 0xf1, 0x6c, 0x50, 0x20, 0xb9, 0xa8, 0xad, 0xe6, 0x20, 0x7d, 0x34, 0x4b, 0x1c, 0x6b, 0x07, 0x85, 0x97, 0x55,
+    0x60, 0xe6, 0x32, 0x97, 0xcb, 0x41, 0xc1, 0x72, 0xbd, 0xd5, 0x4c, 0x33, 0xd5, 0x17, 0xb9, 0xbd, 0xcd, 0x78, 0x99,
+    0xfe, 0x9b, 0x25, 0x03, 0x1e, 0x5d, 0x3c, 0xf7, 0x03, 0x48, 0x93, 0xbc, 0x0e, 0x90, 0x04, 0x9b, 0x83, 0x5d, 0xec,
+    0x30, 0x6c, 0x15, 0x2b, 0x7b, 0xf2, 0x74, 0xb9, 0x43, 0x53, 0x2e, 0x61, 0x24, 0x27, 0xe6, 0x52, 0xea, 0xfb, 0x92,
+    0xea, 0x86, 0x82, 0x93, 0x4d, 0x13, 0x50, 0x0a, 0x68, 0xb7, 0xe0, 0xbf, 0xf0, 0xa9, 0xa1, 0xd3, 0x02, 0x2c, 0xb5,
+    0xdd, 0x80, 0xff, 0x42, 0xbf, 0xd8, 0x3e, 0xa2, 0x7e, 0x60, 0x1e, 0xec, 0xcd, 0xda, 0xca, 0x18, 0x10, 0x91, 0xb8,
+    0x82, 0x3c, 0x12, 0xfc, 0xa0, 0xd8, 0xd3, 0x65, 0xe2, 0xc0, 0x99, 0xe2, 0x62, 0x29, 0xb5, 0x99, 0x79, 0xed, 0xb7,
+    0xd4, 0xc4, 0x9b, 0x28, 0x89, 0x0a, 0xdb, 0x21, 0x8d, 0x5e, 0x52, 0xc6, 0x54, 0xc1, 0x86, 0xe8, 0xbe, 0x6e, 0x82,
+    0x29, 0xf0, 0xa6, 0xaa, 0x02, 0x22, 0xd4, 0x5e, 0x64, 0x79, 0x7e, 0xd3, 0x05, 0x56, 0x17, 0x7c, 0x6c, 0x4c, 0xb3,
+    0x0b, 0x56, 0x72, 0x35, 0x93, 0x3e, 0xf3, 0x76, 0xa0, 0x85, 0xbc, 0xcb, 0xcb, 0xa2, 0x15, 0xba, 0x1e, 0x44, 0x0b,
+    0x7f, 0xaf, 0x39, 0x1e, 0x3d, 0xdb, 0x56, 0x53, 0x9b, 0x7d, 0xad, 0xc5, 0x02, 0x19, 0x88, 0x86, 0xbe, 0x90, 0x33,
+    0x0a, 0x77, 0x95, 0xe6, 0x6a, 0xb5, 0xaf, 0xca, 0x20, 0x81, 0x89, 0x20, 0x6b, 0x59, 0x78, 0x8f, 0xee, 0xd5, 0x23,
+    0xcd, 0x2b, 0x09, 0x9e, 0xb9, 0xf8, 0x0b, 0x00, 0xa1, 0x3c, 0x49, 0xc8, 0x01, 0x39, 0x80, 0xbf, 0xa5, 0x28, 0x95,
+    0x06, 0xf8, 0x67, 0x75, 0x39, 0xb6, 0xf5, 0xfd, 0x9d, 0x56, 0x31, 0xb8, 0xfe, 0x7c, 0xdd, 0xf5, 0xac, 0x1d, 0xe2,
+    0x5c, 0xd9, 0xea, 0xb5, 0x65, 0x9a, 0xc7, 0x48, 0x5d, 0x03, 0x70, 0x27, 0xd2, 0x23, 0x10, 0xc9, 0x4c, 0x34, 0xc8,
+    0xd9, 0x0b, 0x3e, 0x9e, 0x8a, 0xc7, 0xa4, 0xbd, 0xca, 0xf7, 0xcd, 0x85, 0x3e, 0x18, 0x63, 0xdf, 0x82, 0x06, 0xf1,
+    0xd1, 0x6a, 0x6b, 0x05, 0x62, 0xbd, 0x55, 0xea, 0x43, 0x37, 0x46, 0x41, 0x07, 0x8f, 0xb8, 0x91, 0x0b, 0x8e, 0xed,
+    0xae, 0xad, 0xa7, 0xf4, 0x15, 0x80, 0xb9, 0x0e, 0x54, 0x32, 0x0c, 0x52, 0xe7, 0x89, 0xc2, 0x24, 0x3f, 0x4f, 0x48,
+    0x42, 0x44, 0x75, 0xb6, 0x1c, 0xa5, 0xdc, 0xb4, 0x80, 0xcb, 0x8c, 0x0c, 0x30, 0x9b, 0x34, 0xeb, 0x27, 0x97, 0x2f,
+    0x41, 0x2a, 0x0d, 0x11, 0xdc, 0xb0, 0xbd, 0x64, 0x74, 0xeb, 0xa8, 0x1b, 0x54, 0x49, 0xe6, 0xfa, 0xcd, 0xed, 0x2c,
+    0x52, 0xe6, 0xcd, 0x47, 0x18, 0x6b, 0xf2, 0x21, 0xac, 0x13, 0xfc, 0x36, 0x40, 0x25, 0x7d, 0x2a, 0xbc, 0x68, 0x04,
+    0x10, 0xea, 0x3b, 0x55, 0xc6, 0xa7, 0xc2, 0xcb, 0x46, 0x5b, 0x96, 0x51, 0x0a, 0xd5, 0x05, 0xb3, 0x5b, 0xd3, 0x85,
+    0xe8, 0x56, 0xd5, 0x40, 0x1b, 0xb8, 0x76, 0x1d, 0x28, 0xa0, 0xa1, 0xda, 0x95, 0x1b, 0x16, 0x80, 0xd5, 0x4c, 0x04,
+    0x86, 0xcb, 0xbf, 0xcf, 0x5f, 0xa9, 0x18, 0x9e, 0x7e, 0x3f, 0xf4, 0xf6, 0xdb, 0x20, 0x1a, 0x6d, 0x2f, 0xd9, 0x2e,
+    0x88, 0x46, 0xbb, 0xcb, 0x86, 0xd1, 0xef, 0xe7, 0xf4, 0xfb, 0x79, 0x03, 0x3a, 0x12, 0x61, 0xc2, 0xec, 0xf5, 0x1b,
+    0xb5, 0x7c, 0xa5, 0xd6, 0xef, 0xd4, 0xf2, 0xa5, 0x1a, 0xde, 0xda, 0x93, 0x44, 0x10, 0x59, 0xaa, 0x9a, 0x07, 0x49,
+    0x91, 0x6a, 0xe9, 0x72, 0x8c, 0x16, 0x23, 0x6a, 0x29, 0x6b, 0x8e, 0x75, 0x22, 0xed, 0x1c, 0x94, 0x0c, 0x70, 0xb4,
+    0xb8, 0xaa, 0x31, 0xdd, 0xac, 0x68, 0x09, 0xc4, 0x08, 0x2b, 0xdb, 0x72, 0x71, 0x93, 0xfa, 0xe8, 0x9c, 0x7c, 0xdb,
+    0x2a, 0xe5, 0xdb, 0x56, 0xf0, 0xfc, 0x2b, 0x0a, 0xe5, 0x92, 0x6b, 0xd7, 0xb2, 0x69, 0xa1, 0x14, 0xca, 0xb8, 0x06,
+    0x5b, 0xfb, 0x26, 0x30, 0x64, 0x3e, 0x52, 0xd4, 0xd8, 0x5e, 0x34, 0xca, 0x21, 0xc8, 0xd6, 0xc1, 0xa8, 0x53, 0x16,
+    0x2c, 0xbe, 0xdd, 0x21, 0x03, 0x19, 0xe8, 0xa8, 0x6a, 0xe3, 0xd5, 0xce, 0x4a, 0x7f, 0x58, 0x5e, 0x3c, 0x67, 0x89,
+    0x95, 0x4e, 0x7e, 0x53, 0xa1, 0x3f, 0x08, 0xd1, 0x37, 0x65, 0xc3, 0xc1, 0x8b, 0x2e, 0xb6, 0x32, 0x20, 0xde, 0x30,
+    0xbd, 0xb7, 0xb1, 0x92, 0xe5, 0xae, 0x29, 0x5f, 0xcc, 0x78, 0xc2, 0x71, 0xf4, 0xe5, 0x6a, 0x11, 0xd6, 0x6a, 0x91,
+    0x9d, 0x00, 0x0f, 0xad, 0xd5, 0x52, 0xc8, 0xd5, 0x22, 0x9c, 0x99, 0x2e, 0xd4, 0x4c, 0xcf, 0x40, 0xf3, 0x28, 0xd4,
+    0x2c, 0x4f, 0x00, 0x0b, 0x5e, 0x98, 0x19, 0x2e, 0xcc, 0x0c, 0xc7, 0x21, 0x35, 0x4e, 0x0f, 0x7a, 0xaf, 0x73, 0xcf,
+    0x2d, 0x77, 0xa3, 0xd3, 0x30, 0x6f, 0x47, 0x1b, 0xcc, 0xf1, 0x41, 0x38, 0x81, 0xf8, 0xc0, 0x12, 0x01, 0x7a, 0x34,
+    0xac, 0x8e, 0x1a, 0x2a, 0x47, 0xf1, 0x65, 0x01, 0x48, 0x96, 0x04, 0x20, 0xb9, 0x57, 0xe3, 0x5c, 0x5a, 0x7e, 0x5d,
+    0x25, 0x21, 0x47, 0x64, 0xbc, 0x94, 0x76, 0xf7, 0x84, 0x97, 0x23, 0x23, 0x34, 0x4f, 0x16, 0xa9, 0x97, 0xb3, 0x8c,
+    0x8d, 0x11, 0xb8, 0x28, 0xf4, 0x9b, 0xaa, 0xdf, 0x4f, 0x4b, 0x2f, 0xa7, 0x76, 0x7e, 0x02, 0x7f, 0xcb, 0x53, 0x67,
+    0x91, 0x23, 0xe4, 0xd5, 0xc8, 0x24, 0x2c, 0x2f, 0x95, 0x7a, 0xfa, 0x12, 0x66, 0x50, 0x77, 0x6f, 0x14, 0x80, 0x6b,
+    0x91, 0x4b, 0xa7, 0xda, 0x12, 0xae, 0x4c, 0xb9, 0xc1, 0x3e, 0x0f, 0x79, 0x4e, 0x42, 0xa8, 0x44, 0x1e, 0x29, 0xac,
+    0xfb, 0xf6, 0xc5, 0xf3, 0x89, 0xeb, 0xc3, 0x62, 0xa3, 0x11, 0x1c, 0x0e, 0x00, 0x73, 0x30, 0xf5, 0xa2, 0x01, 0x2f,
+    0xd5, 0x9c, 0xf9, 0xe8, 0xe5, 0x84, 0x8d, 0x01, 0x6a, 0x8a, 0x81, 0x53, 0xd6, 0x33, 0xf9, 0xc8, 0xf8, 0x96, 0xf9,
+    0x7e, 0x80, 0xef, 0xd6, 0x85, 0x84, 0x7c, 0x50, 0xa8, 0x04, 0x99, 0x42, 0x25, 0x48, 0x0c, 0x2a, 0x41, 0x6c, 0x50,
+    0x09, 0x36, 0x0d, 0x5f, 0x4b, 0xe5, 0x6d, 0x04, 0x1c, 0x11, 0x3e, 0xf4, 0x2c, 0x6c, 0xac, 0x50, 0x3c, 0x1b, 0xb3,
+    0x31, 0x2b, 0xd4, 0xce, 0x93, 0xcb, 0xa9, 0xd8, 0x59, 0x8c, 0x75, 0x13, 0x59, 0x26, 0x5e, 0x48, 0xd0, 0x71, 0xce,
+    0x85, 0x44, 0x5d, 0xfd, 0xdc, 0x7b, 0x49, 0xc6, 0x92, 0x79, 0x43, 0xa3, 0x06, 0xf3, 0xb2, 0xeb, 0x00, 0xa6, 0x25,
+    0xdf, 0x16, 0x34, 0x98, 0x4e, 0x95, 0x47, 0xa4, 0x49, 0x50, 0x3b, 0x97, 0x49, 0x91, 0x13, 0xc2, 0x24, 0xe8, 0x95,
+    0xe0, 0x37, 0x12, 0xda, 0xff, 0xab, 0x9e, 0xef, 0x80, 0xc1, 0x44, 0xab, 0xe4, 0x0b, 0x58, 0x2d, 0x73, 0xfe, 0x52,
+    0x7a, 0x62, 0x23, 0xfe, 0x62, 0x99, 0xc6, 0xa3, 0x2f, 0x6c, 0x88, 0x78, 0x56, 0x2f, 0xd1, 0xb4, 0x04, 0x75, 0x80,
+    0x47, 0xf4, 0xd7, 0xe8, 0x8b, 0xe1, 0x4d, 0xe9, 0x6a, 0xa4, 0xae, 0xd9, 0x39, 0xe7, 0x5f, 0x6a, 0x43, 0x84, 0x8c,
+    0x69, 0x53, 0x20, 0x19, 0x10, 0x48, 0x32, 0x10, 0x00, 0x98, 0x9a, 0xce, 0xec, 0x15, 0x40, 0x34, 0x10, 0xc0, 0xe3,
+    0xbc, 0xe3, 0xf1, 0x23, 0xfd, 0x55, 0x1c, 0xf7, 0x4e, 0xd3, 0xb0, 0xfd, 0x17, 0xa0, 0x29, 0x86, 0x72, 0x3c, 0xdf,
+    0x29, 0x48, 0xf6, 0x28, 0x65, 0xe9, 0xaa, 0x89, 0xec, 0x50, 0xac, 0x4f, 0x73, 0xca, 0x42, 0xda, 0x96, 0x63, 0xb4,
+    0xc5, 0xfa, 0x31, 0xf2, 0xde, 0xdc, 0xa8, 0xc8, 0x07, 0x3d, 0xb8, 0xbd, 0xbd, 0x7d, 0xdd, 0x63, 0x36, 0xc9, 0x8a,
+    0x45, 0xae, 0x22, 0x4e, 0x9c, 0xd6, 0x21, 0x07, 0x0c, 0xc8, 0x49, 0x08, 0x4c, 0x63, 0x5c, 0x2a, 0xd0, 0x41, 0xc9,
+    0x72, 0x5e, 0x03, 0xb5, 0x2c, 0x22, 0x6b, 0x80, 0xa8, 0xa6, 0xf9, 0x57, 0x0d, 0xf9, 0x49, 0xd5, 0x9c, 0x52, 0xa8,
+    0x7d, 0xc5, 0xc3, 0xea, 0xf4, 0x89, 0x55, 0x9b, 0x18, 0xeb, 0x5f, 0x6b, 0x4f, 0xd0, 0x56, 0xd2, 0x40, 0x7c, 0xe7,
+    0xeb, 0xf4, 0x8e, 0x42, 0x77, 0x9c, 0x99, 0x78, 0xaa, 0x02, 0x63, 0xdf, 0xda, 0x11, 0x14, 0x0e, 0x4d, 0xd7, 0x01,
+    0x87, 0x69, 0x74, 0xc2, 0xe2, 0x9f, 0xd2, 0x71, 0xf2, 0xa2, 0x56, 0x88, 0x24, 0xff, 0x10, 0x2e, 0x0c, 0x89, 0x05,
+    0x79, 0x49, 0xa8, 0x23, 0x32, 0x62, 0x35, 0x2a, 0xd6, 0x42, 0x45, 0xc5, 0x29, 0x1e, 0x6f, 0x15, 0x14, 0x97, 0xa2,
+    0x54, 0x29, 0x15, 0xb9, 0x51, 0x29, 0x20, 0x96, 0x0d, 0xbc, 0x5b, 0xc0, 0x01, 0x10, 0x74, 0x96, 0xbb, 0xb5, 0xed,
+    0x6e, 0x23, 0xf3, 0x99, 0x69, 0x9e, 0x56, 0x1f, 0xd4, 0xdf, 0xef, 0x97, 0x18, 0x5b, 0xe3, 0xe9, 0xef, 0xdb, 0xb4,
+    0xe0, 0xe6, 0x6f, 0x18, 0xa2, 0x3b, 0x40, 0xc4, 0x2c, 0xed, 0xa1, 0x90, 0x05, 0x13, 0x96, 0xa1, 0x2a, 0x4f, 0x39,
+    0xea, 0xe5, 0x93, 0x5b, 0x80, 0x50, 0x43, 0xbf, 0x36, 0x3a, 0xd5, 0x55, 0x09, 0xc2, 0xf7, 0x5d, 0xa1, 0x1e, 0x9b,
+    0x03, 0x9e, 0x0c, 0x80, 0xbf, 0x22, 0xaf, 0xf5, 0xd8, 0xfe, 0x41, 0x6f, 0xd4, 0x1b, 0x20, 0x88, 0xce, 0x79, 0xe1,
+    0x1f, 0x71, 0xae, 0x53, 0x7f, 0xc6, 0x85, 0x20, 0xbe, 0xf5, 0x24, 0xbc, 0x17, 0x67, 0x69, 0x1c, 0x9c, 0xf5, 0x06,
+    0xe6, 0x22, 0x50, 0x9c, 0xa5, 0xf9, 0x19, 0x88, 0xe5, 0x88, 0x89, 0x58, 0xb3, 0x3b, 0x80, 0x09, 0x2c, 0x75, 0x1c,
+    0xb2, 0xea, 0xd8, 0x7e, 0xff, 0xcd, 0xc8, 0x90, 0xa5, 0x23, 0x0c, 0x8c, 0xfe, 0x5d, 0x81, 0x00, 0x05, 0xcb, 0xcc,
+    0xf6, 0x60, 0xd2, 0xd5, 0x9e, 0xd5, 0xf3, 0x66, 0x93, 0x77, 0xf5, 0x8e, 0xd5, 0xb4, 0x9c, 0x9a, 0x56, 0x59, 0x4d,
+    0x9b, 0xe4, 0x50, 0x33, 0xd1, 0xef, 0x6b, 0x50, 0xd4, 0x7c, 0x0e, 0x60, 0x6c, 0x98, 0xfc, 0x66, 0x56, 0xcd, 0xfb,
+    0x7d, 0x4f, 0x3e, 0x82, 0x5f, 0xc8, 0x56, 0xe6, 0xd6, 0x58, 0x3e, 0x7d, 0x4d, 0x24, 0x66, 0x06, 0xe6, 0xe8, 0xee,
+    0x08, 0xdf, 0xeb, 0x46, 0x78, 0x1d, 0x73, 0x85, 0xcd, 0xc4, 0xf4, 0x0d, 0x0c, 0x9e, 0x27, 0x7c, 0x70, 0x91, 0xa3,
+    0xbf, 0x91, 0xc3, 0x4c, 0x61, 0x41, 0xce, 0xfd, 0xc9, 0x1b, 0xc4, 0x4b, 0x46, 0x78, 0x07, 0x9d, 0x4e, 0x78, 0x90,
+    0xfd, 0xfe, 0x0a, 0x3a, 0xb3, 0x95, 0x4a, 0xd9, 0xaa, 0xa8, 0x4c, 0xd7, 0x75, 0x51, 0x56, 0xd0, 0xb1, 0xf4, 0xf3,
+    0x56, 0xc8, 0xcc, 0xfa, 0x99, 0x05, 0xf7, 0xb4, 0x92, 0x00, 0x53, 0xb6, 0x6d, 0xa2, 0x36, 0xf0, 0xb2, 0x2e, 0x3e,
+    0x17, 0x78, 0x74, 0xd6, 0x5e, 0x6f, 0x84, 0xda, 0xe7, 0x7c, 0xb4, 0x2e, 0xd6, 0x1e, 0xf8, 0xc1, 0xcc, 0xd2, 0xb9,
+    0x22, 0xce, 0xc8, 0xfd, 0xd1, 0xe7, 0x22, 0xcd, 0x29, 0x0f, 0x70, 0x1f, 0x8a, 0xb9, 0xfd, 0x16, 0x48, 0x3f, 0xf4,
+    0x16, 0xc8, 0x3e, 0x3a, 0xe7, 0xe4, 0x0d, 0x20, 0xd2, 0x21, 0x0c, 0x6e, 0x45, 0x82, 0x8e, 0x55, 0xc3, 0x5b, 0x0b,
+    0xec, 0xb4, 0x97, 0xc6, 0xbd, 0x34, 0x3f, 0x4b, 0xfb, 0x7d, 0x83, 0x9a, 0x99, 0x22, 0x1c, 0x3c, 0xce, 0xc8, 0x45,
+    0xd2, 0x82, 0x2d, 0xa5, 0xfd, 0x57, 0x03, 0x47, 0x10, 0xf2, 0xf7, 0x3f, 0x84, 0xf7, 0x04, 0x20, 0x36, 0x69, 0x03,
+    0xae, 0x7a, 0x4c, 0x47, 0x63, 0x4b, 0xa2, 0x56, 0x9d, 0x0d, 0x90, 0x38, 0x55, 0x5a, 0x4f, 0xb9, 0x59, 0x53, 0x18,
+    0xa4, 0xca, 0x42, 0xfd, 0xc6, 0x7a, 0x32, 0x59, 0xe5, 0x22, 0x23, 0x8e, 0xca, 0xf4, 0xa5, 0x66, 0x04, 0xd3, 0xa5,
+    0x9f, 0x2f, 0x60, 0xc9, 0xc6, 0x1f, 0x71, 0xf2, 0x96, 0x80, 0x63, 0x3b, 0x6b, 0x57, 0xd5, 0x2e, 0xc7, 0xad, 0xdd,
+    0x1c, 0xe0, 0x7b, 0xbd, 0xd1, 0x68, 0xa4, 0x9d, 0xe3, 0x04, 0x0c, 0x55, 0x4f, 0x2d, 0x85, 0x1e, 0xab, 0x15, 0xa0,
+    0x6e, 0x47, 0x2e, 0xb3, 0x64, 0x30, 0x5f, 0x18, 0xc7, 0xaf, 0xcc, 0x47, 0x1f, 0x2f, 0x95, 0xb5, 0xeb, 0x88, 0xaf,
+    0xff, 0x20, 0xab, 0xf5, 0x2d, 0xef, 0xaa, 0x26, 0xe0, 0x8b, 0x2a, 0xa0, 0xf4, 0x1b, 0xde, 0x93, 0xbd, 0x8b, 0xaf,
+    0xdd, 0x60, 0x97, 0x7c, 0xcb, 0x5b, 0xd4, 0x79, 0xbe, 0x72, 0x70, 0xa3, 0x4a, 0xb7, 0xf7, 0x92, 0x05, 0xae, 0xbd,
+    0xa3, 0xa6, 0xb1, 0x9e, 0xf9, 0xd1, 0xc3, 0x22, 0x64, 0x3b, 0x1f, 0x7b, 0x5f, 0x35, 0x4f, 0xcf, 0x1a, 0x7a, 0x93,
+    0x1a, 0xfa, 0xd8, 0x8b, 0xb2, 0x7d, 0x6a, 0x1a, 0xd1, 0x6b, 0xd8, 0xd0, 0xc7, 0xde, 0x92, 0x93, 0x43, 0x22, 0xc0,
+    0xa9, 0x31, 0x7f, 0x7c, 0x38, 0x9d, 0xe1, 0xef, 0x18, 0x50, 0x09, 0xc4, 0x7c, 0x7a, 0x4c, 0x3b, 0x0a, 0x30, 0xa3,
+    0x4a, 0x6f, 0x9f, 0x1e, 0xd8, 0x8e, 0x97, 0xf5, 0xd0, 0xd2, 0xbb, 0x27, 0x47, 0xb7, 0xe3, 0x55, 0x35, 0xbe, 0x94,
+    0x43, 0x9e, 0xe7, 0xb3, 0xd1, 0x68, 0x24, 0x0c, 0x24, 0x77, 0xa5, 0x37, 0xb0, 0x02, 0x69, 0x5b, 0x54, 0x1f, 0xca,
+    0xa5, 0xb7, 0x53, 0x87, 0x76, 0xe5, 0x4f, 0xf2, 0xc3, 0xa1, 0x18, 0x99, 0x63, 0x1c, 0xc0, 0x4d, 0x0a, 0x25, 0x47,
+    0xc9, 0x5a, 0x82, 0xe8, 0x94, 0xc6, 0x53, 0x59, 0xaf, 0xad, 0x88, 0xbc, 0x1a, 0x71, 0x1e, 0x82, 0x1f, 0x3d, 0x50,
+    0x8b, 0xbf, 0xd0, 0x82, 0xd8, 0x63, 0x9f, 0x2a, 0xa5, 0x17, 0xbc, 0x2a, 0x20, 0x44, 0xec, 0xef, 0x06, 0xda, 0x41,
+    0x09, 0x0e, 0x25, 0xdc, 0x07, 0x84, 0x85, 0x7e, 0xed, 0xe5, 0x33, 0x19, 0xa3, 0xdc, 0x1b, 0x54, 0x73, 0x06, 0x30,
+    0x95, 0x3e, 0x03, 0xbf, 0x4b, 0x80, 0x3a, 0xc5, 0xa7, 0xe8, 0x54, 0x6f, 0x1e, 0x36, 0x5d, 0x9f, 0x96, 0x28, 0x8a,
+    0xe8, 0xce, 0xcf, 0xc7, 0x80, 0xd8, 0xd9, 0xb5, 0x19, 0x69, 0xd7, 0x7e, 0x83, 0x06, 0x2b, 0x25, 0x89, 0x76, 0x4e,
+    0x09, 0xbb, 0x9d, 0x8f, 0x6c, 0xe9, 0x47, 0x29, 0x10, 0x73, 0xc7, 0x89, 0x44, 0xf6, 0x60, 0x23, 0x27, 0x70, 0x8b,
+    0xf6, 0x8e, 0x0e, 0x40, 0xe5, 0x46, 0x41, 0x7e, 0x35, 0x47, 0x72, 0xc7, 0x77, 0xbd, 0xef, 0x06, 0xf5, 0xe0, 0xbb,
+    0xde, 0x59, 0x4a, 0x72, 0x47, 0x78, 0xa6, 0xa6, 0x84, 0x88, 0xcf, 0xbe, 0x1b, 0xe4, 0x03, 0x3c, 0x4b, 0xb4, 0x48,
+    0x8b, 0x84, 0x6a, 0x75, 0x8d, 0x9b, 0xf0, 0x22, 0x91, 0xdc, 0x43, 0xbb, 0xce, 0x23, 0x62, 0x01, 0xc8, 0x58, 0x7c,
+    0x36, 0x6f, 0x28, 0xd4, 0xdd, 0xc4, 0x6c, 0xd1, 0x5d, 0x16, 0xfb, 0xfd, 0x6d, 0x9e, 0xd6, 0x3d, 0x1d, 0x1f, 0x83,
+    0x2f, 0x48, 0x35, 0x01, 0x1e, 0xed, 0xaf, 0xcd, 0xf1, 0xea, 0xd5, 0xe6, 0x48, 0x59, 0xa8, 0x12, 0xf5, 0x5b, 0xac,
+    0x66, 0x3d, 0x84, 0xe1, 0xce, 0x32, 0x63, 0x6d, 0x2f, 0x78, 0x25, 0x67, 0x55, 0x6c, 0x97, 0xe3, 0x2b, 0x96, 0xda,
+    0x4a, 0xa2, 0x72, 0xb4, 0x1e, 0x6b, 0x53, 0x8c, 0xfc, 0x4a, 0x21, 0x51, 0x16, 0x1d, 0x5b, 0x0b, 0x05, 0xc4, 0x0b,
+    0xd0, 0x97, 0xec, 0x4c, 0x03, 0xac, 0x37, 0x7a, 0x15, 0x11, 0x5a, 0x3e, 0x52, 0xe1, 0x4d, 0x6e, 0xaa, 0xcc, 0xca,
+    0x66, 0xd1, 0xee, 0xa7, 0x8a, 0x57, 0x08, 0x56, 0x6f, 0xd4, 0x1e, 0x05, 0xa8, 0x3d, 0xb4, 0x50, 0x06, 0x90, 0xd2,
+    0x34, 0x03, 0x40, 0x06, 0x00, 0x99, 0x2a, 0xe2, 0x33, 0x01, 0x2a, 0x6d, 0x75, 0xa3, 0xc0, 0x89, 0xf4, 0x1a, 0x68,
+    0x16, 0x58, 0xe9, 0x23, 0x05, 0x19, 0x2c, 0xb6, 0x08, 0xc0, 0xca, 0x91, 0x33, 0x4c, 0x63, 0xc8, 0x36, 0x9a, 0xb8,
+    0x24, 0xcd, 0xef, 0xc3, 0x2c, 0x95, 0x78, 0x12, 0x3f, 0xc8, 0x1a, 0x23, 0x00, 0x90, 0xbe, 0x4f, 0x2f, 0x8a, 0x2c,
+    0x26, 0x1c, 0x38, 0xeb, 0xa9, 0x83, 0xa2, 0x26, 0xe7, 0x5a, 0xd3, 0xea, 0x59, 0x6d, 0xf2, 0x90, 0x05, 0x3a, 0x7b,
+    0x30, 0x26, 0xb5, 0x7c, 0xcf, 0x23, 0xfb, 0x2b, 0xc7, 0x33, 0xc2, 0x77, 0xdd, 0xc1, 0xa9, 0xff, 0x6e, 0x6a, 0x60,
+    0x62, 0x4a, 0x00, 0x36, 0x06, 0x47, 0x13, 0xe2, 0x77, 0x3a, 0x26, 0x53, 0x9b, 0x14, 0x81, 0xc0, 0x43, 0xf0, 0x0a,
+    0x9e, 0x1b, 0x2e, 0xb7, 0xdc, 0xd8, 0x59, 0xe4, 0x69, 0x02, 0x70, 0xe2, 0x05, 0xdf, 0x02, 0x1c, 0xa7, 0x5e, 0x15,
+    0xb2, 0x67, 0xcf, 0xc5, 0x74, 0x36, 0x0f, 0x1e, 0x12, 0xda, 0xbf, 0x98, 0xf0, 0x9b, 0xee, 0x2a, 0xb9, 0x32, 0xb5,
+    0xee, 0x4d, 0x74, 0x95, 0xcb, 0x9d, 0x3e, 0xad, 0x38, 0x86, 0x39, 0x83, 0x55, 0x40, 0xce, 0xd9, 0x90, 0xbf, 0x38,
+    0x07, 0xc0, 0x96, 0x95, 0xf0, 0x22, 0xfe, 0x22, 0x94, 0xd5, 0x02, 0xb8, 0x47, 0xce, 0x23, 0xf3, 0xcb, 0x57, 0xdb,
+    0xa1, 0x9c, 0x53, 0x14, 0xc6, 0x72, 0x6a, 0x5a, 0x52, 0x9c, 0x0e, 0x3d, 0x05, 0x93, 0xa9, 0x2d, 0x7f, 0x6f, 0x13,
+    0x97, 0xd9, 0x9b, 0x49, 0x38, 0x5f, 0x47, 0xb6, 0xad, 0x55, 0xf7, 0xd0, 0x0d, 0xc1, 0xa0, 0x8f, 0x11, 0xb4, 0x6c,
+    0xae, 0xef, 0xd6, 0x83, 0x81, 0xc2, 0xf6, 0xad, 0xe9, 0xa6, 0x45, 0xa7, 0x38, 0xe0, 0xcc, 0x5a, 0xd7, 0xa8, 0x54,
+    0x15, 0x87, 0x5e, 0xf2, 0x6e, 0x59, 0x95, 0x5d, 0x96, 0x5e, 0x08, 0x52, 0xa3, 0xae, 0x22, 0x44, 0x4a, 0xc5, 0x0e,
+    0xef, 0xc9, 0xaf, 0x81, 0x89, 0x67, 0x56, 0x8e, 0xd2, 0x78, 0x0e, 0x30, 0x41, 0x0a, 0x7d, 0x53, 0x7e, 0x05, 0xb8,
+    0xa1, 0x8b, 0x28, 0xcc, 0xde, 0xc6, 0x55, 0x50, 0x5b, 0x4d, 0xbf, 0x77, 0x70, 0x62, 0xcf, 0xeb, 0x7e, 0x3f, 0x25,
+    0x1a, 0x3f, 0x0c, 0xbd, 0xc0, 0xbf, 0xc7, 0xd3, 0x7d, 0x13, 0xa4, 0xe6, 0x95, 0x07, 0x78, 0x45, 0x97, 0x5b, 0x9b,
+    0x72, 0x45, 0xe3, 0x62, 0x5e, 0x23, 0x22, 0x7c, 0xea, 0x28, 0xb6, 0xdb, 0xfc, 0x38, 0xb5, 0x31, 0x18, 0x84, 0x70,
+    0xdf, 0xca, 0xf8, 0x7d, 0xe2, 0xe5, 0xb3, 0x68, 0x0e, 0x8a, 0xd2, 0x4c, 0x93, 0x84, 0x14, 0xd2, 0x4b, 0x80, 0x3e,
+    0x1a, 0x84, 0x5a, 0x5d, 0xf9, 0x47, 0xe2, 0xa5, 0x6a, 0x5a, 0x9b, 0xa7, 0x58, 0xa3, 0x40, 0xcc, 0xa2, 0x79, 0xc3,
+    0x32, 0x3a, 0x24, 0xd5, 0xe5, 0xd2, 0x34, 0xe3, 0x0f, 0xab, 0x19, 0xaa, 0x15, 0x47, 0x4d, 0x50, 0xa3, 0x74, 0x03,
+    0x17, 0xc0, 0xbf, 0xd3, 0x1d, 0x47, 0x35, 0x8a, 0x14, 0x0d, 0xf8, 0x04, 0x81, 0x61, 0xcd, 0xe6, 0x09, 0x6b, 0x4d,
+    0x5d, 0x33, 0xfa, 0x7d, 0x19, 0x27, 0x64, 0x92, 0x90, 0x9c, 0x0f, 0x97, 0xeb, 0x47, 0x52, 0x5d, 0x00, 0xa9, 0x72,
+    0xc5, 0x66, 0xbd, 0xde, 0x1c, 0x30, 0x7a, 0x61, 0xfd, 0xc2, 0xc6, 0x15, 0x9c, 0x5f, 0x12, 0xe6, 0xae, 0xfa, 0x11,
+    0x66, 0x19, 0x54, 0x01, 0x69, 0x7e, 0x2c, 0x78, 0xf3, 0xdc, 0x05, 0xa2, 0x7e, 0x33, 0x52, 0x17, 0x94, 0x59, 0x3a,
+    0xb7, 0x88, 0x40, 0xc0, 0x6b, 0x58, 0x3d, 0x81, 0x64, 0x5f, 0x3e, 0xf6, 0x69, 0x46, 0x81, 0xea, 0x08, 0x40, 0xd9,
+    0xac, 0x1f, 0xc2, 0xfe, 0x01, 0xe1, 0x84, 0xfa, 0x9b, 0x37, 0x72, 0xd6, 0x90, 0x3c, 0x90, 0x6a, 0xc2, 0x63, 0x38,
+    0x35, 0x16, 0xf8, 0xd2, 0xa2, 0x37, 0x15, 0xbc, 0x26, 0x38, 0xee, 0x05, 0x5a, 0xfb, 0x16, 0x70, 0x84, 0x08, 0x2e,
+    0x43, 0x13, 0xa7, 0xbd, 0x5d, 0x2f, 0x40, 0x42, 0x73, 0x0b, 0xe7, 0xfa, 0xda, 0x05, 0x2d, 0x4e, 0x91, 0x93, 0x45,
+    0x17, 0x18, 0xe8, 0x82, 0xcc, 0x1b, 0xff, 0xaa, 0x60, 0xe5, 0x02, 0x64, 0x2f, 0x15, 0x2b, 0x89, 0xd8, 0x76, 0xea,
+    0x8f, 0x52, 0xd9, 0x6f, 0xcf, 0xac, 0x09, 0xfc, 0x2a, 0xb1, 0x5f, 0x22, 0x93, 0x6f, 0x7a, 0x6c, 0xf2, 0x95, 0xb1,
+    0xd0, 0xa9, 0x65, 0x70, 0x4e, 0x8f, 0x0c, 0xce, 0xbd, 0x9d, 0x55, 0x9b, 0x10, 0x86, 0x82, 0x24, 0xd0, 0x74, 0xe9,
+    0x61, 0xdd, 0xf4, 0xe7, 0x27, 0x2d, 0x7e, 0xad, 0xda, 0xb7, 0xee, 0xc7, 0x21, 0x76, 0xf1, 0xab, 0xc4, 0x33, 0xec,
+    0xa3, 0x3e, 0x70, 0x80, 0xc9, 0x88, 0x89, 0xcb, 0x7e, 0x1f, 0x0a, 0x9b, 0x8d, 0xe7, 0xa3, 0xba, 0xf8, 0xb9, 0x78,
+    0x00, 0x28, 0x87, 0x0a, 0xec, 0x72, 0x28, 0x43, 0x19, 0xb1, 0xa9, 0x2d, 0xf7, 0xfc, 0xfe, 0x2a, 0xcc, 0x41, 0xde,
+    0xd1, 0x98, 0x38, 0x67, 0x20, 0x86, 0xc1, 0xd7, 0xbf, 0x7b, 0xb2, 0x4f, 0x9b, 0xef, 0xce, 0xe0, 0xbb, 0xa3, 0xb3,
+    0x0f, 0xc8, 0x71, 0x73, 0xb6, 0x2e, 0x8b, 0xfb, 0x34, 0x16, 0x67, 0xdf, 0x41, 0xea, 0x77, 0x67, 0x45, 0x79, 0xf6,
+    0x9d, 0xaa, 0xcc, 0x77, 0x67, 0xb4, 0xe0, 0x46, 0xbf, 0x5b, 0x13, 0xef, 0x9f, 0x95, 0xa6, 0x3d, 0x5b, 0x42, 0x38,
+    0x96, 0x56, 0x3f, 0x82, 0x12, 0x51, 0x91, 0xa2, 0xca, 0x50, 0x56, 0x6b, 0xc7, 0x79, 0x9f, 0x68, 0x78, 0x6c, 0x9a,
+    0x90, 0xb8, 0x5a, 0xc2, 0x3a, 0xd4, 0xb3, 0xd3, 0x26, 0xd9, 0x71, 0x1e, 0xa8, 0x03, 0x22, 0xe7, 0x2f, 0xf2, 0xd1,
+    0x96, 0xbe, 0x06, 0xdf, 0x3a, 0x1c, 0xf2, 0xd1, 0xce, 0xfc, 0xf4, 0xc9, 0x5a, 0x29, 0x83, 0x8d, 0x14, 0xa3, 0x10,
+    0x12, 0xc5, 0x6d, 0x7b, 0x0c, 0x80, 0xff, 0xfd, 0xc3, 0x81, 0x7e, 0xef, 0xe4, 0x6f, 0xb5, 0x5b, 0x5a, 0xf5, 0xfc,
+    0xd0, 0x22, 0xcc, 0x78, 0x5d, 0x1b, 0x76, 0xb6, 0xbd, 0x04, 0x94, 0xde, 0x37, 0x0d, 0x6a, 0x8a, 0xe8, 0x27, 0xac,
+    0x26, 0x56, 0x71, 0x58, 0x90, 0x12, 0x87, 0x18, 0x8e, 0xd1, 0x0e, 0x3d, 0x4e, 0x17, 0x35, 0x4f, 0xee, 0x3b, 0x64,
+    0xdc, 0xfa, 0x3e, 0x20, 0xb9, 0x14, 0xce, 0x3f, 0x78, 0xa1, 0xc1, 0x44, 0x2f, 0xf2, 0xaa, 0xc8, 0xc4, 0x48, 0xd0,
+    0x28, 0xbf, 0x25, 0x71, 0xe6, 0x0c, 0x6b, 0x71, 0xa6, 0x10, 0xc2, 0x42, 0x42, 0xe5, 0x2e, 0x4a, 0x4a, 0x0f, 0xce,
+    0x9e, 0xec, 0xcb, 0xe6, 0x77, 0xc2, 0x84, 0x18, 0x2d, 0x80, 0x06, 0x67, 0xd7, 0x2e, 0xef, 0x21, 0x2c, 0x73, 0xef,
+    0xf7, 0xb7, 0x77, 0x79, 0x01, 0x71, 0x99, 0x67, 0x52, 0xb1, 0x5a, 0x9e, 0x01, 0x4d, 0x9e, 0x88, 0xcf, 0xc2, 0x4a,
+    0x4e, 0x83, 0xaa, 0xa3, 0x58, 0xbd, 0x8d, 0xe7, 0x1e, 0xf0, 0x7a, 0xbf, 0x4f, 0x80, 0xc0, 0xdd, 0x67, 0x6f, 0x94,
+    0x5b, 0x2a, 0xe9, 0x91, 0xe7, 0x18, 0x22, 0x99, 0x00, 0xaf, 0x33, 0x04, 0x47, 0x0a, 0xab, 0xe7, 0x26, 0xc8, 0x3f,
+    0xbe, 0x3e, 0xa1, 0xf8, 0xa2, 0x79, 0x14, 0x35, 0x2c, 0x64, 0x09, 0x1c, 0x0f, 0xc9, 0x2c, 0x9b, 0x23, 0x35, 0x79,
+    0xda, 0x9e, 0x22, 0x1d, 0x9d, 0x58, 0xe2, 0xb7, 0x35, 0xa9, 0x5e, 0xa4, 0xc2, 0x2e, 0x69, 0x67, 0x2b, 0x73, 0x2f,
+    0x84, 0xa1, 0x4a, 0xb8, 0xf7, 0xba, 0x9e, 0x85, 0x72, 0x53, 0xb4, 0x2a, 0x66, 0x0f, 0x53, 0x62, 0x86, 0x29, 0xd6,
+    0x5f, 0xd8, 0xf0, 0x9b, 0xc4, 0x8b, 0xc1, 0x70, 0xbd, 0xe4, 0xe5, 0x6c, 0x63, 0x16, 0xc2, 0xe1, 0xb0, 0x99, 0x14,
+    0xb3, 0x25, 0xc4, 0xb6, 0x2e, 0xe7, 0x87, 0x43, 0x57, 0xcb, 0xd6, 0xc2, 0x83, 0x87, 0xaa, 0x85, 0x9b, 0x86, 0xe5,
+    0xf0, 0x33, 0x99, 0xc5, 0xd8, 0xbe, 0xc6, 0x67, 0xf6, 0xe7, 0x8b, 0xee, 0x59, 0x82, 0x8c, 0x1b, 0x6b, 0xe0, 0x1a,
+    0x9b, 0xb5, 0x3b, 0x5c, 0x8d, 0x80, 0xe4, 0x71, 0x37, 0xfa, 0xbb, 0xb2, 0x93, 0x9c, 0x04, 0x09, 0xa3, 0x15, 0xc2,
+    0xef, 0xbe, 0xf1, 0x27, 0x5a, 0xec, 0x41, 0xbb, 0x8d, 0x2d, 0x21, 0xaa, 0x69, 0xcf, 0xe5, 0x4a, 0xb1, 0x34, 0x6f,
+    0xa5, 0x0d, 0x99, 0x0f, 0xeb, 0x73, 0xdf, 0xc8, 0x81, 0x82, 0x31, 0xe2, 0xa9, 0x75, 0x10, 0xcd, 0xe6, 0xc0, 0x7d,
+    0x81, 0xe6, 0x11, 0x9e, 0x5a, 0x90, 0xa0, 0xcc, 0xda, 0xb0, 0x9f, 0x24, 0x27, 0xcb, 0xe3, 0xf0, 0x2d, 0xfc, 0xcb,
+    0x67, 0xd8, 0x24, 0xa6, 0x28, 0x1e, 0x7f, 0xab, 0x14, 0xff, 0x1d, 0x5b, 0x10, 0xc1, 0xda, 0x8d, 0xa8, 0x0d, 0x7f,
+    0xc3, 0xbf, 0x85, 0x7d, 0x84, 0xfd, 0x86, 0x26, 0x08, 0x03, 0x58, 0x7f, 0x26, 0x10, 0x17, 0x16, 0x82, 0x04, 0x7f,
+    0xab, 0x24, 0xff, 0x9c, 0xf0, 0xd9, 0xa2, 0x04, 0xb2, 0x3a, 0x8c, 0xe2, 0x13, 0x8a, 0x89, 0x42, 0x18, 0x6e, 0x09,
+    0xbd, 0xa3, 0xff, 0x46, 0x94, 0x64, 0x93, 0xdc, 0x8a, 0xf5, 0x40, 0x26, 0x49, 0x30, 0xc1, 0xca, 0x0b, 0xe5, 0x4b,
+    0xf7, 0x42, 0xa9, 0xb5, 0x16, 0xb4, 0x7e, 0xf9, 0x93, 0xc4, 0x33, 0xa0, 0x7b, 0x20, 0x63, 0xd0, 0x6d, 0x44, 0x35,
+    0xc9, 0x31, 0x7d, 0x94, 0xce, 0x33, 0x50, 0x01, 0x9d, 0xad, 0xb3, 0xb0, 0x5e, 0x16, 0xe5, 0xaa, 0x15, 0x1e, 0x2a,
+    0x4b, 0x1f, 0xa9, 0xc7, 0x98, 0x17, 0xe6, 0xc9, 0x89, 0x7c, 0xf0, 0x08, 0xd0, 0xf0, 0x28, 0x4f, 0xab, 0x8e, 0xd2,
+    0xfa, 0x81, 0x65, 0xc0, 0x08, 0x9c, 0x28, 0x03, 0x1e, 0x61, 0x19, 0x98, 0xa7, 0x5d, 0x86, 0x1a, 0xc4, 0x1a, 0x55,
+    0x57, 0x6a, 0x83, 0x39, 0x51, 0x94, 0x7c, 0x8a, 0xa5, 0x15, 0xc6, 0xd0, 0xd4, 0x95, 0x47, 0xd6, 0x4b, 0x4e, 0xd8,
+    0x93, 0xdd, 0x40, 0xba, 0x85, 0x8d, 0x02, 0x17, 0x74, 0x2d, 0x4b, 0x94, 0x8b, 0x6e, 0x19, 0x51, 0x26, 0x42, 0xea,
+    0x67, 0x0f, 0x67, 0x5a, 0xed, 0x37, 0x76, 0xd2, 0xbe, 0x3d, 0x52, 0xf4, 0x82, 0x81, 0xf8, 0xb4, 0x47, 0x4a, 0x3d,
+    0x6b, 0xe4, 0x32, 0xb0, 0xa5, 0x4b, 0x55, 0xcf, 0x7f, 0x83, 0xf2, 0x1d, 0xcc, 0x8c, 0xb3, 0xd9, 0xef, 0x7a, 0x73,
+    0x7b, 0xb2, 0xaf, 0x9b, 0xdf, 0x59, 0xaf, 0x07, 0x5b, 0x83, 0x4c, 0x7c, 0xa9, 0xa8, 0xa7, 0xac, 0x42, 0xac, 0xc8,
+    0xec, 0x7f, 0x0b, 0xef, 0x77, 0x78, 0x6b, 0x84, 0x66, 0x65, 0x3c, 0xcc, 0x47, 0x4f, 0xf6, 0xa2, 0xf9, 0xbd, 0xb3,
+    0x6c, 0x2b, 0x57, 0x25, 0xb3, 0xfd, 0x7e, 0x94, 0x34, 0x67, 0x8f, 0xd7, 0x48, 0xea, 0x00, 0x1f, 0xaf, 0xcf, 0xf0,
+    0x91, 0x4a, 0x28, 0xb5, 0xa0, 0xaa, 0x41, 0xeb, 0x63, 0xbf, 0xb7, 0x9e, 0xd3, 0xc7, 0x8f, 0xe5, 0x74, 0x4b, 0x8a,
+    0x30, 0x7e, 0x60, 0x30, 0x65, 0x27, 0x4e, 0x5d, 0xf2, 0x66, 0x48, 0xef, 0xba, 0x55, 0x52, 0x97, 0x3d, 0x4a, 0x04,
+    0xa1, 0x0e, 0xd6, 0x2f, 0xf6, 0x43, 0x98, 0xd9, 0xa2, 0x3f, 0x6c, 0x56, 0x73, 0x42, 0x41, 0x04, 0x88, 0x56, 0x79,
+    0x1f, 0x38, 0x26, 0x09, 0xb3, 0xe6, 0x86, 0x74, 0xeb, 0xcd, 0x95, 0xf6, 0x4a, 0x0a, 0xe8, 0xe7, 0x20, 0x73, 0xfb,
+    0xe8, 0x96, 0xab, 0x96, 0x79, 0x2e, 0x6d, 0x39, 0x60, 0xd1, 0x42, 0x74, 0x66, 0xe7, 0xd2, 0xe1, 0xe0, 0x3f, 0xa8,
+    0x2b, 0x51, 0x45, 0x04, 0x1d, 0x45, 0x0b, 0x46, 0xab, 0x55, 0xbb, 0x9c, 0x6c, 0x2a, 0x64, 0x4b, 0x22, 0x9c, 0x28,
+    0xd9, 0x2b, 0xa1, 0x3e, 0xca, 0xd5, 0x9e, 0x69, 0x88, 0x3f, 0x13, 0xb0, 0x69, 0x83, 0xbf, 0x05, 0xee, 0x65, 0x70,
+    0x66, 0xda, 0xa7, 0x61, 0x04, 0x44, 0xe6, 0x10, 0xec, 0xe7, 0x77, 0x3d, 0xa8, 0xe0, 0x41, 0x47, 0xfa, 0xeb, 0x7a,
+    0x56, 0xe0, 0x99, 0x7b, 0xe2, 0xf9, 0x9b, 0x13, 0xe9, 0x45, 0x0e, 0x0f, 0x34, 0xf7, 0x61, 0xc6, 0x5f, 0x96, 0x65,
+    0xb8, 0x1b, 0x2d, 0xcb, 0x62, 0xe5, 0x45, 0x7a, 0x1f, 0xcf, 0xa4, 0x18, 0x48, 0x74, 0x98, 0x19, 0x5d, 0xc5, 0x3a,
+    0xce, 0x61, 0xdc, 0xdb, 0x93, 0xb0, 0x42, 0xfb, 0x67, 0x89, 0xbd, 0x2e, 0x00, 0xc0, 0x21, 0x6b, 0xd0, 0x0a, 0xef,
+    0x74, 0x7b, 0xbb, 0xc7, 0x25, 0x25, 0x8a, 0x1b, 0x35, 0x3f, 0xab, 0xa1, 0x65, 0x82, 0x5a, 0x66, 0xdd, 0xc9, 0x64,
+    0x8a, 0x24, 0xf0, 0x6d, 0xd8, 0x1b, 0x56, 0xe4, 0xf3, 0x46, 0x6e, 0x0f, 0xef, 0xc2, 0x95, 0x88, 0xb5, 0x05, 0x9d,
+    0x74, 0x64, 0x1c, 0xee, 0x85, 0xe6, 0x46, 0xba, 0x7f, 0x52, 0x25, 0x61, 0x29, 0x62, 0xb8, 0x05, 0xb2, 0xbd, 0xda,
+    0x56, 0x82, 0x12, 0x48, 0x60, 0x3f, 0x94, 0x62, 0x99, 0x6e, 0x05, 0x80, 0x39, 0xf0, 0x3f, 0x25, 0x0c, 0xa1, 0xbb,
+    0xf3, 0x10, 0xaf, 0x1a, 0x79, 0xdf, 0x20, 0x04, 0xfb, 0x6b, 0x90, 0xd3, 0x80, 0x41, 0xa4, 0x18, 0xc9, 0x82, 0x81,
+    0x04, 0x20, 0xe7, 0x6b, 0x30, 0xc9, 0x4d, 0x73, 0xcf, 0x0f, 0x72, 0xdd, 0xc1, 0xb4, 0x0f, 0xba, 0x17, 0xd7, 0x9a,
+    0xe5, 0xe0, 0x15, 0x13, 0xf1, 0xbf, 0xd7, 0x5e, 0xc9, 0x72, 0x96, 0xf9, 0x8d, 0xb9, 0xe8, 0x64, 0x70, 0xd5, 0x10,
+    0x7e, 0x31, 0xcb, 0xe6, 0x3c, 0x9a, 0x65, 0x3a, 0xd4, 0xbf, 0x68, 0x8e, 0x4a, 0x01, 0x0c, 0x75, 0xbc, 0x00, 0x6b,
+    0xbc, 0x2b, 0xdd, 0xb4, 0xe2, 0x91, 0xc6, 0x18, 0x05, 0x15, 0x3a, 0x08, 0xfd, 0xbd, 0x06, 0x78, 0x0d, 0x26, 0xb9,
+    0x11, 0x2a, 0x1f, 0x5c, 0xd0, 0x0d, 0xdd, 0x72, 0xe5, 0x12, 0xd4, 0xa4, 0x6a, 0xf9, 0xe5, 0x08, 0xf5, 0xae, 0x96,
+    0x5c, 0xaa, 0xcd, 0xa7, 0x46, 0x59, 0x23, 0xc8, 0xe4, 0x28, 0xfd, 0x3e, 0xe5, 0xc2, 0xad, 0x8c, 0xc9, 0xfa, 0x70,
+    0xf0, 0x0a, 0x6e, 0x6a, 0xfc, 0x3a, 0x27, 0x16, 0x51, 0x7b, 0x48, 0x84, 0xad, 0xdd, 0x0a, 0xdd, 0x7b, 0xdc, 0x28,
+    0xcd, 0xa3, 0x6c, 0x13, 0x8b, 0xca, 0xeb, 0x25, 0x60, 0x2d, 0xee, 0x01, 0x19, 0x2a, 0x2d, 0xfd, 0x8a, 0x15, 0x00,
+    0x19, 0x20, 0x85, 0x8d, 0x1f, 0x90, 0xf6, 0xea, 0x83, 0x97, 0xfa, 0xfd, 0xbe, 0x31, 0xe5, 0xbf, 0x7f, 0xc8, 0x81,
+    0x99, 0x50, 0x94, 0xf5, 0x0e, 0x26, 0x10, 0x5c, 0x3b, 0x49, 0x7b, 0x56, 0xf3, 0x17, 0xeb, 0xda, 0x03, 0x52, 0x2b,
+    0xdf, 0x62, 0xae, 0x7a, 0x6d, 0x5f, 0x6c, 0xf6, 0x69, 0x75, 0x63, 0x34, 0x0e, 0x82, 0xa5, 0xd5, 0x5b, 0xad, 0x72,
+    0xc8, 0x1b, 0x5e, 0x81, 0x48, 0x65, 0x5d, 0x5d, 0x2b, 0xe7, 0xea, 0x5a, 0x70, 0x24, 0x90, 0x2d, 0x79, 0x0e, 0xff,
+    0x85, 0xdc, 0x2b, 0x0f, 0x87, 0xc2, 0xef, 0xf7, 0xd3, 0x19, 0x69, 0x65, 0x81, 0x32, 0x6d, 0x5d, 0x7b, 0xa1, 0x7f,
+    0x38, 0xfc, 0x00, 0x5e, 0x23, 0xfe, 0xe1, 0x50, 0xf6, 0xfb, 0x1f, 0xcd, 0x4d, 0xe6, 0x7c, 0xac, 0x94, 0xb2, 0x97,
+    0xa8, 0x74, 0x7f, 0x9b, 0xf0, 0xde, 0xff, 0x1e, 0xfd, 0xef, 0xd1, 0x65, 0x4f, 0x05, 0x80, 0x25, 0x7c, 0x86, 0x37,
+    0x74, 0xa6, 0x2e, 0xe7, 0x4c, 0xba, 0xbb, 0x2b, 0x3f, 0xf4, 0x9e, 0xc6, 0x87, 0xef, 0xcd, 0x4d, 0x1b, 0x7f, 0xad,
+    0x8e, 0x34, 0x09, 0x1d, 0x17, 0xfd, 0xc3, 0xe1, 0x53, 0xa2, 0xf5, 0x69, 0xa9, 0xd2, 0xa7, 0x29, 0xf0, 0x24, 0xc3,
+    0x86, 0xeb, 0x16, 0xa6, 0xa3, 0xf9, 0x71, 0xf3, 0x55, 0xf2, 0xe2, 0x2c, 0x85, 0x6b, 0x6f, 0x3e, 0x4b, 0xe7, 0x53,
+    0xb0, 0xae, 0x0c, 0xf3, 0x59, 0x3d, 0x0f, 0x20, 0x75, 0x08, 0x69, 0xd6, 0x34, 0xfc, 0x5b, 0xe5, 0x0a, 0xde, 0xda,
+    0xe3, 0xdd, 0x60, 0x44, 0xa9, 0x23, 0x7d, 0xd2, 0x86, 0xd0, 0x25, 0x95, 0xfc, 0x47, 0x91, 0xc7, 0x18, 0xb3, 0xf1,
+    0x9a, 0xc8, 0x3e, 0x8b, 0xfc, 0x55, 0x01, 0x80, 0x45, 0x80, 0x80, 0x9c, 0xce, 0x1d, 0x49, 0xfc, 0xe7, 0xe4, 0xdb,
+    0x3f, 0xa6, 0x4b, 0xfb, 0x50, 0x16, 0x77, 0xa5, 0xa8, 0xaa, 0xa3, 0xd2, 0x76, 0xb6, 0x5c, 0x0f, 0xf4, 0xa1, 0xfd,
+    0xbe, 0xa4, 0x0f, 0x4d, 0x31, 0x14, 0x05, 0x6e, 0x8d, 0xbd, 0x69, 0xca, 0x15, 0x4d, 0xf5, 0xc8, 0x58, 0x3f, 0xbf,
+    0xdf, 0xbd, 0x8d, 0xbd, 0xd4, 0x0f, 0x52, 0x10, 0x84, 0x35, 0x7e, 0x52, 0x8a, 0x24, 0x70, 0x3e, 0xc3, 0x54, 0xe2,
+    0xd3, 0xa5, 0x54, 0xf9, 0xc3, 0x48, 0xf3, 0x61, 0x0a, 0x7a, 0xd9, 0x7f, 0x54, 0x30, 0xff, 0x75, 0x7b, 0xb0, 0x3e,
+    0xad, 0xcb, 0x34, 0xaa, 0x88, 0x2a, 0x2f, 0x4c, 0xb5, 0x09, 0x44, 0xf0, 0x17, 0xc2, 0x22, 0xf9, 0xf5, 0xc9, 0x91,
+    0xa0, 0x31, 0x93, 0xe5, 0xe3, 0x91, 0xfb, 0x85, 0x7d, 0xe5, 0x3a, 0x9e, 0xff, 0xb9, 0x99, 0xff, 0x03, 0x74, 0x86,
+    0x2c, 0x5e, 0x70, 0xcb, 0x60, 0x81, 0xb3, 0x5f, 0xba, 0x7a, 0xc0, 0xdf, 0xcc, 0x13, 0x2f, 0x80, 0x83, 0xf9, 0x05,
+    0xba, 0x2a, 0xa6, 0xb3, 0x62, 0x00, 0x04, 0xb6, 0x7e, 0x63, 0xcd, 0x89, 0x37, 0x16, 0xcf, 0x95, 0x5c, 0x10, 0xfa,
+    0xba, 0x0a, 0xb3, 0x71, 0x55, 0x6c, 0x2a, 0x51, 0x6c, 0xea, 0x1e, 0xa9, 0x65, 0xf3, 0x69, 0x6d, 0x2b, 0x64, 0x7f,
+    0x12, 0x2d, 0xda, 0x2e, 0x43, 0x35, 0x19, 0x65, 0xe9, 0x7a, 0x0a, 0xa4, 0x7a, 0x01, 0x9c, 0x45, 0xe6, 0x95, 0x2f,
+    0xce, 0x1e, 0xb0, 0x45, 0xe3, 0x29, 0x30, 0xa2, 0xd2, 0x1f, 0x79, 0x63, 0x74, 0x7a, 0xa2, 0xdf, 0xcf, 0xa7, 0x14,
+    0xf2, 0xf5, 0x13, 0x60, 0x72, 0xd5, 0x72, 0x01, 0xfa, 0x32, 0xd4, 0x41, 0x25, 0x4a, 0xad, 0x18, 0x46, 0x2c, 0xfc,
+    0x24, 0x90, 0xbd, 0x99, 0x82, 0x9a, 0x55, 0x94, 0x84, 0x4a, 0x54, 0x4a, 0xb6, 0x26, 0xa8, 0xa5, 0xf7, 0x45, 0x51,
+    0xef, 0x2b, 0x70, 0x94, 0x8c, 0xb4, 0x59, 0x4e, 0x99, 0x71, 0x51, 0xe6, 0xa2, 0x1f, 0xec, 0xdf, 0x95, 0xe7, 0x37,
+    0x32, 0x9f, 0xe5, 0xbe, 0xa3, 0x73, 0xda, 0x8e, 0x0b, 0x94, 0xb9, 0xe5, 0xb4, 0xd5, 0x92, 0xc7, 0xe4, 0x3d, 0x0b,
+    0xb6, 0xfd, 0x97, 0x09, 0xf2, 0x2a, 0xc2, 0x7c, 0x42, 0x95, 0xcd, 0x3f, 0x20, 0xcc, 0x16, 0x07, 0xf6, 0xd8, 0x85,
+    0x89, 0x48, 0x6f, 0xc1, 0x92, 0x18, 0x66, 0xa5, 0x08, 0xe3, 0x1d, 0x78, 0xff, 0x6c, 0x2a, 0x31, 0x3a, 0x43, 0x27,
+    0xf7, 0xb3, 0x87, 0xb4, 0x4e, 0xce, 0xde, 0xbe, 0x3e, 0xfb, 0xae, 0x37, 0x28, 0x46, 0x69, 0x3c, 0xe8, 0x7d, 0x77,
+    0xb6, 0xda, 0x00, 0x44, 0xa6, 0x38, 0x8b, 0xc9, 0x94, 0x26, 0xe2, 0x33, 0x32, 0x0c, 0x9e, 0xd5, 0x89, 0x38, 0xa3,
+    0x89, 0xe9, 0xbe, 0x46, 0x69, 0xf2, 0xed, 0x28, 0xcc, 0xe1, 0xe5, 0x52, 0x6c, 0x2a, 0x11, 0x83, 0x9d, 0x52, 0xcd,
+    0xb3, 0xbc, 0x7d, 0x16, 0xe7, 0xa3, 0x0e, 0x59, 0xa5, 0x03, 0x74, 0x7b, 0x22, 0xed, 0xaa, 0x74, 0x05, 0x84, 0x1e,
+    0x00, 0x27, 0x5d, 0xf9, 0xf3, 0x70, 0x10, 0x09, 0x84, 0x5a, 0x30, 0x27, 0xd3, 0x88, 0x6e, 0x48, 0xaf, 0xb0, 0xcf,
+    0xc0, 0x2c, 0xa4, 0x34, 0x0f, 0x6e, 0xae, 0x16, 0x2d, 0x77, 0xc5, 0xca, 0x51, 0x58, 0xad, 0x45, 0x54, 0x23, 0xd5,
+    0x31, 0x38, 0xef, 0x40, 0x04, 0x80, 0x62, 0x04, 0xcf, 0x78, 0xd4, 0xef, 0x47, 0x2a, 0x28, 0x27, 0xa1, 0x5f, 0x14,
+    0xfa, 0xa5, 0x31, 0x28, 0x63, 0xfe, 0x2e, 0xd4, 0xc4, 0x00, 0xf5, 0x96, 0x87, 0x8a, 0x23, 0x00, 0x97, 0x73, 0xc4,
+    0x8c, 0xf3, 0x1e, 0x77, 0xd1, 0x38, 0x15, 0xef, 0x84, 0xba, 0x0e, 0x96, 0x0a, 0x75, 0xde, 0xd4, 0x47, 0x7a, 0x4e,
+    0x9a, 0x04, 0x0d, 0xe2, 0x06, 0x1e, 0xaf, 0x86, 0x80, 0x6a, 0x25, 0xa4, 0xde, 0x42, 0xa7, 0x54, 0x75, 0x08, 0xac,
+    0x01, 0x2e, 0x51, 0xd8, 0x56, 0x98, 0x1c, 0xd1, 0xa6, 0x2c, 0x45, 0x7e, 0xc4, 0x06, 0xed, 0x92, 0x91, 0xa9, 0x83,
+    0xcb, 0xe5, 0x72, 0x22, 0xea, 0x5f, 0xf3, 0x2d, 0x80, 0xf3, 0x42, 0x7e, 0x6b, 0x37, 0x5b, 0x26, 0xd9, 0xae, 0x2b,
+    0xc3, 0x59, 0x52, 0x8a, 0x6a, 0x5d, 0xe4, 0x55, 0x7a, 0x2f, 0x7e, 0xd6, 0x0f, 0x5d, 0x02, 0x29, 0xf4, 0x23, 0xbd,
+    0x6e, 0x37, 0x47, 0xaa, 0x71, 0x74, 0x39, 0xb6, 0xa7, 0xd2, 0x4e, 0xf6, 0xaa, 0xc5, 0x9b, 0x2d, 0x73, 0x25, 0x69,
+    0x1c, 0x8b, 0xfc, 0x6d, 0x1e, 0xa7, 0x91, 0x95, 0x1c, 0xfe, 0x1f, 0xde, 0xbe, 0x85, 0xbb, 0x6d, 0x1b, 0x5b, 0xf7,
+    0xaf, 0x58, 0xbc, 0xa9, 0x4a, 0x44, 0x90, 0x2c, 0x39, 0x49, 0x67, 0x4a, 0x19, 0xd6, 0x71, 0xf3, 0x68, 0xd3, 0x36,
+    0x71, 0x1a, 0xa7, 0x9d, 0xce, 0xe8, 0xea, 0xb8, 0x34, 0x09, 0x5b, 0x6c, 0x68, 0x40, 0x25, 0x29, 0x3f, 0x22, 0xf1,
+    0xbf, 0xdf, 0xb5, 0x37, 0x9e, 0xa4, 0x68, 0x27, 0x33, 0xf7, 0xdc, 0xbb, 0xb2, 0x56, 0x2c, 0x82, 0x20, 0xde, 0xd8,
+    0xd8, 0xd8, 0x8f, 0x6f, 0xeb, 0x00, 0xd5, 0x2e, 0xf2, 0x95, 0x8b, 0x8d, 0xfc, 0x22, 0x2b, 0x31, 0x60, 0x70, 0xa3,
+    0x51, 0xad, 0x50, 0x53, 0x26, 0xf0, 0x85, 0x7c, 0x8f, 0x11, 0xb7, 0x59, 0x99, 0x00, 0xc3, 0x8f, 0x89, 0xfa, 0x92,
+    0x9e, 0x42, 0x94, 0x07, 0x15, 0x8f, 0xfb, 0x05, 0x47, 0xc4, 0x6b, 0xab, 0x32, 0x07, 0x26, 0x5b, 0xab, 0x20, 0x11,
+    0xec, 0x2e, 0x9b, 0xeb, 0x45, 0xb4, 0x50, 0x77, 0xa1, 0x5e, 0xbc, 0xdd, 0xf6, 0x12, 0x45, 0x07, 0x9c, 0xfc, 0x34,
+    0x78, 0x15, 0x67, 0x39, 0x4f, 0xf7, 0x2a, 0xb9, 0xa7, 0x36, 0xd4, 0x9e, 0x72, 0xe6, 0x80, 0x9d, 0xf7, 0x75, 0xb5,
+    0xa7, 0xd7, 0xf4, 0x9e, 0x6e, 0xe7, 0x1e, 0x5c, 0x30, 0x70, 0xe7, 0x5e, 0x66, 0xd7, 0x5c, 0xec, 0x81, 0x32, 0xd0,
+    0x1a, 0x0f, 0xd4, 0xa2, 0x1a, 0xa9, 0x89, 0xd1, 0x81, 0xab, 0x13, 0x7d, 0x30, 0x07, 0xf4, 0x7b, 0x88, 0x15, 0xde,
+    0x7a, 0xbb, 0xd2, 0x07, 0x6d, 0x40, 0x7f, 0x5e, 0x9a, 0x3e, 0xe8, 0x68, 0xf1, 0x2a, 0x24, 0x70, 0x63, 0x48, 0x35,
+    0x52, 0xab, 0x91, 0x55, 0xa0, 0x78, 0xc3, 0x5b, 0xbc, 0x3b, 0xd7, 0x92, 0x8d, 0xf7, 0x12, 0x81, 0xbd, 0x32, 0x51,
+    0xc5, 0x99, 0x38, 0xf6, 0x52, 0x79, 0xad, 0x9d, 0x64, 0x84, 0xf1, 0x2d, 0x2b, 0xa9, 0xbf, 0x43, 0xcc, 0x2d, 0xd2,
+    0x1c, 0x06, 0x2f, 0xc3, 0x8a, 0xcc, 0x78, 0xbf, 0x2f, 0x67, 0x32, 0x2a, 0x67, 0x62, 0xbf, 0x8c, 0x14, 0x42, 0xdb,
+    0x7d, 0x22, 0xa0, 0x07, 0x25, 0x40, 0xbe, 0x00, 0xa8, 0x7a, 0x48, 0xf8, 0xf3, 0x90, 0xd4, 0xa7, 0x53, 0xe8, 0x53,
+    0x68, 0xeb, 0x15, 0xaf, 0xa0, 0xaa, 0x6e, 0x8c, 0x6c, 0xa3, 0x82, 0x16, 0x8f, 0xe5, 0x59, 0x6d, 0x18, 0x9b, 0x53,
+    0xeb, 0x5d, 0x6f, 0x36, 0x98, 0xb2, 0xb9, 0x50, 0xab, 0x30, 0x24, 0xd1, 0x4d, 0xe9, 0x85, 0x0f, 0xb1, 0x58, 0x59,
+    0xad, 0xcd, 0x6f, 0x62, 0x7f, 0x64, 0x22, 0xc5, 0xfd, 0x6c, 0x89, 0x73, 0x17, 0x8f, 0xe7, 0x55, 0x5f, 0x6b, 0x69,
+    0x91, 0x69, 0xf3, 0x9d, 0xbe, 0x0c, 0x69, 0x2a, 0x6a, 0x48, 0xa3, 0xce, 0x0c, 0xba, 0x6f, 0x97, 0x57, 0x54, 0x23,
+    0x4c, 0x80, 0x57, 0x3a, 0x83, 0x6e, 0x34, 0x1e, 0x88, 0xa2, 0x1a, 0x15, 0x6b, 0x21, 0x10, 0x6d, 0x18, 0x72, 0xcc,
+    0x2c, 0x21, 0xc9, 0x3e, 0xf1, 0xef, 0x54, 0x70, 0x85, 0x22, 0xbe, 0x31, 0x70, 0xde, 0x95, 0xf5, 0xec, 0xae, 0x23,
+    0x3f, 0x27, 0x16, 0x56, 0xfb, 0x0f, 0xcd, 0xa3, 0xd6, 0x38, 0x0b, 0x68, 0x6b, 0x5a, 0xdd, 0x70, 0xb8, 0x47, 0x75,
+    0x2c, 0x4a, 0x03, 0x48, 0xec, 0x91, 0xe5, 0xa2, 0x75, 0xcc, 0xa0, 0x01, 0xfd, 0x6d, 0x76, 0xb5, 0xbe, 0x42, 0xd4,
+    0xb6, 0x12, 0x59, 0x27, 0xa9, 0xfc, 0x4b, 0xda, 0xa3, 0xae, 0xed, 0xa9, 0xfc, 0x6f, 0xdb, 0x54, 0x39, 0xb4, 0x40,
+    0xf2, 0xd8, 0xcd, 0x59, 0xa0, 0x3a, 0x12, 0x44, 0x81, 0xda, 0x7a, 0xc1, 0xd4, 0x3b, 0x65, 0x8a, 0x0e, 0xe4, 0xe7,
+    0xc2, 0x9c, 0x61, 0x5f, 0x70, 0xc4, 0x98, 0xa5, 0x12, 0x83, 0xa9, 0x8f, 0x31, 0xaa, 0x69, 0xad, 0x00, 0x5d, 0x3f,
+    0xdd, 0xc0, 0x9f, 0xa8, 0xa8, 0xd1, 0x50, 0x6b, 0x24, 0x85, 0xa2, 0x89, 0x0a, 0x3a, 0x96, 0x16, 0x3a, 0x98, 0x42,
+    0x27, 0x91, 0xb0, 0x04, 0x34, 0x4c, 0x88, 0x4e, 0x2a, 0xf0, 0xd6, 0x00, 0xce, 0x7c, 0x5c, 0x94, 0xeb, 0x42, 0x1b,
+    0xcc, 0xfd, 0x10, 0x5f, 0xf3, 0xd7, 0x2f, 0x9c, 0x51, 0x7d, 0xcb, 0x5a, 0xdf, 0xd3, 0x82, 0xfc, 0x10, 0x72, 0x8a,
+    0x0e, 0x4c, 0xec, 0x68, 0x83, 0xc6, 0x18, 0x65, 0xad, 0x43, 0x5d, 0x9c, 0xe8, 0xf8, 0x2b, 0xda, 0x04, 0xef, 0x01,
+    0x4f, 0x11, 0x6d, 0x78, 0x28, 0x8c, 0x55, 0x35, 0x3e, 0x95, 0xac, 0xa5, 0x07, 0x2b, 0x78, 0xba, 0x4e, 0x78, 0x08,
+    0x7a, 0x24, 0xc2, 0x8e, 0xc2, 0x62, 0x1e, 0x2f, 0xe0, 0x38, 0x29, 0x08, 0xa8, 0x1d, 0xf4, 0x15, 0x7c, 0xbe, 0x40,
+    0xf7, 0x57, 0x89, 0x1e, 0x60, 0x68, 0x41, 0xdc, 0x0c, 0x7d, 0x3a, 0xba, 0x8a, 0x57, 0x0d, 0x15, 0x09, 0x9f, 0x17,
+    0x60, 0x3b, 0xa4, 0xd4, 0x53, 0xa0, 0x85, 0x4a, 0x94, 0x7e, 0x18, 0xf8, 0x0e, 0x0d, 0x7c, 0xad, 0x75, 0x80, 0x86,
+    0x7e, 0xc6, 0x34, 0xb5, 0xce, 0x50, 0xf9, 0xcc, 0xbb, 0x67, 0x46, 0xcb, 0x99, 0x05, 0x63, 0xd0, 0xb7, 0xd1, 0x14,
+    0xc5, 0x39, 0xf9, 0x2c, 0x28, 0xe2, 0x34, 0x8b, 0x73, 0xf0, 0xdb, 0x8c, 0x0b, 0xcc, 0x98, 0xc4, 0x15, 0xbf, 0x94,
+    0x05, 0x68, 0xbb, 0x73, 0x95, 0x5a, 0xd7, 0x20, 0x20, 0xfb, 0x01, 0xac, 0x5e, 0x1a, 0x3a, 0x2a, 0xe7, 0xdd, 0xa5,
+    0x4d, 0x21, 0x62, 0x11, 0x82, 0x4d, 0x33, 0x5d, 0xb2, 0xe3, 0x50, 0x69, 0x73, 0x20, 0xbe, 0x11, 0x1a, 0xf7, 0x4f,
+    0xc3, 0xd8, 0x6a, 0x8a, 0xad, 0xdd, 0xdb, 0x76, 0xfb, 0x7b, 0xe9, 0xa5, 0xd3, 0x9c, 0xf4, 0x18, 0xfb, 0xbd, 0x0c,
+    0x8b, 0x91, 0xed, 0x08, 0x81, 0x25, 0xe7, 0x7d, 0xea, 0xbf, 0xa2, 0xe5, 0x3c, 0x01, 0xd3, 0x11, 0x1d, 0x21, 0x17,
+    0x28, 0x3b, 0x46, 0x71, 0x07, 0x06, 0x57, 0xf4, 0xfb, 0x60, 0x95, 0x61, 0x2e, 0x24, 0x4b, 0x92, 0x32, 0x78, 0x9e,
+    0x7a, 0x18, 0xf0, 0x6b, 0xa6, 0xcc, 0x5d, 0x94, 0xf5, 0xe9, 0x92, 0x4c, 0x53, 0x64, 0x20, 0xd6, 0xe1, 0x26, 0x4b,
+    0xa3, 0x44, 0x89, 0xc8, 0x96, 0xe8, 0x1f, 0x69, 0x28, 0x96, 0x0e, 0xd7, 0x8b, 0x54, 0x89, 0x50, 0x31, 0x4f, 0xf1,
+    0xa4, 0x4e, 0xeb, 0x74, 0x84, 0xf1, 0x26, 0x41, 0x29, 0x57, 0xc3, 0x40, 0x95, 0x54, 0x2f, 0x85, 0x4d, 0xb1, 0xdd,
+    0xea, 0x8b, 0x95, 0x98, 0xc7, 0x0b, 0x7c, 0x29, 0x70, 0x14, 0x7f, 0xe2, 0x5e, 0xac, 0x29, 0xb5, 0x3d, 0xa8, 0x1d,
+    0x51, 0x42, 0x7f, 0xe2, 0x70, 0x91, 0xf8, 0x4e, 0xea, 0xb8, 0x7f, 0x68, 0x11, 0x72, 0xa6, 0x0e, 0x52, 0xc3, 0x0d,
+    0xed, 0x08, 0xff, 0x0d, 0xd7, 0x67, 0x9c, 0xd1, 0x9b, 0x6a, 0x46, 0x8d, 0xdf, 0xeb, 0xe1, 0x19, 0xa3, 0x3e, 0x1b,
+    0x38, 0xac, 0x10, 0x85, 0x36, 0xec, 0xa8, 0x54, 0xa2, 0x85, 0xa1, 0x54, 0x7f, 0x09, 0x15, 0x47, 0xdc, 0x99, 0x51,
+    0x96, 0x8c, 0x4f, 0xcb, 0x43, 0x31, 0x1d, 0x0c, 0x4a, 0x52, 0x19, 0x0b, 0x3d, 0xb8, 0x1e, 0x78, 0xfe, 0x3d, 0x70,
+    0x0b, 0xf1, 0xe0, 0x90, 0xc5, 0x90, 0x1b, 0x70, 0xfc, 0x16, 0x27, 0x57, 0x8d, 0x4a, 0x15, 0xbc, 0x9a, 0xa8, 0x16,
+    0xfc, 0x54, 0x86, 0x01, 0xfa, 0x24, 0x05, 0x60, 0x32, 0x98, 0xf2, 0x5b, 0x90, 0x28, 0x9d, 0xa9, 0x1b, 0xd2, 0xaf,
+    0xa2, 0xe0, 0x17, 0xbc, 0xe0, 0x22, 0x71, 0x05, 0x58, 0xde, 0xc1, 0xf6, 0x3a, 0xaa, 0xa8, 0x02, 0xe2, 0x35, 0x3d,
+    0x8e, 0xb8, 0xf1, 0xfe, 0x33, 0x3d, 0xb6, 0x40, 0xad, 0xd6, 0xb1, 0xc1, 0x67, 0x8e, 0xc1, 0x05, 0x5d, 0x4b, 0x6c,
+    0x0d, 0xd5, 0xb0, 0x22, 0x30, 0x70, 0x01, 0x07, 0x61, 0x89, 0xe2, 0xd8, 0x4a, 0x5e, 0x91, 0x86, 0x94, 0xf6, 0x81,
+    0xe1, 0x68, 0x93, 0x1c, 0xdf, 0x66, 0xd9, 0x4d, 0xe0, 0x7c, 0xd1, 0x39, 0x69, 0x26, 0x96, 0x0d, 0xde, 0xe7, 0xcd,
+    0xf9, 0x75, 0xff, 0x90, 0x50, 0x15, 0xec, 0x86, 0xb7, 0x83, 0xdd, 0x38, 0xe1, 0xd7, 0x5c, 0x2c, 0x74, 0x7c, 0x16,
+    0x73, 0xc9, 0xf2, 0x5b, 0xeb, 0xdd, 0x92, 0xa4, 0x56, 0x40, 0xfb, 0x2c, 0x0b, 0x6a, 0x22, 0x00, 0xdd, 0x0f, 0x7f,
+    0x81, 0xd0, 0x19, 0xfe, 0xf6, 0x18, 0x5c, 0x91, 0xc2, 0x7b, 0x87, 0x40, 0x58, 0xd3, 0xcd, 0x9d, 0xda, 0x80, 0x2f,
+    0xc6, 0xfd, 0x19, 0x53, 0x4f, 0xbf, 0xcd, 0xe4, 0xae, 0xae, 0xdb, 0x23, 0xcb, 0xf0, 0x11, 0xae, 0x14, 0x00, 0xcb,
+    0x84, 0xbf, 0x18, 0x5b, 0x52, 0x7d, 0x02, 0x70, 0x6a, 0x3a, 0xa2, 0x4f, 0x10, 0x18, 0x38, 0x25, 0x5a, 0x8c, 0xae,
+    0x95, 0x23, 0x9a, 0x41, 0x5a, 0xd3, 0xad, 0x30, 0xde, 0x7a, 0xd0, 0x42, 0xcf, 0x34, 0x9c, 0xf8, 0x0f, 0x9a, 0x79,
+    0x55, 0x40, 0x00, 0xad, 0x8c, 0xe0, 0xad, 0xf5, 0xd1, 0x1c, 0x21, 0x3e, 0x61, 0x49, 0x34, 0x61, 0xf1, 0x4c, 0xf1,
+    0x63, 0x42, 0x37, 0x4d, 0x6d, 0xd3, 0x07, 0xa4, 0xbf, 0xb8, 0x66, 0xfd, 0x94, 0x65, 0xed, 0xdb, 0x43, 0xc5, 0x8b,
+    0x69, 0x33, 0xf8, 0x61, 0xa2, 0x8a, 0xf1, 0xbf, 0xa8, 0x7c, 0xa9, 0x15, 0xc0, 0x30, 0x77, 0xd5, 0xd3, 0xef, 0x37,
+    0xb3, 0xe5, 0x40, 0xa8, 0xfc, 0xce, 0x20, 0xe9, 0xd3, 0xf1, 0xfc, 0xc0, 0x26, 0x51, 0x5b, 0xe8, 0xf9, 0xe3, 0x52,
+    0x37, 0xa1, 0xf2, 0xda, 0xd4, 0x88, 0x56, 0xc8, 0x50, 0xd9, 0x3a, 0x60, 0x7d, 0xff, 0x10, 0xee, 0x2e, 0x6a, 0x1a,
+    0x6a, 0xdd, 0x73, 0xd7, 0xa2, 0xe0, 0xc4, 0x1f, 0x60, 0x2c, 0x2e, 0x24, 0xb5, 0x0e, 0xc2, 0xa4, 0x1f, 0x2d, 0x4e,
+    0x72, 0xa3, 0xae, 0x4e, 0xce, 0x14, 0xf3, 0x04, 0x2e, 0xaa, 0x65, 0xdb, 0x5f, 0x51, 0xa9, 0x4b, 0xb9, 0xbd, 0xa2,
+    0x34, 0x3d, 0xa4, 0xed, 0x55, 0x9c, 0xb7, 0x05, 0x17, 0xfc, 0x0b, 0x05, 0x17, 0xd6, 0xc1, 0xba, 0xe3, 0x4e, 0xd9,
+    0x13, 0x9e, 0x28, 0xd3, 0xda, 0xe0, 0xae, 0x1b, 0x8c, 0x89, 0xb1, 0xdf, 0x5d, 0xf2, 0xe4, 0x23, 0xb2, 0xe0, 0xdf,
+    0x65, 0x02, 0x3c, 0x93, 0xdd, 0x2b, 0x95, 0xff, 0x07, 0xff, 0x6a, 0x6b, 0xdf, 0x59, 0xf3, 0x4f, 0xcf, 0x7a, 0xb8,
+    0x73, 0x98, 0xfc, 0x00, 0x9d, 0x01, 0xdd, 0x5c, 0xc9, 0x94, 0x03, 0x32, 0x80, 0xb5, 0x48, 0x46, 0x03, 0x3e, 0xb4,
+    0xb2, 0x6c, 0xfb, 0x4e, 0xab, 0x0b, 0xc2, 0xbd, 0x04, 0x6e, 0x7a, 0x7f, 0x6d, 0x66, 0xe6, 0x74, 0xad, 0x44, 0xd3,
+    0xa5, 0xb1, 0xb5, 0x2c, 0x55, 0xc0, 0xee, 0xf7, 0x9e, 0x64, 0xd3, 0xfc, 0x70, 0x39, 0xcd, 0x2d, 0x75, 0xdb, 0xb8,
+    0x65, 0x03, 0x40, 0x88, 0x5d, 0x6b, 0x2b, 0x07, 0x90, 0xdc, 0x1e, 0x84, 0xf0, 0xb5, 0x22, 0xf4, 0x54, 0x89, 0xd0,
+    0xa7, 0x69, 0xb3, 0x0f, 0x76, 0x55, 0xad, 0x1b, 0x71, 0x8e, 0x06, 0xa9, 0x66, 0xe4, 0x4f, 0xae, 0x79, 0x71, 0x91,
+    0xcb, 0x1b, 0xc0, 0x40, 0x26, 0xb5, 0x51, 0x58, 0x5e, 0x81, 0x3b, 0x3f, 0x3a, 0x8e, 0x33, 0x31, 0xca, 0x31, 0x58,
+    0x2b, 0xc2, 0x23, 0xeb, 0xc4, 0x19, 0x80, 0x20, 0xfb, 0x93, 0xa6, 0xe3, 0xb9, 0x16, 0x18, 0xd3, 0x17, 0xb8, 0xab,
+    0x9c, 0x1d, 0x6d, 0x72, 0xbb, 0xe8, 0x9b, 0x33, 0xac, 0x3b, 0x52, 0x5a, 0x1b, 0x8b, 0xae, 0x3b, 0x58, 0x6b, 0x06,
+    0x6d, 0x11, 0x4a, 0x3e, 0xe4, 0x4e, 0xda, 0x4f, 0x01, 0x0d, 0xce, 0xb2, 0xf4, 0xd6, 0x5a, 0xe5, 0x6f, 0xb4, 0x10,
+    0x27, 0x8a, 0xa9, 0x13, 0xdf, 0x44, 0x89, 0x3e, 0x3f, 0x13, 0xe3, 0x06, 0x02, 0xa9, 0x3f, 0x60, 0x50, 0x8d, 0x22,
+    0x4c, 0xe0, 0x3a, 0x10, 0xc5, 0xf6, 0x44, 0x6d, 0x2c, 0x47, 0xd0, 0x09, 0x21, 0xde, 0x41, 0x19, 0xc6, 0xea, 0xe2,
+    0x40, 0x1b, 0x2c, 0x7d, 0xdd, 0x5a, 0xe7, 0x86, 0x50, 0x18, 0x27, 0x30, 0xc5, 0x20, 0xa9, 0xb3, 0xce, 0x32, 0x41,
+    0x95, 0x1d, 0x93, 0xce, 0xfb, 0x00, 0xdd, 0x5d, 0x8b, 0xa6, 0xf8, 0xba, 0x73, 0x07, 0xdd, 0xc7, 0xf5, 0x6b, 0x2d,
+    0x72, 0x83, 0x3f, 0x6f, 0x89, 0xb0, 0x08, 0x9c, 0xb5, 0x26, 0x5f, 0x35, 0xc2, 0x81, 0x29, 0xc9, 0x34, 0xec, 0x25,
+    0xca, 0xa6, 0x7b, 0xbb, 0xed, 0xf5, 0xee, 0x15, 0x71, 0xf5, 0x18, 0xab, 0xbc, 0x9b, 0xb9, 0xbd, 0x53, 0xad, 0xc5,
+    0xee, 0x4d, 0xdb, 0x4f, 0xb1, 0xa3, 0xd6, 0xda, 0xed, 0x86, 0x13, 0x6a, 0xc8, 0xb7, 0xa2, 0x4a, 0xab, 0xd3, 0x8d,
+    0x41, 0x3b, 0xc4, 0xb3, 0x16, 0x19, 0xdc, 0x28, 0x5f, 0x38, 0xa1, 0x93, 0x8a, 0xb3, 0xea, 0xd4, 0x05, 0x9b, 0x2b,
+    0x5e, 0x2d, 0x65, 0x1a, 0x09, 0x8a, 0x36, 0xe7, 0x51, 0x49, 0x13, 0xb9, 0x16, 0x55, 0x24, 0x6b, 0xd4, 0x8b, 0x5a,
+    0x8d, 0x01, 0x02, 0x32, 0x9d, 0x35, 0x3d, 0xa8, 0x82, 0xd9, 0x50, 0x46, 0x72, 0xfa, 0x1e, 0x2c, 0xed, 0x91, 0x63,
+    0xad, 0xef, 0xab, 0xb3, 0xc5, 0xb7, 0x7a, 0x42, 0x30, 0x85, 0xd9, 0x03, 0x61, 0xe0, 0x9a, 0xc6, 0x90, 0xd3, 0x2e,
+    0x71, 0x59, 0xd3, 0x2d, 0xe1, 0x1e, 0x6e, 0x57, 0xb2, 0x23, 0x37, 0x4f, 0x9a, 0x9b, 0x2b, 0xd8, 0x51, 0x31, 0x1f,
+    0x83, 0xf6, 0x4b, 0xaa, 0x6b, 0x97, 0xe6, 0xd6, 0xe3, 0x41, 0x40, 0x83, 0x41, 0x61, 0xf8, 0xd7, 0x89, 0xf1, 0xf0,
+    0xa4, 0x01, 0x41, 0x52, 0x2e, 0xc2, 0xb1, 0x6f, 0x44, 0x3f, 0x99, 0xca, 0x43, 0x8e, 0x16, 0xef, 0xd0, 0xea, 0x04,
+    0xa2, 0x78, 0x89, 0x50, 0x12, 0xa3, 0x2a, 0x34, 0x22, 0x28, 0x4f, 0xcb, 0x5f, 0xaa, 0xea, 0x10, 0x50, 0x48, 0xfb,
+    0x8a, 0x42, 0xd9, 0x26, 0x31, 0x34, 0xc3, 0x2f, 0xe7, 0x93, 0x85, 0x9e, 0x81, 0x81, 0x9c, 0x1f, 0x2c, 0xf4, 0x2c,
+    0x0c, 0xe4, 0xfc, 0xc9, 0xa2, 0x76, 0xeb, 0x40, 0x13, 0x10, 0xcf, 0x85, 0xa3, 0x93, 0xd2, 0xaa, 0x6c, 0x01, 0xdd,
+    0x3c, 0x44, 0xd0, 0x7f, 0xb2, 0x87, 0xa0, 0x93, 0x0b, 0xed, 0xc8, 0x0d, 0x68, 0x3b, 0x0e, 0x81, 0xbd, 0x62, 0x52,
+    0x61, 0x02, 0x10, 0x1d, 0xb2, 0x31, 0x18, 0x62, 0xab, 0x0f, 0x0e, 0xd9, 0x78, 0xea, 0x93, 0x20, 0x60, 0x74, 0x7f,
+    0x30, 0x90, 0xe0, 0xb7, 0x78, 0x95, 0x3e, 0xda, 0x08, 0x74, 0xd3, 0x77, 0x77, 0x43, 0xef, 0xe2, 0x0a, 0x4e, 0xd5,
+    0xee, 0x9e, 0x84, 0x6e, 0x32, 0xed, 0x00, 0xbd, 0x86, 0xb8, 0x21, 0xbf, 0x32, 0x1a, 0x8d, 0x6c, 0x4a, 0x48, 0x88,
+    0xe1, 0x1c, 0x9a, 0x39, 0x2d, 0x97, 0xaf, 0x6e, 0x3d, 0x1b, 0x90, 0x61, 0xa6, 0xb7, 0x4c, 0xd6, 0x0f, 0x50, 0x56,
+    0x3d, 0x86, 0x76, 0xe8, 0x3d, 0x72, 0xfc, 0xf0, 0xe0, 0x9b, 0x8c, 0x9f, 0x39, 0x5c, 0x7b, 0x38, 0x17, 0xbe, 0xcb,
+    0x9a, 0x91, 0x39, 0x74, 0x9e, 0x7d, 0x1c, 0xef, 0x61, 0x9c, 0x7c, 0x9e, 0x85, 0xf2, 0xc6, 0x6b, 0xfa, 0x1f, 0x95,
+    0xde, 0xec, 0x70, 0xc8, 0xe9, 0x0a, 0x56, 0xdc, 0xac, 0x0a, 0x0d, 0x3f, 0x8b, 0xbc, 0x71, 0xc4, 0x6b, 0x12, 0x55,
+    0xdd, 0xe7, 0xbd, 0x0d, 0x53, 0xda, 0x31, 0x0e, 0x00, 0x4e, 0xd4, 0xaa, 0x61, 0x57, 0x1a, 0xd7, 0xea, 0x20, 0x86,
+    0xa1, 0x84, 0xad, 0x12, 0x47, 0x42, 0xf9, 0x1b, 0x80, 0xb0, 0x18, 0x8a, 0xe3, 0xad, 0x61, 0x7d, 0x80, 0xfd, 0xd0,
+    0x05, 0x9a, 0xe6, 0x94, 0x6a, 0x06, 0x00, 0x49, 0xc0, 0x1f, 0x3d, 0xdd, 0x34, 0x54, 0xb6, 0x79, 0x1e, 0x5a, 0x56,
+    0x57, 0xf0, 0x40, 0x4f, 0x5d, 0xc9, 0xc0, 0xb8, 0xaa, 0x63, 0x6f, 0x73, 0x7f, 0x7b, 0xb4, 0x8a, 0x7c, 0x67, 0x93,
+    0xda, 0x66, 0x55, 0x68, 0xec, 0xe3, 0x09, 0x3d, 0x9d, 0x00, 0xad, 0xd7, 0x96, 0x8a, 0xf6, 0xfb, 0x28, 0x46, 0x8d,
+    0x0b, 0x05, 0x56, 0x61, 0x22, 0xc1, 0x21, 0xc2, 0x08, 0xa1, 0xdf, 0x97, 0xe1, 0xc6, 0x17, 0x64, 0x10, 0x0d, 0xd7,
+    0xa2, 0xe3, 0x0f, 0x39, 0x5e, 0xb4, 0x2d, 0x55, 0x35, 0x27, 0x4d, 0x5b, 0x02, 0x6f, 0xc2, 0x01, 0xb6, 0xf3, 0x4f,
+    0x1b, 0x22, 0x57, 0xe1, 0xa2, 0x84, 0xef, 0x88, 0x6b, 0x41, 0x74, 0x53, 0x9b, 0x7a, 0x1b, 0x76, 0x88, 0x8e, 0xa6,
+    0x78, 0x74, 0xc8, 0x3d, 0x77, 0xcf, 0x6d, 0x11, 0xdf, 0x7c, 0x86, 0xdc, 0x35, 0x9d, 0xbd, 0x14, 0x61, 0x50, 0xb7,
+    0x6c, 0xa0, 0x58, 0x87, 0x4e, 0x50, 0x80, 0x51, 0x5b, 0x3e, 0x01, 0x1d, 0x1b, 0x0c, 0x2a, 0x82, 0x4f, 0x0a, 0xdb,
+    0xa6, 0x41, 0xfe, 0x88, 0x77, 0x43, 0x87, 0xd7, 0x96, 0x3c, 0x10, 0xaf, 0xb0, 0xcf, 0x94, 0x70, 0xff, 0x82, 0x82,
+    0xee, 0x28, 0x2f, 0x57, 0x85, 0xab, 0xd2, 0x00, 0x54, 0xd9, 0xf1, 0x5c, 0x6b, 0x4a, 0x5a, 0xc0, 0x4a, 0x49, 0xdd,
+    0xf9, 0x4d, 0x44, 0xdc, 0x92, 0xa9, 0x98, 0xad, 0xba, 0x51, 0xe5, 0xa1, 0x44, 0x91, 0x8e, 0x3d, 0xdb, 0x39, 0x58,
+    0x03, 0xe0, 0x29, 0x6c, 0x2f, 0xce, 0xb0, 0xa0, 0x8c, 0xcb, 0x96, 0xb9, 0x04, 0x8a, 0xfa, 0x61, 0x9c, 0x97, 0x1d,
+    0x5f, 0xee, 0x8e, 0xb6, 0xf7, 0xd0, 0x1b, 0xb1, 0x31, 0x5e, 0x5f, 0x46, 0x4d, 0xbf, 0x78, 0x86, 0x2b, 0x4b, 0x41,
+    0x1e, 0x68, 0xaa, 0x47, 0x18, 0x1d, 0x02, 0xd3, 0x94, 0x1f, 0xb1, 0xf1, 0x74, 0x38, 0x34, 0x64, 0xd0, 0x6b, 0x26,
+    0xc6, 0xff, 0xfa, 0x02, 0x5a, 0x67, 0x26, 0xae, 0xf1, 0x69, 0xfb, 0x0a, 0x5a, 0xdd, 0xa2, 0x4c, 0xee, 0x0c, 0x0c,
+    0x1f, 0x68, 0xc9, 0x14, 0x4c, 0x15, 0xde, 0x10, 0xa9, 0x64, 0x9f, 0x96, 0xd6, 0x61, 0xdf, 0x2e, 0x14, 0x5a, 0x68,
+    0xe2, 0x57, 0x19, 0xe2, 0xa7, 0xae, 0x33, 0xff, 0x36, 0xed, 0x53, 0x83, 0x58, 0x58, 0x12, 0xa3, 0x10, 0xbf, 0x38,
+    0x55, 0xb6, 0x13, 0x42, 0x05, 0xc4, 0x43, 0xd7, 0xba, 0x71, 0x24, 0x55, 0xec, 0x49, 0xa1, 0xf1, 0xd4, 0x70, 0xdf,
+    0x0b, 0x1d, 0xb3, 0x0e, 0xb3, 0xb8, 0xcd, 0x1a, 0x49, 0x8d, 0x71, 0x2a, 0x4c, 0x70, 0x4a, 0xb9, 0x8a, 0x04, 0x46,
+    0xc7, 0xb3, 0x85, 0x41, 0x54, 0x49, 0x4c, 0x32, 0xb6, 0x16, 0xc2, 0xc4, 0xae, 0x73, 0x85, 0x69, 0xea, 0x22, 0xf5,
+    0x9b, 0x81, 0xc9, 0x82, 0x86, 0xfc, 0x1e, 0x8d, 0xd6, 0x54, 0x4d, 0x01, 0x86, 0x71, 0x94, 0x6a, 0xfc, 0x5b, 0x84,
+    0xda, 0x0c, 0x03, 0x00, 0xdb, 0xbc, 0x93, 0x99, 0xa8, 0x5e, 0x0b, 0x84, 0x40, 0x73, 0xf6, 0x53, 0x45, 0xb5, 0x33,
+    0x0b, 0x46, 0xd1, 0x6e, 0xaf, 0x7c, 0x3e, 0x70, 0x42, 0x79, 0xac, 0x2e, 0x50, 0xaf, 0x64, 0xf1, 0x46, 0xa6, 0xbc,
+    0x15, 0x17, 0x73, 0x4f, 0xb2, 0x0f, 0xf9, 0x08, 0xce, 0x2b, 0x74, 0x2a, 0x37, 0xdb, 0x44, 0x99, 0x25, 0x49, 0xc6,
+    0x02, 0x63, 0xf3, 0x12, 0xcc, 0xa4, 0x66, 0xc6, 0xf0, 0x6b, 0x08, 0x2e, 0xb6, 0x73, 0x12, 0x6e, 0xee, 0xe7, 0x81,
+    0x21, 0x34, 0xb9, 0x68, 0x89, 0x86, 0xad, 0x1d, 0xaf, 0x27, 0xd7, 0x84, 0xfb, 0xb0, 0x11, 0x6b, 0x32, 0xc6, 0xb8,
+    0x36, 0x37, 0xb2, 0x7e, 0xb4, 0xc0, 0x83, 0x31, 0x65, 0xfd, 0x09, 0x64, 0x5a, 0x49, 0x59, 0xe7, 0x0b, 0x23, 0x66,
+    0x52, 0x89, 0xde, 0xed, 0x1b, 0x9f, 0xd5, 0x5d, 0x44, 0xfd, 0xd6, 0x7e, 0x4f, 0xea, 0xe1, 0xce, 0x7f, 0x50, 0x58,
+    0x83, 0xca, 0x88, 0xcb, 0x88, 0xf2, 0xcc, 0x81, 0x6e, 0x9a, 0x14, 0x71, 0x7a, 0xb6, 0x8a, 0x8b, 0x92, 0xa7, 0x50,
+    0xa9, 0xa6, 0x6e, 0x51, 0x6f, 0x02, 0xf6, 0x86, 0x48, 0x92, 0xac, 0xa5, 0xb1, 0x15, 0xbb, 0x34, 0x48, 0xcf, 0xbd,
+    0x61, 0x96, 0x5e, 0x55, 0x68, 0x48, 0x4b, 0xbd, 0xb3, 0x50, 0xc9, 0xfc, 0x15, 0xff, 0x19, 0xd4, 0x0a, 0x74, 0xb4,
+    0x49, 0x31, 0x9e, 0x03, 0x23, 0xbe, 0x1b, 0xc1, 0xea, 0x01, 0xe2, 0xa2, 0x09, 0x4a, 0xbd, 0x23, 0x76, 0xfc, 0xdc,
+    0xe4, 0xe1, 0x5d, 0xc8, 0x39, 0x83, 0x4f, 0x1f, 0x66, 0x89, 0x5a, 0xeb, 0x48, 0x8c, 0xd4, 0x0c, 0xa0, 0xe9, 0xa0,
+    0xcc, 0x79, 0x2c, 0x82, 0x59, 0xcf, 0x24, 0x46, 0x3d, 0xae, 0x7f, 0x81, 0x86, 0xda, 0x6f, 0x56, 0x96, 0x67, 0xd5,
+    0xdd, 0x97, 0x70, 0x60, 0x53, 0x5b, 0x41, 0x8f, 0xd7, 0x95, 0xbc, 0xbc, 0x54, 0xdd, 0xf6, 0x0b, 0x31, 0x72, 0xba,
+    0xc6, 0xb5, 0x74, 0x5e, 0x2d, 0x58, 0xaf, 0x3b, 0xdd, 0x2c, 0xee, 0x66, 0x19, 0x0d, 0x84, 0xb5, 0x9d, 0x4f, 0x34,
+    0x7f, 0xd6, 0x6c, 0xbb, 0x8f, 0xb7, 0x20, 0x66, 0x01, 0x00, 0xa4, 0x07, 0x51, 0xb0, 0xcc, 0x52, 0x1e, 0x50, 0x79,
+    0x1f, 0x47, 0x59, 0x28, 0xbd, 0x9c, 0x65, 0xfc, 0xb4, 0x69, 0xac, 0x75, 0x56, 0x28, 0x43, 0x6b, 0xa3, 0x3b, 0x5d,
+    0x65, 0x88, 0xed, 0x27, 0x71, 0xb6, 0x00, 0xf7, 0xc7, 0x0c, 0x85, 0x86, 0xce, 0x32, 0xd2, 0x44, 0xc3, 0x77, 0xdd,
+    0x33, 0xc8, 0x28, 0x4e, 0xd6, 0x79, 0x25, 0xdd, 0xe8, 0xb3, 0x36, 0x12, 0xe6, 0x1e, 0xa2, 0x5f, 0xc5, 0xe0, 0x51,
+    0xee, 0xf3, 0xda, 0xe8, 0x64, 0x5a, 0x46, 0xda, 0x9d, 0x9f, 0xd4, 0xcb, 0x2c, 0xd5, 0x3a, 0x6c, 0x9f, 0x61, 0x6f,
+    0x8d, 0x49, 0x6f, 0x42, 0x6a, 0x18, 0x89, 0xcf, 0x67, 0xd4, 0x08, 0x01, 0x6d, 0x39, 0xfe, 0x0e, 0x9f, 0x61, 0x68,
+    0x0a, 0x2c, 0x55, 0xdc, 0xc2, 0x6e, 0xf8, 0x9a, 0x4f, 0x56, 0x2d, 0x00, 0x11, 0xac, 0x7c, 0xbd, 0x8b, 0x57, 0x42,
+    0x7d, 0xa6, 0xcd, 0x00, 0x90, 0x05, 0xa5, 0xdc, 0xf1, 0x53, 0x2a, 0x1d, 0x2c, 0x51, 0xb4, 0xbd, 0x9c, 0xbe, 0xd1,
+    0xb1, 0xf1, 0x43, 0x7a, 0x2e, 0x60, 0xbb, 0x90, 0xdf, 0xba, 0x57, 0x2f, 0x51, 0x91, 0xda, 0x36, 0xeb, 0x01, 0xbe,
+    0xdc, 0xa0, 0x49, 0x18, 0x41, 0x99, 0x32, 0x05, 0x30, 0xb8, 0xa9, 0x46, 0xc1, 0xa4, 0xd5, 0x48, 0xd8, 0x52, 0x4f,
+    0xb2, 0xdc, 0xf4, 0xc1, 0xa9, 0xee, 0x11, 0xf4, 0x68, 0x87, 0x93, 0x96, 0xfd, 0x5a, 0xc1, 0xd1, 0xc9, 0xd5, 0x10,
+    0x35, 0xf3, 0x5e, 0xdb, 0x91, 0x21, 0xe5, 0x32, 0x0c, 0x04, 0x53, 0x8e, 0x79, 0x7a, 0x6c, 0x3d, 0x23, 0xa2, 0x07,
+    0xce, 0x3e, 0xd3, 0xad, 0xba, 0x92, 0x80, 0xe8, 0xf8, 0xcd, 0xd3, 0xd7, 0x57, 0xf1, 0xa5, 0x41, 0x51, 0x6a, 0x58,
+    0xc4, 0x28, 0xd3, 0xbe, 0x4a, 0xc2, 0xe0, 0xfd, 0xfa, 0xfe, 0x67, 0x95, 0xa5, 0xf6, 0x7b, 0xb0, 0xb1, 0xa2, 0xaa,
+    0x5f, 0x4b, 0x5e, 0x34, 0x05, 0x58, 0xf7, 0x59, 0xa2, 0x40, 0xee, 0xf7, 0x36, 0xcd, 0x7c, 0x13, 0x35, 0x6e, 0x36,
+    0xac, 0x37, 0xae, 0xdb, 0xa5, 0xb6, 0x64, 0x47, 0x56, 0x22, 0x67, 0x16, 0x83, 0x19, 0x3f, 0x2a, 0x0c, 0x4a, 0xc3,
+    0x06, 0x55, 0xa9, 0xf8, 0xbd, 0x11, 0xc1, 0xa9, 0x63, 0x55, 0x61, 0x4c, 0x03, 0x66, 0x5b, 0x51, 0x6b, 0x50, 0x07,
+    0xa5, 0xb4, 0x35, 0x51, 0xd8, 0x7e, 0x67, 0x05, 0x35, 0xbf, 0xff, 0x69, 0x0c, 0xf9, 0x9a, 0x52, 0x50, 0x49, 0xc0,
+    0xce, 0xa0, 0xd1, 0x53, 0x25, 0x0c, 0xa4, 0x20, 0x78, 0x02, 0x94, 0x2f, 0xa2, 0xc6, 0x6a, 0xb7, 0xaf, 0x4e, 0x8d,
+    0xd1, 0x16, 0x10, 0x5a, 0x48, 0x8f, 0x2e, 0xfb, 0xb8, 0x8d, 0x75, 0x20, 0xf1, 0xe0, 0x04, 0xdb, 0xb9, 0xba, 0x46,
+    0x23, 0xa1, 0xf9, 0x43, 0xa3, 0x01, 0xaf, 0x69, 0x05, 0x0a, 0xf5, 0x1c, 0x47, 0x43, 0x67, 0x87, 0x14, 0x44, 0x6c,
+    0xd0, 0xc2, 0xbe, 0x7b, 0x3e, 0x34, 0xfb, 0x7a, 0x9e, 0x2c, 0x48, 0x4d, 0xa5, 0xfb, 0xdc, 0x2d, 0x21, 0x6b, 0xd5,
+    0xa1, 0xac, 0x3c, 0xc0, 0xf1, 0x42, 0xc9, 0xfc, 0x1d, 0x26, 0x35, 0x4a, 0x63, 0x42, 0x63, 0xc4, 0x02, 0x96, 0x04,
+    0xed, 0xf5, 0x40, 0xfd, 0x32, 0x08, 0x15, 0xce, 0xf4, 0x44, 0xe2, 0x53, 0xca, 0xd5, 0xa7, 0x05, 0xa9, 0xa7, 0x05,
+    0x73, 0xa0, 0x97, 0xbe, 0x95, 0x5f, 0xd9, 0xf8, 0x68, 0x77, 0xef, 0x9a, 0x0b, 0xeb, 0x18, 0x82, 0x61, 0x0b, 0xbf,
+    0x39, 0x35, 0x05, 0x60, 0xc3, 0x63, 0x5d, 0x96, 0x6f, 0xd4, 0x44, 0x66, 0x71, 0x48, 0x22, 0x90, 0x6c, 0x37, 0x37,
+    0xb7, 0x11, 0x6c, 0x7b, 0x0b, 0xb5, 0xa1, 0xfe, 0xf2, 0xb6, 0xfb, 0x3d, 0xc3, 0xcb, 0x3d, 0xb9, 0x77, 0xd3, 0x86,
+    0xf2, 0x87, 0xfb, 0x57, 0xc9, 0xff, 0x55, 0x25, 0xf7, 0x5b, 0x65, 0xd6, 0x6d, 0xf1, 0x7e, 0xd7, 0x71, 0xcb, 0x31,
+    0x1a, 0x04, 0xd6, 0x14, 0x18, 0x48, 0x4f, 0x1a, 0xd3, 0x44, 0x87, 0x54, 0x66, 0xcc, 0xe0, 0xd1, 0x05, 0x68, 0x0e,
+    0xd3, 0x79, 0x1e, 0x03, 0x70, 0x80, 0x7f, 0xe4, 0x11, 0xea, 0x9f, 0xce, 0xf3, 0xe0, 0x2c, 0x18, 0x94, 0x83, 0x40,
+    0x7f, 0xe2, 0x9a, 0x13, 0x2c, 0x40, 0xe7, 0x16, 0x33, 0x08, 0x36, 0x69, 0xcd, 0x1c, 0xe2, 0xc3, 0x64, 0x3a, 0x18,
+    0xc4, 0x64, 0x03, 0x20, 0x7d, 0xf1, 0xc2, 0x3a, 0x07, 0x15, 0x7a, 0x41, 0xb6, 0xea, 0x2e, 0x9a, 0x15, 0x7b, 0xd5,
+    0x4e, 0xf3, 0x7e, 0x3f, 0x9f, 0x97, 0x83, 0xa0, 0x51, 0x61, 0x61, 0xbc, 0xff, 0x68, 0xf3, 0x4b, 0xa3, 0x93, 0x26,
+    0x18, 0xa6, 0xf6, 0x18, 0xd5, 0x2b, 0x9e, 0x66, 0xb4, 0x71, 0x3b, 0x56, 0xca, 0x17, 0x10, 0xc5, 0x03, 0x43, 0xd6,
+    0xca, 0xbb, 0x73, 0xf0, 0xba, 0xdc, 0x78, 0x73, 0x44, 0x01, 0x76, 0x53, 0x18, 0x27, 0x35, 0x17, 0x5d, 0xd4, 0xc4,
+    0x33, 0xd8, 0xe9, 0xea, 0xad, 0x44, 0xab, 0xf1, 0x5e, 0xbc, 0x6b, 0x36, 0xfe, 0x56, 0xee, 0xe9, 0x32, 0xf7, 0x2e,
+    0x00, 0x71, 0x76, 0x2f, 0xae, 0xf6, 0xb0, 0xd4, 0xbd, 0x60, 0x60, 0x91, 0x43, 0xda, 0xd5, 0xea, 0xa1, 0x88, 0xd4,
+    0x79, 0x0c, 0x06, 0x4c, 0xa6, 0x21, 0x35, 0x99, 0xf6, 0x0a, 0x05, 0x69, 0x63, 0xad, 0x05, 0xb4, 0xe1, 0xb0, 0xd8,
+    0xb1, 0x1b, 0x76, 0xa7, 0x5b, 0x87, 0x42, 0x09, 0xa3, 0x57, 0xd7, 0xcd, 0x43, 0xad, 0xe1, 0x89, 0xa0, 0x07, 0xd5,
+    0x68, 0x3f, 0x3d, 0x94, 0x27, 0xed, 0xb1, 0x00, 0x17, 0x3d, 0x7c, 0xf9, 0x52, 0xe0, 0x45, 0x7b, 0x07, 0x79, 0xce,
+    0x7c, 0xaa, 0x7c, 0x10, 0x1b, 0x6e, 0x19, 0x3e, 0xb4, 0x8f, 0x6f, 0x05, 0x32, 0xa9, 0x3b, 0x9a, 0xda, 0xda, 0x1d,
+    0x8d, 0x63, 0x02, 0xfd, 0xa6, 0x1c, 0xa5, 0x4c, 0x4c, 0x2d, 0x4b, 0x76, 0xd4, 0xcb, 0x95, 0x37, 0x54, 0xca, 0x8e,
+    0x96, 0x6d, 0xce, 0x2f, 0x6d, 0x24, 0xf4, 0xfb, 0xda, 0x1d, 0x08, 0xdf, 0xa8, 0xf5, 0x86, 0xbc, 0x6c, 0x88, 0x58,
+    0x0e, 0x31, 0x03, 0xc7, 0x0b, 0xa9, 0x5c, 0xbb, 0x8b, 0xa6, 0xaa, 0x6e, 0x67, 0x2b, 0x17, 0xb4, 0xc4, 0x5b, 0x29,
+    0xb0, 0x8a, 0xd4, 0xe9, 0xf5, 0x54, 0xe2, 0x7d, 0x1f, 0xc5, 0xf6, 0x23, 0x60, 0x1b, 0x1b, 0x47, 0x63, 0xe3, 0x16,
+    0xb1, 0xc1, 0x57, 0x51, 0x45, 0x0b, 0x0e, 0x10, 0xdc, 0x6d, 0x49, 0x2d, 0xcd, 0x1c, 0xe2, 0xbe, 0xe2, 0x01, 0xda,
+    0x77, 0x71, 0xc4, 0xa9, 0x00, 0xdb, 0xba, 0xd6, 0x39, 0xab, 0xe5, 0x80, 0xcd, 0x44, 0xcf, 0x3f, 0xad, 0x1a, 0x89,
+    0x18, 0x56, 0xd9, 0x48, 0x59, 0xa1, 0x3d, 0x28, 0x5d, 0xc2, 0xc5, 0x17, 0xe0, 0x65, 0xfb, 0x7e, 0x65, 0xf7, 0xd9,
+    0x12, 0xfb, 0x87, 0x79, 0xd5, 0x04, 0x8f, 0xbc, 0xc6, 0xdb, 0x7b, 0x98, 0xf8, 0x52, 0x29, 0x84, 0x57, 0x29, 0x0d,
+    0x25, 0x00, 0x83, 0x24, 0xa8, 0xe1, 0x4a, 0xdb, 0x66, 0x90, 0xca, 0x18, 0x76, 0xb7, 0x7a, 0xab, 0xff, 0xd3, 0x2a,
+    0x5c, 0x54, 0xb2, 0x18, 0x93, 0x40, 0xe7, 0x54, 0xcb, 0x4d, 0x4c, 0xc1, 0xb3, 0x5d, 0x72, 0x04, 0x0a, 0x3b, 0x01,
+    0xdc, 0x50, 0xc2, 0x7e, 0xc5, 0xdb, 0x50, 0xce, 0x5e, 0x59, 0xc9, 0x93, 0xdb, 0x97, 0x54, 0xd0, 0x84, 0x4c, 0x85,
+    0xdd, 0xbf, 0xad, 0x0d, 0xfb, 0x22, 0x94, 0x23, 0x29, 0x70, 0x71, 0xd0, 0x39, 0x80, 0xfd, 0x41, 0x2e, 0x63, 0xf3,
+    0x99, 0xf4, 0xfb, 0xea, 0xfd, 0xf3, 0x3c, 0x4b, 0x3e, 0xee, 0xbc, 0x37, 0x3c, 0xcd, 0x92, 0x01, 0x95, 0x88, 0xa9,
+    0x75, 0x55, 0x0c, 0x97, 0xda, 0xc5, 0xb8, 0x41, 0x32, 0xe2, 0x7b, 0xa9, 0x43, 0x8c, 0x18, 0x5f, 0x64, 0x87, 0xa4,
+    0xe4, 0x74, 0x59, 0x77, 0xf6, 0x5c, 0x8b, 0x66, 0xd0, 0x18, 0x6e, 0xc7, 0x7b, 0x49, 0xaf, 0x00, 0x15, 0x15, 0xba,
+    0x67, 0x81, 0x6b, 0x78, 0x73, 0x49, 0x34, 0xb6, 0xf4, 0xb4, 0x25, 0x1a, 0xb8, 0x57, 0x26, 0x24, 0xd5, 0xc6, 0x01,
+    0x16, 0xb1, 0xae, 0x3f, 0x86, 0x12, 0x80, 0x5a, 0x0d, 0xd2, 0x2b, 0x7d, 0x45, 0xa8, 0x4a, 0x42, 0x30, 0x3a, 0x91,
+    0xf0, 0x32, 0xa0, 0x71, 0x66, 0x12, 0x2d, 0x6c, 0x70, 0x40, 0x5f, 0x54, 0x26, 0xd1, 0xd8, 0x90, 0x07, 0xb4, 0xb2,
+    0x69, 0x00, 0x83, 0x0f, 0x92, 0x24, 0xfa, 0x7a, 0x69, 0x92, 0x40, 0x50, 0x82, 0xf2, 0x0d, 0xfa, 0x4b, 0xe9, 0xf9,
+    0x58, 0xfe, 0xcb, 0x3b, 0x94, 0x7e, 0x08, 0x25, 0xc8, 0x14, 0x75, 0xc5, 0x34, 0x63, 0x47, 0x59, 0xb7, 0x31, 0x89,
+    0xe7, 0x69, 0x77, 0x5b, 0x28, 0x97, 0x2e, 0xf0, 0x2b, 0xcb, 0x10, 0xc7, 0xfa, 0x79, 0xbc, 0x62, 0xc7, 0x21, 0xd7,
+    0x78, 0xe9, 0xcf, 0xe3, 0x15, 0xce, 0x10, 0xad, 0x5a, 0x09, 0x44, 0xf9, 0xaf, 0xda, 0xc0, 0x21, 0xee, 0x13, 0x0c,
+    0x72, 0x51, 0x79, 0x0f, 0x04, 0xf2, 0xb6, 0x82, 0x88, 0x34, 0xb3, 0xeb, 0x30, 0x22, 0xd5, 0x4e, 0x92, 0xf9, 0xf2,
+    0x47, 0x99, 0x09, 0xef, 0x1b, 0x78, 0x6c, 0x36, 0xcb, 0xa6, 0x98, 0x2f, 0x54, 0x30, 0x07, 0xf7, 0x89, 0x8a, 0x4b,
+    0x51, 0xf9, 0x4f, 0xd8, 0x05, 0x2f, 0xc6, 0x83, 0xd7, 0x6b, 0x04, 0xd8, 0xaf, 0xfc, 0x27, 0x6f, 0xcc, 0xde, 0x5a,
+    0x37, 0xbe, 0xcc, 0x44, 0x7c, 0xe0, 0xa3, 0x5b, 0xca, 0x47, 0x77, 0x5e, 0xa6, 0x3f, 0x1b, 0x50, 0x22, 0xa3, 0xb2,
+    0xe2, 0xab, 0x15, 0x4f, 0x67, 0xb7, 0x49, 0x94, 0x8d, 0x2a, 0x2e, 0x60, 0x7a, 0xc1, 0xf1, 0x2e, 0x59, 0x9f, 0x67,
+    0xc9, 0x6b, 0x88, 0x3d, 0xb0, 0x92, 0x0a, 0x8b, 0x1f, 0x96, 0x99, 0x5a, 0xcc, 0x42, 0x56, 0x52, 0xf0, 0x60, 0x76,
+    0x9d, 0x44, 0x6f, 0x97, 0x1e, 0x92, 0x9a, 0x99, 0xb2, 0x4d, 0xed, 0x08, 0xb5, 0xf1, 0x75, 0xa4, 0x1b, 0x6d, 0x01,
+    0x00, 0xf7, 0x6c, 0x91, 0x46, 0x92, 0x89, 0xe1, 0xa4, 0x66, 0xdc, 0xa4, 0x17, 0x98, 0x1a, 0xd7, 0xac, 0xa2, 0x89,
+    0xb3, 0x90, 0x01, 0xbd, 0x3f, 0xe0, 0xe5, 0xe0, 0x73, 0x06, 0xf7, 0x1f, 0xb4, 0x06, 0x2e, 0x0f, 0x8b, 0x7e, 0x5f,
+    0x1e, 0x16, 0xdb, 0x6d, 0x79, 0x14, 0xf7, 0xfb, 0xf2, 0x28, 0x36, 0xfc, 0x83, 0x52, 0x6c, 0x1b, 0x73, 0x83, 0x84,
+    0xe6, 0x12, 0xa2, 0x16, 0x8d, 0xe0, 0x0f, 0xcd, 0x72, 0x2e, 0xa2, 0xfc, 0x30, 0xe9, 0xf7, 0x7b, 0xcb, 0x99, 0x18,
+    0xe4, 0xc3, 0x24, 0xca, 0x87, 0x89, 0xe7, 0x84, 0xf8, 0x9b, 0xe7, 0x84, 0xa8, 0x68, 0xe0, 0x0a, 0xce, 0x0c, 0x40,
+    0x14, 0xf0, 0xe9, 0x1f, 0xd5, 0xb5, 0x14, 0xba, 0x96, 0x58, 0xd5, 0x92, 0xe8, 0x0a, 0x6a, 0x76, 0x5d, 0x84, 0x25,
+    0x96, 0x42, 0x97, 0xec, 0xcf, 0x25, 0xf0, 0x44, 0x39, 0xaf, 0x36, 0xc0, 0xc0, 0x46, 0x78, 0xe7, 0x30, 0xe1, 0x24,
+    0xd6, 0x35, 0xa0, 0x9d, 0x6e, 0x6a, 0x7a, 0x41, 0x57, 0xf4, 0x12, 0xf9, 0xd9, 0x0b, 0x30, 0x58, 0x3a, 0x64, 0xf9,
+    0x74, 0x30, 0xb8, 0x20, 0x2b, 0x56, 0xce, 0xc3, 0x78, 0x10, 0xae, 0x67, 0xf9, 0xf0, 0x22, 0xba, 0x20, 0xe4, 0xab,
+    0x62, 0x41, 0x7b, 0xab, 0x51, 0xf9, 0x31, 0x83, 0xe0, 0x7e, 0xe9, 0x2c, 0xcc, 0x4c, 0x9c, 0x8f, 0xd5, 0xe8, 0x96,
+    0xae, 0x20, 0x7e, 0x0d, 0xdc, 0x48, 0x48, 0x04, 0x1d, 0xb9, 0xa4, 0x2b, 0xba, 0xa6, 0xd2, 0xcc, 0x30, 0x86, 0xe8,
+    0xb6, 0xc7, 0x49, 0x02, 0x8e, 0xc9, 0xae, 0xf8, 0x68, 0xac, 0x0a, 0xef, 0xfa, 0x8e, 0xd0, 0x5e, 0x2f, 0x71, 0x83,
+    0xf4, 0x5d, 0x7b, 0x90, 0x80, 0x11, 0x19, 0xa9, 0x81, 0x32, 0x23, 0x23, 0xa9, 0x99, 0x54, 0x1c, 0x92, 0xd8, 0x1f,
+    0x12, 0x35, 0x0e, 0x89, 0x3f, 0x0e, 0xb9, 0x1e, 0x07, 0xe4, 0xee, 0x97, 0x6c, 0x4c, 0x53, 0x36, 0xa6, 0x6b, 0x35,
+    0x2a, 0xf4, 0x8a, 0x9e, 0x6b, 0xea, 0x78, 0xc6, 0xde, 0xc0, 0x81, 0x3d, 0x08, 0xf3, 0x59, 0x3c, 0x7c, 0x13, 0xbd,
+    0x21, 0xe4, 0x2b, 0x49, 0xaf, 0xd5, 0xa5, 0x0c, 0xc2, 0x20, 0x5e, 0x81, 0x73, 0xa9, 0x0b, 0x75, 0x72, 0x65, 0x76,
+    0x1c, 0x3e, 0x5d, 0x36, 0x9e, 0xce, 0x21, 0xa2, 0x0f, 0x5a, 0xa9, 0xf4, 0xfb, 0xe1, 0x05, 0x2b, 0xe7, 0x67, 0xe1,
+    0x98, 0x00, 0x0e, 0x8f, 0x1e, 0xce, 0x8b, 0xd1, 0x2d, 0xbd, 0x18, 0xdd, 0x11, 0xb0, 0xf0, 0x1a, 0x4f, 0xd7, 0x87,
+    0x2c, 0x9e, 0x0e, 0x06, 0x6b, 0xa4, 0xea, 0x2a, 0xf7, 0x9a, 0x2c, 0xe8, 0x05, 0x4e, 0x04, 0x01, 0x86, 0x3e, 0x13,
+    0x6b, 0x43, 0xc3, 0xdf, 0x30, 0xf8, 0xf8, 0x8e, 0x5d, 0x8c, 0xee, 0xe8, 0x2d, 0x7b, 0xb3, 0x1d, 0x4f, 0x81, 0x99,
+    0x5a, 0xcd, 0xc2, 0xbb, 0xc3, 0xcb, 0xd9, 0x25, 0xbb, 0x8b, 0xee, 0x8e, 0xa0, 0xa1, 0x57, 0xec, 0x0e, 0x01, 0x97,
+    0xd2, 0xc7, 0xcb, 0xc1, 0x1b, 0xb2, 0x3f, 0x18, 0xa4, 0x24, 0x0a, 0xaf, 0x43, 0xaf, 0x95, 0x6f, 0xe8, 0x1d, 0xa1,
+    0x2b, 0x76, 0x8b, 0xa3, 0x71, 0xc9, 0xf0, 0x83, 0x73, 0x76, 0x57, 0x5f, 0x87, 0xde, 0x6e, 0x4e, 0x44, 0x27, 0x88,
+    0x11, 0xfa, 0x1a, 0x38, 0x9a, 0xe5, 0xc2, 0x4c, 0xc0, 0x93, 0xb9, 0xc8, 0x68, 0x51, 0x68, 0x06, 0xe2, 0xac, 0x04,
+    0xc4, 0x92, 0xa8, 0xfb, 0xcd, 0x46, 0x67, 0xb0, 0x9c, 0xfb, 0xfd, 0x5e, 0x65, 0xe8, 0x01, 0x22, 0x67, 0x76, 0xd2,
+    0x83, 0x9e, 0x4f, 0x0f, 0xf0, 0x13, 0xbd, 0x6a, 0x10, 0x27, 0xf3, 0xbb, 0x65, 0xf4, 0x9b, 0x47, 0x1f, 0x7e, 0xe8,
+    0xa6, 0x3c, 0x22, 0xff, 0xf7, 0x29, 0x4f, 0x99, 0x47, 0x6f, 0x2a, 0x0f, 0x04, 0xcf, 0x5b, 0x93, 0x4a, 0x23, 0x51,
+    0x8d, 0xce, 0x56, 0x31, 0x68, 0x23, 0x51, 0xdb, 0xa0, 0x9f, 0xd0, 0xc2, 0x0a, 0x22, 0xe4, 0x1c, 0xbc, 0x00, 0x83,
+    0x54, 0x08, 0x95, 0xa3, 0x16, 0x25, 0x1a, 0x82, 0xe4, 0xb2, 0xe4, 0x2a, 0x7c, 0x0e, 0xa1, 0xea, 0xf4, 0x71, 0x26,
+    0xc2, 0x86, 0x1e, 0x87, 0x3e, 0x00, 0xfc, 0xaf, 0x3b, 0xe4, 0xa2, 0xe4, 0x97, 0x78, 0x36, 0xb7, 0x09, 0x46, 0xc1,
+    0x12, 0xd1, 0x0c, 0x6d, 0x83, 0xd8, 0x8f, 0x25, 0xc1, 0x7a, 0x24, 0x8d, 0x47, 0xa5, 0x39, 0x22, 0xfc, 0x28, 0x3e,
+    0x8a, 0x9e, 0xc6, 0x86, 0x44, 0x72, 0x24, 0x91, 0x7c, 0x00, 0x84, 0x93, 0xa0, 0xbf, 0xb8, 0x6b, 0xb2, 0x6b, 0x21,
+    0x31, 0xe8, 0x4f, 0x4b, 0xa6, 0x65, 0xf7, 0xaa, 0xc7, 0xbe, 0x22, 0xc8, 0x1d, 0xd3, 0x7f, 0x79, 0x7d, 0xf8, 0xe7,
+    0x12, 0x67, 0xd0, 0x7a, 0xbe, 0xa8, 0xce, 0xcc, 0xbc, 0xc1, 0x8d, 0xbc, 0x2e, 0x6b, 0xd7, 0xe5, 0x0b, 0xbe, 0xc7,
+    0x6f, 0x2b, 0x2e, 0xd2, 0x72, 0xef, 0x97, 0xaa, 0x8d, 0xe7, 0x54, 0xae, 0x57, 0x2e, 0xce, 0x8a, 0x32, 0x4e, 0xf5,
+    0xa4, 0x2e, 0xc6, 0x1a, 0xb6, 0xe1, 0xf7, 0x88, 0xba, 0x92, 0x96, 0xa3, 0xa7, 0x94, 0xab, 0x66, 0xca, 0xc5, 0x3a,
+    0xcf, 0x7f, 0xde, 0x49, 0xc5, 0x29, 0x6e, 0xa6, 0x20, 0x55, 0x6a, 0xb9, 0x80, 0xea, 0x39, 0x6a, 0xb9, 0x5b, 0x9a,
+    0x1d, 0xe0, 0xdc, 0x36, 0xd5, 0xc7, 0xca, 0xec, 0xc2, 0x4b, 0x6e, 0xdc, 0x9f, 0x4c, 0x19, 0x16, 0x8c, 0x42, 0x9b,
+    0x55, 0x57, 0xda, 0xbe, 0xd0, 0x3a, 0x0d, 0xc3, 0x95, 0x1f, 0x2f, 0x20, 0x5d, 0xc0, 0x38, 0x5e, 0x94, 0x4c, 0x8c,
+    0xdb, 0xa3, 0xb7, 0x82, 0xf8, 0x92, 0xad, 0x40, 0xc0, 0x5c, 0xc3, 0xdb, 0x75, 0x1d, 0x6d, 0xf7, 0xc4, 0x29, 0xa3,
+    0x72, 0x15, 0x8b, 0xef, 0xe3, 0x95, 0x81, 0x4c, 0x56, 0xc7, 0x63, 0x63, 0x4c, 0xa7, 0x3f, 0x25, 0xa1, 0x5f, 0x08,
+    0x05, 0x9f, 0xf5, 0xd2, 0xca, 0x93, 0xdb, 0xc3, 0x32, 0xae, 0xd1, 0x2b, 0x71, 0xa5, 0xfb, 0x66, 0xa4, 0x90, 0x7a,
+    0xe4, 0xab, 0xa6, 0x80, 0xde, 0x8c, 0x7d, 0x33, 0x15, 0xe6, 0xed, 0x9e, 0x31, 0x57, 0x08, 0x56, 0xaa, 0xec, 0xf6,
+    0x9d, 0x1a, 0x53, 0x31, 0x83, 0x29, 0xb6, 0x9d, 0xc5, 0xa4, 0x5b, 0xf9, 0xa7, 0x9d, 0xfb, 0x65, 0xde, 0xe1, 0xae,
+    0xa8, 0xdf, 0x02, 0x17, 0x9a, 0x15, 0x65, 0xd5, 0x96, 0x0d, 0xdb, 0xc6, 0x1b, 0x59, 0x28, 0x36, 0xc0, 0xb2, 0xe7,
+    0xbe, 0x85, 0x07, 0x88, 0x9b, 0x70, 0xcf, 0x2e, 0x6a, 0xb8, 0x31, 0x7c, 0x59, 0x49, 0xbe, 0x2b, 0x8d, 0xb9, 0xf4,
+    0xa9, 0xd2, 0xc4, 0x70, 0xb2, 0x18, 0x71, 0x91, 0x2e, 0xea, 0xcc, 0xae, 0x85, 0xcf, 0x78, 0x19, 0xce, 0xf9, 0xc2,
+    0xe8, 0xa6, 0x74, 0xe9, 0x05, 0x8b, 0x75, 0xa7, 0x37, 0x2b, 0x8d, 0x95, 0x12, 0x71, 0x6b, 0x96, 0x09, 0x94, 0xa5,
+    0xac, 0x95, 0xf0, 0xa6, 0x68, 0xd9, 0x4a, 0x1a, 0x79, 0xcf, 0x1c, 0xdc, 0xc7, 0x7e, 0x40, 0x4c, 0x64, 0x13, 0x98,
+    0x14, 0x0d, 0x1d, 0xd0, 0xae, 0xba, 0xf0, 0xcd, 0xa8, 0x07, 0x83, 0xdc, 0x92, 0x44, 0xac, 0x20, 0xc5, 0x0a, 0xd6,
+    0x35, 0x2b, 0xe6, 0xf9, 0x82, 0x5e, 0x30, 0x39, 0x4f, 0x17, 0x74, 0xc5, 0xe4, 0x7c, 0x8d, 0x37, 0xa1, 0x0b, 0x38,
+    0x21, 0xc9, 0x26, 0x56, 0x0a, 0xd8, 0x0b, 0xbc, 0xbc, 0xe1, 0x99, 0xaa, 0x69, 0xd9, 0xa5, 0xe2, 0x00, 0xe3, 0xf3,
+    0x32, 0x0c, 0xcb, 0xe1, 0x05, 0x58, 0x4b, 0xec, 0x87, 0xab, 0x39, 0x5f, 0xa8, 0xdf, 0x10, 0x70, 0x3e, 0x09, 0x15,
+    0xbb, 0x60, 0xf7, 0x02, 0x99, 0x5e, 0xcd, 0xf9, 0x42, 0x8d, 0x84, 0x2e, 0xf8, 0xca, 0x1a, 0x9b, 0xc4, 0x9e, 0xa0,
+    0x65, 0x16, 0xcf, 0xc7, 0x8b, 0x28, 0xae, 0x61, 0x19, 0x9e, 0xaa, 0x99, 0x69, 0xc9, 0x7f, 0x12, 0xb5, 0xa1, 0x89,
+    0xbe, 0xc1, 0x2a, 0xf2, 0x87, 0xc7, 0x47, 0x97, 0x40, 0xc6, 0xce, 0xae, 0x64, 0xe6, 0x43, 0xdf, 0x47, 0x06, 0xf7,
+    0xdc, 0x94, 0x33, 0xae, 0x82, 0x44, 0x19, 0xb8, 0x7b, 0x35, 0x4b, 0xc6, 0x5a, 0x84, 0xef, 0x1e, 0x15, 0x45, 0x9f,
+    0x49, 0xd3, 0x80, 0xee, 0x23, 0xc1, 0x1c, 0xe8, 0xbd, 0x42, 0x87, 0xcb, 0x6a, 0x9b, 0x09, 0xf8, 0x8b, 0x04, 0xf9,
+    0xad, 0xd0, 0xab, 0x1a, 0x83, 0x2a, 0xda, 0x45, 0x2c, 0xfd, 0xfb, 0x88, 0x1f, 0x65, 0xf3, 0x2f, 0x73, 0x8f, 0x57,
+    0x12, 0x06, 0x3f, 0xa4, 0x66, 0x93, 0xcc, 0xdb, 0x2b, 0xf6, 0x3d, 0x74, 0xd4, 0xa3, 0xd6, 0x78, 0x5f, 0xbd, 0xe0,
+    0x14, 0x62, 0x94, 0x50, 0x74, 0x12, 0x0c, 0xe0, 0x76, 0x09, 0x29, 0xee, 0x06, 0xbb, 0x69, 0x5e, 0xf3, 0xa2, 0xe0,
+    0x7c, 0x5d, 0x55, 0x81, 0x1f, 0xd0, 0x70, 0xbe, 0xd8, 0x0d, 0x61, 0x38, 0xa6, 0xad, 0x6b, 0x18, 0x84, 0x19, 0xc3,
+    0x48, 0x08, 0x5e, 0xff, 0xa2, 0x27, 0x34, 0x89, 0x57, 0xdf, 0xf1, 0x4f, 0x19, 0x2f, 0x14, 0x91, 0x06, 0x11, 0x52,
+    0x37, 0xf1, 0x8d, 0x4c, 0x93, 0x02, 0x0a, 0x01, 0x46, 0x01, 0x95, 0xd8, 0xd0, 0x54, 0xfc, 0xad, 0x16, 0x1f, 0xfc,
+    0xd4, 0x74, 0x3c, 0x1a, 0xd7, 0xad, 0xce, 0xa8, 0xa0, 0x33, 0xd0, 0xa3, 0x56, 0xd4, 0xd3, 0xa0, 0x95, 0x60, 0x1a,
+    0x69, 0xde, 0xba, 0x87, 0xc0, 0x2b, 0xd3, 0xe2, 0x9d, 0x07, 0x74, 0x73, 0xe6, 0x83, 0x27, 0x8f, 0xe9, 0x99, 0x43,
+    0x4f, 0xae, 0xd8, 0x51, 0xd5, 0x43, 0xed, 0xbd, 0x19, 0xa1, 0xa0, 0xdf, 0xc7, 0x14, 0xe8, 0x46, 0x50, 0x7b, 0x57,
+    0xf7, 0x1f, 0xcb, 0x5d, 0x0e, 0xdf, 0x71, 0x96, 0x1b, 0xc0, 0x52, 0x91, 0xb5, 0x02, 0x8f, 0x02, 0xd4, 0xa5, 0x32,
+    0x84, 0x2d, 0xe6, 0x70, 0xa8, 0xec, 0x56, 0xad, 0x86, 0x92, 0x1c, 0x96, 0x23, 0x70, 0x08, 0x5d, 0x97, 0x83, 0x72,
+    0xb4, 0xcc, 0xaa, 0xf7, 0xf8, 0x5b, 0xb3, 0x0e, 0x49, 0x76, 0x1f, 0xeb, 0xc0, 0x2d, 0xeb, 0x30, 0xfd, 0x68, 0x90,
+    0x02, 0xd0, 0x64, 0x23, 0x70, 0x09, 0xc0, 0x7b, 0xfb, 0x8f, 0x08, 0xb5, 0x32, 0xbd, 0x97, 0xb1, 0x50, 0xdf, 0x37,
+    0x92, 0xa0, 0x84, 0x66, 0x42, 0xe5, 0x58, 0x0a, 0xde, 0x79, 0xa4, 0x73, 0x52, 0x67, 0xe2, 0x3d, 0x88, 0xd3, 0xc2,
+    0x07, 0xf6, 0x16, 0x04, 0xe7, 0x2c, 0xe8, 0x1d, 0xde, 0x66, 0xb5, 0xd4, 0x46, 0x0f, 0x14, 0xc0, 0xef, 0x06, 0x77,
+    0x08, 0xf2, 0xd5, 0x18, 0xae, 0x95, 0xbc, 0x09, 0xf9, 0xb0, 0xa0, 0x07, 0x64, 0x60, 0x9f, 0xc5, 0x30, 0xa6, 0x07,
+    0xe4, 0xd0, 0x3e, 0x4b, 0x37, 0x80, 0x03, 0xa9, 0x47, 0x95, 0x1e, 0x40, 0x83, 0x7e, 0xb7, 0x2d, 0xb2, 0x24, 0xeb,
+    0xc7, 0xd2, 0x28, 0x62, 0xa0, 0x4a, 0x10, 0x51, 0x8b, 0x7f, 0x3e, 0x98, 0xeb, 0x0e, 0x73, 0x81, 0x30, 0x07, 0x03,
+    0x0e, 0xe2, 0x36, 0x08, 0xcd, 0x01, 0xb3, 0xb9, 0x8d, 0x04, 0xbd, 0xb3, 0x86, 0x99, 0x1d, 0xfd, 0xe1, 0x56, 0x82,
+    0x6f, 0xb2, 0xd6, 0xa8, 0xf3, 0xe2, 0x10, 0x08, 0x82, 0x37, 0x85, 0xaa, 0xf6, 0xaa, 0x07, 0x36, 0xde, 0xaa, 0x1f,
+    0xdb, 0xed, 0x78, 0x2a, 0xdc, 0xb5, 0x5f, 0x50, 0x38, 0xf9, 0x94, 0xfc, 0xeb, 0xbd, 0xc9, 0xe0, 0xc0, 0xc8, 0xf0,
+    0xa5, 0xb7, 0x7f, 0xe1, 0x6b, 0x2d, 0xdd, 0x13, 0x83, 0x92, 0x3c, 0x3e, 0x50, 0xf4, 0xef, 0x5e, 0x59, 0xf9, 0xd4,
+    0x4e, 0xff, 0x76, 0x6b, 0xd6, 0xe7, 0xe1, 0x68, 0xb2, 0xdd, 0xf6, 0xb4, 0x81, 0x2b, 0xd5, 0x2a, 0x04, 0xec, 0x42,
+    0x49, 0xf6, 0x0f, 0x20, 0x2a, 0x42, 0x33, 0xee, 0x66, 0xd9, 0x90, 0xc8, 0xf8, 0x71, 0x3a, 0xcb, 0x86, 0x60, 0x87,
+    0x7b, 0x51, 0x89, 0xcb, 0x51, 0x6b, 0x83, 0xd3, 0xb3, 0x24, 0x84, 0x50, 0x0e, 0x58, 0xd9, 0xad, 0xfa, 0x73, 0xa7,
+    0xcc, 0x84, 0xd4, 0x64, 0x75, 0x3b, 0xa5, 0x7b, 0x98, 0xe6, 0x7b, 0x66, 0x04, 0x07, 0xdc, 0xdb, 0x5f, 0xf5, 0xc7,
+    0x30, 0xc9, 0x34, 0x39, 0x45, 0xf2, 0x8b, 0xf4, 0x14, 0x92, 0x76, 0xe8, 0xa9, 0x22, 0x80, 0x13, 0x6a, 0x3f, 0x86,
+    0xdf, 0x30, 0xee, 0xdf, 0x35, 0x5f, 0xbb, 0xa9, 0x88, 0x9e, 0x52, 0x2c, 0x53, 0x93, 0xd3, 0x24, 0x2b, 0x12, 0x88,
+    0xda, 0xa8, 0x9a, 0x11, 0x3d, 0x71, 0x31, 0x1f, 0x15, 0xe1, 0xf3, 0x6a, 0xfd, 0x9f, 0x21, 0x7c, 0x46, 0xe1, 0x06,
+    0x70, 0x79, 0xc5, 0xe5, 0x79, 0xf8, 0xec, 0x29, 0xdd, 0x9b, 0x7c, 0x73, 0x40, 0xf7, 0x0e, 0x9e, 0x3c, 0x23, 0x00,
+    0x8b, 0x76, 0x79, 0x1e, 0x1e, 0x3c, 0x7b, 0x46, 0xf7, 0xbe, 0xfd, 0x96, 0xee, 0x4d, 0x9e, 0x1c, 0x34, 0xd2, 0x26,
+    0xcf, 0xbe, 0xa5, 0x7b, 0xdf, 0x3c, 0x6d, 0xa4, 0x1d, 0x8c, 0x9f, 0xd1, 0xbd, 0xbf, 0x7f, 0x63, 0xd2, 0xfe, 0x06,
+    0xd9, 0xbe, 0x3d, 0xc0, 0xff, 0x4c, 0xda, 0xe4, 0xd9, 0x13, 0xba, 0x37, 0x19, 0x43, 0x25, 0xcf, 0x5c, 0x25, 0xe3,
+    0x09, 0x7c, 0xfc, 0x04, 0xfe, 0xfb, 0x1b, 0x09, 0x16, 0xb4, 0x92, 0x2c, 0x17, 0xa8, 0x3f, 0x43, 0x11, 0x27, 0xaa,
+    0x26, 0x12, 0x1e, 0x62, 0x66, 0xf5, 0x4d, 0x1c, 0x06, 0xc4, 0xa5, 0x43, 0x41, 0x74, 0x6f, 0x3c, 0x7a, 0x46, 0x02,
+    0x1f, 0x9e, 0xee, 0xc6, 0x07, 0x19, 0xcb, 0xc5, 0x3c, 0xfb, 0x2a, 0x37, 0xb1, 0x15, 0x3c, 0x00, 0xab, 0x8f, 0x7e,
+    0xae, 0x4a, 0xce, 0xb3, 0xaf, 0x2a, 0xb9, 0x9b, 0xeb, 0xf7, 0x16, 0xa0, 0xbc, 0xbf, 0x6a, 0xd9, 0x4d, 0xa1, 0x42,
+    0xa7, 0xb5, 0x46, 0x9f, 0x7d, 0xc4, 0xf4, 0xc1, 0xc0, 0xbb, 0x61, 0xff, 0xb4, 0x53, 0x4e, 0xeb, 0x1b, 0x8d, 0x42,
+    0x8d, 0xca, 0x43, 0xc2, 0x8e, 0xa0, 0xe8, 0xc1, 0x00, 0x78, 0x02, 0x0f, 0xf7, 0xed, 0xdf, 0x2c, 0xe3, 0x63, 0x47,
+    0x19, 0xbf, 0xa0, 0x0c, 0x01, 0x8d, 0x7a, 0x98, 0xdd, 0xf4, 0xb0, 0xd1, 0xad, 0x5e, 0xb2, 0x54, 0x27, 0x53, 0xd3,
+    0x33, 0xd8, 0xd7, 0xba, 0x96, 0x7b, 0x46, 0x14, 0x2d, 0x2f, 0xf6, 0x52, 0x3e, 0xab, 0xd8, 0x4f, 0x4b, 0x54, 0x6f,
+    0x45, 0x8d, 0x37, 0x32, 0x9b, 0x55, 0xec, 0x7b, 0xf3, 0x06, 0xb8, 0x19, 0xf6, 0xbb, 0x7a, 0xf2, 0x03, 0x67, 0x70,
+    0x69, 0xdb, 0xa3, 0x4c, 0x8c, 0x00, 0x2b, 0x20, 0x03, 0x07, 0x1e, 0x00, 0x1d, 0xf4, 0x47, 0x7b, 0xbb, 0x55, 0x29,
+    0xcd, 0x3e, 0x5b, 0x18, 0x40, 0xc3, 0xbc, 0x4d, 0x5c, 0xd9, 0xff, 0x6a, 0xc8, 0x4b, 0x50, 0xb8, 0xd5, 0x2c, 0x6f,
+    0xa7, 0x30, 0x84, 0x10, 0xfc, 0x71, 0xc9, 0x00, 0x70, 0x20, 0xc0, 0x60, 0xac, 0x65, 0x40, 0xcd, 0x96, 0x8f, 0x36,
+    0x5c, 0xa9, 0x27, 0x81, 0x33, 0xb8, 0x90, 0x45, 0xc2, 0x4f, 0xb4, 0xd8, 0x1f, 0xad, 0x1f, 0x7d, 0xdf, 0x1e, 0x0f,
+    0xd6, 0xbe, 0xc7, 0x47, 0xfa, 0xb3, 0xc6, 0x75, 0x60, 0xd3, 0xf2, 0x8d, 0x17, 0xb5, 0x95, 0x78, 0x94, 0xc0, 0x1b,
+    0x98, 0x88, 0x14, 0x06, 0xa9, 0x16, 0x38, 0x06, 0xe5, 0x8d, 0x85, 0x58, 0xaa, 0xae, 0x6e, 0xb0, 0x05, 0x91, 0x21,
+    0x78, 0xb8, 0xfd, 0x6b, 0xa9, 0x02, 0x47, 0xf5, 0xfb, 0x5c, 0xfa, 0x6e, 0x4f, 0xc6, 0x8e, 0x1c, 0xa7, 0x7e, 0x2a,
+    0x1c, 0xfc, 0x37, 0xa9, 0x6b, 0x63, 0xb9, 0x92, 0x32, 0xcb, 0xb2, 0xb0, 0xa3, 0x50, 0xcb, 0x3d, 0x2a, 0x0f, 0x92,
+    0x2f, 0xe4, 0x10, 0xc9, 0x02, 0xa3, 0x50, 0x90, 0xe1, 0x84, 0x8a, 0xd1, 0x5a, 0x94, 0xcb, 0xec, 0xa2, 0x0a, 0x37,
+    0x4a, 0xa1, 0xcc, 0x29, 0xfa, 0x76, 0x83, 0x03, 0x09, 0x89, 0xb2, 0xf2, 0x6d, 0xfc, 0x36, 0x44, 0xb0, 0x3a, 0xae,
+    0x6d, 0xa1, 0xb8, 0xb7, 0x3f, 0x79, 0xda, 0xc5, 0x1f, 0x19, 0x17, 0x50, 0x17, 0x8b, 0x69, 0x38, 0xb1, 0xb1, 0x6f,
+    0xdc, 0x17, 0x56, 0xd3, 0x03, 0x50, 0xdf, 0xa5, 0x12, 0x23, 0xa8, 0xaf, 0x8c, 0x7d, 0x6c, 0x8f, 0x31, 0x39, 0x83,
+    0x58, 0xc3, 0x2a, 0x67, 0xa6, 0xfa, 0x46, 0xd8, 0x11, 0x00, 0x37, 0x42, 0x6b, 0x14, 0x04, 0x1e, 0xaf, 0x42, 0x3c,
+    0x2f, 0x55, 0xf8, 0xd6, 0x8c, 0xd0, 0x31, 0x78, 0x53, 0xd9, 0x46, 0x66, 0xd2, 0x17, 0x0c, 0x9a, 0x63, 0x5b, 0x47,
+    0x61, 0xb5, 0x95, 0x65, 0x47, 0x00, 0x37, 0x90, 0x1d, 0x9a, 0x8b, 0xe7, 0xac, 0x9a, 0x67, 0x8b, 0xc8, 0x04, 0x05,
+    0x5c, 0x0a, 0xcb, 0xa0, 0x7d, 0xba, 0x47, 0xb6, 0xe3, 0x10, 0xba, 0xe1, 0x3e, 0x82, 0xf1, 0xb4, 0x9b, 0x82, 0x15,
+    0x44, 0x23, 0xc4, 0xc3, 0x8c, 0x59, 0x7c, 0xaf, 0x34, 0xe5, 0xa9, 0x6a, 0x09, 0x04, 0x8e, 0x42, 0xa8, 0x8b, 0x5d,
+    0xa3, 0x04, 0x97, 0xa9, 0x11, 0xcc, 0x60, 0xc7, 0x8e, 0xd4, 0x76, 0xc9, 0x39, 0x1d, 0xaa, 0x29, 0x2d, 0xf5, 0x94,
+    0x6a, 0x5f, 0x43, 0x31, 0x2f, 0xd1, 0x43, 0x0f, 0x5c, 0x0f, 0xb4, 0x43, 0x5e, 0x49, 0x27, 0x26, 0x82, 0x4e, 0xab,
+    0x4d, 0xd8, 0xb9, 0x91, 0x6e, 0x59, 0x8d, 0xbc, 0x63, 0x68, 0x76, 0xc4, 0x4b, 0x3f, 0x50, 0x17, 0x40, 0x84, 0xdc,
+    0xdb, 0x22, 0x73, 0x44, 0xb3, 0xac, 0x7c, 0x05, 0x65, 0x71, 0xc4, 0xd6, 0x15, 0x70, 0x2d, 0x05, 0x93, 0x4b, 0x1e,
+    0xf1, 0x14, 0x11, 0x01, 0x8f, 0x95, 0x76, 0x7d, 0xa7, 0x25, 0x84, 0x66, 0x29, 0x10, 0x37, 0x17, 0xc5, 0xb9, 0xb6,
+    0x81, 0x2c, 0x80, 0xbe, 0xfd, 0x9c, 0x5d, 0x79, 0xe1, 0x60, 0x37, 0x57, 0x99, 0x78, 0xc1, 0x2f, 0x32, 0xc1, 0x53,
+    0x04, 0xbb, 0xba, 0x35, 0x0f, 0xdc, 0xb1, 0x6d, 0x60, 0xf9, 0xf6, 0x1d, 0x2c, 0x98, 0x32, 0xd4, 0x4a, 0x89, 0x4c,
+    0x44, 0x02, 0x32, 0xfb, 0xcc, 0xdd, 0x9b, 0x4c, 0xbc, 0x89, 0x6f, 0xc1, 0x9b, 0xa2, 0xc1, 0x4f, 0x8f, 0xce, 0xf1,
+    0x4b, 0x44, 0x12, 0x85, 0x18, 0xb6, 0x18, 0x11, 0x0b, 0x91, 0x63, 0xc7, 0x84, 0x72, 0x25, 0x68, 0x6d, 0x0d, 0x81,
+    0x17, 0x7f, 0x5a, 0x75, 0xef, 0x2a, 0x13, 0xc6, 0x3e, 0xe3, 0x2a, 0xbe, 0x65, 0xa5, 0x02, 0xb3, 0xc0, 0x38, 0xf7,
+    0x6d, 0x29, 0xc9, 0x55, 0x26, 0x8c, 0x80, 0xe4, 0x2a, 0xbe, 0xa5, 0x4d, 0x19, 0x87, 0xb6, 0xa2, 0xf3, 0xe2, 0xfc,
+    0xee, 0x0e, 0xbf, 0xc4, 0x50, 0x2b, 0xe3, 0x7e, 0x1f, 0x24, 0x66, 0xd2, 0x36, 0x65, 0x26, 0x23, 0xa9, 0xd1, 0x42,
+    0x2a, 0xca, 0x07, 0x13, 0xb2, 0xbb, 0x52, 0x2d, 0x23, 0x6a, 0xbf, 0x0a, 0xc5, 0x6c, 0x1c, 0x4d, 0x08, 0x9d, 0x74,
+    0xac, 0x77, 0xd3, 0x5a, 0xc8, 0x34, 0x7a, 0x16, 0x79, 0x3e, 0x9d, 0x05, 0xab, 0xa6, 0xc5, 0x21, 0xe3, 0xd3, 0x62,
+    0x30, 0x20, 0xda, 0xa5, 0x70, 0x83, 0xf5, 0x80, 0x29, 0x8d, 0x8b, 0xb7, 0x66, 0x5a, 0xfd, 0x4a, 0xaa, 0x90, 0xf4,
+    0x9e, 0x01, 0x49, 0x26, 0x5d, 0xb0, 0x5b, 0x90, 0x28, 0x7a, 0xfe, 0x77, 0x6a, 0x0b, 0xee, 0x7a, 0x30, 0x36, 0xa3,
+    0xfb, 0x7a, 0xc6, 0x7f, 0xa8, 0x6d, 0x41, 0xd4, 0xa7, 0x92, 0xf5, 0x3a, 0x12, 0x55, 0xc8, 0x45, 0xf8, 0xd9, 0xd1,
+    0x10, 0x43, 0x54, 0x7b, 0x2c, 0x10, 0xeb, 0xab, 0x73, 0x5e, 0xe0, 0xf4, 0x33, 0x77, 0xb9, 0x82, 0x6d, 0x41, 0x2b,
+    0x43, 0xa3, 0xde, 0xc6, 0x6f, 0x23, 0x7b, 0x59, 0xd0, 0x45, 0xbe, 0x40, 0x21, 0x6b, 0x1e, 0x86, 0xd5, 0xb0, 0x3d,
+    0x88, 0x64, 0xbf, 0x3d, 0x09, 0x8d, 0xc6, 0xc0, 0x02, 0xd9, 0xa1, 0x11, 0xb8, 0x08, 0xad, 0xfc, 0xed, 0x10, 0x5c,
+    0xb8, 0x2c, 0x22, 0xcb, 0x50, 0xc7, 0x6f, 0x6a, 0x37, 0x41, 0xf5, 0x0a, 0x9d, 0xa6, 0xb0, 0x2a, 0x65, 0x92, 0x0f,
+    0xbf, 0x5e, 0xc9, 0x02, 0x33, 0x79, 0x5d, 0xf6, 0xe8, 0x6b, 0xbb, 0xbd, 0x03, 0x53, 0xb0, 0xee, 0x93, 0xf7, 0xf5,
+    0xe3, 0xce, 0x9e, 0x80, 0x51, 0xac, 0xca, 0xd1, 0x14, 0x52, 0x6a, 0x1f, 0x94, 0xfa, 0x63, 0xb8, 0x14, 0x9a, 0x63,
+    0xb7, 0x80, 0x49, 0xc0, 0x3e, 0x43, 0xaa, 0xc7, 0xb4, 0x63, 0x9f, 0xa3, 0x0d, 0x2c, 0x09, 0x38, 0xfc, 0xa3, 0x4c,
+    0xd6, 0xfe, 0xd5, 0x5d, 0xa4, 0xcd, 0x90, 0x2d, 0xf3, 0x05, 0xf0, 0xf9, 0xb0, 0x6b, 0xa3, 0x12, 0x65, 0x13, 0x91,
+    0xa4, 0xb0, 0xe5, 0x31, 0x48, 0x7b, 0x14, 0xd3, 0x55, 0xc1, 0x93, 0x0c, 0xa5, 0x14, 0x89, 0xf6, 0x09, 0xce, 0xe1,
+    0x0d, 0xee, 0x47, 0x15, 0x10, 0x5e, 0x85, 0x9c, 0x8e, 0x52, 0xaa, 0x2d, 0x60, 0x14, 0xf5, 0x00, 0x51, 0x5e, 0x06,
+    0x72, 0xbc, 0xed, 0x76, 0x42, 0x57, 0x6c, 0x39, 0x9c, 0x50, 0x24, 0x25, 0x97, 0x58, 0xee, 0x15, 0xe8, 0x3c, 0xce,
+    0x59, 0xef, 0x25, 0x60, 0x11, 0x9c, 0xc1, 0xdf, 0x98, 0xd0, 0x6b, 0xf8, 0x9b, 0x13, 0xfa, 0x86, 0x85, 0x57, 0xc3,
+    0x4b, 0xb2, 0x1f, 0xa6, 0x83, 0x89, 0x12, 0x8c, 0xdd, 0xb1, 0x65, 0x19, 0xaa, 0xc4, 0xd5, 0xfe, 0x05, 0x79, 0x7c,
+    0x41, 0x6f, 0xe9, 0x0d, 0x3d, 0xa5, 0x27, 0x40, 0xf8, 0xef, 0x0e, 0x27, 0x7c, 0x38, 0x79, 0xda, 0xef, 0xf7, 0xce,
+    0xfb, 0xfd, 0xde, 0x99, 0x31, 0xa0, 0xd0, 0xbb, 0xe8, 0xb2, 0xa6, 0xfa, 0xd7, 0x55, 0xbd, 0x98, 0x9e, 0xa8, 0x8d,
+    0x9b, 0xf0, 0x2c, 0x0f, 0xaf, 0xf6, 0xef, 0xc8, 0x10, 0x1f, 0x2f, 0x72, 0x29, 0x8b, 0xf0, 0x72, 0xff, 0x8e, 0xd0,
+    0x93, 0x23, 0xd0, 0x9b, 0x62, 0x7d, 0x27, 0x8f, 0xef, 0x74, 0x6d, 0x84, 0xbe, 0x0c, 0x13, 0xd8, 0x26, 0xb7, 0xcc,
+    0xde, 0xb5, 0x27, 0x63, 0x88, 0x65, 0x72, 0xe7, 0x95, 0x77, 0xf7, 0xf8, 0x96, 0xec, 0xdf, 0x82, 0xa7, 0xa8, 0x25,
+    0x7f, 0xb3, 0xf0, 0x86, 0xb5, 0x6a, 0x78, 0x7c, 0x47, 0x4f, 0x5b, 0x8d, 0x78, 0x7c, 0x47, 0xa2, 0xf0, 0x86, 0x5d,
+    0xd2, 0x53, 0x76, 0x45, 0xe8, 0x79, 0xbf, 0x7f, 0xd6, 0xef, 0xcb, 0x7e, 0xff, 0xa7, 0x38, 0x0c, 0xe3, 0x61, 0x41,
+    0xf6, 0x25, 0xbd, 0xdb, 0x9f, 0xf0, 0x27, 0x64, 0x16, 0xea, 0xe6, 0xab, 0x05, 0x67, 0x55, 0xde, 0x2a, 0xd7, 0x1d,
+    0x05, 0x6b, 0x85, 0x3b, 0xa6, 0x9e, 0x4e, 0xe8, 0x0d, 0x2b, 0xe8, 0x29, 0x8b, 0x49, 0x74, 0x0d, 0xad, 0x38, 0x9f,
+    0x15, 0xd1, 0x0d, 0x3d, 0x65, 0x67, 0xb3, 0x38, 0x3a, 0xa5, 0x27, 0x2c, 0x1f, 0x4e, 0x20, 0xef, 0xe9, 0xf0, 0x86,
+    0xec, 0x9f, 0x90, 0x28, 0x3c, 0xd1, 0xbf, 0xef, 0xe8, 0x25, 0x0f, 0x4f, 0xa8, 0x57, 0xcd, 0x09, 0x31, 0xd5, 0x37,
+    0x6a, 0x3f, 0x21, 0x91, 0x3f, 0x98, 0x27, 0xd6, 0x9e, 0xe6, 0x91, 0xa3, 0x8d, 0x69, 0x19, 0x82, 0xbe, 0xb9, 0x0c,
+    0x6f, 0x08, 0x99, 0x36, 0xc7, 0x0e, 0x06, 0x74, 0xf6, 0x28, 0x4a, 0x08, 0xbd, 0xf1, 0x4b, 0xbd, 0xc1, 0x31, 0x34,
+    0x23, 0xa4, 0xd2, 0x4e, 0x31, 0x0d, 0xd7, 0xc1, 0x6b, 0x0d, 0xd6, 0x71, 0xde, 0xef, 0x87, 0xeb, 0x7e, 0x1f, 0x22,
+    0xdd, 0x17, 0x33, 0x13, 0xdb, 0xcd, 0x91, 0x4d, 0x7a, 0x03, 0xda, 0xff, 0xd7, 0x83, 0x01, 0x74, 0xc6, 0x2b, 0x29,
+    0xbc, 0x19, 0xbc, 0x7e, 0x7c, 0x47, 0x54, 0x1d, 0x05, 0x15, 0x32, 0x2c, 0xe8, 0x1b, 0x9a, 0x01, 0xe0, 0xd7, 0xeb,
+    0xc1, 0x80, 0x44, 0xe6, 0x33, 0x32, 0x7d, 0x7d, 0x78, 0x32, 0x1d, 0x0c, 0x5e, 0x9b, 0x6d, 0xf2, 0x96, 0xdd, 0x53,
+    0x0a, 0xac, 0xbf, 0xb3, 0x7e, 0xff, 0xed, 0x51, 0x4c, 0xce, 0x0b, 0x1e, 0x7f, 0x9c, 0x36, 0xdb, 0xf2, 0xd6, 0x45,
+    0x55, 0x3b, 0xeb, 0xf7, 0xd7, 0xfd, 0xfe, 0x29, 0x60, 0x17, 0xcd, 0x9c, 0xaf, 0x27, 0x48, 0x5b, 0xe6, 0x8e, 0x22,
+    0x69, 0x92, 0x43, 0x63, 0x68, 0x5b, 0xac, 0xda, 0x36, 0xeb, 0xc8, 0xc0, 0xe2, 0xa8, 0x59, 0x51, 0x5c, 0x93, 0x28,
+    0xec, 0x9d, 0x6d, 0xb7, 0xa7, 0x8c, 0xb1, 0x98, 0x80, 0xf4, 0xc3, 0x7f, 0x7d, 0x5a, 0x37, 0x62, 0x88, 0x09, 0x89,
+    0xcc, 0xe6, 0x66, 0x69, 0x0f, 0x81, 0x88, 0xc3, 0xa6, 0x7f, 0x6f, 0xee, 0xe5, 0xa2, 0x76, 0x7c, 0xeb, 0x2f, 0x00,
+    0x42, 0x24, 0x59, 0xc8, 0x67, 0x38, 0x06, 0x65, 0x06, 0x40, 0xe6, 0x91, 0x9a, 0x79, 0x09, 0x20, 0xc0, 0x64, 0xbb,
+    0x1d, 0x8d, 0xc7, 0x13, 0x5a, 0xb0, 0xd1, 0xdf, 0x9e, 0x3d, 0xae, 0x1e, 0x87, 0x41, 0x30, 0xc8, 0x48, 0x4b, 0x4f,
+    0x61, 0x17, 0x6b, 0xb5, 0x0f, 0x46, 0xf0, 0x9a, 0x7d, 0xbc, 0xce, 0xbe, 0x98, 0x7d, 0x44, 0xc2, 0xda, 0x60, 0x1c,
+    0xb9, 0x48, 0x5b, 0x7a, 0xbb, 0x7b, 0x18, 0x4c, 0x2e, 0xd2, 0xcf, 0xb0, 0x9d, 0x3e, 0xff, 0xe6, 0xc1, 0x78, 0xc2,
+    0xc1, 0xe8, 0x2e, 0x0a, 0xfa, 0x4c, 0xdb, 0x6e, 0x2b, 0xff, 0x12, 0xf8, 0x16, 0x53, 0x41, 0xc7, 0x66, 0x59, 0xb8,
+    0x41, 0x45, 0xd4, 0xd1, 0x32, 0xa8, 0x6a, 0x65, 0x3b, 0x07, 0xd4, 0x12, 0xab, 0x32, 0x71, 0x0b, 0x0c, 0x43, 0x86,
+    0xba, 0xdc, 0xe3, 0xea, 0x5f, 0xbc, 0x90, 0x06, 0x3e, 0xc3, 0x89, 0x08, 0x3d, 0x6e, 0x8d, 0xfb, 0xdc, 0x9a, 0xf8,
+    0x0c, 0xb7, 0x56, 0x22, 0x89, 0x35, 0xb0, 0xa4, 0xe6, 0x72, 0x94, 0xb0, 0xa3, 0x92, 0xf1, 0x59, 0x19, 0x25, 0x34,
+    0x86, 0x07, 0xc9, 0xc4, 0x4c, 0x46, 0x09, 0xda, 0x27, 0xba, 0x08, 0x83, 0x7f, 0x01, 0x66, 0x3f, 0xcd, 0xe1, 0xaf,
+    0x24, 0xd3, 0xe4, 0x10, 0x02, 0x42, 0x1c, 0x8e, 0x67, 0x71, 0x38, 0x26, 0x51, 0x72, 0x04, 0x4f, 0xf0, 0x5f, 0x11,
+    0x8e, 0x49, 0xad, 0xef, 0x30, 0x52, 0x5d, 0x6e, 0x13, 0x06, 0x70, 0x65, 0xe3, 0xd9, 0x24, 0xb2, 0xd2, 0x5d, 0xf9,
+    0x78, 0x34, 0x7e, 0x46, 0xa6, 0x71, 0x28, 0x07, 0x09, 0xa1, 0xe0, 0xdd, 0x1b, 0x96, 0xc3, 0x44, 0xc3, 0xb3, 0x01,
+    0x9b, 0x57, 0x3a, 0x36, 0x4f, 0xc2, 0x09, 0x08, 0xc3, 0x84, 0x1c, 0xeb, 0x3d, 0x48, 0x29, 0xfa, 0x3c, 0xc7, 0x7e,
+    0xea, 0x23, 0x08, 0xb3, 0xa3, 0x96, 0x8a, 0xaf, 0x00, 0xe8, 0x12, 0x07, 0x87, 0xda, 0x33, 0x5f, 0xcc, 0xc2, 0xd2,
+    0xa3, 0x52, 0xa6, 0xba, 0x7d, 0xd1, 0xa0, 0xfc, 0xa6, 0x41, 0xfb, 0x82, 0x0c, 0x26, 0xb4, 0x3c, 0x9a, 0xf0, 0x27,
+    0x10, 0xc0, 0xa3, 0x11, 0xf1, 0x4b, 0xe1, 0xc4, 0x40, 0x78, 0x15, 0x64, 0xa0, 0xd2, 0x5a, 0x35, 0x66, 0x64, 0x2b,
+    0xde, 0x83, 0x30, 0x29, 0x7b, 0x37, 0x72, 0x9d, 0xa7, 0x10, 0x15, 0x6c, 0x9d, 0x57, 0x7b, 0x97, 0x60, 0xc9, 0x1e,
+    0x57, 0x10, 0x27, 0x6c, 0xbd, 0x02, 0xec, 0xdc, 0x47, 0x9b, 0xb2, 0xde, 0x53, 0xdf, 0xed, 0x61, 0xcb, 0xe1, 0x55,
+    0x25, 0xf7, 0x26, 0xe3, 0xf1, 0x78, 0xf4, 0x07, 0x1c, 0x1d, 0x40, 0x68, 0x49, 0x64, 0xf8, 0x64, 0x80, 0xc6, 0x5d,
+    0x57, 0xdc, 0x1b, 0x17, 0x8a, 0xb2, 0xd2, 0xc9, 0x84, 0x80, 0xf8, 0xd9, 0xf4, 0x0d, 0xf6, 0x15, 0xd7, 0xf1, 0x4f,
+    0x76, 0x3f, 0x31, 0x2b, 0x5a, 0xad, 0xd4, 0xd1, 0xbb, 0x93, 0xd3, 0xd7, 0x1f, 0x5e, 0xff, 0xf6, 0xf2, 0xec, 0xf5,
+    0xdb, 0x57, 0xaf, 0xdf, 0xbe, 0xfe, 0xf0, 0xcf, 0x07, 0x18, 0x6c, 0xdf, 0x56, 0xc4, 0x8e, 0xbd, 0x77, 0x8f, 0xf1,
+    0x6a, 0xf1, 0x85, 0xb3, 0x07, 0xee, 0x16, 0x0b, 0xb0, 0x09, 0x86, 0x5b, 0x10, 0x54, 0x33, 0x1a, 0x95, 0xbe, 0x27,
+    0x20, 0xa3, 0x51, 0x21, 0x1b, 0x0f, 0x2b, 0xb6, 0x42, 0x2e, 0xde, 0x31, 0x1c, 0x7c, 0x64, 0x7f, 0x2b, 0xce, 0x84,
+    0xdb, 0xd1, 0xd6, 0xac, 0x08, 0xf8, 0x7c, 0xad, 0x45, 0xe5, 0x71, 0x21, 0x6a, 0x6f, 0xdb, 0xe7, 0x90, 0x50, 0x8f,
+    0xc8, 0x75, 0xf0, 0xbe, 0x0d, 0xb2, 0xc7, 0x47, 0xde, 0x93, 0xf2, 0x0c, 0xf5, 0x39, 0x1a, 0x3e, 0x6a, 0x3c, 0xa3,
+    0x13, 0x73, 0x6d, 0x74, 0xa8, 0x67, 0x05, 0xec, 0x6f, 0x25, 0xc6, 0x86, 0x68, 0x0f, 0x29, 0x62, 0x7d, 0x38, 0xdd,
+    0xef, 0xee, 0xcd, 0xe8, 0x7b, 0x38, 0x7e, 0x94, 0x6a, 0x02, 0x69, 0x51, 0xa0, 0x74, 0x65, 0xc8, 0x6d, 0xcf, 0xc2,
+    0xc2, 0xfc, 0x0c, 0x1b, 0x04, 0xd0, 0x5e, 0x76, 0x2c, 0x09, 0x34, 0x8b, 0xd7, 0xba, 0xfe, 0x79, 0xf9, 0x32, 0xd1,
+    0xce, 0x17, 0xdf, 0x42, 0x88, 0x61, 0xff, 0x8a, 0xd0, 0x98, 0x70, 0x37, 0xc9, 0xee, 0xd2, 0x62, 0xee, 0x55, 0x57,
+    0x31, 0x1e, 0x77, 0xf7, 0x5c, 0x29, 0x9a, 0xb7, 0x2e, 0xb0, 0x07, 0x6a, 0x5e, 0xc7, 0x4b, 0x16, 0x02, 0x36, 0xe3,
+    0xbe, 0x5d, 0x24, 0xce, 0xef, 0x9d, 0x4e, 0xc8, 0xfe, 0xc1, 0x94, 0x0f, 0x59, 0x49, 0xc5, 0x80, 0x95, 0xf5, 0x0e,
+    0x35, 0xe7, 0x6d, 0x42, 0x2e, 0x76, 0x69, 0xb8, 0x18, 0xf2, 0x87, 0x2e, 0x49, 0x1f, 0x78, 0xc3, 0xa1, 0xda, 0x36,
+    0x17, 0x43, 0x9a, 0x72, 0xba, 0x4b, 0x65, 0x40, 0x88, 0x74, 0x15, 0x57, 0xa4, 0xd6, 0x47, 0x55, 0xea, 0x24, 0x1d,
+    0xd7, 0xd9, 0xe6, 0x33, 0x97, 0x6c, 0x75, 0xbb, 0xf6, 0xaf, 0xd5, 0xed, 0x0b, 0x33, 0x90, 0xbf, 0x3f, 0x11, 0xd5,
+    0xc4, 0x40, 0x74, 0x01, 0x15, 0xfc, 0x13, 0xbc, 0x3c, 0x79, 0xa4, 0x15, 0xa0, 0xf7, 0x9d, 0x1d, 0x5d, 0x7b, 0xbc,
+    0x31, 0x8b, 0xad, 0x25, 0xce, 0x59, 0xe5, 0x3b, 0xcb, 0xab, 0xb2, 0x15, 0xba, 0x8e, 0x60, 0xbf, 0x84, 0x1d, 0x7d,
+    0xf7, 0xb6, 0x01, 0x10, 0xa5, 0xb0, 0x72, 0x67, 0xbf, 0xf0, 0xce, 0x7e, 0x61, 0xcf, 0x7e, 0xbb, 0x09, 0x94, 0x0f,
+    0x2b, 0xb4, 0xec, 0x95, 0x14, 0x95, 0x69, 0xf2, 0xb8, 0xa9, 0xcb, 0x42, 0x5a, 0xcc, 0xf7, 0x2d, 0xed, 0x7a, 0x3a,
+    0xa6, 0x12, 0xd5, 0x23, 0x3f, 0x60, 0xab, 0xf6, 0x4b, 0xf2, 0xf0, 0x3d, 0xf3, 0x7f, 0xf6, 0x06, 0x79, 0xdf, 0xdd,
+    0xee, 0xff, 0xe6, 0x42, 0x07, 0xb7, 0xb5, 0x54, 0x78, 0xea, 0xea, 0xb8, 0xc0, 0xbb, 0x5a, 0xfa, 0xf0, 0x5d, 0xed,
+    0x5d, 0xa6, 0x97, 0x5d, 0x05, 0xa8, 0x41, 0x62, 0x7d, 0xc5, 0x8b, 0x2c, 0xa9, 0xad, 0x42, 0xe3, 0x84, 0x43, 0x68,
+    0x0f, 0xef, 0xe0, 0x02, 0x39, 0x2c, 0x21, 0xf4, 0x63, 0x65, 0x04, 0x80, 0x3e, 0x8b, 0x7d, 0xc2, 0xc3, 0x8c, 0x0c,
+    0x7c, 0x89, 0x5f, 0x29, 0x7d, 0x71, 0xf1, 0xfe, 0x4e, 0x66, 0x82, 0x5e, 0x25, 0x36, 0xbb, 0x94, 0xed, 0x98, 0x1f,
+    0xfe, 0x17, 0x18, 0x0d, 0xc2, 0x6b, 0x4b, 0xb6, 0x2f, 0x3a, 0x66, 0xb9, 0x82, 0xa3, 0xb6, 0x74, 0x65, 0x96, 0xad,
+    0xeb, 0x67, 0x35, 0xcc, 0xf4, 0x99, 0x72, 0x02, 0xb2, 0x2f, 0xe4, 0xee, 0xa7, 0xba, 0x62, 0x41, 0x8e, 0x26, 0xe3,
+    0x29, 0x11, 0x83, 0x41, 0x2b, 0xf9, 0x10, 0x93, 0x87, 0xc3, 0x1d, 0xe6, 0x52, 0xe8, 0x7e, 0x78, 0x7d, 0x80, 0xfa,
+    0x1a, 0x5b, 0x92, 0x6c, 0x2a, 0xf6, 0x17, 0x98, 0xc5, 0x02, 0x71, 0x74, 0xf0, 0x8b, 0xf3, 0x05, 0x80, 0x2c, 0xc3,
+    0x32, 0xd3, 0xc2, 0xa2, 0x32, 0x55, 0x3e, 0xb2, 0x05, 0x93, 0x87, 0xe3, 0x99, 0xdf, 0x73, 0xc7, 0xe0, 0x10, 0x12,
+    0x4d, 0xac, 0xf1, 0x8b, 0x9f, 0x05, 0xe3, 0x38, 0x94, 0x47, 0xb2, 0xf1, 0x5d, 0x49, 0xa2, 0xb1, 0x31, 0x55, 0xd6,
+    0x57, 0x89, 0x6a, 0x98, 0x90, 0xc7, 0x05, 0xd9, 0x2f, 0xe8, 0xd2, 0x1f, 0x4b, 0x4c, 0xdf, 0x8f, 0xf7, 0x27, 0x63,
+    0xf2, 0x38, 0x7e, 0x3c, 0x31, 0x70, 0xc3, 0x7e, 0x8e, 0x7c, 0xb8, 0x24, 0xfb, 0xcd, 0x2a, 0xc1, 0x14, 0xd5, 0xf4,
+    0xcc, 0xaf, 0x24, 0x19, 0x2c, 0x07, 0xe9, 0xe3, 0x56, 0x5e, 0xac, 0x55, 0x8f, 0xf7, 0xfa, 0x90, 0x4f, 0x89, 0x68,
+    0xdc, 0x18, 0xd6, 0xf4, 0x2a, 0xfe, 0x53, 0x16, 0x51, 0x29, 0x01, 0x91, 0x10, 0xd4, 0xdb, 0xd9, 0x45, 0x96, 0xc4,
+    0x22, 0x8d, 0xd2, 0x9a, 0xd0, 0xf4, 0x88, 0x4d, 0xc6, 0xb3, 0x94, 0xa5, 0x87, 0x93, 0x67, 0xb3, 0xc9, 0xb3, 0xe8,
+    0x60, 0x1c, 0xa5, 0x83, 0x01, 0x24, 0x1f, 0x8c, 0xc1, 0xc5, 0x0e, 0x7e, 0xb3, 0x03, 0x18, 0xba, 0x23, 0x64, 0x09,
+    0x0b, 0x68, 0xda, 0x97, 0x35, 0x49, 0x0f, 0xe7, 0x85, 0xea, 0x49, 0x7c, 0x4b, 0xd7, 0x9e, 0x83, 0x8b, 0xdf, 0xc2,
+    0x0b, 0xd7, 0xc2, 0x8b, 0xdd, 0x16, 0x0a, 0x4d, 0xb6, 0x0b, 0xf9, 0xff, 0xe3, 0x86, 0x71, 0xdf, 0x5d, 0xc2, 0x2c,
+    0xae, 0xeb, 0x6c, 0xb4, 0x2a, 0x64, 0x25, 0xe1, 0x36, 0xa1, 0x44, 0x61, 0xa3, 0x78, 0xb5, 0xca, 0xb5, 0x8b, 0xd8,
+    0xbc, 0xa2, 0x00, 0xee, 0x02, 0x71, 0x8a, 0x81, 0x85, 0x36, 0x06, 0x72, 0x9f, 0x78, 0x21, 0x99, 0x55, 0xfb, 0x98,
+    0x7b, 0xe4, 0x9f, 0x21, 0x18, 0xa3, 0x8a, 0xa3, 0xf1, 0x4c, 0x61, 0x5d, 0x7c, 0x4e, 0xde, 0xfb, 0x6f, 0x1c, 0x45,
+    0xf6, 0x68, 0x06, 0x3d, 0x41, 0xe4, 0x3c, 0xe2, 0xec, 0xc9, 0xe4, 0x65, 0xe0, 0x7e, 0x06, 0x2b, 0xfd, 0x75, 0xb7,
+    0x19, 0x6b, 0xdb, 0xa3, 0x7b, 0x61, 0x84, 0xa2, 0x9f, 0xf0, 0x9d, 0xa9, 0x17, 0x70, 0x09, 0xd5, 0xc0, 0xae, 0x2f,
+    0x2f, 0x79, 0x09, 0x20, 0x42, 0x99, 0xe8, 0xf7, 0x7b, 0x7f, 0x1a, 0x68, 0xd2, 0x92, 0x17, 0x6f, 0x32, 0x61, 0x9d,
+    0x71, 0xa0, 0xa9, 0x40, 0xfd, 0x3f, 0x56, 0xf6, 0x99, 0x8e, 0xc9, 0xcc, 0x7f, 0x1c, 0x4e, 0x48, 0xd4, 0x7c, 0x4d,
+    0x3e, 0x73, 0x9a, 0x7e, 0xe6, 0x8a, 0xf6, 0x1f, 0xc8, 0xcc, 0x0d, 0x87, 0x0c, 0xf5, 0x97, 0x8e, 0x79, 0x32, 0x7a,
+    0x9d, 0x98, 0x1d, 0x09, 0x56, 0xcd, 0x20, 0x0a, 0x7b, 0x01, 0x0f, 0xea, 0x5a, 0x16, 0x4f, 0x61, 0xf6, 0x41, 0x8d,
+    0x28, 0x0e, 0xd9, 0x78, 0x16, 0xca, 0x70, 0x02, 0xf6, 0xbd, 0x93, 0x31, 0xdc, 0x07, 0x64, 0xf8, 0xb1, 0x0a, 0xb1,
+    0x73, 0x90, 0xf6, 0xb1, 0x42, 0xc5, 0x04, 0x40, 0x04, 0x42, 0xde, 0x7e, 0x5f, 0xaa, 0x24, 0x7c, 0x5d, 0x62, 0x4a,
+    0xa1, 0x3e, 0xf8, 0x4f, 0xa4, 0xea, 0x8e, 0xe9, 0x57, 0xeb, 0xc7, 0x9f, 0x09, 0xc5, 0xa7, 0xbb, 0x94, 0xf8, 0x16,
+    0x82, 0x3b, 0x4b, 0xd0, 0x41, 0x54, 0x68, 0xc6, 0xf6, 0x30, 0xbf, 0x2b, 0xee, 0xe7, 0x77, 0xc5, 0xff, 0x3b, 0x7e,
+    0x57, 0x3c, 0xc4, 0x18, 0x56, 0x16, 0x1a, 0x7e, 0x16, 0x8c, 0x83, 0xe8, 0x3f, 0xe7, 0x13, 0xef, 0xe5, 0xa9, 0xaf,
+    0x32, 0x31, 0xbd, 0x87, 0x69, 0xf6, 0x09, 0x0a, 0xc2, 0x2a, 0xee, 0xd2, 0x93, 0x75, 0x65, 0x6f, 0xad, 0x64, 0x88,
+    0x79, 0x1e, 0x60, 0x8d, 0xc2, 0xca, 0x03, 0xba, 0x47, 0xd5, 0x06, 0x71, 0x22, 0x78, 0x18, 0x33, 0x2b, 0x7d, 0xdf,
+    0x6e, 0x8d, 0x0a, 0xf3, 0x41, 0x2e, 0x0a, 0xb2, 0x9b, 0x8f, 0x67, 0xe3, 0x28, 0xc4, 0x06, 0xfc, 0xc7, 0x8c, 0x55,
+    0x43, 0x36, 0xdf, 0xc9, 0x48, 0xed, 0x98, 0x3c, 0x4d, 0x76, 0x49, 0xef, 0x80, 0x77, 0xc8, 0xcf, 0xeb, 0x8f, 0x61,
+    0x21, 0x0d, 0xbf, 0x25, 0x2f, 0xe3, 0x22, 0xab, 0x96, 0x57, 0x59, 0x82, 0x4c, 0x17, 0xbc, 0xf8, 0x62, 0xa6, 0xcb,
+    0xfb, 0x58, 0x1f, 0x30, 0x9e, 0x52, 0xbc, 0x6e, 0x88, 0xd2, 0xd7, 0x2d, 0xcf, 0x0a, 0x75, 0x79, 0x52, 0x31, 0xdb,
+    0xb3, 0x12, 0x9c, 0x4e, 0xc1, 0x04, 0x5f, 0xff, 0x74, 0xbd, 0x8f, 0x01, 0x17, 0x14, 0x6a, 0x4e, 0x0b, 0xb9, 0x32,
+    0x58, 0x4e, 0x16, 0xba, 0x13, 0x30, 0x43, 0xa5, 0xc0, 0x0b, 0x14, 0xfc, 0x45, 0x03, 0x23, 0xfa, 0xca, 0xfd, 0x26,
+    0x03, 0x83, 0x74, 0x69, 0x4e, 0x84, 0xb1, 0xe3, 0x76, 0x8a, 0xb4, 0x15, 0xe5, 0x8c, 0xb3, 0xf7, 0xea, 0x4a, 0x01,
+    0x06, 0x78, 0x9b, 0x9b, 0xe8, 0x3c, 0x41, 0xaf, 0x05, 0xa5, 0xf3, 0x06, 0xee, 0x66, 0x19, 0x19, 0xe1, 0xe2, 0xe3,
+    0xca, 0x63, 0xc1, 0x3d, 0xfb, 0x85, 0x58, 0x1a, 0xcd, 0x34, 0x18, 0xb3, 0x79, 0xc1, 0x02, 0x85, 0x0a, 0x14, 0x58,
+    0xce, 0xb4, 0xa5, 0x69, 0x35, 0xe4, 0xfb, 0x07, 0x68, 0x6d, 0x5a, 0x0d, 0xf8, 0xfe, 0x41, 0x1d, 0x65, 0x87, 0x90,
+    0xe5, 0xc8, 0xcf, 0xa0, 0x5e, 0xd7, 0x91, 0x49, 0x31, 0xd9, 0xfd, 0xfa, 0x52, 0x7f, 0x54, 0x37, 0xe0, 0xfa, 0x01,
+    0x08, 0x60, 0x03, 0x70, 0x08, 0x54, 0x83, 0xa5, 0x11, 0xc1, 0xa2, 0x4c, 0xa1, 0x7d, 0x0d, 0xbd, 0x37, 0x1a, 0xfe,
+    0x0b, 0xdc, 0x45, 0xe4, 0xca, 0xff, 0x04, 0x81, 0xbf, 0xa2, 0x4c, 0x2b, 0x53, 0xfc, 0x4f, 0xb4, 0x7a, 0x85, 0x72,
+    0xd6, 0xb4, 0xe6, 0x83, 0x68, 0x4d, 0x84, 0x6a, 0xc6, 0x10, 0xfc, 0x5b, 0x59, 0xa6, 0x2d, 0x55, 0x95, 0xfa, 0xd0,
+    0x78, 0xad, 0x15, 0xce, 0xf2, 0x71, 0xe4, 0xbd, 0xc6, 0xd0, 0xb1, 0x89, 0xb3, 0x94, 0x53, 0xa9, 0xb3, 0x4f, 0xfb,
+    0x32, 0x72, 0x80, 0xd3, 0x09, 0x1b, 0x4f, 0x93, 0x43, 0x39, 0x4d, 0x1c, 0x64, 0x7e, 0xce, 0x30, 0xb2, 0xaa, 0x01,
+    0x61, 0x51, 0x36, 0x94, 0xb6, 0x00, 0x93, 0x9c, 0x10, 0x32, 0xc5, 0x50, 0x14, 0xf9, 0x48, 0xf7, 0xc3, 0x7a, 0xb3,
+    0xba, 0x2f, 0xde, 0x69, 0x80, 0xd3, 0x30, 0x81, 0x40, 0xe0, 0x45, 0x7c, 0x93, 0x89, 0x4b, 0xf0, 0x18, 0x1e, 0xc0,
+    0x97, 0xe0, 0x26, 0x97, 0xb2, 0xdf, 0xab, 0x30, 0xc7, 0xb5, 0x05, 0x0c, 0x1a, 0xac, 0x1e, 0x44, 0x87, 0x4b, 0x69,
+    0xb3, 0xab, 0x00, 0xb1, 0x31, 0x85, 0x58, 0x16, 0x6c, 0x6d, 0xd9, 0xb3, 0xef, 0x55, 0xd3, 0xd0, 0x3a, 0xe1, 0x58,
+    0x5c, 0xe6, 0x10, 0x45, 0x65, 0x10, 0x83, 0x3b, 0x92, 0xc7, 0xe7, 0x3d, 0x12, 0xe1, 0x05, 0x01, 0xb7, 0xb2, 0x58,
+    0x86, 0x2b, 0xba, 0x1c, 0xdd, 0xd2, 0xf5, 0xe8, 0x86, 0x8e, 0xe9, 0xe4, 0xef, 0x63, 0xb0, 0xc8, 0xd6, 0xa9, 0x77,
+    0x74, 0x3d, 0x5a, 0xd2, 0x6f, 0xc7, 0xf4, 0xe0, 0x6f, 0x60, 0xc2, 0x87, 0x87, 0x09, 0xbd, 0x00, 0xc7, 0x2e, 0x52,
+    0xa3, 0xa7, 0xa6, 0x6f, 0x70, 0x58, 0x8d, 0xf2, 0x21, 0x1f, 0xe5, 0x94, 0x8f, 0x8a, 0x61, 0x35, 0x02, 0x4f, 0xc7,
+    0x6a, 0xc8, 0x47, 0x15, 0xe5, 0xa3, 0xf3, 0x61, 0x35, 0x3a, 0x27, 0xcd, 0xa6, 0xbf, 0xae, 0xf8, 0x55, 0xc9, 0x52,
+    0xd8, 0x16, 0xb0, 0x7c, 0x3d, 0xaf, 0xa8, 0xd4, 0x5f, 0xd5, 0xe6, 0x64, 0xb6, 0x9c, 0xbd, 0xbd, 0xee, 0x72, 0x62,
+    0xf1, 0xb8, 0x6d, 0x3a, 0x5c, 0x7d, 0x39, 0x51, 0x27, 0xbd, 0x42, 0x7e, 0x18, 0x4f, 0x85, 0x3a, 0x87, 0xc0, 0x4c,
+    0x62, 0x16, 0xc6, 0x0c, 0x9b, 0xa9, 0xd3, 0x40, 0x81, 0x93, 0x8d, 0x3c, 0x17, 0xc5, 0x6c, 0x94, 0x53, 0x78, 0x1f,
+    0x13, 0x12, 0x09, 0x38, 0xab, 0x8e, 0xaa, 0x51, 0x01, 0x31, 0x47, 0x58, 0x88, 0x8f, 0xd0, 0x2f, 0xf5, 0x91, 0x87,
+    0x04, 0x9e, 0x61, 0x5f, 0x8b, 0x41, 0x0c, 0x47, 0xbc, 0xad, 0xac, 0x9a, 0x85, 0x09, 0x54, 0x56, 0x0d, 0x4b, 0x53,
+    0x59, 0x41, 0xb3, 0x51, 0xe5, 0x57, 0x56, 0xe1, 0x18, 0x25, 0x84, 0x44, 0xa5, 0xae, 0x0c, 0xd4, 0x27, 0x09, 0x0b,
+    0x4b, 0x5d, 0xd9, 0xb9, 0xfa, 0xe8, 0xdc, 0xaf, 0xec, 0x1c, 0x5c, 0x48, 0x07, 0x89, 0x7f, 0x95, 0xca, 0xd3, 0xf6,
+    0x75, 0xb0, 0xb1, 0xaa, 0xe8, 0x86, 0xdf, 0x56, 0x45, 0x1c, 0x95, 0xd4, 0xc5, 0x80, 0xc6, 0x85, 0x11, 0x49, 0xaa,
+    0xd7, 0x28, 0xf8, 0x43, 0x82, 0xa8, 0x34, 0x06, 0xaf, 0xce, 0xa4, 0x6b, 0xa5, 0x56, 0x54, 0x0c, 0xca, 0x41, 0x01,
+    0xf7, 0xa7, 0xbc, 0xb5, 0x90, 0xbe, 0x87, 0x88, 0xca, 0x50, 0xde, 0xe0, 0x1f, 0x18, 0x3c, 0x99, 0xad, 0xd2, 0x30,
+    0x19, 0xdd, 0xd1, 0x78, 0xb4, 0x44, 0x38, 0x18, 0xb6, 0x4e, 0x15, 0xde, 0xfa, 0x05, 0xa4, 0xdf, 0xd2, 0x78, 0x74,
+    0x43, 0x53, 0x6b, 0x73, 0x6a, 0xa0, 0xae, 0x7a, 0x63, 0x7a, 0x1b, 0xc1, 0xeb, 0xbb, 0x68, 0x49, 0x61, 0x2b, 0x1d,
+    0xe7, 0xd9, 0xa5, 0x88, 0x52, 0x8a, 0x08, 0x84, 0x6b, 0x44, 0x0e, 0x5c, 0x6a, 0xb4, 0xc1, 0xf5, 0x00, 0xca, 0xd0,
+    0x70, 0x81, 0xcb, 0x41, 0x3c, 0x5a, 0x7a, 0x64, 0x6a, 0xa9, 0x2f, 0xb2, 0x08, 0x1f, 0xed, 0x6c, 0xb4, 0x14, 0xcf,
+    0x88, 0x85, 0x71, 0x05, 0x43, 0xa8, 0x0b, 0x2b, 0x4d, 0x41, 0xd2, 0x05, 0x8e, 0xec, 0x85, 0x45, 0x15, 0x6e, 0xc0,
+    0xb4, 0xe8, 0x0e, 0xcc, 0xa3, 0x40, 0xe1, 0xe0, 0x12, 0xa4, 0x9f, 0x50, 0xb6, 0x73, 0x94, 0x26, 0x87, 0x37, 0x41,
+    0xe9, 0xce, 0x04, 0x21, 0xed, 0xea, 0x26, 0x5b, 0xd2, 0x37, 0xd8, 0xde, 0xa1, 0x53, 0x51, 0x41, 0xf5, 0xb9, 0x05,
+    0x93, 0x25, 0x1b, 0x84, 0x2d, 0x61, 0x7a, 0xa6, 0xd7, 0x80, 0x3d, 0xbd, 0x7f, 0xb0, 0x33, 0xdf, 0xc5, 0xec, 0xd3,
+    0x7e, 0x19, 0x8d, 0x95, 0x05, 0x6f, 0x6e, 0x89, 0xdd, 0x92, 0x8d, 0xa7, 0xcb, 0xc3, 0x72, 0xba, 0x44, 0x62, 0x67,
+    0xe8, 0x16, 0xe3, 0xf3, 0xe5, 0x82, 0x26, 0x78, 0xb6, 0xb1, 0x6a, 0xbe, 0x34, 0x68, 0x29, 0x29, 0xc3, 0xf5, 0xb6,
+    0x44, 0xff, 0x7f, 0x75, 0xf1, 0x4b, 0x01, 0x5e, 0x82, 0xb1, 0x00, 0x10, 0xee, 0xc1, 0xb4, 0x20, 0xb5, 0x51, 0x36,
+    0x96, 0x69, 0x98, 0xe2, 0x22, 0x30, 0x29, 0xfd, 0x7e, 0x98, 0xb3, 0x94, 0x78, 0xd0, 0xa1, 0xee, 0xd4, 0x4e, 0x7d,
+    0x21, 0x08, 0xf0, 0x48, 0xea, 0x1c, 0x9b, 0xfc, 0x7d, 0x3c, 0x0b, 0xd4, 0x40, 0x04, 0x51, 0x76, 0x88, 0x8f, 0x18,
+    0xb8, 0x28, 0xd2, 0x71, 0x3b, 0x5d, 0x11, 0x17, 0xbb, 0xc7, 0x2c, 0xc4, 0x49, 0xc2, 0x5c, 0xb3, 0x6c, 0xc8, 0xaa,
+    0x08, 0x13, 0x74, 0x61, 0x60, 0x96, 0x37, 0x64, 0xd5, 0xfe, 0x01, 0x44, 0x6a, 0xb5, 0x65, 0xac, 0xba, 0xca, 0xf8,
+    0x16, 0x80, 0xac, 0x19, 0x63, 0x07, 0x7f, 0x1b, 0xcf, 0xd4, 0x37, 0x51, 0xc8, 0x8f, 0x0e, 0xfe, 0x06, 0xc9, 0x87,
+    0xdf, 0x22, 0x33, 0x07, 0xc9, 0x8d, 0x82, 0x2e, 0x9b, 0xb3, 0xae, 0xa1, 0x34, 0x71, 0xed, 0x95, 0x7a, 0xed, 0x49,
+    0xb3, 0xf6, 0x0a, 0x74, 0xa7, 0x36, 0xbc, 0x87, 0xb2, 0x9d, 0x05, 0x13, 0x74, 0x34, 0xbb, 0x03, 0x1d, 0xbc, 0x53,
+    0x04, 0xbd, 0x4c, 0x42, 0xe3, 0x11, 0xaa, 0x8c, 0x7a, 0x61, 0x47, 0x76, 0xb3, 0x2e, 0x99, 0x67, 0xc0, 0x1c, 0xdb,
+    0x73, 0x48, 0x0c, 0x73, 0x75, 0x50, 0xa7, 0xac, 0x1c, 0xe6, 0x78, 0x00, 0xaf, 0x99, 0x1c, 0x8a, 0x41, 0xae, 0x51,
+    0xbe, 0x2f, 0x58, 0x31, 0x2c, 0x07, 0xb9, 0xe6, 0x66, 0xa6, 0xcd, 0xd8, 0xb4, 0x89, 0x0e, 0xcf, 0xbc, 0x62, 0x47,
+    0xab, 0x1e, 0xf0, 0xb1, 0xe0, 0xc9, 0xec, 0x7b, 0x3e, 0xbe, 0x01, 0x4e, 0x66, 0x73, 0x1b, 0x2d, 0xe9, 0x5d, 0x94,
+    0xd2, 0x9b, 0x68, 0x4d, 0x97, 0xd1, 0x85, 0x31, 0x31, 0x4e, 0x6a, 0x38, 0x07, 0xa0, 0x55, 0x00, 0x89, 0xa7, 0x7e,
+    0xbd, 0xe7, 0x49, 0x15, 0x2e, 0x69, 0x0a, 0x6e, 0xc3, 0xbe, 0x7d, 0xe6, 0x95, 0x2f, 0x91, 0xda, 0x20, 0xc6, 0x9a,
+    0x35, 0x54, 0xdc, 0x78, 0xeb, 0x3e, 0x12, 0x35, 0xec, 0x5c, 0x17, 0x9b, 0xa8, 0x1a, 0x4e, 0xa6, 0x25, 0x20, 0xb6,
+    0x96, 0xc3, 0xa1, 0x3b, 0x42, 0x76, 0x8f, 0x1f, 0x1d, 0xe8, 0xb9, 0x27, 0x2d, 0xb6, 0x6d, 0xcb, 0x1f, 0x18, 0xc2,
+    0x94, 0x7e, 0xfe, 0xc8, 0x07, 0xc4, 0x8a, 0x4b, 0x38, 0x1b, 0x81, 0x3a, 0x5a, 0xa1, 0xd3, 0xef, 0x55, 0x58, 0xe8,
+    0x03, 0x7c, 0x73, 0x1b, 0x25, 0xf4, 0x2e, 0xca, 0x3d, 0xb2, 0xb6, 0xac, 0x99, 0x9c, 0x9e, 0x65, 0x21, 0x6f, 0x1f,
+    0xe8, 0xe5, 0x02, 0x40, 0xb4, 0x06, 0xb1, 0x2f, 0x75, 0x3d, 0x00, 0xa7, 0x21, 0x34, 0x09, 0x8d, 0xe0, 0xaa, 0x82,
+    0x30, 0x02, 0xae, 0x24, 0xfc, 0x0d, 0x26, 0x2a, 0xf0, 0x05, 0xb8, 0xc8, 0xa4, 0x69, 0xce, 0x83, 0xda, 0x1f, 0xc9,
+    0xd3, 0xa2, 0xed, 0xed, 0x0a, 0xa3, 0x09, 0xc6, 0x9e, 0x68, 0x9f, 0x47, 0xca, 0x51, 0x5c, 0x24, 0x61, 0x36, 0xba,
+    0x55, 0xe7, 0x39, 0xcd, 0x46, 0x77, 0xfa, 0x57, 0x45, 0xc7, 0xf4, 0x3b, 0x1d, 0xd0, 0x46, 0x49, 0xdf, 0x3a, 0xce,
+    0x06, 0xb4, 0x5e, 0x2c, 0x8d, 0xff, 0xb5, 0x1c, 0xdd, 0x52, 0x39, 0xba, 0xf3, 0x2d, 0xa9, 0x26, 0xd3, 0xe2, 0x50,
+    0xa0, 0x21, 0x55, 0xe7, 0xf7, 0x05, 0xf0, 0x73, 0xa5, 0xf1, 0x9d, 0x36, 0xdf, 0x7b, 0xed, 0x3f, 0xef, 0xe4, 0x09,
+    0x14, 0x4b, 0x54, 0xb0, 0x6a, 0x04, 0x76, 0xec, 0xeb, 0x3c, 0x2e, 0xcc, 0x28, 0xc5, 0xd4, 0x9a, 0xf4, 0x63, 0xe0,
+    0x8a, 0x69, 0xaf, 0x00, 0x57, 0xcb, 0xed, 0x56, 0xc5, 0xd0, 0x84, 0x3d, 0x3b, 0x86, 0xa8, 0xe7, 0xc6, 0x31, 0x4a,
+    0x36, 0xdc, 0x03, 0x62, 0x2d, 0xf3, 0x56, 0x2e, 0x01, 0x09, 0xbc, 0xf5, 0x30, 0x29, 0x00, 0x63, 0xb0, 0x5c, 0x12,
+    0x9d, 0xc7, 0x43, 0x9f, 0x50, 0x2f, 0x34, 0xea, 0x84, 0x6c, 0x6c, 0x09, 0x1c, 0x7f, 0x58, 0x1f, 0x02, 0xc1, 0xab,
+    0x3c, 0xd7, 0x5f, 0x69, 0x5d, 0x7f, 0xa9, 0xf4, 0xdc, 0xb1, 0x5c, 0xd7, 0xcf, 0xda, 0xd4, 0xe8, 0x15, 0x58, 0xf8,
+    0x6e, 0x94, 0x79, 0x24, 0xb7, 0x08, 0xa9, 0x0a, 0xac, 0xd4, 0x2d, 0x24, 0x98, 0x7f, 0x25, 0x67, 0xab, 0x32, 0x5f,
+    0x3d, 0xf2, 0xa0, 0x9c, 0x4d, 0x4f, 0x7f, 0x43, 0x82, 0x76, 0xd7, 0x91, 0xe6, 0xf1, 0x16, 0x1d, 0x3e, 0xbb, 0xd6,
+    0x12, 0x73, 0x27, 0x51, 0xf1, 0x7c, 0x0a, 0xd8, 0xea, 0x45, 0x76, 0xa5, 0x7c, 0xac, 0x76, 0x71, 0xfc, 0xcc, 0xf9,
+    0x13, 0x57, 0xe1, 0x5a, 0x34, 0x94, 0x20, 0xe0, 0xcd, 0x61, 0xec, 0x0a, 0x55, 0x40, 0x43, 0x73, 0x03, 0xc7, 0xb9,
+    0x1a, 0x56, 0x9a, 0x80, 0x69, 0x29, 0x8f, 0x0e, 0x70, 0x68, 0xf2, 0xa8, 0xdd, 0x34, 0xac, 0x0c, 0x5d, 0x6b, 0xf4,
+    0xb9, 0xad, 0x74, 0xc6, 0x9b, 0x0d, 0xdf, 0x3f, 0x18, 0x54, 0xf8, 0x93, 0x34, 0x47, 0xa3, 0x9d, 0x1b, 0xee, 0x34,
+    0x02, 0x33, 0x57, 0x72, 0x45, 0x76, 0x47, 0xc9, 0xcb, 0xef, 0xe9, 0x85, 0x05, 0xf4, 0xe7, 0x3f, 0x17, 0x13, 0x4e,
+    0x5a, 0x62, 0x42, 0xb4, 0x74, 0xd0, 0xa2, 0x83, 0x1d, 0xe5, 0x95, 0x7d, 0x89, 0x97, 0xce, 0xf1, 0xbf, 0xaf, 0xc7,
+    0xda, 0x55, 0x20, 0xb4, 0x3a, 0xb9, 0xdf, 0x9e, 0x2c, 0x10, 0x35, 0xa0, 0x9a, 0x5d, 0x95, 0xa3, 0x4c, 0x3b, 0x2b,
+    0xb2, 0x69, 0xc8, 0x5c, 0x77, 0xb3, 0x34, 0x6c, 0x26, 0x3b, 0x16, 0x96, 0x19, 0x06, 0x6b, 0xa7, 0x8a, 0x3e, 0x07,
+    0x2d, 0x3f, 0x82, 0x17, 0x4d, 0xe5, 0x99, 0xcf, 0x66, 0x19, 0xf1, 0x02, 0x9d, 0x73, 0x2a, 0x16, 0x4d, 0xe9, 0x58,
+    0xb9, 0xdd, 0x96, 0x68, 0x2c, 0x51, 0x46, 0x41, 0x50, 0xdb, 0x20, 0xec, 0xba, 0x74, 0x4f, 0xfa, 0xb4, 0x8b, 0x4f,
+    0x2b, 0xd0, 0xf7, 0xf8, 0x3e, 0x03, 0x89, 0xa9, 0x27, 0x79, 0xa8, 0x1a, 0xcd, 0xd1, 0xc9, 0xb3, 0x38, 0xd5, 0xf8,
+    0xfc, 0x4a, 0x76, 0xd6, 0xbc, 0x5b, 0x8d, 0x29, 0xfe, 0x23, 0x75, 0xfb, 0xce, 0x65, 0x68, 0xa2, 0xbf, 0x96, 0x07,
+    0x2d, 0x85, 0x05, 0xc7, 0x6d, 0xe3, 0xaf, 0xdf, 0x66, 0x0e, 0x31, 0x2c, 0x5d, 0x0e, 0x6f, 0x42, 0x87, 0xee, 0xae,
+    0xb2, 0x33, 0xd7, 0x07, 0xd4, 0xa9, 0x8b, 0x75, 0x1b, 0x50, 0xb2, 0xe4, 0xdd, 0x3a, 0x3d, 0xb1, 0xd2, 0x77, 0xfb,
+    0xe1, 0xce, 0x3c, 0x6a, 0x76, 0x77, 0xbb, 0x9d, 0x90, 0xb6, 0x7d, 0x30, 0xde, 0x97, 0xb0, 0x10, 0xe7, 0x1d, 0xb6,
+    0xf7, 0x7d, 0x58, 0x3d, 0xe6, 0x83, 0x5f, 0x70, 0x9c, 0x61, 0xf4, 0x33, 0x65, 0xe8, 0xf3, 0xaa, 0x90, 0x57, 0xaa,
+    0x53, 0xbe, 0xd0, 0xad, 0x65, 0xea, 0xfd, 0x36, 0x7e, 0xdb, 0x0a, 0x10, 0xe3, 0x75, 0xc5, 0x4a, 0xf1, 0x86, 0x56,
+    0x18, 0xd7, 0xc0, 0x6d, 0x72, 0xa8, 0xa5, 0x5a, 0x20, 0xea, 0xf2, 0x93, 0xc7, 0x3c, 0x32, 0xea, 0x4c, 0xf8, 0xee,
+    0x31, 0xf7, 0xa5, 0x6b, 0xbb, 0x4d, 0xfc, 0x5c, 0xd3, 0xf6, 0x77, 0x07, 0xba, 0xa3, 0x75, 0x0f, 0x37, 0xcf, 0xe6,
+    0xe7, 0x91, 0xf9, 0x62, 0x80, 0xcd, 0xda, 0x65, 0x5c, 0x76, 0x0c, 0xf7, 0xbd, 0xe9, 0xc1, 0x58, 0x40, 0x20, 0x31,
+    0x43, 0x2f, 0x03, 0x17, 0xb8, 0xc0, 0x5d, 0x61, 0xc0, 0x10, 0xd7, 0xb4, 0xe4, 0x4c, 0x5b, 0xd9, 0xfa, 0xc8, 0xdb,
+    0xa8, 0x10, 0xac, 0xeb, 0x8e, 0x9b, 0x24, 0x87, 0xe0, 0x84, 0x2d, 0xf7, 0xbe, 0xf6, 0xda, 0x19, 0xfe, 0x63, 0x20,
+    0x9c, 0x5b, 0xa2, 0x67, 0xd4, 0xf6, 0x58, 0xab, 0x7b, 0x0d, 0xaf, 0x72, 0x17, 0x79, 0xd6, 0x6f, 0xe6, 0xa5, 0x61,
+    0x5f, 0xf0, 0x5a, 0x0a, 0x0e, 0x8d, 0xed, 0x56, 0xb8, 0xc5, 0xe2, 0x1d, 0xad, 0x56, 0xd6, 0xda, 0x6a, 0xaf, 0x95,
+    0x8a, 0xde, 0xbf, 0xe6, 0x38, 0x71, 0x96, 0xc2, 0xf6, 0xc3, 0x87, 0x0b, 0x76, 0x4d, 0x00, 0x83, 0x16, 0x93, 0x05,
+    0x4a, 0x50, 0xc9, 0x5a, 0xd5, 0x6e, 0xa7, 0xc4, 0x2f, 0xf7, 0x8b, 0x2e, 0xb3, 0x9d, 0xc7, 0xaf, 0x9b, 0xb4, 0xcf,
+    0x7c, 0x8e, 0x7e, 0x98, 0xdf, 0x59, 0x27, 0x25, 0x67, 0x18, 0xd7, 0xf2, 0xff, 0xab, 0xe8, 0x65, 0x91, 0xa5, 0xd1,
+    0xc6, 0xf0, 0x60, 0x36, 0xd4, 0xa6, 0x0f, 0x8d, 0x51, 0xb9, 0x65, 0xa3, 0x88, 0x68, 0x75, 0x0b, 0x82, 0x19, 0xc5,
+    0x7d, 0x89, 0x36, 0xaf, 0x54, 0x59, 0x78, 0x87, 0xcf, 0x6c, 0xf4, 0x86, 0xed, 0x09, 0xa1, 0x7c, 0xf7, 0xb4, 0x30,
+    0xab, 0x96, 0x8a, 0x06, 0xdb, 0x25, 0xbc, 0x8b, 0x51, 0xa5, 0x9f, 0x30, 0xd9, 0xb2, 0x60, 0xaa, 0xff, 0xdf, 0x17,
+    0x59, 0xda, 0xa6, 0xe8, 0xc0, 0x74, 0x36, 0x7d, 0x3a, 0xe9, 0x06, 0xd7, 0x19, 0xb0, 0x88, 0x60, 0x4b, 0x85, 0xe3,
+    0x51, 0x6a, 0x37, 0x48, 0x98, 0x08, 0x6e, 0xa2, 0x5e, 0x76, 0xb4, 0x4c, 0xc9, 0xaa, 0x80, 0xe7, 0x57, 0xae, 0x32,
+    0x1d, 0x47, 0x43, 0xbf, 0x7f, 0x95, 0x9a, 0xd0, 0xaf, 0xd4, 0x4b, 0x55, 0x9c, 0x87, 0x51, 0x75, 0xa8, 0x30, 0x46,
+    0x4b, 0x9a, 0xc2, 0x31, 0x98, 0x5d, 0x84, 0x29, 0x5e, 0xce, 0x36, 0x09, 0xfb, 0x82, 0x81, 0x5c, 0x6a, 0x83, 0x7a,
+    0x4d, 0x89, 0xd6, 0xac, 0xbd, 0x99, 0x53, 0x42, 0x2f, 0x58, 0xe9, 0xdf, 0x85, 0xd6, 0x20, 0x50, 0x94, 0xcd, 0x94,
+    0xe9, 0xb9, 0x6e, 0xe7, 0x05, 0x4d, 0x68, 0x41, 0x57, 0xa4, 0x06, 0x7d, 0xaf, 0x93, 0xb3, 0xa3, 0x93, 0x9d, 0x99,
+    0xf5, 0x98, 0x15, 0xc3, 0xc9, 0x34, 0x86, 0x6b, 0x5a, 0xec, 0xae, 0x69, 0xcb, 0xe6, 0x8d, 0xab, 0xb1, 0x71, 0x1a,
+    0xb4, 0x0b, 0xa4, 0x6d, 0x9a, 0xdb, 0x4f, 0x3d, 0x6e, 0x7f, 0x5d, 0xb3, 0xe5, 0xb4, 0xb7, 0xde, 0x6e, 0x7b, 0x29,
+    0xd8, 0x88, 0x7a, 0x7c, 0xfc, 0x5a, 0x49, 0xd7, 0x2d, 0x97, 0x9f, 0xc2, 0xb3, 0xc7, 0xd7, 0x2f, 0x7d, 0x70, 0x39,
+    0x5a, 0xb5, 0xb9, 0xfb, 0xe5, 0x2e, 0xb2, 0xdc, 0x17, 0x0d, 0x2d, 0xd7, 0x33, 0xd4, 0x24, 0xcf, 0x46, 0x7b, 0x87,
+    0x5a, 0xb0, 0x9c, 0x75, 0x13, 0x9e, 0x18, 0xec, 0xd8, 0xab, 0xc6, 0xe6, 0xa8, 0xcc, 0x25, 0xab, 0x41, 0x02, 0x7d,
+    0x92, 0x67, 0x9a, 0xfe, 0x41, 0x86, 0xf9, 0xe8, 0x96, 0xe6, 0x80, 0x2b, 0x56, 0xd9, 0x4b, 0x06, 0xa9, 0xab, 0xf6,
+    0x12, 0x57, 0xbe, 0xc2, 0x21, 0xd9, 0xe0, 0x93, 0x61, 0xaa, 0x3e, 0xbb, 0xe4, 0xc1, 0xff, 0xdb, 0xaa, 0x55, 0x7a,
+    0x6e, 0x92, 0x1b, 0x8e, 0x7f, 0x9d, 0xb4, 0x7d, 0x4c, 0x0c, 0x12, 0xf0, 0xd4, 0x2e, 0x86, 0x6a, 0x54, 0x15, 0xb1,
+    0x28, 0x73, 0x13, 0x73, 0xec, 0xde, 0xae, 0xa1, 0x83, 0x32, 0xf8, 0x75, 0xc3, 0x27, 0xe6, 0x0e, 0x6c, 0x05, 0x3a,
+    0x3a, 0xd1, 0x5c, 0x86, 0x99, 0xb9, 0x0c, 0xd3, 0xae, 0xad, 0x02, 0xc3, 0xab, 0xb6, 0x4a, 0xa2, 0x5c, 0x8d, 0x7a,
+    0xdc, 0xcc, 0x52, 0xb3, 0x17, 0x79, 0xf7, 0x9a, 0xf4, 0x24, 0xfe, 0x74, 0xe9, 0xc9, 0xeb, 0x61, 0x40, 0xe4, 0x97,
+    0x2c, 0x0d, 0xd7, 0x28, 0x08, 0x4e, 0xad, 0x76, 0x20, 0xcd, 0x47, 0x80, 0xcc, 0x8f, 0xd3, 0xf0, 0x9d, 0x16, 0xe7,
+    0x90, 0x8d, 0xd2, 0x38, 0xb1, 0xa5, 0x51, 0x0f, 0xc1, 0x9d, 0xf7, 0x8a, 0xc7, 0x10, 0xf8, 0xf0, 0x03, 0x6e, 0x06,
+    0x15, 0xdd, 0x96, 0x98, 0x28, 0x6d, 0x1e, 0x75, 0xcb, 0x47, 0x0d, 0xa1, 0x92, 0x95, 0xe1, 0xc5, 0xd0, 0xde, 0x1d,
+    0x81, 0x51, 0xe5, 0x04, 0x32, 0xc3, 0x62, 0xff, 0x60, 0x98, 0x2a, 0x41, 0xd1, 0x50, 0x0e, 0x97, 0x28, 0x07, 0xc4,
+    0x24, 0x10, 0x18, 0x15, 0x83, 0x54, 0x57, 0xa6, 0x5e, 0x0c, 0x52, 0x7d, 0xab, 0x22, 0xf5, 0x59, 0x16, 0x56, 0x54,
+    0xb7, 0x88, 0x8e, 0xe9, 0x50, 0xd2, 0xa5, 0xd9, 0xa9, 0xb9, 0x96, 0x5e, 0xa8, 0xe5, 0xf8, 0x5c, 0xa7, 0xc1, 0x28,
+    0x9e, 0xba, 0x14, 0xfd, 0x56, 0xed, 0x67, 0xff, 0x2d, 0xa6, 0xd4, 0x88, 0x4d, 0xed, 0x2d, 0x62, 0x58, 0xb5, 0x1f,
+    0xb2, 0x2a, 0x07, 0xed, 0x2e, 0x28, 0x1b, 0x2b, 0xe3, 0x3c, 0xdf, 0x08, 0x66, 0x0e, 0xda, 0xc6, 0xaa, 0xe9, 0x43,
+    0x6f, 0xc4, 0xa8, 0xbd, 0x31, 0xd5, 0xb8, 0x27, 0xf0, 0xd3, 0x06, 0x4d, 0xf7, 0x22, 0xcf, 0x51, 0x8f, 0xbc, 0xfb,
+    0x9f, 0x39, 0xb2, 0x33, 0xf9, 0x2c, 0x96, 0x49, 0xdd, 0x3e, 0x26, 0xc1, 0x42, 0xd5, 0x31, 0xba, 0x70, 0x23, 0x53,
+    0xda, 0xcf, 0x9d, 0xe9, 0x47, 0x3c, 0x93, 0x87, 0xed, 0xd0, 0xa8, 0x2f, 0x0d, 0x6b, 0x49, 0x11, 0xf5, 0x05, 0xbd,
+    0x35, 0xd5, 0xd1, 0x01, 0xf5, 0x3a, 0x02, 0xab, 0x2b, 0xda, 0xa0, 0x06, 0x60, 0x32, 0xae, 0x6d, 0x6d, 0x3e, 0x07,
+    0x53, 0x5b, 0x55, 0xc1, 0x33, 0xba, 0x2b, 0x94, 0xee, 0x4d, 0xea, 0xba, 0x35, 0xc4, 0x16, 0x30, 0x20, 0x70, 0xa3,
+    0xa7, 0xa6, 0x3f, 0x68, 0xa2, 0x02, 0xd0, 0xa0, 0x71, 0x3b, 0xd3, 0x39, 0x12, 0xfd, 0x4e, 0x6d, 0xda, 0x66, 0xaa,
+    0x57, 0x95, 0x0f, 0xa0, 0xe2, 0xcf, 0xd2, 0xd9, 0x85, 0x19, 0xb1, 0x00, 0xc6, 0x3d, 0x70, 0xa6, 0x7a, 0xc7, 0x19,
+    0x58, 0x4f, 0xe4, 0x79, 0x56, 0xf2, 0x44, 0x0a, 0x98, 0x11, 0x79, 0x75, 0x25, 0x05, 0x0c, 0x83, 0x1a, 0x00, 0xb4,
+    0x68, 0x2e, 0xa3, 0x09, 0x7f, 0x52, 0xd3, 0xfb, 0xf2, 0xf0, 0x27, 0x3a, 0xd7, 0x37, 0xe3, 0x1a, 0x0c, 0x95, 0xd7,
+    0x15, 0xdf, 0xc9, 0xf4, 0x0d, 0x7f, 0xea, 0x65, 0x5a, 0xca, 0x75, 0xb1, 0x93, 0xe5, 0xc9, 0x37, 0xfc, 0x99, 0xce,
+    0x73, 0xf0, 0xb4, 0xa6, 0x69, 0x7c, 0xb7, 0x93, 0xe5, 0xef, 0xdf, 0x3c, 0xb5, 0x79, 0x9e, 0x8c, 0x6b, 0x7a, 0xc3,
+    0xf9, 0x47, 0x97, 0x69, 0xa2, 0xab, 0x1a, 0x3f, 0xfd, 0xbb, 0xcd, 0xf5, 0xb4, 0xa6, 0x57, 0x52, 0x54, 0xcb, 0x9d,
+    0xa2, 0x0e, 0xbe, 0x39, 0xf8, 0x3b, 0xff, 0xc6, 0x74, 0xef, 0xa0, 0xa6, 0x7f, 0xad, 0xe3, 0xa2, 0xe2, 0xc5, 0x4e,
+    0x71, 0x7f, 0xfb, 0xfb, 0xdf, 0x9f, 0xda, 0x8c, 0x4f, 0x6b, 0x7a, 0xc7, 0xe3, 0x8e, 0xb6, 0x4f, 0x9e, 0x3d, 0xe5,
+    0x7f, 0xab, 0x6b, 0xfa, 0x2b, 0xf3, 0x83, 0xa3, 0x1e, 0x67, 0x9e, 0x1e, 0x3e, 0x91, 0x4d, 0xd4, 0x80, 0xa1, 0x87,
+    0x06, 0x90, 0x4b, 0xab, 0xa6, 0xb9, 0xc7, 0x2b, 0x17, 0xdc, 0xbe, 0xcf, 0xe2, 0x34, 0x5e, 0xc1, 0x41, 0xb0, 0x41,
+    0xe3, 0xac, 0x02, 0x38, 0x55, 0xe0, 0x3d, 0xa3, 0x92, 0x66, 0xa5, 0xfc, 0x07, 0xe7, 0x1f, 0x61, 0xd0, 0x10, 0xd2,
+    0x46, 0x45, 0x06, 0x3a, 0x59, 0xe9, 0xc8, 0x46, 0xe8, 0xbf, 0xd9, 0x8c, 0x83, 0xe3, 0xc3, 0xe8, 0xf5, 0xfb, 0x61,
+    0xc1, 0x44, 0x58, 0x10, 0x42, 0xff, 0x0c, 0x0b, 0x70, 0x28, 0x29, 0x98, 0x97, 0xcf, 0xf8, 0x9e, 0x6b, 0xa3, 0xb0,
+    0x10, 0x44, 0x77, 0x91, 0x7d, 0x40, 0xd5, 0xa3, 0xef, 0xd0, 0x0d, 0xf1, 0xb2, 0xc2, 0x82, 0xa1, 0x55, 0x0d, 0xcc,
+    0x10, 0x14, 0xff, 0x86, 0x87, 0x12, 0x7c, 0xe2, 0x01, 0x3e, 0x7a, 0x4c, 0x66, 0x5c, 0x5d, 0x6b, 0x4f, 0x2e, 0xc2,
+    0x82, 0x06, 0xba, 0xed, 0x10, 0x74, 0x20, 0xf2, 0x5f, 0x80, 0xa7, 0xc0, 0xc0, 0x87, 0x85, 0x5d, 0xca, 0x5d, 0x7f,
+    0xf5, 0x5f, 0x0d, 0xeb, 0xe8, 0xc2, 0x8f, 0xfe, 0x6a, 0x5d, 0xd8, 0x33, 0x32, 0x95, 0x87, 0xe5, 0x70, 0x32, 0x1d,
+    0x0c, 0xa4, 0x8b, 0xe3, 0x76, 0x9c, 0xcd, 0x7f, 0x9d, 0xcb, 0xc5, 0x02, 0x75, 0xdf, 0x38, 0xaf, 0x33, 0xfd, 0x37,
+    0xd2, 0xce, 0x07, 0x6f, 0x8e, 0x7f, 0x3f, 0x3b, 0x3d, 0x7e, 0x05, 0xce, 0x07, 0x1f, 0x5e, 0x7e, 0xff, 0xf2, 0xbd,
+    0x0a, 0xee, 0xae, 0xe6, 0xbc, 0xdf, 0x77, 0x52, 0x9f, 0x90, 0x0f, 0x2b, 0xb2, 0x1f, 0xc6, 0x8f, 0x0b, 0x65, 0xf4,
+    0x40, 0x0e, 0x99, 0x85, 0x42, 0x86, 0x2a, 0x6a, 0xfb, 0xbb, 0x1c, 0x4e, 0x3c, 0x30, 0x8b, 0xbb, 0x86, 0x08, 0xd7,
+    0x6f, 0xb9, 0x0d, 0xb2, 0x26, 0x8f, 0xbc, 0x7e, 0x70, 0x32, 0x95, 0x8e, 0x2d, 0x2c, 0x18, 0x94, 0x0d, 0x6d, 0x3a,
+    0xce, 0xe6, 0xc5, 0xc2, 0xb6, 0xcb, 0x2d, 0x90, 0x51, 0x9a, 0x5d, 0x5c, 0x84, 0x0a, 0xba, 0xfa, 0x08, 0x34, 0x00,
+    0xa6, 0x51, 0x85, 0x6b, 0x11, 0x9f, 0xf9, 0xe5, 0x47, 0x63, 0xaf, 0x79, 0xb7, 0xa8, 0x7b, 0x32, 0xcd, 0xaa, 0x1a,
+    0x03, 0x3a, 0x98, 0x50, 0xee, 0x06, 0xdd, 0x04, 0x93, 0x51, 0x6d, 0xf9, 0x75, 0x5e, 0x2d, 0x4c, 0x73, 0xdc, 0x30,
+    0x54, 0x5e, 0xc9, 0x6b, 0xd9, 0x40, 0x64, 0x20, 0x19, 0x86, 0x3d, 0x1a, 0xa3, 0x48, 0x7d, 0x6f, 0xd7, 0x3b, 0x7e,
+    0x93, 0x4b, 0x88, 0xa6, 0x98, 0x81, 0x74, 0xfe, 0x58, 0x28, 0xe7, 0x72, 0xc9, 0xf8, 0x5c, 0x2c, 0x8e, 0xc0, 0xed,
+    0x7c, 0x2e, 0x16, 0x11, 0x06, 0xe5, 0xcb, 0x20, 0x56, 0x09, 0xd8, 0xbd, 0x38, 0x08, 0xdf, 0x4e, 0x68, 0x03, 0xbb,
+    0x81, 0x24, 0x1b, 0x94, 0x76, 0xa5, 0x21, 0xca, 0x9d, 0xf2, 0x68, 0x83, 0xc8, 0x43, 0xac, 0x9a, 0x57, 0x6d, 0x4f,
+    0x36, 0x73, 0x31, 0xc1, 0x55, 0x16, 0x33, 0x39, 0x8d, 0x0f, 0x59, 0x31, 0x8d, 0xa1, 0x94, 0x38, 0x4d, 0xc3, 0x98,
+    0x4e, 0xa8, 0x20, 0x24, 0x61, 0x7c, 0x1e, 0x2f, 0x68, 0x82, 0x52, 0x82, 0x10, 0x42, 0x7e, 0x8c, 0xd0, 0x36, 0x07,
+    0x96, 0xbc, 0xdd, 0x7e, 0x9e, 0x7e, 0x6e, 0xc7, 0x70, 0x19, 0x15, 0xa1, 0x1b, 0x74, 0xd6, 0xf0, 0x6f, 0x44, 0x05,
+    0x8d, 0xb1, 0x62, 0x08, 0x02, 0x5e, 0x60, 0x54, 0xc2, 0x82, 0xc4, 0xac, 0x82, 0x28, 0x02, 0xe5, 0x3c, 0x5e, 0xb0,
+    0x82, 0x36, 0x6d, 0x4e, 0x63, 0x6d, 0x12, 0xd4, 0x73, 0x58, 0x6a, 0x7b, 0x52, 0xa9, 0x10, 0x7b, 0x7c, 0x26, 0xa2,
+    0x6b, 0x6d, 0x68, 0x00, 0x28, 0x50, 0x4a, 0x2e, 0x7e, 0xf3, 0xe5, 0x1e, 0x6e, 0x0a, 0xfa, 0x9f, 0x6d, 0x4c, 0xb4,
+    0xb3, 0x5c, 0x1d, 0x7a, 0xf3, 0x05, 0x8d, 0xf3, 0x1c, 0x42, 0xb1, 0x19, 0x04, 0x72, 0x91, 0x55, 0x10, 0xd1, 0xe2,
+    0x2e, 0x30, 0x21, 0xe1, 0xa0, 0x4d, 0xbf, 0x42, 0x6a, 0x43, 0x4c, 0xae, 0x3c, 0x31, 0xb0, 0xdb, 0x2a, 0x41, 0xc0,
+    0x91, 0x9e, 0x67, 0x9f, 0x9a, 0x18, 0x6b, 0x9a, 0x9a, 0x99, 0x78, 0x1b, 0x0a, 0xd1, 0xa0, 0x05, 0xd1, 0x0c, 0xde,
+    0x3f, 0x57, 0x1c, 0xaf, 0x3a, 0xf0, 0x03, 0xde, 0xb9, 0x38, 0xf3, 0x6a, 0xe6, 0x11, 0x39, 0xf5, 0x51, 0x8e, 0xe8,
+    0x97, 0x3c, 0xac, 0x46, 0x3a, 0x19, 0x63, 0x25, 0x71, 0xd0, 0xdb, 0x60, 0xc1, 0x9c, 0xd0, 0x15, 0x0f, 0x2d, 0x1f,
+    0xff, 0x0a, 0x99, 0x8c, 0x92, 0x1a, 0x2b, 0xba, 0xd2, 0x62, 0xc4, 0x79, 0x0d, 0xb3, 0x34, 0x59, 0xd1, 0xc5, 0x42,
+    0x93, 0x66, 0xa1, 0x4c, 0x03, 0x7c, 0x02, 0x2d, 0x46, 0xee, 0xa1, 0xa6, 0x0d, 0x84, 0x86, 0xdd, 0x21, 0xe0, 0x23,
+    0xf7, 0xd0, 0xe1, 0xff, 0xe7, 0xd9, 0x05, 0x22, 0xed, 0xcd, 0x4d, 0x64, 0x3c, 0x52, 0x37, 0x70, 0x50, 0x8c, 0x8f,
+    0x7d, 0x33, 0xf1, 0x0b, 0x67, 0xf4, 0x21, 0xa9, 0x7c, 0x87, 0x0f, 0x96, 0x3f, 0xde, 0xd4, 0xcc, 0xca, 0x08, 0xd6,
+    0xc3, 0x76, 0x8b, 0x0b, 0xa2, 0xed, 0x02, 0x48, 0x3d, 0xe3, 0xd5, 0xc2, 0x37, 0x5e, 0x8d, 0xef, 0x31, 0x5e, 0x75,
+    0x67, 0x6a, 0x98, 0x93, 0x0d, 0xea, 0xb3, 0x94, 0x3c, 0x3f, 0x47, 0x99, 0x60, 0xd3, 0xe5, 0xac, 0xa4, 0x2a, 0x95,
+    0xd0, 0x5e, 0xec, 0x67, 0x8c, 0x6f, 0x09, 0xc6, 0x59, 0x71, 0x18, 0x09, 0x54, 0xa5, 0x92, 0x3a, 0xec, 0x15, 0xa0,
+    0x1e, 0x83, 0xf7, 0x06, 0x43, 0xd4, 0xc8, 0xd8, 0x4d, 0x1b, 0x08, 0x0d, 0x8d, 0xf5, 0x68, 0xcf, 0x5a, 0x8f, 0x6e,
+    0xb7, 0x95, 0xf1, 0xb7, 0x93, 0xeb, 0x22, 0x41, 0x54, 0x61, 0x35, 0x9a, 0x00, 0x6f, 0x9a, 0xd8, 0xdb, 0x92, 0x53,
+    0x5a, 0x60, 0xf8, 0xec, 0x3f, 0xc3, 0xd2, 0xa9, 0x24, 0x4a, 0x32, 0x2b, 0xa3, 0x81, 0x3b, 0x07, 0x5f, 0xc4, 0x15,
+    0xac, 0x01, 0x88, 0xe4, 0x88, 0x1e, 0xae, 0x7f, 0x86, 0xd2, 0x65, 0x96, 0x64, 0x26, 0x21, 0x33, 0x17, 0x69, 0x3b,
+    0xeb, 0x60, 0xe2, 0x4c, 0x6a, 0xbd, 0xb1, 0x90, 0x43, 0x83, 0xfc, 0x00, 0xca, 0x10, 0x87, 0x4f, 0x3e, 0x98, 0x50,
+    0xa9, 0x42, 0xa9, 0x36, 0xba, 0xd9, 0x0d, 0xbc, 0xf2, 0x21, 0xbb, 0xe2, 0x65, 0x15, 0x5f, 0xad, 0x8c, 0x25, 0x31,
+    0x67, 0xf7, 0xb9, 0xed, 0x51, 0x61, 0x5e, 0xbd, 0x7d, 0xf9, 0xfd, 0x71, 0xe3, 0xd5, 0x2e, 0xe2, 0x68, 0x08, 0xb6,
+    0x15, 0x63, 0x8c, 0xde, 0xe2, 0xd3, 0x60, 0xa2, 0x5c, 0x23, 0xd0, 0xbb, 0x14, 0xf4, 0xdb, 0x5f, 0xea, 0x09, 0x78,
+    0xc5, 0xf5, 0xf2, 0x4b, 0x3e, 0x02, 0x96, 0xa8, 0xd0, 0xb3, 0xc2, 0xdc, 0xac, 0xcc, 0xee, 0xed, 0x56, 0x64, 0xa6,
+    0x5d, 0x69, 0x64, 0x20, 0x5e, 0x6d, 0x87, 0xb1, 0x70, 0xe9, 0x9a, 0x6e, 0x07, 0xbb, 0x5a, 0x7a, 0x96, 0xc8, 0xdb,
+    0x6d, 0x09, 0x1d, 0xb2, 0x03, 0xee, 0xbd, 0x8c, 0x6f, 0xe1, 0x65, 0xe9, 0x75, 0xb3, 0x19, 0x3c, 0x01, 0xcc, 0x84,
+    0x0b, 0x67, 0x59, 0x1c, 0x33, 0x9e, 0x84, 0x2a, 0x36, 0x57, 0x43, 0xe4, 0xad, 0x08, 0xad, 0xd9, 0x5f, 0xa1, 0x18,
+    0x81, 0xdd, 0xc9, 0xe9, 0xc7, 0x6c, 0x35, 0x5b, 0x02, 0x6a, 0xfe, 0x55, 0x26, 0x80, 0xe6, 0xda, 0xb5, 0x60, 0x9b,
+    0x42, 0x9b, 0xeb, 0xfa, 0x79, 0xbc, 0x8a, 0x13, 0x50, 0xdd, 0x80, 0xb7, 0xc8, 0x9d, 0x16, 0x5d, 0x19, 0x74, 0x51,
+    0xfa, 0x40, 0x39, 0x96, 0x14, 0x3a, 0xfa, 0xde, 0x13, 0xea, 0xdc, 0x33, 0x80, 0x4b, 0x1a, 0x35, 0x4f, 0xb5, 0x94,
+    0xb1, 0x00, 0x58, 0xe8, 0x60, 0xa6, 0xc8, 0x56, 0x74, 0x6b, 0x30, 0x29, 0xe0, 0xad, 0x01, 0xfe, 0x10, 0x59, 0xa5,
+    0xee, 0x8a, 0x65, 0x58, 0x7a, 0xf6, 0xd7, 0xfd, 0x7e, 0xec, 0xd9, 0x5f, 0x5f, 0x68, 0x5a, 0x17, 0xb7, 0x1b, 0x40,
+    0x6a, 0x0c, 0x20, 0x72, 0xac, 0x07, 0xc2, 0x44, 0x14, 0x6b, 0xfa, 0xfe, 0x1d, 0x9b, 0x2c, 0x0a, 0x84, 0x7e, 0xa7,
+    0x5e, 0x4f, 0x4a, 0x02, 0x3a, 0xb5, 0x8a, 0x1d, 0x0d, 0xb4, 0xd9, 0x07, 0x04, 0x44, 0xf5, 0x33, 0xb2, 0xf9, 0x42,
+    0x39, 0x17, 0xab, 0xf0, 0xe1, 0x63, 0x0a, 0x01, 0x85, 0x3b, 0x6a, 0x74, 0xde, 0x86, 0x48, 0xa0, 0xac, 0x50, 0xc4,
+    0x9a, 0x17, 0x6b, 0x49, 0xc8, 0x7c, 0xbc, 0x40, 0xc1, 0x95, 0x03, 0x76, 0xe5, 0x6c, 0x32, 0x2c, 0x23, 0xce, 0xc2,
+    0xfb, 0xbf, 0x99, 0x2c, 0x08, 0x6a, 0xae, 0xfc, 0x40, 0x8e, 0x3b, 0x99, 0x1a, 0x7b, 0xaa, 0x51, 0x83, 0x60, 0x32,
+    0x82, 0xc0, 0x70, 0xc3, 0x2f, 0xf8, 0xf8, 0x60, 0x41, 0x40, 0x45, 0x66, 0xcd, 0x42, 0xcc, 0x8b, 0xc3, 0x27, 0x80,
+    0x1a, 0x33, 0x3a, 0x78, 0x06, 0xa0, 0xb0, 0x10, 0x10, 0x7d, 0x0c, 0x32, 0x5a, 0x01, 0xbf, 0x85, 0xfa, 0xdd, 0x3a,
+    0xf1, 0x7d, 0xe8, 0x57, 0x41, 0x2f, 0x62, 0x60, 0x38, 0xa2, 0xc9, 0x7e, 0xc8, 0x07, 0x93, 0x01, 0x68, 0x4b, 0xbc,
+    0xdd, 0xd7, 0xd2, 0x8a, 0x9b, 0xd3, 0xa5, 0xd3, 0xfd, 0x93, 0x36, 0x41, 0x12, 0xa9, 0x64, 0xa5, 0x22, 0x06, 0x10,
+    0xca, 0x52, 0x6d, 0x93, 0x25, 0x58, 0x56, 0x98, 0x25, 0xcd, 0x0d, 0x4a, 0xe2, 0xee, 0x66, 0xe0, 0x18, 0x35, 0xeb,
+    0x38, 0x2c, 0x5b, 0x6e, 0xd4, 0x00, 0x9f, 0x93, 0xb0, 0xc2, 0xde, 0x70, 0x66, 0xd2, 0x3b, 0xd3, 0xe1, 0xea, 0x98,
+    0xb3, 0x37, 0x1c, 0xc1, 0x38, 0x12, 0xbc, 0xf1, 0xd0, 0x25, 0xd3, 0x50, 0x91, 0x29, 0xe3, 0x60, 0xda, 0x03, 0xdc,
+    0x7b, 0x0e, 0xc6, 0x61, 0x6c, 0x50, 0x59, 0x52, 0x9f, 0x7a, 0x77, 0x21, 0x10, 0xa4, 0xb5, 0x5e, 0xe6, 0x33, 0x3c,
+    0x3d, 0x23, 0x94, 0xfd, 0x21, 0x87, 0x2f, 0xc0, 0x8e, 0x82, 0x1c, 0x4d, 0xf8, 0xb3, 0xc7, 0xbb, 0x81, 0xaa, 0xf8,
+    0x20, 0xd8, 0x8b, 0x45, 0xba, 0x17, 0x0c, 0x04, 0xfc, 0x2a, 0xf8, 0x5e, 0x25, 0xe5, 0xde, 0x45, 0x5c, 0xec, 0xc5,
+    0xab, 0xb8, 0xa8, 0xf6, 0x6e, 0xb2, 0x6a, 0xb9, 0x67, 0x3a, 0x04, 0xd0, 0xbc, 0xc1, 0x20, 0x1e, 0x04, 0x7b, 0xc1,
+    0xa0, 0x30, 0x53, 0xbb, 0x62, 0x65, 0xe3, 0x38, 0x33, 0x21, 0xca, 0x82, 0x66, 0x80, 0xb0, 0xc6, 0x69, 0x00, 0x7c,
+    0xea, 0x9a, 0xa5, 0xf4, 0x02, 0xc3, 0x0d, 0x88, 0xe9, 0x1a, 0xfa, 0x00, 0x3c, 0xf2, 0x9a, 0xc6, 0xb0, 0x04, 0x2e,
+    0x06, 0x03, 0xb2, 0x86, 0xc8, 0x05, 0x6b, 0x6a, 0x83, 0x38, 0x84, 0x6b, 0x65, 0xa7, 0xbd, 0x0b, 0xcc, 0xb4, 0xdd,
+    0x02, 0xa2, 0xf2, 0x84, 0xf4, 0xfb, 0xf6, 0x1b, 0xea, 0x5f, 0xb0, 0x97, 0x60, 0x7f, 0x55, 0x54, 0x61, 0x22, 0x95,
+    0xe6, 0xfb, 0x92, 0x1d, 0x0d, 0x54, 0xc4, 0xe1, 0x1d, 0x47, 0x8a, 0x36, 0x2a, 0x97, 0x65, 0x4f, 0x96, 0x0d, 0x5f,
+    0x89, 0x2b, 0xee, 0xfc, 0xb8, 0x2a, 0x29, 0xf3, 0x2a, 0x5b, 0x29, 0xf6, 0x6f, 0xc6, 0x35, 0xf7, 0x07, 0xd6, 0x9f,
+    0xcd, 0x57, 0x70, 0x6d, 0xf5, 0xde, 0x35, 0xb9, 0x46, 0xe4, 0x2c, 0xa1, 0x5c, 0x52, 0xdb, 0x3c, 0xbc, 0xa5, 0xef,
+    0xf3, 0xab, 0x6f, 0x33, 0x9d, 0xc6, 0x67, 0x15, 0x16, 0x2e, 0x44, 0x2b, 0x82, 0x43, 0x43, 0x2e, 0x9a, 0x47, 0x80,
+    0xb9, 0xf6, 0xd9, 0x0a, 0x0a, 0x52, 0x9f, 0x55, 0xe8, 0xdd, 0x0a, 0x09, 0xaf, 0x34, 0xbb, 0xf4, 0x30, 0x90, 0x32,
+    0x6e, 0x0f, 0x2d, 0x61, 0xd2, 0xf2, 0x22, 0xbc, 0xf7, 0x9a, 0x9b, 0xdc, 0x8b, 0x10, 0xa3, 0x17, 0x79, 0x76, 0x02,
+    0xc6, 0xba, 0x4b, 0x76, 0x36, 0x3c, 0xf1, 0x1b, 0x9e, 0xb3, 0x16, 0x8d, 0xa6, 0x4b, 0x96, 0xf4, 0xfb, 0x31, 0x98,
+    0x78, 0xa7, 0x2c, 0x87, 0x5f, 0xf9, 0x82, 0xae, 0x19, 0x60, 0x8a, 0xd1, 0x0b, 0x48, 0x48, 0x11, 0x89, 0x64, 0xad,
+    0x4e, 0x92, 0xcf, 0x74, 0x17, 0x80, 0xd1, 0x2f, 0x66, 0x69, 0xb4, 0xbc, 0xd7, 0xcc, 0x02, 0xc9, 0x33, 0xf4, 0x5d,
+    0x07, 0xdb, 0x1b, 0xfb, 0x20, 0xe5, 0xfc, 0x50, 0x4c, 0x07, 0x03, 0x4e, 0x34, 0xdc, 0x78, 0xa9, 0xc4, 0xb5, 0xba,
+    0xc5, 0x1d, 0xc3, 0x58, 0xea, 0xdb, 0x22, 0x06, 0x07, 0xec, 0xa2, 0x95, 0xdd, 0x3e, 0xc0, 0xbe, 0x72, 0xbc, 0x4b,
+    0x95, 0xdd, 0xe9, 0x31, 0xd3, 0x5c, 0xb6, 0x9a, 0x74, 0x52, 0x71, 0x3f, 0x91, 0x6f, 0x72, 0x07, 0x5d, 0x2e, 0xc7,
+    0x9a, 0xb7, 0x1c, 0x80, 0x8a, 0x7e, 0xa4, 0xa8, 0xee, 0x17, 0x38, 0xc2, 0x3c, 0x58, 0xb7, 0xf9, 0x64, 0xdf, 0x14,
+    0x38, 0x44, 0x9e, 0xb4, 0xd1, 0x14, 0xd0, 0xbd, 0x8b, 0xc7, 0x5d, 0xfd, 0xb6, 0x74, 0x17, 0x28, 0xd1, 0x4e, 0xc5,
+    0x0d, 0x3f, 0x26, 0xea, 0x74, 0xa6, 0x0d, 0xa1, 0x7f, 0x65, 0xc4, 0xfd, 0xa5, 0x71, 0x15, 0x6f, 0x7a, 0x97, 0xcf,
+    0x38, 0xd4, 0xd9, 0x0d, 0xa1, 0x00, 0x5c, 0xb5, 0xa7, 0x53, 0x37, 0x86, 0xf4, 0x4a, 0x89, 0x6e, 0x83, 0x83, 0xdd,
+    0xeb, 0x33, 0x8e, 0xa2, 0x1f, 0xa3, 0x46, 0xbe, 0x89, 0xc4, 0x63, 0x39, 0x88, 0x1f, 0x17, 0x74, 0x19, 0x89, 0xc7,
+    0xc5, 0x20, 0x7e, 0x2c, 0xeb, 0x7a, 0xf7, 0x5c, 0xb9, 0xbf, 0x8f, 0xc8, 0xb3, 0xee, 0xec, 0xa5, 0x12, 0x36, 0x06,
+    0x9e, 0x5d, 0x0b, 0x08, 0xa7, 0xe0, 0x89, 0x6c, 0x2d, 0x7d, 0xe8, 0xdc, 0xee, 0x63, 0xcb, 0x24, 0x41, 0xd0, 0xf3,
+    0x36, 0x9b, 0x44, 0xb1, 0xb3, 0xcd, 0xa3, 0x0f, 0xa7, 0x40, 0x42, 0xb7, 0xdb, 0x66, 0x5d, 0xad, 0x01, 0xc5, 0x34,
+    0x1c, 0xf3, 0xfd, 0x62, 0x74, 0xe3, 0xbb, 0xeb, 0xef, 0x17, 0xa3, 0x25, 0x19, 0x4e, 0xcc, 0xe4, 0xc7, 0x47, 0xe3,
+    0x59, 0x1c, 0x4d, 0xea, 0x8e, 0xd3, 0x42, 0xe3, 0x9f, 0x7a, 0xb7, 0x50, 0x04, 0x4e, 0xc5, 0x08, 0x8e, 0x9c, 0x0a,
+    0xe5, 0xa4, 0xd4, 0xc0, 0xf0, 0xdf, 0xab, 0x76, 0xb4, 0x69, 0x6f, 0xe2, 0x2a, 0x59, 0x66, 0xe2, 0x52, 0x87, 0x0f,
+    0xd7, 0xd1, 0xc5, 0x6d, 0x40, 0x3b, 0xef, 0x32, 0xed, 0xf8, 0x75, 0xd2, 0xa0, 0x27, 0xae, 0x66, 0x06, 0xdc, 0xba,
+    0x1f, 0xa1, 0x19, 0x02, 0xa3, 0xe5, 0xf9, 0x3b, 0xc4, 0xdc, 0xfe, 0x4d, 0xd9, 0xfc, 0x2a, 0xda, 0xe7, 0xc8, 0x48,
+    0xd9, 0x26, 0x23, 0x15, 0x18, 0x61, 0x4a, 0x91, 0xc4, 0x55, 0x08, 0x81, 0xec, 0xbf, 0xa4, 0xb8, 0x16, 0x4b, 0xef,
+    0x35, 0x08, 0x13, 0x6c, 0x17, 0xb4, 0x5f, 0xdd, 0xce, 0x6d, 0xa5, 0xc5, 0x1e, 0xa9, 0xef, 0x73, 0x67, 0xbb, 0xa2,
+    0xc9, 0xdf, 0x97, 0x0d, 0x68, 0x03, 0x88, 0xf2, 0xbe, 0x3e, 0x2a, 0x81, 0x93, 0x11, 0x37, 0x94, 0x18, 0xbd, 0xa0,
+    0xab, 0x13, 0xb9, 0x67, 0xa7, 0xe6, 0x4d, 0xc5, 0x4c, 0xc5, 0x95, 0x6f, 0xf6, 0xcc, 0x7f, 0x30, 0x14, 0x54, 0x80,
+    0x81, 0xb7, 0x39, 0xe3, 0xd1, 0x81, 0xee, 0xc6, 0xe8, 0xb4, 0x60, 0xb3, 0xa0, 0x2e, 0xeb, 0xa6, 0x8d, 0x07, 0x8d,
+    0x38, 0x28, 0x8a, 0x55, 0xa1, 0x46, 0xc2, 0x13, 0x81, 0x80, 0x29, 0xbb, 0xe2, 0x91, 0x11, 0xd4, 0xf4, 0x26, 0x14,
+    0x36, 0x14, 0xfc, 0x55, 0xa2, 0x9a, 0xde, 0x84, 0x36, 0x99, 0x38, 0xcd, 0x20, 0x82, 0x19, 0xb1, 0xdd, 0x6f, 0x01,
+    0x6d, 0x6e, 0xcd, 0x68, 0x53, 0xd7, 0x56, 0x5b, 0x85, 0x5c, 0x52, 0xa4, 0x2c, 0xff, 0x9d, 0x9a, 0x0a, 0x4a, 0x6a,
+    0xb9, 0xe8, 0x4d, 0x9a, 0x2e, 0x7a, 0x3c, 0x33, 0x92, 0x40, 0xe5, 0x96, 0x3b, 0x46, 0x7f, 0x08, 0x0b, 0x3c, 0x62,
+    0xe2, 0xc4, 0x82, 0xb9, 0xd5, 0x11, 0xcb, 0xe6, 0x62, 0x31, 0x5a, 0x49, 0x08, 0x1b, 0x7c, 0xc8, 0xb2, 0x79, 0xa9,
+    0x1f, 0x42, 0x5f, 0x58, 0x7a, 0x02, 0x76, 0xb1, 0xc1, 0x4a, 0x96, 0x01, 0xf8, 0x5e, 0xd0, 0xcd, 0x4a, 0x96, 0x91,
+    0x54, 0xdd, 0x8f, 0x6b, 0x2c, 0x41, 0xa5, 0x15, 0x2a, 0x2d, 0xa9, 0xb1, 0x20, 0xf0, 0x55, 0xd5, 0xe5, 0x43, 0xb2,
+    0xab, 0x40, 0x3d, 0x75, 0xd4, 0x80, 0x53, 0xa0, 0xaa, 0xc0, 0x82, 0x24, 0xa8, 0x0c, 0x5d, 0x15, 0x98, 0x56, 0x60,
+    0x9a, 0xa9, 0xc2, 0x45, 0x99, 0x1d, 0x4a, 0xb3, 0x5e, 0xf2, 0x59, 0x3c, 0x08, 0x93, 0x61, 0x4c, 0x1e, 0x23, 0xd4,
+    0xfe, 0x7e, 0x1e, 0xc5, 0x5a, 0x2e, 0xb9, 0x72, 0x7e, 0xf1, 0x37, 0x9f, 0xb1, 0xd7, 0x3d, 0xc3, 0x60, 0x01, 0xce,
+    0xd2, 0xf6, 0x2a, 0x13, 0xef, 0x64, 0x2b, 0x38, 0x0e, 0x66, 0x51, 0x0e, 0xab, 0x9e, 0x1c, 0xd1, 0x5c, 0xe4, 0xda,
+    0xbb, 0x08, 0x91, 0x83, 0xcc, 0x1e, 0x03, 0xec, 0x46, 0xf8, 0x3a, 0xb4, 0x36, 0xb7, 0xba, 0x42, 0xfc, 0x8d, 0x12,
+    0x89, 0x9f, 0xa5, 0xfc, 0xb8, 0x5e, 0xa9, 0x5c, 0x95, 0xc1, 0x63, 0xd5, 0xcd, 0xe0, 0x99, 0xf6, 0x3d, 0xd6, 0xfe,
+    0xad, 0xed, 0xe6, 0x78, 0xef, 0xc1, 0x83, 0xd6, 0xff, 0xd6, 0x93, 0x10, 0xda, 0x2b, 0x27, 0xa9, 0x3b, 0x6a, 0xf4,
+    0xcc, 0x64, 0x8d, 0xa8, 0x84, 0xa9, 0xdd, 0xa9, 0x1c, 0x03, 0x35, 0x1d, 0xc0, 0xb5, 0x44, 0x4d, 0xd0, 0x93, 0x82,
+    0x8d, 0xe1, 0x88, 0xb3, 0x38, 0x68, 0x87, 0x31, 0x8a, 0x97, 0x73, 0x25, 0x5e, 0xce, 0x8f, 0x18, 0x07, 0x68, 0x2d,
+    0x40, 0xaa, 0xd7, 0xb0, 0x9f, 0xb9, 0x82, 0x05, 0x36, 0x77, 0xbe, 0x03, 0x0b, 0x64, 0x88, 0x93, 0xcd, 0x71, 0xb2,
+    0xc7, 0xb5, 0x9e, 0x7b, 0x81, 0x8f, 0x93, 0x7a, 0xe1, 0xd5, 0x55, 0xb6, 0xeb, 0x5a, 0xb2, 0x72, 0x5e, 0x0c, 0x26,
+    0x10, 0x94, 0xa5, 0x9c, 0x17, 0xc3, 0xc9, 0x82, 0xe6, 0xf0, 0x63, 0xd1, 0x40, 0x87, 0x58, 0x0e, 0x12, 0xb8, 0x74,
+    0xf6, 0x18, 0xf0, 0x86, 0x52, 0x8b, 0xbb, 0xb1, 0x8e, 0x1c, 0xeb, 0x28, 0xf6, 0xc3, 0x18, 0x70, 0x65, 0x9d, 0xc0,
+    0xfb, 0xfe, 0xeb, 0x63, 0x13, 0x90, 0x55, 0xbb, 0xc2, 0xab, 0x51, 0xee, 0xba, 0xd2, 0xe8, 0x4b, 0x4a, 0x4f, 0x78,
+    0xc1, 0x53, 0xc9, 0x76, 0xdb, 0x33, 0x70, 0xb6, 0xc4, 0x43, 0xe2, 0x1d, 0x23, 0x7a, 0x31, 0x6d, 0x64, 0xe6, 0x04,
+    0xce, 0x6c, 0x77, 0xd9, 0xc6, 0xfc, 0xd8, 0x01, 0x0e, 0x16, 0x41, 0x48, 0xdc, 0x10, 0x86, 0x89, 0x1d, 0x95, 0x43,
+    0x2d, 0x84, 0xeb, 0x5a, 0x78, 0x1d, 0xa7, 0x65, 0x0c, 0x2e, 0xd2, 0xda, 0x36, 0xf1, 0x1e, 0xba, 0xee, 0xf9, 0x31,
+    0xb7, 0x3a, 0x46, 0x5b, 0x48, 0xbf, 0x1d, 0x9d, 0xde, 0x73, 0x18, 0x80, 0xa6, 0x07, 0xb3, 0xaa, 0x7d, 0x26, 0x71,
+    0x73, 0xda, 0x09, 0x42, 0x22, 0x10, 0x45, 0xe9, 0x8c, 0x30, 0xfd, 0x3b, 0xcd, 0x65, 0x15, 0xad, 0x1e, 0xe4, 0x99,
+    0x43, 0x9e, 0x85, 0xde, 0xf6, 0xa0, 0x55, 0x73, 0x37, 0x18, 0x27, 0x6e, 0xb7, 0x77, 0xfe, 0xdf, 0xb2, 0xae, 0xad,
+    0xd6, 0x88, 0xc7, 0xed, 0xea, 0x07, 0x8d, 0xbd, 0xda, 0x53, 0x31, 0x60, 0x56, 0xd2, 0x3b, 0xa3, 0x4a, 0x5e, 0x64,
+    0xbc, 0xc4, 0x93, 0x6a, 0xd5, 0xf0, 0xf1, 0xbe, 0xc9, 0x46, 0xe6, 0x81, 0x4c, 0x01, 0xf1, 0xfc, 0x26, 0x35, 0xea,
+    0xe3, 0x14, 0x25, 0xe0, 0xef, 0x74, 0x7c, 0x23, 0xfa, 0xd1, 0xbe, 0xb8, 0xe4, 0xd5, 0xc9, 0x8d, 0x30, 0x2f, 0x5e,
+    0x58, 0x9d, 0x3f, 0x7d, 0x53, 0xf8, 0xd0, 0xe1, 0xa8, 0xbd, 0x83, 0x22, 0x4b, 0x26, 0x8e, 0x26, 0x46, 0xd6, 0x26,
+    0x66, 0x1f, 0x15, 0x5c, 0x4c, 0x54, 0xa1, 0x67, 0x9d, 0x3d, 0x61, 0x0a, 0xd0, 0x37, 0x8e, 0x51, 0xc9, 0x18, 0x16,
+    0x0c, 0xd4, 0x69, 0x4a, 0x88, 0x1e, 0x8a, 0x19, 0xc6, 0x2b, 0x06, 0x50, 0x98, 0x42, 0x81, 0x28, 0x3a, 0xfb, 0x70,
+    0xa0, 0x09, 0xfd, 0xfe, 0x4d, 0xaa, 0x33, 0xd0, 0xb2, 0x9e, 0x4a, 0x10, 0xd5, 0x41, 0xb4, 0x55, 0x5e, 0x84, 0x3f,
+    0x2e, 0x69, 0x99, 0xd1, 0xa5, 0xa0, 0xa9, 0xa0, 0x49, 0x46, 0x2f, 0xb8, 0x12, 0x15, 0x5f, 0x08, 0xa6, 0x68, 0xbb,
+    0x21, 0xec, 0xff, 0x6a, 0xd0, 0xf5, 0x56, 0xac, 0x35, 0xb4, 0x3b, 0x41, 0x46, 0x68, 0xbe, 0xd0, 0x41, 0xc8, 0x50,
+    0x39, 0x09, 0x5d, 0xab, 0x34, 0x5e, 0x81, 0x4b, 0xa6, 0xd9, 0x68, 0x19, 0x97, 0x61, 0x60, 0xbf, 0x0a, 0x2c, 0x26,
+    0x07, 0x26, 0x9d, 0xae, 0xcf, 0x9f, 0xcb, 0xab, 0x95, 0x14, 0x5c, 0x54, 0x0a, 0xa2, 0xdf, 0xe0, 0xbe, 0x9b, 0xb8,
+    0xea, 0xac, 0x59, 0x2b, 0x7d, 0xe8, 0x5b, 0x9f, 0xb5, 0x71, 0x5f, 0x18, 0x1c, 0x83, 0x9d, 0x8f, 0x88, 0x81, 0x34,
+    0xa8, 0x74, 0x8b, 0x43, 0x13, 0xa0, 0x4b, 0x87, 0x14, 0xb2, 0x64, 0x2a, 0x53, 0x25, 0xa8, 0xf8, 0xc6, 0xef, 0xa5,
+    0xac, 0x46, 0x7f, 0xad, 0x79, 0x71, 0x77, 0xca, 0x73, 0x8e, 0x63, 0x14, 0x24, 0xb1, 0xb8, 0x8e, 0xcb, 0x80, 0xf8,
+    0x96, 0x57, 0xc1, 0x41, 0x6a, 0xc2, 0xc6, 0xec, 0x54, 0x8d, 0x5a, 0x2f, 0x89, 0xbe, 0x32, 0xca, 0x37, 0x06, 0x43,
+    0x13, 0x51, 0x05, 0x7d, 0xaf, 0xd5, 0x3d, 0xad, 0x6e, 0x58, 0x40, 0xfc, 0xb9, 0xd2, 0x0b, 0xb5, 0x5e, 0x37, 0x63,
+    0x6e, 0x98, 0x08, 0x41, 0xa3, 0x27, 0xf5, 0xa2, 0xf6, 0xdc, 0xd2, 0x54, 0x64, 0xdc, 0x68, 0x93, 0xf3, 0x4b, 0x90,
+    0xf1, 0x39, 0x73, 0xa1, 0x49, 0x5d, 0x53, 0x05, 0x55, 0x18, 0x6d, 0x6e, 0x1b, 0xe9, 0xf4, 0x0e, 0xdc, 0xd9, 0x8c,
+    0xd9, 0x91, 0x76, 0x69, 0xac, 0x69, 0xc1, 0xcb, 0x95, 0x14, 0x25, 0x84, 0x71, 0xee, 0x8d, 0xe9, 0x55, 0x9c, 0x89,
+    0x2a, 0xce, 0xc4, 0x71, 0xb9, 0xe2, 0x49, 0xf5, 0x1e, 0x6e, 0x71, 0xca, 0xea, 0xa6, 0x2e, 0xe1, 0x4a, 0x97, 0xec,
+    0x61, 0x30, 0x35, 0x15, 0xf7, 0xd8, 0x19, 0x5c, 0x54, 0x7f, 0x44, 0x4b, 0x89, 0xb1, 0x50, 0x75, 0xf1, 0xf1, 0x79,
+    0x29, 0xf3, 0x75, 0x05, 0xda, 0xdd, 0x8b, 0x2a, 0x3a, 0x78, 0xba, 0xba, 0x9d, 0xaa, 0x1b, 0x4c, 0xf4, 0xf4, 0x60,
+    0x75, 0xdb, 0xcb, 0xae, 0x56, 0xb2, 0xa8, 0x62, 0x51, 0x4d, 0x15, 0x22, 0x59, 0x12, 0xe7, 0x49, 0x38, 0x19, 0x8f,
+    0xbf, 0xda, 0x1b, 0xee, 0x41, 0x06, 0x32, 0xfd, 0x34, 0x54, 0x2e, 0x47, 0xc3, 0xc9, 0x78, 0x3c, 0x95, 0xea, 0x6e,
+    0x17, 0x8d, 0x26, 0x35, 0xd6, 0x33, 0x4c, 0xf4, 0xcc, 0x8c, 0xf8, 0xed, 0x2a, 0x16, 0x29, 0xc4, 0xaf, 0xd3, 0xc5,
+    0x1f, 0x3c, 0x1d, 0x37, 0xca, 0xb7, 0x9f, 0x3e, 0xab, 0xff, 0xa8, 0x4d, 0x58, 0x6b, 0xd3, 0xee, 0xe7, 0x7f, 0x1c,
+    0xaa, 0xf9, 0x3e, 0x3a, 0xdc, 0xd7, 0x3f, 0xfe, 0xa8, 0xeb, 0xe9, 0x9b, 0x22, 0x9c, 0xff, 0x33, 0x54, 0xf3, 0x79,
+    0x5c, 0x14, 0xf1, 0x5d, 0x0d, 0x91, 0x3c, 0x85, 0xf3, 0x26, 0xa1, 0xde, 0x36, 0xa0, 0x07, 0x64, 0x7a, 0x21, 0x18,
+    0x7c, 0xf3, 0xbe, 0x0a, 0x03, 0x5e, 0xae, 0x86, 0x5c, 0x54, 0x59, 0x75, 0x37, 0xc4, 0x3c, 0x01, 0x7e, 0x6a, 0x78,
+    0xb3, 0xe7, 0x85, 0x21, 0x36, 0x17, 0x05, 0xe7, 0x9f, 0x78, 0xa8, 0x8c, 0xa3, 0xc7, 0x68, 0x1c, 0x3d, 0xa6, 0x6a,
+    0x30, 0x26, 0xdf, 0x50, 0xdd, 0x99, 0xc9, 0x37, 0x60, 0x82, 0x94, 0xb5, 0xbf, 0x51, 0xc6, 0x89, 0xd1, 0x98, 0x5e,
+    0xbf, 0xca, 0xb3, 0x15, 0x30, 0xc1, 0x4b, 0xfd, 0xa3, 0x26, 0xf4, 0x3d, 0x6f, 0x67, 0x1f, 0x8d, 0x46, 0xcf, 0x0b,
+    0x3a, 0x1a, 0x8d, 0x3e, 0x66, 0x35, 0xa1, 0x2b, 0xd1, 0xf1, 0xfe, 0x3d, 0xa7, 0xe7, 0x32, 0xbd, 0x8b, 0x82, 0x80,
+    0x2e, 0xb3, 0x34, 0xe5, 0x42, 0x95, 0x75, 0x9a, 0xb6, 0xf3, 0xaa, 0x16, 0x22, 0xf0, 0x8f, 0x6e, 0x23, 0x42, 0x10,
+    0x11, 0x7a, 0xb2, 0xd3, 0xb3, 0xd1, 0x68, 0x74, 0x9a, 0x9a, 0x6a, 0x1d, 0x43, 0xfe, 0x06, 0xcd, 0x07, 0x9c, 0x5d,
+    0x3e, 0x58, 0xdf, 0x98, 0x68, 0x27, 0xfb, 0xff, 0x3d, 0x9c, 0xcd, 0xc7, 0xc3, 0x6f, 0x47, 0x8b, 0xc7, 0xfb, 0x34,
+    0x08, 0x7c, 0xd0, 0xea, 0x50, 0x5b, 0x73, 0x4c, 0xcb, 0xc3, 0xf1, 0x94, 0x94, 0x03, 0xf6, 0xd4, 0xfa, 0xd2, 0x7c,
+    0xf5, 0x14, 0x90, 0x48, 0x51, 0x84, 0x1a, 0x38, 0xe9, 0x1f, 0x5e, 0x45, 0x5e, 0x0b, 0xc0, 0x47, 0xb3, 0x91, 0x0c,
+    0x8c, 0x16, 0x70, 0x1c, 0x41, 0x79, 0xb5, 0x35, 0x8d, 0xe8, 0x31, 0x96, 0x99, 0xa8, 0xa0, 0xe3, 0x69, 0x79, 0x93,
+    0x55, 0xc9, 0x12, 0x03, 0x1b, 0xc5, 0x25, 0x0f, 0xbe, 0x0a, 0xa2, 0x92, 0x1d, 0x3c, 0x9b, 0x2a, 0x78, 0x5f, 0x4c,
+    0x4a, 0xf9, 0x25, 0x24, 0x7e, 0x3b, 0x46, 0x08, 0x54, 0xa2, 0x3d, 0x16, 0xb1, 0xc6, 0x57, 0xb9, 0x8c, 0xc1, 0x83,
+    0xb3, 0xd4, 0x3c, 0x8b, 0x3d, 0x09, 0xac, 0xfd, 0x45, 0xab, 0x39, 0x12, 0x9a, 0x13, 0x4a, 0x26, 0xf7, 0x4b, 0x2a,
+    0xbf, 0x9a, 0xa0, 0x57, 0x10, 0xb8, 0x55, 0x47, 0x70, 0xdc, 0x59, 0xcb, 0x06, 0xbd, 0x7c, 0x52, 0xb6, 0x3f, 0xff,
+    0xdf, 0x25, 0x5d, 0x0c, 0xf6, 0xdd, 0xd0, 0x9c, 0x68, 0xf7, 0xd5, 0x0a, 0x19, 0xa5, 0x2a, 0x7c, 0x9e, 0x12, 0x6b,
+    0x7c, 0xca, 0xd9, 0xd1, 0xc6, 0x74, 0x67, 0x54, 0x15, 0xd9, 0x55, 0x48, 0x74, 0xaf, 0x1c, 0x28, 0x66, 0x10, 0x65,
+    0x23, 0x5c, 0x3f, 0x60, 0x2d, 0xe2, 0x75, 0xf2, 0x9a, 0x17, 0x55, 0x96, 0xa8, 0xf7, 0xd7, 0x8d, 0xf7, 0x40, 0x0d,
+    0x54, 0x83, 0xde, 0x15, 0x0c, 0xe6, 0xf9, 0xa4, 0x00, 0xd0, 0xce, 0x92, 0x17, 0xd7, 0xdc, 0xa7, 0x1b, 0x41, 0x50,
+    0xbb, 0x66, 0x5e, 0x36, 0x82, 0x4d, 0xc0, 0x57, 0xef, 0x0a, 0xc0, 0xdc, 0x08, 0x41, 0x6a, 0x0a, 0xa1, 0x70, 0xe0,
+    0x02, 0x5f, 0x55, 0x45, 0x76, 0xbe, 0xae, 0x38, 0x06, 0xfb, 0xf0, 0xe2, 0x26, 0x2a, 0x27, 0x3c, 0x1e, 0x06, 0xf8,
+    0x23, 0xa0, 0x2a, 0xe0, 0x86, 0xf1, 0xb0, 0x83, 0x17, 0xea, 0x97, 0x7b, 0xa3, 0xf6, 0x08, 0x7b, 0x93, 0x86, 0x10,
+    0x5c, 0x07, 0x1f, 0x02, 0x58, 0x52, 0x84, 0x9e, 0xe0, 0xa9, 0x1a, 0x06, 0x17, 0x79, 0xb6, 0xd2, 0x49, 0xd5, 0xa8,
+    0xa3, 0xf9, 0x50, 0x6a, 0x47, 0x72, 0x40, 0xbd, 0xf4, 0x18, 0xd3, 0x0b, 0x95, 0xae, 0x8a, 0x72, 0x46, 0x28, 0xef,
+    0xf4, 0xc4, 0xb8, 0x30, 0x7d, 0x1c, 0x22, 0xbf, 0xbc, 0x2b, 0x54, 0xe8, 0x17, 0xbe, 0x00, 0xf0, 0x2b, 0xb8, 0xdd,
+    0xef, 0xc6, 0x77, 0x51, 0xd9, 0xcf, 0x38, 0xdb, 0xff, 0xef, 0x79, 0x3c, 0xfc, 0x34, 0x1e, 0x7e, 0xbb, 0x18, 0x84,
+    0x43, 0xfb, 0x93, 0x3c, 0x7e, 0xb4, 0x4f, 0x5f, 0x71, 0xcb, 0x95, 0xc0, 0xc2, 0x6f, 0x04, 0xb7, 0x51, 0x2b, 0x21,
+    0x88, 0x02, 0xbc, 0x51, 0xb8, 0xd5, 0x38, 0x01, 0x80, 0xbf, 0xe0, 0xbf, 0x02, 0x34, 0x12, 0x72, 0x17, 0x0d, 0xd0,
+    0x0f, 0xa8, 0xdf, 0x47, 0x4f, 0x1a, 0x06, 0x72, 0x20, 0x9e, 0x50, 0x31, 0x50, 0x88, 0x2e, 0x63, 0xa2, 0x60, 0x7f,
+    0x6d, 0xf6, 0xed, 0xb6, 0xd7, 0x96, 0xfc, 0xe0, 0x97, 0x7e, 0xa6, 0x89, 0x99, 0x77, 0xb8, 0xa1, 0xac, 0xe4, 0x2a,
+    0x44, 0x6c, 0x3c, 0xfd, 0x2b, 0x67, 0x10, 0x6b, 0xf2, 0x3a, 0x03, 0x1f, 0x06, 0xfb, 0xc5, 0x78, 0x06, 0x6c, 0x03,
+    0xdc, 0x71, 0x0a, 0x7e, 0x91, 0x81, 0x5b, 0xb3, 0x88, 0xf1, 0x82, 0x6d, 0x97, 0x44, 0xbf, 0xdf, 0xcb, 0xb3, 0x30,
+    0xd7, 0x38, 0xcb, 0x79, 0x6d, 0xc4, 0xee, 0xa8, 0x13, 0x06, 0x71, 0xbb, 0x1e, 0x82, 0xa1, 0x1a, 0x82, 0xa2, 0xa3,
+    0x2d, 0xae, 0x5e, 0x5b, 0x4f, 0x61, 0x7a, 0xab, 0xea, 0x2b, 0x46, 0x7f, 0xca, 0x4c, 0x60, 0x21, 0xed, 0x9a, 0x63,
+    0x5d, 0x73, 0x8c, 0xb4, 0xa7, 0xdf, 0x17, 0x0d, 0xf2, 0xd3, 0x59, 0x78, 0x10, 0xa8, 0x52, 0xe5, 0x4e, 0x59, 0x94,
+    0xdb, 0xd2, 0xbc, 0x31, 0xac, 0x69, 0x9e, 0xd9, 0xb8, 0x2e, 0xb3, 0x5e, 0x2f, 0x0c, 0xd1, 0xa1, 0x11, 0x4b, 0xc5,
+    0xda, 0x20, 0xbc, 0x8f, 0x49, 0x18, 0x5d, 0x81, 0xac, 0x2e, 0x3c, 0xe3, 0x04, 0xf9, 0x32, 0x30, 0x59, 0x53, 0xd5,
+    0x7a, 0x39, 0xe1, 0xb1, 0x91, 0x2f, 0x1b, 0x41, 0x83, 0xbc, 0xa4, 0xa8, 0x37, 0x71, 0x3b, 0xf6, 0x51, 0x0b, 0xa9,
+    0x71, 0x53, 0x4f, 0x7b, 0x9a, 0x54, 0xf4, 0x58, 0xaf, 0x52, 0xbf, 0xc0, 0xb2, 0xc0, 0x92, 0x0f, 0x42, 0x7b, 0x9a,
+    0x56, 0x60, 0x86, 0x6b, 0x9b, 0xc1, 0xd0, 0x0f, 0x87, 0xb6, 0x08, 0x9d, 0x51, 0xdb, 0x12, 0xc2, 0xb6, 0x0d, 0xc2,
+    0xca, 0x7b, 0x22, 0x5f, 0x3d, 0xf5, 0x18, 0xe1, 0x90, 0x9b, 0xcd, 0x2c, 0x1a, 0x18, 0xe6, 0x57, 0xb2, 0xd9, 0x3c,
+    0xdd, 0x5c, 0x2f, 0x2a, 0xa6, 0x80, 0xed, 0xb6, 0x12, 0x04, 0xff, 0x7e, 0xcc, 0x66, 0xf8, 0x37, 0xeb, 0xf7, 0x7b,
+    0x21, 0xfe, 0xe2, 0x18, 0xbc, 0x67, 0x2e, 0x16, 0xec, 0x23, 0xc8, 0x54, 0x48, 0x84, 0xa9, 0xca, 0xf8, 0x8d, 0x55,
+    0x60, 0x01, 0x67, 0x3e, 0x50, 0xb9, 0x30, 0x93, 0xbd, 0xbc, 0xb8, 0x86, 0x1c, 0xb7, 0xc6, 0x29, 0x1b, 0x65, 0x89,
+    0x72, 0x5d, 0xc8, 0x46, 0x71, 0x9e, 0xc5, 0x25, 0x2f, 0xb7, 0x5b, 0x7d, 0x38, 0x26, 0x05, 0x07, 0xf6, 0x54, 0x51,
+    0xa9, 0x92, 0x75, 0xa4, 0xba, 0xf1, 0x97, 0x61, 0x81, 0xfb, 0x94, 0xcf, 0x0b, 0x43, 0x23, 0xf6, 0xe0, 0xf2, 0xce,
+    0xd4, 0xad, 0xb4, 0x17, 0x16, 0xd0, 0xbc, 0x92, 0x90, 0x0d, 0xa6, 0x7a, 0x16, 0xad, 0x31, 0x13, 0xf3, 0x62, 0x01,
+    0x61, 0x64, 0x8a, 0x05, 0xd8, 0x4c, 0x71, 0x01, 0x5e, 0x24, 0x31, 0xc0, 0xc4, 0xc5, 0x64, 0x0a, 0xf1, 0xcc, 0x55,
+    0x39, 0xf1, 0xc2, 0xdc, 0x2f, 0x13, 0x87, 0x94, 0x01, 0xaf, 0x6a, 0x83, 0x26, 0x66, 0x1b, 0x8e, 0x3a, 0x41, 0x4e,
+    0x4c, 0x7e, 0x3f, 0x55, 0x10, 0xe2, 0x4e, 0x1c, 0x09, 0x97, 0x15, 0xdb, 0x85, 0x97, 0x1d, 0x88, 0x31, 0x6a, 0x70,
+    0xca, 0xcf, 0x0c, 0x8e, 0xc6, 0xe0, 0xdc, 0x78, 0x27, 0x48, 0x11, 0xc6, 0x64, 0x23, 0xd9, 0x95, 0x0c, 0xc5, 0x3c,
+    0x5e, 0x80, 0xb2, 0x2e, 0x5e, 0x80, 0x65, 0x8d, 0x31, 0xc0, 0x04, 0x79, 0x15, 0xf7, 0x42, 0x3f, 0x51, 0x5c, 0x21,
+    0xd2, 0xb3, 0x72, 0x7d, 0x54, 0xb4, 0x43, 0x5f, 0xe0, 0xf5, 0x5e, 0x99, 0xe3, 0x66, 0x3d, 0x16, 0x48, 0x6c, 0x08,
+    0x18, 0x1b, 0xe9, 0x34, 0xd5, 0x5a, 0xf7, 0xc6, 0xcc, 0x03, 0x9f, 0x66, 0x23, 0x21, 0xab, 0xb3, 0x0b, 0x10, 0xa1,
+    0xf8, 0x68, 0xf0, 0xc8, 0x2f, 0xe2, 0xce, 0x32, 0x6f, 0x6d, 0x8b, 0x4a, 0x76, 0xb4, 0x01, 0x90, 0x3e, 0x1d, 0x2d,
+    0x4a, 0xc9, 0x29, 0x4a, 0x52, 0xbb, 0x4d, 0x01, 0x2b, 0xc9, 0x5f, 0xc0, 0x10, 0x6c, 0x6c, 0x4f, 0x38, 0x9d, 0x22,
+    0xc4, 0x27, 0x9a, 0x22, 0xb2, 0x62, 0x58, 0x52, 0x1c, 0xdb, 0x12, 0x51, 0x3f, 0x6d, 0x59, 0x76, 0x30, 0x4c, 0x54,
+    0xdc, 0x17, 0xa9, 0x47, 0x89, 0x82, 0x80, 0xea, 0x21, 0x07, 0x89, 0xad, 0x6d, 0x20, 0x3c, 0x20, 0x8f, 0xe8, 0x8d,
+    0xf5, 0xf7, 0x59, 0xe7, 0xd9, 0x85, 0xe6, 0xa8, 0x5c, 0xef, 0x0a, 0x33, 0x46, 0x78, 0x92, 0x19, 0x98, 0x7c, 0xef,
+    0x3c, 0x33, 0x6a, 0x8a, 0x9e, 0x87, 0x4f, 0x76, 0x8c, 0x11, 0xe9, 0xee, 0x19, 0x74, 0x13, 0xbc, 0xaa, 0xc3, 0x46,
+    0xbb, 0x52, 0x10, 0x12, 0xa6, 0x16, 0x4d, 0xcc, 0x7a, 0xd6, 0x80, 0x7a, 0xbb, 0xed, 0xe9, 0xb9, 0xba, 0x7f, 0xee,
+    0xb6, 0xdb, 0x1e, 0x76, 0xeb, 0x45, 0xda, 0x6d, 0x05, 0x5e, 0xa9, 0x0f, 0xda, 0xe3, 0xcf, 0xdd, 0xf8, 0x73, 0x83,
+    0xe4, 0x51, 0x3a, 0x9a, 0x69, 0xeb, 0x83, 0x70, 0xb8, 0xe9, 0x5d, 0xa3, 0x49, 0xdf, 0x67, 0xa1, 0xa4, 0x2b, 0xd1,
+    0xa8, 0xae, 0x76, 0x26, 0x95, 0x0f, 0xae, 0xff, 0x87, 0x57, 0x01, 0x1e, 0x71, 0x6a, 0x67, 0xdf, 0xdb, 0xa0, 0xa2,
+    0xd1, 0x16, 0x8e, 0x14, 0xa1, 0x07, 0x24, 0xe1, 0xbe, 0x96, 0xb5, 0xb8, 0xcd, 0xd3, 0xec, 0x61, 0xfa, 0xf4, 0x3a,
+    0xf5, 0xad, 0xee, 0xdd, 0x32, 0xcb, 0xcc, 0x81, 0x57, 0x51, 0x1c, 0xd0, 0xa8, 0x8b, 0xf6, 0x5d, 0x65, 0x65, 0x09,
+    0x5e, 0x1e, 0x70, 0x7d, 0x3e, 0xe5, 0x3e, 0xdc, 0xdc, 0x65, 0xd5, 0xdc, 0xa4, 0xa7, 0xd9, 0x3c, 0x5b, 0x6c, 0xb7,
+    0x21, 0xfe, 0xed, 0x6a, 0x91, 0xa3, 0xc9, 0x73, 0xd0, 0xe1, 0x61, 0xe4, 0x1e, 0xa6, 0x1b, 0xe7, 0x6d, 0xfe, 0x4f,
+    0xa2, 0xe1, 0x24, 0x70, 0x0c, 0xf4, 0x62, 0xf6, 0x08, 0x64, 0x30, 0xc6, 0xa9, 0x5f, 0xcc, 0xf4, 0x9a, 0x81, 0xe8,
+    0x5b, 0x22, 0x02, 0x1c, 0x5d, 0x6c, 0x24, 0x1a, 0x59, 0x70, 0x52, 0x13, 0xb0, 0xd8, 0xb4, 0xe5, 0x7d, 0xb0, 0xb4,
+    0xad, 0x2a, 0xee, 0xbc, 0x25, 0xcd, 0x71, 0x1d, 0x38, 0xdb, 0x7e, 0x33, 0xc4, 0xa6, 0xec, 0x6a, 0x81, 0xdc, 0x2f,
+    0xaf, 0x69, 0x6f, 0x5c, 0x27, 0x30, 0x6b, 0x9b, 0xda, 0x32, 0x7e, 0xb6, 0xf4, 0x9f, 0xf5, 0xe0, 0x2a, 0xe3, 0xa7,
+    0xb9, 0xb1, 0x4a, 0xb0, 0xfb, 0xc6, 0xf3, 0x1d, 0x80, 0x70, 0x6c, 0x3e, 0x3d, 0x3e, 0xcd, 0x3c, 0x7a, 0x0c, 0x44,
+    0xc7, 0x7c, 0x54, 0xba, 0x8f, 0xec, 0xee, 0xf5, 0x03, 0xe0, 0xcd, 0xab, 0x76, 0x41, 0xf3, 0x72, 0x01, 0x81, 0x44,
+    0xbd, 0xf2, 0x0a, 0xcb, 0x67, 0xc6, 0xec, 0x12, 0xc8, 0x50, 0x41, 0xc0, 0x26, 0xa9, 0xeb, 0x5c, 0x88, 0x55, 0x87,
+    0x95, 0xf9, 0x48, 0xc2, 0x8e, 0x42, 0x34, 0xe7, 0x0c, 0x66, 0xc1, 0x7f, 0x05, 0x83, 0x72, 0x10, 0x44, 0x41, 0x14,
+    0x04, 0x64, 0x50, 0xc0, 0x2f, 0xc4, 0x19, 0x23, 0x18, 0xa3, 0x04, 0x3a, 0xfc, 0x8e, 0x33, 0x9f, 0x11, 0x79, 0xd9,
+    0x08, 0x63, 0xe9, 0x06, 0xe0, 0x5c, 0xca, 0x9c, 0xc7, 0xe8, 0x63, 0xf1, 0x8e, 0xb3, 0x8c, 0xd0, 0x77, 0xde, 0xa9,
+    0xfc, 0x88, 0x37, 0x82, 0xdb, 0xed, 0x0e, 0xdb, 0x2b, 0x1e, 0x66, 0xb4, 0x37, 0xa6, 0xef, 0x38, 0x89, 0xb2, 0x86,
+    0xf3, 0x30, 0x87, 0x9e, 0x55, 0x96, 0xb5, 0xa2, 0x86, 0xdc, 0xa0, 0x58, 0x17, 0x59, 0x26, 0x27, 0xc3, 0x55, 0x73,
+    0x2a, 0x70, 0xdd, 0xd9, 0xf5, 0x02, 0x92, 0x32, 0xa1, 0x59, 0x3a, 0x1b, 0xbe, 0xda, 0xb6, 0xec, 0x45, 0xeb, 0x14,
+    0xf2, 0x1a, 0xa2, 0xa2, 0x1f, 0x3a, 0x02, 0x6a, 0x68, 0xc5, 0x65, 0x05, 0x2e, 0xbb, 0xa6, 0x3d, 0xdc, 0xb4, 0xc7,
+    0x34, 0xe3, 0x03, 0xc4, 0x88, 0xe3, 0xd8, 0x32, 0xb0, 0x9b, 0x70, 0x78, 0x36, 0xce, 0xf7, 0x65, 0x97, 0xde, 0xba,
+    0x5a, 0x3c, 0xc2, 0xda, 0xf3, 0x56, 0x48, 0x08, 0x90, 0x96, 0xa6, 0xd2, 0xed, 0x36, 0x08, 0x60, 0x80, 0xfb, 0xfd,
+    0x1e, 0x70, 0xad, 0x86, 0x9d, 0x34, 0xb7, 0x66, 0x4b, 0xec, 0x15, 0x85, 0xc7, 0x40, 0x94, 0x9a, 0xff, 0x0c, 0x02,
+    0x8a, 0xe7, 0x6e, 0x08, 0xf6, 0x95, 0xec, 0x68, 0x53, 0xf4, 0xfb, 0x2f, 0x0a, 0x7c, 0x40, 0x39, 0x28, 0x88, 0x75,
+    0x75, 0xdc, 0x0a, 0xc3, 0x3e, 0xa9, 0x0f, 0x71, 0x2c, 0xf2, 0x2c, 0x74, 0x84, 0xa5, 0x32, 0x84, 0x85, 0x2b, 0x46,
+    0x3a, 0x88, 0x83, 0x9a, 0x74, 0x0e, 0x56, 0xe5, 0x82, 0x0d, 0xf7, 0x7a, 0x9f, 0x00, 0x16, 0x3c, 0xf3, 0x86, 0xe5,
+    0xbd, 0x07, 0x00, 0xd6, 0xeb, 0xe1, 0x42, 0x71, 0x2f, 0x5f, 0x35, 0xd0, 0x27, 0xf1, 0xa5, 0x65, 0xd7, 0x67, 0x5a,
+    0x56, 0x32, 0x1a, 0x8d, 0xaa, 0x5a, 0x49, 0x3e, 0x1c, 0x79, 0x69, 0xa1, 0x56, 0xca, 0x38, 0xe5, 0x29, 0x58, 0x7a,
+    0x1b, 0x4a, 0x37, 0x5f, 0xd0, 0x15, 0x17, 0xa9, 0xfa, 0xe9, 0xa1, 0x4d, 0x36, 0x88, 0x6b, 0xd6, 0xd4, 0x59, 0xd8,
+    0xe1, 0x87, 0x80, 0x8f, 0xf6, 0x61, 0xe6, 0xd2, 0x35, 0x2c, 0x2d, 0x88, 0x23, 0xe3, 0x82, 0x87, 0x2e, 0x0f, 0x60,
+    0xfd, 0x99, 0x43, 0x12, 0x3f, 0x85, 0x9f, 0x33, 0x93, 0xd6, 0xf1, 0x19, 0xce, 0x66, 0x54, 0xaa, 0x1b, 0x41, 0xfb,
+    0x35, 0x24, 0x12, 0x83, 0x6c, 0xdc, 0x60, 0x28, 0x5a, 0x77, 0x1b, 0xb8, 0xf2, 0x5b, 0x7a, 0xe7, 0xd3, 0x20, 0xc0,
+    0xb6, 0xc6, 0x62, 0x00, 0x30, 0x14, 0x7f, 0xa0, 0xaa, 0xc6, 0x5c, 0x51, 0x4c, 0xc3, 0x54, 0xa2, 0xbd, 0xe3, 0xb8,
+    0x8e, 0x1a, 0x57, 0x59, 0xc1, 0x4a, 0x6b, 0xcb, 0xeb, 0xde, 0xd2, 0xc2, 0x96, 0x80, 0x6a, 0x30, 0xdc, 0x09, 0xe0,
+    0x33, 0x22, 0xd5, 0x81, 0x20, 0xbb, 0x0f, 0x0e, 0x9a, 0xb3, 0x04, 0xcf, 0xc3, 0x10, 0xfe, 0xc0, 0xc2, 0x81, 0x65,
+    0xa9, 0xfa, 0xb9, 0x9c, 0xc6, 0x70, 0xee, 0xe6, 0x6a, 0x87, 0xcf, 0x96, 0xa0, 0xc8, 0x53, 0x73, 0x6a, 0x2e, 0x5f,
+    0x79, 0x63, 0xbf, 0xc7, 0x04, 0xf3, 0x98, 0xd9, 0x86, 0xdf, 0x7a, 0xba, 0xad, 0x2f, 0xac, 0x1b, 0x38, 0x69, 0x2f,
+    0x9c, 0xf6, 0x62, 0xbb, 0x34, 0x10, 0x77, 0x75, 0x43, 0x88, 0xf0, 0x5a, 0x13, 0x8b, 0xac, 0x21, 0xd3, 0xb1, 0xd8,
+    0x18, 0xaa, 0x4d, 0xc5, 0x73, 0xad, 0x10, 0x2f, 0xa7, 0xea, 0xc2, 0xd4, 0x4a, 0x65, 0xc2, 0x20, 0xcc, 0x94, 0xb0,
+    0xa8, 0x32, 0xf0, 0xd9, 0xaf, 0x90, 0xe2, 0xda, 0x7a, 0xde, 0xe2, 0xf2, 0xcd, 0x4c, 0x9b, 0xed, 0xa7, 0xaf, 0xf2,
+    0xf8, 0x72, 0xbb, 0x0d, 0xbb, 0x5f, 0x80, 0xf9, 0x65, 0xa9, 0x34, 0x6a, 0xe0, 0xf4, 0x10, 0xa2, 0x9f, 0xf3, 0x3d,
+    0x39, 0x27, 0x8e, 0x93, 0x6b, 0x37, 0x6f, 0xb6, 0x93, 0x62, 0x04, 0x16, 0x70, 0xe2, 0x22, 0x1d, 0x68, 0xa9, 0xe0,
+    0xb4, 0x65, 0xbc, 0xb7, 0xe9, 0x1d, 0xa5, 0xc2, 0xab, 0x85, 0x26, 0x21, 0x95, 0xbb, 0x97, 0xd8, 0x51, 0x03, 0xce,
+    0x49, 0xdd, 0x41, 0xc0, 0x49, 0x4d, 0x37, 0xd6, 0x2a, 0x4e, 0x4d, 0x82, 0xf7, 0x4a, 0x0f, 0x5d, 0xa2, 0x9d, 0xb8,
+    0xdd, 0xb6, 0x2a, 0x5b, 0xa8, 0x8f, 0x7b, 0x39, 0x4b, 0xd4, 0xf1, 0x80, 0x42, 0x17, 0x75, 0x34, 0xe4, 0x0b, 0x52,
+    0xe8, 0x95, 0xa3, 0x55, 0xab, 0xbb, 0x92, 0x81, 0x52, 0xad, 0x82, 0xbc, 0x26, 0xd6, 0x5d, 0x2b, 0x6b, 0x2c, 0xae,
+    0x9c, 0x90, 0xc2, 0x26, 0x7c, 0x69, 0x29, 0x16, 0x56, 0xb0, 0x37, 0xa6, 0xbe, 0x70, 0x89, 0xd0, 0x76, 0xb7, 0x21,
+    0x26, 0x19, 0xac, 0x9b, 0xed, 0xf6, 0x75, 0x11, 0xce, 0xb3, 0x05, 0x95, 0xa3, 0x2c, 0x45, 0x08, 0x31, 0xe3, 0xa1,
+    0x6b, 0xbb, 0x60, 0x26, 0x86, 0xba, 0xf6, 0x78, 0x49, 0xa6, 0x58, 0x9b, 0x24, 0x47, 0xf1, 0xb9, 0x2c, 0xd4, 0x5a,
+    0x23, 0x04, 0x0f, 0xf7, 0x3f, 0x53, 0x88, 0xe1, 0x66, 0xd6, 0xdd, 0x6f, 0x3b, 0x37, 0xc4, 0x3f, 0x21, 0x90, 0x40,
+    0xc9, 0x5e, 0x17, 0xa3, 0xf3, 0x4c, 0xa4, 0xb8, 0x53, 0x55, 0x54, 0x5c, 0xb5, 0x0e, 0x9a, 0x2d, 0xb7, 0xf7, 0x62,
+    0x4b, 0x14, 0x20, 0xae, 0xb1, 0xd0, 0x8c, 0x67, 0xe5, 0x2c, 0x45, 0x32, 0x8a, 0x0d, 0x89, 0x4a, 0x2f, 0x2a, 0xba,
+    0xcf, 0xd3, 0x98, 0x1e, 0xba, 0x35, 0x08, 0xae, 0x9a, 0x3b, 0x1b, 0x69, 0xbe, 0x20, 0x44, 0x4d, 0x80, 0x84, 0x8d,
+    0x6a, 0x4e, 0xad, 0x4b, 0xf1, 0x30, 0xab, 0x7c, 0xa6, 0x0f, 0xe2, 0x4b, 0x01, 0x3c, 0xac, 0xb7, 0xbd, 0xaf, 0x84,
+    0xc7, 0xda, 0xe0, 0xdb, 0xed, 0xf6, 0x52, 0xcc, 0x83, 0xc0, 0x63, 0x34, 0xbf, 0x53, 0x12, 0xf3, 0xde, 0x98, 0xc2,
+    0x8a, 0xf7, 0x5d, 0xda, 0xba, 0x49, 0xad, 0xb5, 0x40, 0xdd, 0xe1, 0xfa, 0x80, 0xe7, 0x29, 0x71, 0xb4, 0xa3, 0x72,
+    0x2a, 0xad, 0xae, 0x1c, 0xbb, 0x22, 0x30, 0x30, 0xf4, 0x0f, 0x29, 0xdb, 0x80, 0x39, 0x1e, 0x58, 0xdb, 0xa0, 0x9f,
+    0x92, 0xd2, 0xc2, 0x8c, 0xd1, 0x98, 0x45, 0xae, 0xab, 0xe8, 0x80, 0xeb, 0xe8, 0xed, 0x3c, 0xfa, 0xdb, 0xb3, 0x31,
+    0x2d, 0x62, 0x91, 0xca, 0x2b, 0x50, 0x41, 0x80, 0x32, 0x04, 0x0d, 0xff, 0x35, 0x35, 0x00, 0x0d, 0x82, 0x1b, 0x80,
+    0x7f, 0x74, 0x3a, 0x0d, 0xda, 0x9a, 0x7c, 0x4c, 0x52, 0x55, 0xe4, 0xac, 0x0d, 0x65, 0xa6, 0x92, 0x43, 0xf2, 0xb8,
+    0x04, 0x3c, 0x47, 0x6c, 0x96, 0xb2, 0xb9, 0x50, 0x9b, 0x4d, 0xbd, 0x56, 0xec, 0xc8, 0x6d, 0xa3, 0x68, 0xb3, 0x16,
+    0xb5, 0x9d, 0xc4, 0x7c, 0x31, 0xbd, 0xb5, 0xc2, 0xc0, 0xa9, 0x69, 0xcd, 0xcd, 0x0e, 0x74, 0x9a, 0xad, 0xcf, 0xe4,
+    0x26, 0x40, 0x1c, 0x60, 0xb8, 0x6e, 0xe7, 0x37, 0x0b, 0x42, 0x6f, 0xd9, 0xad, 0x15, 0xab, 0xde, 0x58, 0xb9, 0x88,
+    0x49, 0xbb, 0x19, 0x4c, 0xe0, 0x32, 0xce, 0x0a, 0xfb, 0x42, 0xab, 0x1b, 0x8a, 0x8e, 0xb6, 0x49, 0xfb, 0x79, 0x47,
+    0xbb, 0xe1, 0x82, 0x6f, 0xc5, 0x3a, 0xce, 0x0d, 0x69, 0xaa, 0xd0, 0xa3, 0x03, 0xbd, 0x1d, 0x02, 0x9a, 0xb3, 0x31,
+    0x5d, 0xd2, 0x14, 0x2f, 0xd0, 0x74, 0x0d, 0x66, 0x29, 0x17, 0xd0, 0xd7, 0x6e, 0x9f, 0xe4, 0x0b, 0xd5, 0x13, 0xe1,
+    0x2d, 0x51, 0xf0, 0xe5, 0x48, 0xc1, 0x2b, 0x2b, 0xe7, 0xb1, 0x99, 0x43, 0xc0, 0x63, 0x51, 0x25, 0x7a, 0x27, 0xc5,
+    0x25, 0x28, 0x53, 0xe1, 0x08, 0x34, 0x55, 0x23, 0x96, 0x70, 0x80, 0xdb, 0x8b, 0xa7, 0x01, 0xa1, 0x20, 0xd5, 0x5d,
+    0xdb, 0x15, 0x79, 0xcb, 0x8e, 0x36, 0xb7, 0x60, 0x16, 0x5b, 0xad, 0xcb, 0xd6, 0x57, 0x36, 0xd9, 0x7d, 0x5c, 0x13,
+    0x6c, 0xbb, 0xb7, 0x41, 0xc2, 0x5b, 0x7a, 0x43, 0x36, 0x37, 0xfd, 0x7e, 0x08, 0xfd, 0x21, 0x54, 0x77, 0xe8, 0xb6,
+    0xb3, 0x43, 0xb7, 0x3e, 0xf3, 0x6b, 0xf5, 0x7c, 0xca, 0x1b, 0xe2, 0x03, 0x9a, 0x68, 0xd1, 0x55, 0x7c, 0x07, 0x9b,
+    0x3a, 0xaa, 0xa8, 0xaa, 0x3c, 0x4a, 0x28, 0xa8, 0x80, 0x33, 0x5e, 0x9e, 0x72, 0x8c, 0x6d, 0xaa, 0x9f, 0xde, 0x69,
+    0x5e, 0x6d, 0x6d, 0xd6, 0x66, 0xb9, 0x3e, 0x07, 0x8b, 0x80, 0x73, 0x1e, 0x5d, 0x69, 0x5a, 0x72, 0xe9, 0x31, 0xf5,
+    0x67, 0x38, 0x2a, 0xc1, 0x45, 0x9c, 0xe5, 0x3c, 0x0d, 0xe8, 0x45, 0xb3, 0xff, 0xa1, 0xb6, 0x95, 0x5a, 0x36, 0xce,
+    0xdc, 0xeb, 0x90, 0x6c, 0xfe, 0xc7, 0x06, 0xea, 0x4d, 0x88, 0x11, 0x51, 0xcd, 0x82, 0x3e, 0x61, 0x10, 0x1b, 0x33,
+    0x28, 0xd7, 0x49, 0xc2, 0xcb, 0x32, 0x30, 0x4a, 0xad, 0x35, 0x5b, 0x9b, 0xf3, 0xec, 0x11, 0x3b, 0x7a, 0xd4, 0x63,
+    0xec, 0x96, 0xd0, 0x44, 0xeb, 0x84, 0x4c, 0x8d, 0x91, 0xa7, 0x05, 0xd2, 0x1d, 0x8a, 0xb2, 0x8b, 0xf0, 0x04, 0x85,
+    0x2c, 0xed, 0x7d, 0x6e, 0x4e, 0x64, 0xf5, 0x8d, 0x36, 0xba, 0x88, 0x54, 0x22, 0xc8, 0xc6, 0x6f, 0x10, 0xb0, 0x17,
+    0x9a, 0x1d, 0x90, 0xcd, 0x92, 0x9d, 0xd2, 0x33, 0x6b, 0x02, 0x03, 0xaf, 0x4f, 0x54, 0xa2, 0x19, 0x65, 0x45, 0x74,
+    0x95, 0x91, 0xcb, 0x5d, 0x48, 0xa2, 0xb3, 0x90, 0xf8, 0xb9, 0x61, 0x69, 0x5d, 0x87, 0x28, 0x66, 0x36, 0x1b, 0x5e,
+    0x75, 0xf7, 0x51, 0x63, 0x5b, 0x19, 0x9f, 0xea, 0x5b, 0x9b, 0x46, 0xa6, 0xd0, 0xd7, 0xe1, 0xa4, 0xdf, 0x87, 0xbf,
+    0x9a, 0x7e, 0xe0, 0x2d, 0x05, 0x7f, 0xb1, 0x47, 0xa4, 0x4e, 0x58, 0x00, 0x70, 0x84, 0x39, 0xaf, 0x9a, 0x13, 0xf8,
+    0x88, 0x1d, 0x6d, 0x1e, 0x85, 0xa7, 0x8d, 0x99, 0xbb, 0x0b, 0xf1, 0x52, 0x95, 0xf4, 0xbc, 0x79, 0x32, 0x03, 0xb1,
+    0x0a, 0xcd, 0x7e, 0xbd, 0x65, 0x56, 0x9f, 0x00, 0x44, 0xea, 0xd6, 0x3a, 0x94, 0xe2, 0xc7, 0xa6, 0xcb, 0x64, 0x93,
+    0xb2, 0x36, 0x13, 0xa5, 0x54, 0x24, 0xcd, 0x45, 0x00, 0xfd, 0x86, 0xe1, 0xa8, 0x01, 0xde, 0x5b, 0x8f, 0xbd, 0x19,
+    0x1a, 0x6f, 0x4c, 0x0d, 0x3d, 0xdb, 0xe8, 0xe5, 0xed, 0x28, 0x84, 0x19, 0x8b, 0xe8, 0xd6, 0x1d, 0x8b, 0xe1, 0x29,
+    0x3d, 0x81, 0x0a, 0xdf, 0x84, 0x18, 0x4d, 0x97, 0xd4, 0xf5, 0x74, 0xad, 0xb6, 0xd2, 0x0d, 0xa1, 0x39, 0x46, 0xf1,
+    0xf1, 0xda, 0x76, 0x47, 0x8d, 0xd0, 0x9e, 0x50, 0x1e, 0xde, 0xd2, 0x8a, 0xde, 0x58, 0x16, 0xc1, 0xc9, 0x8f, 0xbd,
+    0xfc, 0x84, 0x9e, 0x7b, 0x02, 0x93, 0xa2, 0xad, 0x01, 0xfc, 0x01, 0xf5, 0xc3, 0x59, 0x3d, 0xb5, 0x52, 0x0e, 0x4f,
+    0xe1, 0x4b, 0x36, 0x20, 0x57, 0xd0, 0x8b, 0x35, 0x66, 0x47, 0x31, 0xe8, 0xa0, 0x76, 0x76, 0x87, 0x37, 0x29, 0x65,
+    0x88, 0xd6, 0x77, 0x0e, 0xe2, 0xe9, 0x1f, 0xa0, 0xe9, 0x83, 0xb4, 0x30, 0xa5, 0x6b, 0x14, 0xf0, 0x80, 0xbe, 0xa9,
+    0xdf, 0xcf, 0xf1, 0xb9, 0xf6, 0x2c, 0xb1, 0xb0, 0xc7, 0x4b, 0x42, 0x97, 0x5e, 0xdc, 0x28, 0x90, 0x36, 0x3b, 0x56,
+    0x01, 0x58, 0x91, 0x04, 0x1a, 0x91, 0x80, 0xa5, 0x8e, 0x27, 0x2e, 0xdb, 0xa0, 0x01, 0x49, 0x54, 0x52, 0xc8, 0x12,
+    0x49, 0xe0, 0x87, 0x11, 0x84, 0x28, 0x8a, 0x41, 0xdc, 0xab, 0x97, 0x57, 0x5c, 0x53, 0x03, 0x4e, 0x14, 0xc1, 0x04,
+    0xeb, 0x74, 0x0a, 0xc4, 0x56, 0xac, 0x57, 0xe0, 0x79, 0xe9, 0x38, 0x71, 0x64, 0x09, 0xd0, 0x20, 0xcd, 0x97, 0x4e,
+    0xbb, 0xe5, 0xed, 0x89, 0x96, 0x2a, 0x36, 0xf7, 0x5e, 0x2c, 0x2c, 0xf7, 0x58, 0xf9, 0xdb, 0x81, 0xf6, 0xc2, 0x6a,
+    0x47, 0x44, 0x0d, 0x56, 0x76, 0x6d, 0xbb, 0x36, 0x94, 0x86, 0xea, 0x5e, 0x39, 0x26, 0xa0, 0xa2, 0xab, 0xb8, 0x5a,
+    0x46, 0xd9, 0x08, 0xfe, 0x6c, 0xb7, 0xc1, 0x7e, 0x00, 0x16, 0x90, 0xbf, 0xbe, 0xff, 0x39, 0xc2, 0xf0, 0x4c, 0xbf,
+    0xbe, 0xff, 0x79, 0xbb, 0x7d, 0x36, 0x1e, 0x1b, 0xae, 0xc0, 0xa9, 0x75, 0x80, 0x3f, 0x30, 0x6c, 0x83, 0x5d, 0xb2,
+    0xdb, 0xed, 0x33, 0xe0, 0x20, 0x14, 0xdb, 0x60, 0x76, 0xb1, 0x72, 0xe4, 0x52, 0xac, 0x86, 0xde, 0x91, 0x80, 0x55,
+    0xb7, 0xc3, 0x52, 0xec, 0x52, 0x1f, 0x15, 0x82, 0x51, 0x2f, 0xfa, 0x97, 0x9d, 0x02, 0x4b, 0x0a, 0xa6, 0xab, 0xc1,
+    0xb2, 0xaa, 0x56, 0x65, 0xb4, 0xbf, 0x1f, 0xaf, 0xb2, 0x51, 0x99, 0xc1, 0x36, 0x2f, 0xaf, 0x2f, 0x01, 0x50, 0x21,
+    0xa0, 0x8d, 0x77, 0x6b, 0x91, 0x99, 0x17, 0x0b, 0xba, 0xcc, 0x70, 0x4d, 0x82, 0xd9, 0x41, 0xce, 0xad, 0x6e, 0x72,
+    0x4a, 0xec, 0x03, 0xd8, 0x1c, 0x6e, 0xb7, 0x0d, 0x7e, 0xe1, 0x68, 0xf4, 0x6c, 0xb6, 0xcc, 0xb4, 0x41, 0x27, 0x37,
+    0xfb, 0x9f, 0x44, 0x5e, 0x1a, 0x2a, 0x3e, 0xc9, 0xf4, 0x65, 0x06, 0x7c, 0x1e, 0x7b, 0x2b, 0x42, 0x9f, 0xe5, 0x6a,
+    0xb4, 0x06, 0xd8, 0xd8, 0xec, 0xe2, 0x6e, 0x94, 0x72, 0x88, 0x48, 0x11, 0x58, 0x75, 0xcd, 0x32, 0x23, 0xbe, 0x4d,
+    0xc5, 0x5d, 0x4b, 0x15, 0xf6, 0x56, 0x78, 0xce, 0x2a, 0xdc, 0x38, 0xca, 0xf4, 0x26, 0x51, 0xf8, 0x12, 0x85, 0xa8,
+    0x1c, 0x8d, 0xe9, 0x9c, 0x40, 0x2a, 0xf3, 0x98, 0x50, 0xcc, 0xe1, 0xde, 0xfd, 0x9a, 0x3a, 0x73, 0x19, 0x5f, 0xb8,
+    0xf7, 0xd2, 0x97, 0x99, 0xdc, 0x4a, 0x00, 0x45, 0x52, 0xb5, 0xff, 0xf2, 0x19, 0xa9, 0xf1, 0x3f, 0x53, 0xad, 0x01,
+    0xe8, 0xfd, 0x02, 0x35, 0x39, 0x82, 0x80, 0xad, 0x98, 0xfa, 0x68, 0xfa, 0x56, 0x32, 0xff, 0x01, 0x75, 0x3b, 0x82,
+    0x6d, 0x54, 0xfc, 0x9c, 0xa8, 0xa2, 0x05, 0x4f, 0xd7, 0x22, 0x8d, 0x45, 0x72, 0x17, 0xf1, 0x7a, 0x8a, 0x25, 0x31,
+    0x1b, 0x21, 0xeb, 0x97, 0x66, 0x17, 0x7e, 0x2e, 0x1a, 0x26, 0xe0, 0xb4, 0xf4, 0xb7, 0x95, 0xb7, 0x99, 0x2c, 0xe3,
+    0x8c, 0x4c, 0xb9, 0x42, 0xec, 0xb6, 0xfa, 0x1e, 0x73, 0x82, 0x3f, 0x3d, 0x78, 0x4a, 0xe8, 0xad, 0x9c, 0x96, 0x08,
+    0x4a, 0x27, 0x52, 0xeb, 0xaa, 0x89, 0xfd, 0x9a, 0x42, 0x14, 0x07, 0xc1, 0x20, 0x74, 0xa7, 0x69, 0x9f, 0xe2, 0xfb,
+    0x6c, 0xd9, 0x6f, 0x4d, 0xd9, 0x92, 0x6c, 0x04, 0x74, 0x4c, 0x3a, 0x6f, 0x4f, 0x6f, 0xcf, 0xce, 0xbc, 0xdf, 0xa0,
+    0x09, 0x07, 0xd5, 0x0d, 0xb4, 0xab, 0x20, 0xd3, 0x18, 0xc5, 0x66, 0x31, 0xd6, 0x6e, 0x4d, 0x44, 0x10, 0x74, 0xba,
+    0x9c, 0x85, 0xed, 0x76, 0x42, 0x7c, 0x09, 0x24, 0x50, 0xe0, 0xca, 0x45, 0x39, 0x09, 0x89, 0xba, 0x90, 0xe9, 0xc9,
+    0xba, 0x96, 0x2c, 0xd0, 0x6b, 0xec, 0x20, 0xa0, 0xc7, 0xdc, 0x3e, 0x05, 0xf4, 0x7d, 0xc1, 0x8e, 0xf9, 0x20, 0x18,
+    0x62, 0x7c, 0xd5, 0x80, 0xde, 0x48, 0xf5, 0x08, 0x1e, 0xc2, 0xc0, 0x72, 0xd1, 0x57, 0x05, 0x43, 0x58, 0xa1, 0xbf,
+    0x52, 0x36, 0xf9, 0xe6, 0xef, 0x6e, 0x7e, 0xcf, 0xb5, 0x98, 0x1d, 0x84, 0xe2, 0xf6, 0x7a, 0x02, 0xc4, 0xaf, 0xe2,
+    0x57, 0x60, 0x5d, 0xad, 0x25, 0xde, 0x6e, 0x7a, 0xfe, 0x14, 0xbe, 0x1c, 0xdd, 0x7e, 0x52, 0x9a, 0x4f, 0x20, 0x48,
+    0x8d, 0x93, 0x94, 0xbb, 0xef, 0x3e, 0x4a, 0x57, 0x11, 0x8c, 0x16, 0x20, 0xd6, 0xdd, 0x5b, 0xc9, 0x59, 0x53, 0xf8,
+    0x8f, 0x75, 0xbe, 0xc7, 0xd8, 0x21, 0xf2, 0x14, 0xa7, 0xbf, 0x01, 0x86, 0x7d, 0xe7, 0xdf, 0xca, 0xac, 0x21, 0xd1,
+    0xb9, 0xfa, 0x08, 0xe8, 0xff, 0x58, 0x8f, 0xdf, 0x31, 0x4a, 0xfa, 0x92, 0x38, 0x47, 0xb8, 0x22, 0x5e, 0xa2, 0xa9,
+    0x5e, 0x6f, 0x5c, 0xd3, 0x4f, 0x85, 0x79, 0xa1, 0x15, 0x1c, 0xf6, 0xad, 0x51, 0x78, 0xe0, 0x99, 0xf7, 0x9b, 0x68,
+    0x08, 0xba, 0x7f, 0xc7, 0xbd, 0xf1, 0x9b, 0x60, 0x19, 0xde, 0x94, 0xb3, 0xcc, 0xdc, 0xe1, 0x6e, 0x32, 0x91, 0xca,
+    0x1b, 0xc6, 0x82, 0xb5, 0x50, 0xe6, 0xab, 0x69, 0x30, 0xdb, 0xd4, 0x91, 0x4a, 0x76, 0xdf, 0xbf, 0x6d, 0x9c, 0xb0,
+    0xd9, 0x20, 0x38, 0xad, 0x64, 0x11, 0x5f, 0xf2, 0x60, 0xaa, 0x55, 0x14, 0x59, 0xd6, 0xef, 0x67, 0x80, 0x0c, 0xe3,
+    0xb4, 0x77, 0xf0, 0x64, 0xa9, 0x99, 0x09, 0x71, 0x6d, 0x75, 0x16, 0xf0, 0xd6, 0x8c, 0xe6, 0x71, 0x05, 0xbb, 0xcc,
+    0x57, 0x52, 0xfc, 0xd9, 0x92, 0x64, 0x63, 0xfd, 0x0d, 0x19, 0xb6, 0x95, 0xcf, 0x9c, 0x03, 0xc6, 0xcc, 0x8d, 0x54,
+    0x41, 0xee, 0x7a, 0xc0, 0x08, 0x21, 0x11, 0x10, 0xce, 0x62, 0xe2, 0x4e, 0x98, 0xf0, 0x8f, 0x2e, 0x30, 0x4e, 0x8c,
+    0x81, 0x71, 0x3e, 0xca, 0x90, 0xd3, 0x63, 0x3e, 0x48, 0x1a, 0xb3, 0xf5, 0xa7, 0x2a, 0x91, 0x5e, 0x4b, 0x42, 0xcf,
+    0xe0, 0xf7, 0xb8, 0xc5, 0x03, 0x35, 0x82, 0x53, 0xba, 0x9b, 0xd3, 0xfe, 0xab, 0x82, 0x0c, 0xff, 0x02, 0xef, 0xae,
+    0xd8, 0x5e, 0x96, 0x13, 0x58, 0xdc, 0xb1, 0x57, 0x3c, 0xcd, 0x55, 0x8b, 0x13, 0xe2, 0x11, 0x8b, 0xdc, 0x27, 0x16,
+    0x30, 0xa2, 0x86, 0xd1, 0xf8, 0xf1, 0xf4, 0xe4, 0xad, 0xc6, 0x6c, 0xca, 0xfd, 0x0f, 0x60, 0x44, 0xb5, 0xb4, 0xdd,
+    0x0e, 0xf8, 0x72, 0x84, 0x06, 0xdb, 0xa9, 0x1b, 0xec, 0x7e, 0xdf, 0xa4, 0x1d, 0x95, 0x5e, 0x36, 0x27, 0x06, 0xdd,
+    0x51, 0xda, 0x2c, 0x95, 0x41, 0x6d, 0x57, 0xe1, 0x68, 0x3e, 0x6b, 0xc4, 0xaa, 0xde, 0x87, 0xe1, 0x92, 0xc6, 0x56,
+    0x56, 0x6e, 0x77, 0x13, 0x8e, 0x6c, 0x02, 0x5c, 0x9f, 0x82, 0xb2, 0x6a, 0xce, 0x41, 0x0b, 0x3a, 0x13, 0x38, 0xa2,
+    0xed, 0x36, 0x84, 0x08, 0x1c, 0xc5, 0x70, 0x32, 0x0b, 0x8b, 0xe1, 0x50, 0x0d, 0x7c, 0x41, 0x48, 0xf4, 0xa9, 0x98,
+    0x67, 0x0b, 0x85, 0xd8, 0xe3, 0xef, 0xa4, 0xdf, 0x0a, 0xc5, 0x29, 0xf7, 0x7e, 0x13, 0x64, 0xf3, 0x7b, 0x8a, 0x31,
+    0x07, 0x9d, 0x66, 0x33, 0x03, 0x09, 0xeb, 0x71, 0x45, 0xd4, 0x3a, 0xb2, 0xb3, 0x01, 0xaa, 0x58, 0x34, 0x85, 0x05,
+    0x75, 0x8b, 0x27, 0xd6, 0x33, 0x7a, 0x0f, 0x2a, 0x41, 0x54, 0x0b, 0x76, 0x63, 0xb8, 0xd6, 0x3e, 0x89, 0x50, 0x52,
+    0x4e, 0x9a, 0xcc, 0x8c, 0x15, 0x0d, 0x16, 0x20, 0x24, 0x8d, 0xcb, 0xea, 0x8d, 0x4c, 0xb3, 0x8b, 0x0c, 0x10, 0x13,
+    0x9c, 0xff, 0x9c, 0x6c, 0xbc, 0x79, 0xae, 0xe6, 0xa5, 0x2b, 0x71, 0x66, 0x61, 0x3e, 0xba, 0xde, 0xd2, 0x82, 0x44,
+    0x05, 0xd0, 0x28, 0x5f, 0xcb, 0xf3, 0xd3, 0x8e, 0x55, 0xc8, 0xee, 0x87, 0x53, 0x65, 0x3b, 0xc4, 0x8f, 0x58, 0x45,
+    0xbc, 0xd3, 0xba, 0x52, 0x22, 0x8d, 0x8e, 0xb6, 0x01, 0x31, 0x6c, 0xd9, 0xb7, 0xa8, 0xe1, 0x83, 0x30, 0x83, 0x4e,
+    0xf2, 0x83, 0x9e, 0xd1, 0xb1, 0x35, 0x90, 0xf4, 0xb5, 0x08, 0xbe, 0x46, 0x47, 0x3a, 0x51, 0xa6, 0x91, 0x98, 0x42,
+    0xa2, 0x5f, 0x2f, 0xb4, 0xc6, 0x32, 0xca, 0xbe, 0x22, 0xff, 0x7b, 0xdd, 0xbd, 0xdf, 0xc4, 0x76, 0x0b, 0x93, 0xec,
+    0x79, 0x5c, 0xc1, 0xa6, 0x46, 0xad, 0x10, 0xce, 0xce, 0x71, 0x85, 0xda, 0xb1, 0x5e, 0x58, 0x02, 0x79, 0x00, 0x5b,
+    0x91, 0x06, 0x65, 0x90, 0xec, 0x53, 0x31, 0x17, 0x0b, 0x27, 0xca, 0x91, 0x0a, 0xef, 0x4b, 0x8e, 0x52, 0x0e, 0x57,
+    0xb1, 0xb0, 0x60, 0xc8, 0xaf, 0x8e, 0x2e, 0x0a, 0x79, 0x05, 0x92, 0x12, 0xc3, 0x50, 0x59, 0x5e, 0x17, 0x57, 0x6d,
+    0x49, 0x68, 0xef, 0x0c, 0x40, 0x58, 0x0a, 0x10, 0xbc, 0x34, 0x6a, 0x88, 0xd9, 0x46, 0xed, 0xae, 0xe8, 0x5e, 0x72,
+    0x40, 0x9d, 0xee, 0xda, 0xad, 0x37, 0x65, 0x9b, 0x6d, 0xc5, 0x85, 0x7f, 0x42, 0xe9, 0xc7, 0x7c, 0x50, 0xf8, 0x54,
+    0x02, 0x37, 0xbe, 0xda, 0x64, 0xd9, 0xc5, 0x1d, 0x2e, 0xfd, 0xaa, 0x31, 0x7e, 0xfd, 0x7e, 0x4f, 0x2d, 0x84, 0x46,
+    0x2a, 0x30, 0xdf, 0x3e, 0x33, 0x55, 0x19, 0x4d, 0xa9, 0xbd, 0x04, 0x57, 0xce, 0x7e, 0x04, 0x15, 0x71, 0x5d, 0x91,
+    0xc9, 0xd4, 0x00, 0xed, 0x79, 0x59, 0xe1, 0x56, 0x16, 0xe0, 0xb1, 0x13, 0x90, 0xed, 0x96, 0x87, 0x81, 0x3e, 0x74,
+    0x02, 0x7f, 0x4b, 0x9e, 0x22, 0xb3, 0x66, 0x1f, 0x7f, 0xd1, 0x82, 0x7f, 0x6c, 0xc1, 0xcf, 0x28, 0xee, 0xb4, 0x32,
+    0xff, 0x56, 0x5a, 0xb7, 0xb8, 0x7f, 0x27, 0xd3, 0x84, 0xa2, 0x32, 0xa1, 0xf6, 0x2b, 0xfd, 0x97, 0x09, 0x96, 0xa4,
+    0xb2, 0x7f, 0x90, 0xf0, 0xc1, 0xac, 0xf1, 0xc4, 0x1a, 0x4f, 0x86, 0xd3, 0xad, 0x34, 0x0c, 0x01, 0x0a, 0xfd, 0xbc,
+    0xcc, 0x15, 0xd5, 0xcf, 0xbf, 0xac, 0xf9, 0x9a, 0x37, 0x5b, 0x6c, 0x93, 0x1e, 0x68, 0xb0, 0x97, 0x47, 0x53, 0x0a,
+    0x27, 0x51, 0xe7, 0x46, 0xa2, 0x2e, 0x6a, 0x96, 0xa1, 0x3a, 0xc1, 0xab, 0x79, 0xaa, 0x87, 0xbd, 0x99, 0x88, 0xd6,
+    0x4a, 0xca, 0x12, 0x03, 0xd6, 0x3a, 0xf2, 0x90, 0xdc, 0xad, 0x75, 0xdc, 0x69, 0xa8, 0x4b, 0x53, 0x28, 0x01, 0x56,
+    0xb8, 0x00, 0x47, 0xd0, 0xcf, 0x45, 0xc8, 0xe1, 0x9a, 0xaa, 0xf4, 0x0b, 0x9a, 0x92, 0x27, 0x9e, 0xa2, 0x56, 0x2b,
+    0xd2, 0xed, 0x47, 0x39, 0x76, 0xc3, 0x37, 0x4e, 0xc8, 0x89, 0x11, 0xfa, 0xbb, 0x63, 0x29, 0x67, 0x68, 0xf1, 0xa0,
+    0x4e, 0xb0, 0x5e, 0xde, 0x52, 0xa0, 0x98, 0xa3, 0xcb, 0xaa, 0x6b, 0x5e, 0xa3, 0xed, 0xcb, 0xb2, 0xdf, 0xcf, 0x6d,
+    0x3d, 0x29, 0x3b, 0xda, 0x2c, 0xcd, 0x3e, 0x44, 0xc5, 0x14, 0xee, 0xfa, 0x44, 0xf3, 0x57, 0xa1, 0xbe, 0x6a, 0xcb,
+    0x9c, 0x8f, 0x38, 0xe2, 0x62, 0xe4, 0xa4, 0xfe, 0x45, 0x4d, 0xbd, 0x12, 0xf7, 0xab, 0x4a, 0xbe, 0x13, 0xc6, 0x8a,
+    0xd1, 0x01, 0xf5, 0xa7, 0x4a, 0xe5, 0xfd, 0xb2, 0x00, 0xb8, 0x27, 0xc1, 0x3e, 0x81, 0x7d, 0x85, 0x46, 0xf8, 0x6d,
+    0x09, 0xf8, 0x37, 0x8a, 0x1b, 0xb0, 0x0a, 0x0c, 0x30, 0x9a, 0x6c, 0xcf, 0x69, 0x02, 0x07, 0x9c, 0xd0, 0x2a, 0x0a,
+    0x2a, 0xcc, 0xd0, 0x50, 0x5b, 0x18, 0x3d, 0x45, 0x19, 0xb7, 0xca, 0xec, 0xdd, 0x18, 0x3b, 0x2d, 0xf0, 0x1a, 0xfe,
+    0x7c, 0x5e, 0xe8, 0x61, 0xa3, 0x0e, 0xd2, 0xa3, 0x93, 0x98, 0xfe, 0xb8, 0x85, 0x93, 0x9b, 0x85, 0xb3, 0xac, 0x59,
+    0x02, 0xdd, 0x81, 0x0b, 0x62, 0xdc, 0xef, 0xe7, 0x70, 0x64, 0x9a, 0x91, 0x2f, 0x58, 0x4e, 0x63, 0xb6, 0xa4, 0xda,
+    0xd3, 0xee, 0xb2, 0x0a, 0x73, 0xba, 0xb4, 0x32, 0xde, 0x94, 0x81, 0xca, 0x68, 0xbb, 0x0d, 0xe1, 0x4f, 0xb7, 0xb5,
+    0x4b, 0x3a, 0x5f, 0x42, 0x06, 0xf8, 0x03, 0x12, 0x51, 0xc4, 0xbe, 0xfe, 0xb7, 0x1a, 0xa7, 0xf4, 0x44, 0x69, 0xcd,
+    0x12, 0xba, 0x66, 0xba, 0x7e, 0x7a, 0xc1, 0xd6, 0x8d, 0xa5, 0xb0, 0xdd, 0x86, 0xcd, 0x04, 0xa6, 0x39, 0x57, 0x32,
+    0xbd, 0x40, 0x9d, 0x14, 0x50, 0xb1, 0xf0, 0x02, 0x97, 0x5f, 0x4a, 0x28, 0x34, 0x77, 0xbe, 0x5c, 0x18, 0x25, 0x26,
+    0xb4, 0x4a, 0x7e, 0xf9, 0x50, 0x99, 0xaf, 0x8d, 0x47, 0xdc, 0xbf, 0xd2, 0x30, 0x31, 0x45, 0xa2, 0x42, 0x74, 0xf6,
+    0x1b, 0xc8, 0x72, 0x04, 0xe0, 0x58, 0x9e, 0xca, 0x9a, 0xfe, 0x98, 0x42, 0x1c, 0x74, 0x68, 0xd0, 0xbb, 0x42, 0x5e,
+    0x65, 0x25, 0x0f, 0xf1, 0x9e, 0xe0, 0x69, 0x46, 0xef, 0x37, 0xf8, 0xd0, 0xd6, 0x1e, 0x3d, 0x41, 0x36, 0x9e, 0x72,
+    0xbf, 0xfe, 0x4e, 0x84, 0x73, 0x88, 0x56, 0xb9, 0xa0, 0x5a, 0x5d, 0xed, 0x00, 0xa8, 0x3c, 0xdb, 0xab, 0x47, 0x70,
+    0xba, 0xe9, 0xeb, 0x5b, 0x15, 0x3a, 0x73, 0x00, 0x69, 0x0f, 0xc9, 0xba, 0xe6, 0x7a, 0x07, 0xb8, 0x23, 0xb1, 0x5a,
+    0x03, 0x8d, 0x75, 0x5b, 0xb3, 0xd3, 0x1e, 0xc5, 0x63, 0x22, 0x33, 0x63, 0x91, 0x62, 0xcc, 0xdd, 0x3a, 0x2d, 0x8a,
+    0x36, 0x68, 0x86, 0xb0, 0x7b, 0xd7, 0xe1, 0xeb, 0x56, 0x84, 0xf5, 0xfb, 0x6d, 0x5f, 0x60, 0x34, 0x8c, 0xb9, 0x76,
+    0xcf, 0x33, 0x74, 0xc3, 0x06, 0xdb, 0xc8, 0x79, 0x88, 0x7c, 0x98, 0xa9, 0x03, 0x51, 0xd6, 0xd6, 0x80, 0xed, 0x11,
+    0xd7, 0x9b, 0x56, 0xf1, 0xf3, 0x2a, 0xe6, 0x6c, 0xcf, 0x1a, 0xa7, 0xb4, 0xbe, 0xc6, 0x35, 0xc7, 0x55, 0x21, 0xa2,
+    0xb6, 0x9e, 0xf1, 0x30, 0xec, 0x7c, 0x81, 0x3b, 0xb3, 0xc2, 0xe0, 0x45, 0x58, 0x2a, 0xd9, 0xa9, 0x5c, 0x7f, 0x0e,
+    0x5b, 0x1c, 0xa4, 0xf2, 0xa5, 0xd7, 0xdf, 0x7f, 0xf9, 0xe2, 0x0b, 0x74, 0x53, 0x73, 0x7e, 0x04, 0x41, 0x26, 0xd0,
+    0x21, 0x4b, 0xa9, 0x1e, 0xbf, 0x2b, 0x80, 0xda, 0xc3, 0x3c, 0x7c, 0x57, 0x30, 0x11, 0x5f, 0x67, 0x97, 0x71, 0x25,
+    0x8b, 0xd1, 0x35, 0x17, 0xa9, 0x2c, 0xac, 0xd4, 0x38, 0x38, 0x5e, 0xad, 0x72, 0x1e, 0x80, 0xa9, 0xbc, 0x65, 0x94,
+    0x6d, 0x65, 0x99, 0x1e, 0x5c, 0x2d, 0x4f, 0xaf, 0xb4, 0xe8, 0xbc, 0xbc, 0xbe, 0x0c, 0x22, 0xfc, 0x75, 0x6e, 0x7e,
+    0x5c, 0xc5, 0xe5, 0xc7, 0x20, 0xb2, 0x36, 0x75, 0xe6, 0x07, 0x4a, 0xe5, 0xc1, 0x7f, 0x0a, 0x64, 0xba, 0xdf, 0x15,
+    0x60, 0x99, 0x6d, 0x2b, 0x3e, 0x8c, 0xb1, 0xd6, 0xe1, 0x84, 0xcc, 0x54, 0x89, 0xde, 0xbb, 0x64, 0x5d, 0x80, 0xb5,
+    0x9f, 0xc2, 0x32, 0x56, 0xb9, 0x66, 0x58, 0x99, 0xaa, 0xc8, 0xcc, 0xca, 0x9a, 0xed, 0x87, 0xd6, 0x89, 0x66, 0x8e,
+    0xde, 0x02, 0xfa, 0x81, 0xec, 0x5f, 0xd2, 0x72, 0xcd, 0x3c, 0x1f, 0x9b, 0xc6, 0xeb, 0x47, 0xfb, 0x97, 0x6e, 0xc1,
+    0xde, 0xda, 0x3b, 0x39, 0x0a, 0x13, 0xc1, 0xb3, 0xd6, 0x8c, 0x2f, 0xf2, 0xac, 0x80, 0x95, 0x33, 0x19, 0x8f, 0xa9,
+    0xb7, 0xb4, 0x5a, 0x37, 0x47, 0x87, 0xe4, 0x9a, 0x3d, 0xae, 0x1e, 0x73, 0xb2, 0xcf, 0x5b, 0xa6, 0xb6, 0x6d, 0xeb,
+    0x38, 0x4f, 0x93, 0xaf, 0x4c, 0xf7, 0xc5, 0xda, 0x46, 0x44, 0x57, 0xce, 0x7d, 0xce, 0x2b, 0xb8, 0xf5, 0x4d, 0x69,
+    0xe8, 0xb5, 0x04, 0x20, 0x3a, 0x6d, 0xc0, 0x5f, 0xb0, 0x72, 0x3d, 0xaa, 0x78, 0x59, 0x81, 0x84, 0x05, 0x45, 0x78,
+    0x53, 0xec, 0x4d, 0xe1, 0x6e, 0x9c, 0x9e, 0xc3, 0x0e, 0x5c, 0x4c, 0xd1, 0x1d, 0x27, 0x26, 0xb3, 0xd2, 0x68, 0x45,
+    0x23, 0xfd, 0xcb, 0xf5, 0x25, 0xd6, 0x7d, 0xd1, 0xca, 0x3c, 0x9b, 0x53, 0x61, 0xb1, 0xbb, 0xca, 0xa5, 0x13, 0xf5,
+    0x5b, 0x26, 0x5c, 0xb9, 0x12, 0x04, 0x64, 0x5a, 0xb0, 0x5e, 0x61, 0x76, 0x91, 0x5c, 0x03, 0x21, 0x03, 0xc3, 0xd7,
+    0x60, 0x2d, 0x4a, 0x6e, 0xac, 0x60, 0xbd, 0x7b, 0xbe, 0x4e, 0x10, 0x52, 0xf0, 0xc0, 0x4d, 0xd0, 0x0f, 0xad, 0x9b,
+    0xb7, 0xa3, 0x44, 0x19, 0xc4, 0xe3, 0xd6, 0x4e, 0x39, 0x48, 0x20, 0x00, 0xf7, 0x54, 0x85, 0xe0, 0x50, 0x20, 0xeb,
+    0xe0, 0x6a, 0xc6, 0x11, 0x5c, 0x5d, 0x39, 0x73, 0x71, 0x03, 0xb0, 0xae, 0xfc, 0xb9, 0x6c, 0x70, 0x61, 0x3d, 0xa2,
+    0xca, 0x9c, 0x71, 0x8a, 0x41, 0x8c, 0x2c, 0x41, 0x5f, 0x59, 0x4a, 0x7b, 0x09, 0x9a, 0xc6, 0x2b, 0xb6, 0x52, 0x3e,
+    0x00, 0xf4, 0x9c, 0xad, 0x94, 0xb1, 0x3f, 0x7e, 0x7d, 0xc6, 0x56, 0x5a, 0x1a, 0x3c, 0xbd, 0x9a, 0x9d, 0xcf, 0xce,
+    0x06, 0xec, 0x20, 0x0a, 0xb5, 0x01, 0x43, 0xe0, 0x90, 0xf8, 0x83, 0x41, 0xa8, 0xf1, 0x4e, 0x06, 0x2a, 0x20, 0x16,
+    0xf1, 0x78, 0x6c, 0xc4, 0xcd, 0x0a, 0xc7, 0x43, 0x0c, 0x7e, 0xd5, 0x7c, 0x41, 0x02, 0x42, 0x4d, 0x69, 0xe8, 0xf2,
+    0x18, 0x0e, 0x27, 0x7b, 0x13, 0x48, 0xc5, 0xcc, 0x4c, 0x15, 0xc6, 0xc6, 0x24, 0x82, 0x78, 0xa7, 0x9d, 0xf5, 0x42,
+    0xb9, 0xdd, 0x35, 0x1a, 0xc8, 0x95, 0xc1, 0x17, 0x55, 0x3c, 0xd9, 0x1b, 0x76, 0x55, 0x8c, 0xa3, 0x70, 0x6d, 0x94,
+    0x6f, 0x67, 0x87, 0x00, 0x5e, 0x7b, 0x36, 0xf4, 0xe5, 0x12, 0x67, 0xfb, 0x4f, 0xc9, 0xe3, 0xa7, 0x84, 0x9e, 0xb1,
+    0xb3, 0xaf, 0x9e, 0xd2, 0x33, 0x45, 0x4e, 0xf6, 0x26, 0xd1, 0x35, 0xb3, 0x98, 0x2f, 0x07, 0xaa, 0x09, 0xf4, 0x72,
+    0xb4, 0x16, 0x6a, 0x81, 0x69, 0x87, 0xa6, 0xf0, 0xdb, 0xf1, 0x5e, 0x30, 0xb8, 0x6e, 0x37, 0xfd, 0xba, 0xdd, 0x56,
+    0xcf, 0xab, 0x6b, 0xef, 0x20, 0xda, 0x2d, 0x66, 0xf2, 0xf7, 0xf1, 0x9e, 0x9b, 0x03, 0xac, 0xef, 0xe1, 0x31, 0x31,
+    0x4d, 0xda, 0x19, 0x15, 0xbf, 0xa6, 0x27, 0xd8, 0x87, 0x66, 0x91, 0x1d, 0x7d, 0x18, 0xfe, 0x5b, 0x9d, 0xa8, 0xcf,
+    0xbe, 0x3a, 0x00, 0x72, 0x04, 0x32, 0x50, 0x2c, 0x11, 0xcc, 0x70, 0xa0, 0x29, 0xa0, 0x20, 0xd3, 0xe3, 0x4e, 0xf5,
+    0xf0, 0xab, 0x51, 0x53, 0x33, 0x72, 0x0d, 0x53, 0x83, 0x6d, 0xc1, 0x0f, 0x54, 0x37, 0xf4, 0x37, 0x1a, 0xdd, 0x48,
+    0x3b, 0x99, 0x99, 0x97, 0xd4, 0xc6, 0x75, 0xbb, 0x86, 0x00, 0xc6, 0x0e, 0x5e, 0x50, 0xb2, 0xaf, 0x0f, 0x2f, 0xf7,
+    0x70, 0x15, 0x01, 0x4a, 0x16, 0x0b, 0xbe, 0x1e, 0x5c, 0xea, 0xcd, 0xbd, 0x17, 0x90, 0xc1, 0xd7, 0xc1, 0xd1, 0xd7,
+    0x03, 0x39, 0x08, 0x0e, 0xf7, 0x2f, 0x8f, 0x02, 0x67, 0xdc, 0x0f, 0x21, 0x1e, 0x55, 0x45, 0x31, 0x13, 0xa6, 0x8a,
+    0xc4, 0xd6, 0x9e, 0xdb, 0x7a, 0x95, 0xf1, 0x19, 0x4d, 0xa7, 0x16, 0xf9, 0x3b, 0x4c, 0x59, 0x6c, 0x7e, 0x07, 0x13,
+    0x7e, 0x15, 0x44, 0x2e, 0x08, 0xea, 0x2c, 0x8f, 0x62, 0xba, 0x64, 0xb7, 0x22, 0x4c, 0x69, 0xb2, 0x9f, 0x13, 0x12,
+    0x85, 0x4b, 0x05, 0x9e, 0xa7, 0x5e, 0x27, 0x10, 0xc7, 0xd5, 0x7d, 0x7e, 0x2b, 0xc2, 0x25, 0xcd, 0xf7, 0x13, 0xd2,
+    0x2a, 0xc2, 0x45, 0x64, 0xd9, 0xd4, 0xf4, 0x82, 0x85, 0x2b, 0x7a, 0x09, 0xcc, 0x94, 0x5c, 0x87, 0x97, 0xc0, 0xe5,
+    0xad, 0xe7, 0xab, 0x05, 0xbb, 0x6c, 0x48, 0xdf, 0x0c, 0x5f, 0x7c, 0x61, 0x7d, 0xf2, 0x80, 0x87, 0x74, 0x7e, 0x78,
+    0x29, 0xd8, 0x00, 0x5c, 0x67, 0xfc, 0xe6, 0x3b, 0x79, 0xab, 0xe7, 0xa5, 0x3d, 0xc5, 0x38, 0x33, 0xed, 0xc4, 0xa4,
+    0x9d, 0x90, 0xfb, 0xf7, 0xed, 0x4d, 0x6c, 0x4e, 0xf6, 0x32, 0x5a, 0x2b, 0x97, 0x55, 0xcb, 0x90, 0x14, 0x6b, 0x86,
+    0xfc, 0x3d, 0x4a, 0x4e, 0xad, 0xc0, 0x93, 0x5d, 0xf0, 0x2a, 0x59, 0xfa, 0x07, 0x95, 0xb5, 0x1a, 0xb0, 0xc7, 0x88,
+    0x65, 0xa1, 0x70, 0xec, 0xdf, 0x64, 0xac, 0x58, 0xfb, 0x02, 0x8d, 0x18, 0xb9, 0xb7, 0x37, 0x19, 0xf3, 0x62, 0xae,
+    0x26, 0x6b, 0x2f, 0x54, 0x9d, 0x97, 0x9e, 0xb7, 0x78, 0x2f, 0xa7, 0xd4, 0x30, 0x12, 0xd1, 0xbd, 0xb1, 0x32, 0xa3,
+    0x54, 0x89, 0x5a, 0x83, 0x46, 0x04, 0x1b, 0xbb, 0xe0, 0x97, 0xe0, 0x84, 0xca, 0x3d, 0x75, 0xb6, 0x6f, 0xa7, 0x54,
+    0x7a, 0xc0, 0xb2, 0xd4, 0xa8, 0xca, 0xdd, 0x32, 0x93, 0xac, 0x1a, 0x04, 0xa3, 0x3f, 0x4b, 0x29, 0x66, 0x78, 0x67,
+    0x64, 0xc1, 0x14, 0xac, 0x04, 0x55, 0x2d, 0xc3, 0x72, 0xc8, 0x51, 0x8b, 0x67, 0x7c, 0x52, 0xa5, 0xfe, 0xd1, 0x11,
+    0x24, 0x77, 0xb9, 0x6e, 0x05, 0xc9, 0x7d, 0x3a, 0x7e, 0xaa, 0x07, 0x3a, 0x5d, 0x6b, 0xc7, 0x43, 0x9f, 0xdf, 0x46,
+    0x7c, 0x6d, 0xdd, 0x7b, 0xaa, 0xb5, 0x0a, 0x65, 0xa0, 0xc5, 0x8a, 0xca, 0x95, 0x5a, 0xd2, 0xfb, 0x5d, 0x04, 0xc0,
+    0x22, 0x36, 0x66, 0xe3, 0x5d, 0xdb, 0xac, 0x10, 0x34, 0xba, 0xec, 0x68, 0x13, 0x0f, 0x58, 0xa2, 0x5b, 0x3b, 0x98,
+    0xd0, 0xf8, 0x88, 0x95, 0xfd, 0x7e, 0x7e, 0x04, 0xf4, 0x54, 0x1b, 0x31, 0x15, 0x70, 0xe4, 0x7f, 0x69, 0x45, 0xa6,
+    0x28, 0xb0, 0x59, 0x53, 0x77, 0x6b, 0x2c, 0x23, 0xd1, 0x97, 0x29, 0x5d, 0x9e, 0xf0, 0x0c, 0x98, 0xd6, 0xeb, 0x96,
+    0xe3, 0xca, 0xae, 0xe2, 0xc8, 0x53, 0x61, 0x59, 0x71, 0x5e, 0x85, 0xe3, 0xad, 0xc7, 0x37, 0xd8, 0x37, 0x6c, 0xda,
+    0x85, 0x3f, 0x84, 0xb0, 0x10, 0xde, 0x64, 0x70, 0x1b, 0xd1, 0x76, 0x12, 0xa8, 0xbc, 0x31, 0xd7, 0x09, 0x65, 0x73,
+    0xbb, 0x5e, 0x7b, 0x06, 0xe9, 0xc4, 0x1c, 0x28, 0xd5, 0x08, 0x5a, 0xa3, 0x59, 0x50, 0x35, 0xe2, 0x91, 0xe3, 0xe1,
+    0x9d, 0x41, 0xac, 0x96, 0x2f, 0x69, 0x2a, 0x45, 0x03, 0x30, 0x2e, 0x80, 0xcb, 0xd3, 0xaf, 0xef, 0x7f, 0x3e, 0xe5,
+    0x71, 0x91, 0x2c, 0xdf, 0xc5, 0x45, 0x7c, 0x55, 0x86, 0x1b, 0x35, 0x46, 0x71, 0x4d, 0xa6, 0x62, 0xc0, 0xa4, 0x59,
+    0x49, 0xcd, 0x5d, 0xa9, 0x09, 0x31, 0xd6, 0x99, 0xac, 0xcb, 0x4a, 0x5e, 0x35, 0x2a, 0x5d, 0x17, 0x19, 0x7e, 0xdc,
+    0xf2, 0x39, 0xdd, 0x07, 0x20, 0x4f, 0xe3, 0x42, 0x1a, 0x49, 0x5d, 0x88, 0x31, 0x17, 0xf1, 0xba, 0x3e, 0x1e, 0x37,
+    0xba, 0x5e, 0xb2, 0x67, 0xe3, 0x27, 0xd3, 0x37, 0x59, 0x98, 0x0d, 0x04, 0x19, 0x55, 0x4b, 0x2e, 0x5a, 0xa6, 0x9c,
+    0xca, 0x24, 0x00, 0x7d, 0x3c, 0x7b, 0x8c, 0x1d, 0x8c, 0xc7, 0x64, 0xd3, 0x16, 0x0f, 0xf0, 0x70, 0xb9, 0x0e, 0x0b,
+    0x32, 0xd3, 0x75, 0x44, 0x81, 0xe0, 0xb7, 0x55, 0x00, 0x48, 0x8e, 0xb6, 0x2a, 0xc3, 0xa5, 0xb1, 0x67, 0xe3, 0x09,
+    0x95, 0xd8, 0xed, 0x90, 0xd4, 0x5e, 0x85, 0x6e, 0xe6, 0xa5, 0xef, 0x51, 0x24, 0x8d, 0xcb, 0xd2, 0x4e, 0xa5, 0x52,
+    0xed, 0x99, 0x99, 0xeb, 0x1a, 0xc4, 0x60, 0x08, 0x75, 0xdd, 0xa5, 0x57, 0xf7, 0x6e, 0x73, 0xad, 0xd9, 0x0e, 0x78,
+    0xaf, 0x41, 0x33, 0x94, 0xbc, 0xc5, 0xbc, 0x75, 0x45, 0xd4, 0x74, 0xb5, 0x06, 0xb3, 0x62, 0x94, 0x2d, 0x45, 0xe9,
+    0x9a, 0x82, 0x52, 0x30, 0xba, 0x58, 0x7b, 0x0b, 0xf7, 0x8d, 0x6c, 0x5c, 0x58, 0x32, 0xbd, 0x5a, 0x94, 0x94, 0x50,
+    0xdd, 0x54, 0x8c, 0x94, 0x30, 0x52, 0x1a, 0x9e, 0xca, 0xf7, 0x02, 0x8f, 0xf3, 0x3c, 0x88, 0x5a, 0x5e, 0x60, 0xc7,
+    0x15, 0x39, 0x06, 0x47, 0x2f, 0x93, 0xd3, 0x50, 0xe0, 0x1f, 0x33, 0x05, 0x62, 0x3a, 0x54, 0xf7, 0x1b, 0xdc, 0xfc,
+    0xff, 0x28, 0x58, 0xe0, 0xf1, 0xad, 0x97, 0xb8, 0x8d, 0xfe, 0x51, 0xf8, 0xb4, 0xf4, 0xb9, 0xf4, 0x5d, 0x5d, 0x3c,
+    0x69, 0x6f, 0x36, 0x4a, 0x96, 0x59, 0x9e, 0xbe, 0x95, 0x29, 0x07, 0x91, 0x19, 0x5a, 0x83, 0xb2, 0x23, 0xd1, 0xb8,
+    0xe1, 0x81, 0x11, 0x63, 0xe3, 0xc6, 0xf7, 0x63, 0x06, 0xb2, 0x61, 0xb0, 0xfa, 0x66, 0xa9, 0x4c, 0xd6, 0x57, 0x80,
+    0x29, 0xa2, 0xe4, 0x27, 0x2f, 0x73, 0x0e, 0x4f, 0xa1, 0xbe, 0x7e, 0x81, 0xdb, 0x5c, 0xe9, 0xfb, 0x9c, 0xff, 0x98,
+    0xd1, 0x1f, 0x11, 0xe8, 0x24, 0x5e, 0x81, 0xdc, 0xe3, 0x39, 0xd4, 0x8d, 0x30, 0xb5, 0x1c, 0x83, 0x03, 0x21, 0x1a,
+    0x88, 0xa8, 0x58, 0xa0, 0xa0, 0x2e, 0x0c, 0xb0, 0x86, 0xba, 0x60, 0x0e, 0xcf, 0x73, 0x99, 0x7c, 0x9c, 0x1a, 0x9f,
+    0xf9, 0x61, 0x8c, 0x31, 0x93, 0x83, 0x41, 0x58, 0xcd, 0x82, 0xe1, 0x78, 0x34, 0x39, 0x78, 0x06, 0xe7, 0x76, 0x30,
+    0x0e, 0xc8, 0x20, 0xa8, 0xcb, 0x55, 0x2c, 0x68, 0x79, 0x7d, 0x69, 0xcb, 0xc0, 0x8f, 0xeb, 0x60, 0xf0, 0x8f, 0xc2,
+    0x53, 0xbc, 0x83, 0xe6, 0xe4, 0x4c, 0x86, 0x60, 0x63, 0xbf, 0x26, 0x20, 0x29, 0xeb, 0x69, 0x7e, 0x52, 0x1f, 0x6e,
+    0x4c, 0x69, 0xff, 0xcc, 0xe1, 0x05, 0x87, 0x1d, 0x12, 0x28, 0x90, 0xc6, 0xd3, 0x6c, 0xf4, 0x5a, 0x29, 0x72, 0xdf,
+    0x15, 0x1c, 0xee, 0xcc, 0x3d, 0x67, 0x7a, 0xe4, 0x14, 0x12, 0xcd, 0x2c, 0xe0, 0x46, 0xfe, 0x5a, 0x5c, 0xc7, 0x79,
+    0x96, 0xee, 0x35, 0xdf, 0xec, 0x95, 0x77, 0xa2, 0x8a, 0x6f, 0x47, 0x81, 0xb1, 0x26, 0xe4, 0xbe, 0xea, 0x09, 0xd0,
+    0x13, 0x60, 0x0b, 0x80, 0x01, 0xf1, 0x8e, 0x99, 0xc9, 0x8c, 0x47, 0xe0, 0x11, 0xd8, 0xf4, 0x81, 0x2c, 0xee, 0x9c,
+    0x4b, 0x92, 0xbf, 0x99, 0x4a, 0x7b, 0xd5, 0x2b, 0x77, 0x0a, 0xb2, 0x5e, 0x6d, 0xe5, 0xae, 0x5b, 0x9f, 0x7d, 0xd3,
+    0xe1, 0x15, 0x78, 0x2e, 0xc1, 0x2d, 0xb2, 0xdf, 0x6f, 0x0a, 0x2a, 0x85, 0x51, 0x11, 0xef, 0x24, 0xd7, 0xe8, 0xdf,
+    0xee, 0x8d, 0x8d, 0x22, 0xb9, 0xe5, 0xc3, 0x03, 0xa8, 0x33, 0x79, 0x57, 0xdc, 0xce, 0x21, 0x6a, 0xeb, 0x6e, 0x3c,
+    0xb0, 0xda, 0xa0, 0x5d, 0xd6, 0x1c, 0xc1, 0x85, 0x17, 0x7b, 0x19, 0x8c, 0x05, 0xce, 0xca, 0x48, 0xa9, 0x71, 0x0d,
+    0xa9, 0x05, 0x9f, 0xe4, 0xe9, 0x3d, 0x64, 0xa9, 0x27, 0x41, 0x91, 0xe3, 0x59, 0x0c, 0x99, 0xc6, 0xdb, 0xc0, 0xe3,
+    0x77, 0x32, 0x04, 0x69, 0xda, 0x76, 0xdb, 0x1c, 0x81, 0xb2, 0x7b, 0x60, 0x4a, 0x52, 0xd7, 0xc6, 0xd4, 0x40, 0x43,
+    0xed, 0xa1, 0x46, 0x2a, 0xe2, 0xec, 0xe8, 0x0d, 0xe8, 0x10, 0xc1, 0xf7, 0x3b, 0xcd, 0xca, 0x8e, 0x17, 0x13, 0x82,
+    0x27, 0xef, 0xcb, 0xdb, 0xac, 0xac, 0xca, 0xe8, 0x7d, 0x8a, 0x86, 0x50, 0x89, 0x14, 0xd1, 0x2b, 0x88, 0xa7, 0x57,
+    0xe2, 0xef, 0x32, 0xfa, 0x39, 0xa5, 0x71, 0x9a, 0x62, 0xfa, 0x8b, 0x02, 0x7e, 0x3e, 0x07, 0x54, 0x47, 0xdc, 0x09,
+    0xd1, 0xb9, 0x04, 0x7b, 0x35, 0x88, 0x66, 0x55, 0x71, 0xc0, 0xd0, 0x8c, 0x6e, 0x05, 0x45, 0x8c, 0x36, 0xcc, 0xfe,
+    0x43, 0x81, 0x42, 0x21, 0x55, 0xcc, 0x77, 0xc2, 0x3e, 0x44, 0x3f, 0x62, 0x91, 0xc7, 0xef, 0x5e, 0x9b, 0x21, 0x8d,
+    0xee, 0x24, 0xd5, 0x5b, 0x1b, 0x8f, 0x2d, 0x0c, 0x5c, 0x16, 0x5d, 0xae, 0xe9, 0x59, 0xbc, 0xca, 0xa2, 0x0d, 0xe0,
+    0x4f, 0xbc, 0x7b, 0xfd, 0x5c, 0x59, 0x98, 0xbc, 0xc8, 0x40, 0x71, 0x70, 0xfc, 0xee, 0xf5, 0x1b, 0x99, 0xae, 0x73,
+    0x1e, 0x9d, 0x49, 0x24, 0xad, 0xc7, 0xef, 0x5e, 0xff, 0x82, 0xe6, 0x5e, 0x3f, 0x17, 0xf0, 0xfe, 0x15, 0xf0, 0x96,
+    0x51, 0xbc, 0x86, 0x3e, 0xa9, 0xdf, 0xc9, 0x1a, 0x3b, 0xe5, 0xd5, 0x5a, 0x46, 0xbf, 0xa6, 0xb5, 0x27, 0xad, 0xfa,
+    0x67, 0xe1, 0x53, 0x3b, 0x4f, 0xc0, 0x73, 0x9b, 0x67, 0xe2, 0x63, 0x64, 0x45, 0x3b, 0x41, 0xf4, 0xf5, 0xde, 0xed,
+    0x55, 0x2e, 0xca, 0x08, 0x5f, 0x30, 0xb4, 0x0b, 0x8a, 0xf6, 0xf7, 0x6f, 0x6e, 0x6e, 0x46, 0x37, 0x4f, 0x46, 0xb2,
+    0xb8, 0xdc, 0x9f, 0x7c, 0xfb, 0xed, 0xb7, 0xfb, 0xf8, 0x36, 0xf8, 0xba, 0xed, 0xf6, 0x5e, 0x11, 0x3e, 0x60, 0x01,
+    0x22, 0x54, 0x7f, 0x0d, 0x57, 0x14, 0xd0, 0xc2, 0x0d, 0xbe, 0x0e, 0xbe, 0xd6, 0x87, 0xce, 0xd7, 0x87, 0xe5, 0xf5,
+    0xa5, 0x2a, 0xbf, 0xab, 0xe4, 0x83, 0xf1, 0x78, 0xbc, 0x0f, 0x12, 0xa8, 0xaf, 0x07, 0x7c, 0x10, 0x1c, 0x05, 0x83,
+    0x0c, 0x2e, 0x34, 0xe5, 0xf5, 0xe5, 0x51, 0xe0, 0x99, 0xe6, 0x36, 0x58, 0x44, 0x07, 0xe2, 0x12, 0xec, 0x5f, 0xd2,
+    0xe0, 0xeb, 0x80, 0xb8, 0x94, 0xaf, 0x20, 0xe5, 0xab, 0x83, 0x67, 0x7e, 0xda, 0xff, 0x52, 0x69, 0x4f, 0xfc, 0xb4,
+    0x43, 0x4c, 0x7b, 0xf2, 0xdc, 0x4f, 0x3b, 0x52, 0x69, 0x2f, 0xfd, 0xb4, 0xff, 0x5d, 0x0e, 0x20, 0x75, 0xcf, 0xb7,
+    0xfe, 0x3b, 0xf7, 0x5a, 0x83, 0xa7, 0x50, 0x94, 0x5d, 0xc5, 0x97, 0x1c, 0x1a, 0x3d, 0xb8, 0xbd, 0xca, 0x69, 0x30,
+    0xc0, 0xf6, 0x7a, 0x26, 0x21, 0xde, 0x07, 0x5f, 0xaf, 0x8b, 0x3c, 0x0c, 0xbe, 0x1e, 0x60, 0x21, 0x83, 0xaf, 0x03,
+    0xf2, 0xb5, 0x31, 0x90, 0x11, 0x6c, 0x13, 0xb8, 0x50, 0xa4, 0x43, 0x1b, 0x20, 0xcc, 0x97, 0xc6, 0xd5, 0xf4, 0xaf,
+    0xa2, 0x3b, 0x1b, 0xde, 0x12, 0x95, 0x9b, 0x6e, 0x50, 0xd3, 0x13, 0xf0, 0x4e, 0x80, 0x46, 0x45, 0xc1, 0x75, 0x5c,
+    0x84, 0xc3, 0x61, 0x79, 0x7d, 0x49, 0xc0, 0x2e, 0x73, 0xc5, 0xe3, 0x2a, 0x0a, 0x84, 0x1c, 0xaa, 0x9f, 0x81, 0x8a,
+    0x7c, 0x15, 0x20, 0x20, 0x12, 0xfc, 0x17, 0xd4, 0xf4, 0x9d, 0x64, 0x9b, 0x60, 0x78, 0xc3, 0xcf, 0x3f, 0x66, 0xd5,
+    0x50, 0x89, 0x16, 0xaf, 0x05, 0x85, 0x1f, 0xf0, 0xd7, 0x55, 0x1d, 0xfd, 0x05, 0x6e, 0xdc, 0x4d, 0x0d, 0xfb, 0x3b,
+    0xe9, 0x58, 0xd4, 0x77, 0x72, 0x9e, 0x2d, 0xa6, 0xad, 0x03, 0xfd, 0x44, 0x92, 0x6a, 0x9e, 0x0d, 0x82, 0x61, 0x30,
+    0xe0, 0x0b, 0x76, 0x22, 0xe7, 0xdc, 0x33, 0x9f, 0x7a, 0x24, 0xfd, 0x69, 0x9e, 0x65, 0x03, 0xf0, 0x4d, 0x41, 0x7e,
+    0x64, 0xff, 0xbf, 0xe7, 0x43, 0x14, 0x1e, 0x0e, 0x1e, 0xed, 0x93, 0x59, 0xb0, 0xba, 0x45, 0x8f, 0xce, 0x28, 0xc8,
+    0xc4, 0x92, 0x17, 0x59, 0xe5, 0x2d, 0x95, 0xbb, 0x75, 0xdb, 0xcb, 0xe3, 0xde, 0xb3, 0x79, 0x15, 0x8b, 0x40, 0x9d,
+    0x73, 0xa0, 0x78, 0x43, 0xd9, 0x53, 0xd9, 0x94, 0x90, 0x6a, 0x43, 0xde, 0xb0, 0x1c, 0xb0, 0xe0, 0xb0, 0x37, 0x1c,
+    0xee, 0x05, 0x03, 0xa7, 0xce, 0x1d, 0x04, 0x7b, 0xc3, 0xe1, 0x51, 0xe0, 0xee, 0x43, 0xd9, 0xc8, 0xdd, 0x19, 0x69,
+    0xc1, 0xfe, 0x59, 0x84, 0x25, 0x05, 0xf1, 0x98, 0xd4, 0xe2, 0x2f, 0x0d, 0x2e, 0x33, 0x00, 0xe8, 0x23, 0x25, 0x01,
+    0x33, 0xb0, 0x32, 0x03, 0x08, 0xcd, 0x4d, 0x63, 0x76, 0x06, 0xcc, 0x23, 0x70, 0xcc, 0x23, 0x64, 0x1c, 0x00, 0xb1,
+    0x24, 0xc0, 0xb9, 0x0b, 0xa2, 0x58, 0x17, 0xf2, 0x08, 0x40, 0xef, 0xf1, 0x27, 0x31, 0xa5, 0x60, 0x92, 0x8e, 0x55,
+    0x08, 0x82, 0x38, 0x3e, 0xbb, 0x16, 0xad, 0xc9, 0x59, 0xa2, 0x83, 0x19, 0x49, 0x80, 0x0d, 0x31, 0xb0, 0x73, 0x70,
+    0x3f, 0x07, 0xa5, 0x87, 0xd5, 0x3b, 0x21, 0x17, 0x7c, 0xc7, 0x3d, 0xd9, 0x2c, 0x5c, 0x3d, 0xe1, 0x20, 0xb8, 0xe3,
+    0x9a, 0x05, 0x18, 0x55, 0xc5, 0xba, 0xac, 0x78, 0xfa, 0xe1, 0x6e, 0x05, 0xb1, 0xef, 0x70, 0x40, 0xdf, 0xc9, 0x3c,
+    0x4b, 0xee, 0x42, 0x67, 0xcf, 0xb5, 0x51, 0xe9, 0x3f, 0x7c, 0x78, 0xf3, 0x73, 0x04, 0x22, 0xc7, 0xda, 0x50, 0xfa,
+    0x3b, 0x8e, 0x67, 0x93, 0x1f, 0xe1, 0xc9, 0xdf, 0xd8, 0x77, 0xdc, 0x9e, 0x1e, 0xfd, 0x3e, 0xd4, 0x4d, 0xef, 0xf8,
+    0xec, 0x8e, 0x8f, 0x5c, 0x71, 0xa8, 0xae, 0x70, 0x5f, 0xdf, 0xac, 0x7d, 0x23, 0xa4, 0x87, 0xe7, 0x99, 0xf2, 0xc6,
+    0xfc, 0x68, 0x07, 0xc3, 0x20, 0x98, 0x6a, 0xa1, 0x24, 0x44, 0xdd, 0x60, 0x4a, 0xc0, 0x10, 0xed, 0xe9, 0x65, 0x35,
+    0x45, 0xce, 0x4d, 0x8d, 0x2c, 0xbc, 0x1f, 0x30, 0x2d, 0x74, 0x68, 0xe4, 0x50, 0x7e, 0x70, 0x38, 0x61, 0xcc, 0xc2,
+    0x6f, 0x95, 0x30, 0xfd, 0x6a, 0x51, 0x39, 0x07, 0xd1, 0x3d, 0x30, 0xc6, 0x15, 0xbc, 0x80, 0xae, 0xb0, 0xeb, 0xb5,
+    0x8a, 0x8a, 0x81, 0xe0, 0x71, 0xc8, 0x01, 0x7a, 0xd8, 0x05, 0x2d, 0x2b, 0x4b, 0x75, 0xab, 0x72, 0x96, 0x2a, 0xea,
+    0x32, 0x94, 0x95, 0xb1, 0xc2, 0x7c, 0x2f, 0xd9, 0x0f, 0x05, 0x7a, 0x96, 0x4f, 0x45, 0x17, 0xbc, 0x10, 0x4a, 0xb0,
+    0x5c, 0xd7, 0x3b, 0x11, 0x88, 0x3a, 0x3f, 0xf4, 0xae, 0xfa, 0x1a, 0xc7, 0x8e, 0xa7, 0x6f, 0x64, 0xca, 0xb5, 0x09,
+    0x85, 0xe6, 0xf3, 0xa5, 0xaf, 0x98, 0x28, 0xd8, 0x0d, 0xf4, 0xab, 0x6d, 0xa3, 0xcf, 0xee, 0xd6, 0x7a, 0x33, 0x28,
+    0xd1, 0x31, 0xaf, 0x51, 0x70, 0xad, 0x14, 0x0a, 0x46, 0x7b, 0x1b, 0x7f, 0x86, 0x23, 0xb7, 0xba, 0x3d, 0xf4, 0x7e,
+    0xab, 0xe2, 0xcb, 0xb7, 0xe8, 0xdb, 0x69, 0x7f, 0x8e, 0x2a, 0xf9, 0xeb, 0x6a, 0x05, 0x3e, 0x54, 0x10, 0x59, 0xc4,
+    0xe2, 0xd2, 0x42, 0x3d, 0xa7, 0xef, 0x8e, 0xdf, 0x82, 0x1f, 0x25, 0xfe, 0xfe, 0xed, 0xfb, 0xa0, 0x26, 0xd3, 0x78,
+    0x56, 0x98, 0x0f, 0x6d, 0x0e, 0x08, 0x4d, 0xe2, 0xd2, 0xec, 0xfb, 0x59, 0xdc, 0x64, 0xdf, 0x35, 0x5b, 0x4f, 0x8b,
+    0x26, 0x92, 0x94, 0xe1, 0xf6, 0xc1, 0x80, 0x40, 0x1f, 0x20, 0x8a, 0xb3, 0x2f, 0x68, 0x0c, 0x69, 0x3e, 0xb3, 0xef,
+    0x47, 0xc4, 0x7b, 0xb9, 0x13, 0x42, 0x8c, 0x2b, 0x2c, 0x1a, 0x3d, 0xe4, 0x33, 0x1e, 0x29, 0xc3, 0xa2, 0xf7, 0x98,
+    0x40, 0x9c, 0xe1, 0xb4, 0x7a, 0x8f, 0x98, 0xc7, 0x78, 0x37, 0xd0, 0xb2, 0x87, 0x28, 0xa3, 0x2e, 0x7b, 0xc3, 0xe2,
+    0xfb, 0xe3, 0x3a, 0xcc, 0xac, 0xe5, 0xe5, 0x10, 0xfe, 0x06, 0xda, 0x00, 0x9c, 0x72, 0x64, 0xf9, 0x2a, 0xb3, 0xd1,
+    0xd5, 0x12, 0xd3, 0x9b, 0x08, 0x62, 0xf1, 0xe8, 0x74, 0x58, 0xbb, 0x3a, 0x55, 0xef, 0x6a, 0xe7, 0x33, 0xd1, 0xab,
+    0x40, 0x2b, 0xd7, 0xb6, 0xc7, 0x43, 0xb8, 0x4b, 0x2d, 0xad, 0xb0, 0x11, 0xe5, 0x5c, 0x3c, 0xdd, 0x39, 0x36, 0x27,
+    0xa0, 0xc1, 0x95, 0x4c, 0x01, 0x38, 0x4b, 0xab, 0xd1, 0xa8, 0x11, 0xf6, 0x59, 0x39, 0x9f, 0xc3, 0xd6, 0x42, 0x3c,
+    0x2d, 0x00, 0xc3, 0x6d, 0x62, 0x50, 0xf2, 0x6e, 0x0c, 0xca, 0xe9, 0x47, 0x05, 0x6f, 0x1d, 0x9c, 0x95, 0xcb, 0x38,
+    0x95, 0x37, 0x80, 0xc5, 0x18, 0xf8, 0xa9, 0x58, 0xaa, 0x97, 0x90, 0x2c, 0x79, 0xf2, 0x11, 0xad, 0x36, 0xd2, 0x00,
+    0xb8, 0xca, 0xa9, 0xb1, 0xdc, 0x53, 0x20, 0xa1, 0xae, 0x14, 0x95, 0x10, 0x57, 0x55, 0x9c, 0x2c, 0x4f, 0x31, 0x35,
+    0xdc, 0x40, 0x2f, 0xa2, 0x40, 0xae, 0xb8, 0x00, 0x92, 0x9e, 0xb3, 0x7f, 0x65, 0x1a, 0x6b, 0xfc, 0xb9, 0x44, 0x01,
+    0x93, 0x46, 0x0d, 0xc6, 0x4a, 0xd9, 0x4b, 0x69, 0xa2, 0xbd, 0x05, 0x41, 0xed, 0x5e, 0xfe, 0x05, 0x75, 0x3f, 0x87,
+    0x56, 0x84, 0x0d, 0x30, 0x44, 0x79, 0x8e, 0x3b, 0x34, 0xb5, 0x4b, 0xce, 0x03, 0x46, 0x74, 0xde, 0x67, 0xb5, 0xdd,
+    0xea, 0xcf, 0x97, 0x80, 0x6d, 0x9a, 0x1a, 0x9f, 0xc2, 0x30, 0x21, 0x26, 0x36, 0xb0, 0x55, 0x56, 0xda, 0x0d, 0x65,
+    0xda, 0x49, 0x97, 0xcc, 0x6b, 0xe1, 0x34, 0xef, 0x31, 0xb6, 0x1c, 0xa9, 0xdc, 0xfd, 0x7e, 0x68, 0x7e, 0xb2, 0x9c,
+    0x3e, 0xd7, 0x21, 0x9b, 0xbd, 0xf1, 0xa0, 0x39, 0xd1, 0xea, 0xaa, 0x8e, 0x7e, 0x40, 0x07, 0x60, 0xa6, 0x2d, 0x40,
+    0xa6, 0x0b, 0x36, 0xed, 0x2b, 0x51, 0x71, 0x49, 0xc2, 0x52, 0x49, 0x60, 0x67, 0x37, 0x25, 0x3b, 0x9b, 0x80, 0x78,
+    0x86, 0xbb, 0x9e, 0x16, 0x3b, 0x21, 0x4d, 0x78, 0x8b, 0xbd, 0x04, 0x44, 0x1d, 0xaa, 0xba, 0x84, 0x6c, 0x8c, 0xa1,
+    0x8b, 0x7f, 0x51, 0x0a, 0x13, 0xd6, 0x32, 0xa9, 0x4a, 0x4c, 0x10, 0xa4, 0x72, 0xb7, 0x45, 0x60, 0x89, 0x82, 0x1d,
+    0xc0, 0xde, 0xbb, 0x51, 0x37, 0xa3, 0xa6, 0xaa, 0x53, 0x2f, 0xc1, 0xc7, 0x69, 0xd6, 0x55, 0x90, 0x59, 0xd8, 0x55,
+    0xb1, 0xe6, 0x81, 0x8e, 0x4d, 0xa5, 0x8c, 0x89, 0xbb, 0xb4, 0xc8, 0x10, 0x0f, 0x18, 0x63, 0xe9, 0x42, 0x20, 0xdf,
+    0x6c, 0x77, 0xdc, 0xf4, 0x04, 0xa1, 0x9f, 0xb0, 0xa1, 0x04, 0x6e, 0x3a, 0xdb, 0x53, 0xd3, 0xcc, 0x07, 0x44, 0x1c,
+    0x06, 0x14, 0x48, 0x36, 0x0e, 0x69, 0x8e, 0xf4, 0x05, 0x49, 0x13, 0x06, 0x86, 0x56, 0x3c, 0x27, 0xc8, 0x8a, 0x42,
+    0xcf, 0xd6, 0x55, 0x1b, 0xe7, 0xca, 0x30, 0x47, 0x4b, 0x4e, 0x85, 0xcf, 0x09, 0x32, 0xb1, 0x7b, 0xda, 0x66, 0x26,
+    0xc3, 0x51, 0xb2, 0xc0, 0xfc, 0x0a, 0xa2, 0xc4, 0x9d, 0x69, 0x56, 0xe5, 0x60, 0x5c, 0xc0, 0x02, 0xad, 0x7c, 0x0f,
+    0xea, 0xc6, 0x1a, 0xda, 0x68, 0x18, 0x62, 0xb7, 0x3f, 0xc1, 0x7e, 0xad, 0x9d, 0xd6, 0x65, 0x8a, 0xe5, 0x65, 0x0a,
+    0xd1, 0x5e, 0xc8, 0xfc, 0x46, 0x91, 0xe8, 0x4e, 0x11, 0x86, 0x84, 0x75, 0x94, 0x3d, 0x69, 0x53, 0x03, 0xe8, 0xa9,
+    0x17, 0xf0, 0xbc, 0x73, 0x2d, 0xc3, 0x2e, 0xd2, 0xfd, 0x55, 0xc1, 0xa7, 0x74, 0x83, 0x20, 0x45, 0x6f, 0x52, 0x30,
+    0xe7, 0xf5, 0x28, 0xa9, 0x37, 0xa7, 0x2d, 0x33, 0xaa, 0x8e, 0x8a, 0x90, 0x72, 0x82, 0xff, 0xe4, 0xa5, 0xd4, 0xc4,
+    0x26, 0x4c, 0xf0, 0xc0, 0x87, 0x79, 0x86, 0x0d, 0xbc, 0xdd, 0xbe, 0x4b, 0xc3, 0xa4, 0xcd, 0x36, 0xa4, 0x20, 0xad,
+    0x30, 0x71, 0x31, 0xa0, 0xb2, 0xd7, 0xb8, 0x5f, 0xb0, 0x9d, 0x34, 0x05, 0x0f, 0xc2, 0x46, 0x03, 0x13, 0xb7, 0xba,
+    0xf8, 0x3a, 0x4c, 0x68, 0xb8, 0xa4, 0xda, 0xd9, 0x49, 0x4b, 0x9a, 0xdb, 0xeb, 0xf2, 0xc2, 0xf6, 0x41, 0xc7, 0x0e,
+    0xeb, 0x1a, 0x1e, 0x68, 0x5e, 0xb3, 0x8b, 0x2b, 0xa6, 0x69, 0xa2, 0xb1, 0x1e, 0x52, 0x96, 0x1c, 0xeb, 0x7a, 0xba,
+    0xc2, 0xd5, 0x32, 0xd3, 0xc0, 0xee, 0x12, 0x2f, 0xf4, 0x80, 0x87, 0x1d, 0xae, 0x48, 0x74, 0x81, 0xcd, 0x66, 0xab,
+    0x9a, 0x4c, 0xf3, 0xfb, 0xb2, 0xe5, 0x26, 0x20, 0x9c, 0xa5, 0xbe, 0xb9, 0x4f, 0x8e, 0x35, 0x6d, 0xf3, 0x93, 0x00,
+    0xc7, 0xdb, 0x2b, 0x20, 0xe9, 0x58, 0x82, 0x2e, 0xbe, 0xa5, 0x3f, 0x88, 0xd4, 0x4c, 0x05, 0xbd, 0x77, 0xbe, 0x48,
+    0xdd, 0xfc, 0x02, 0x6c, 0xa3, 0x36, 0xc6, 0x34, 0x2b, 0x5b, 0x87, 0x89, 0xb2, 0xb0, 0x46, 0x16, 0x72, 0x09, 0x3e,
+    0x98, 0xbb, 0x4d, 0x9d, 0x1e, 0x77, 0x10, 0x61, 0xbf, 0x8b, 0x1e, 0x8f, 0x30, 0x56, 0xac, 0x41, 0x62, 0x58, 0x85,
+    0x35, 0x6d, 0x2e, 0x87, 0x28, 0xa7, 0x66, 0xc9, 0x44, 0x4b, 0xea, 0x53, 0x8a, 0x28, 0x05, 0x73, 0xe3, 0x69, 0xd9,
+    0x30, 0x25, 0x44, 0xc8, 0x0a, 0xe9, 0x80, 0x6a, 0x2d, 0xb4, 0x54, 0x13, 0xf4, 0x3a, 0xf4, 0xb2, 0xd0, 0x98, 0x82,
+    0xe8, 0x23, 0x32, 0xdc, 0x88, 0x23, 0xa3, 0xbb, 0x63, 0x14, 0x13, 0x08, 0x55, 0xed, 0xe5, 0x85, 0xd5, 0xa7, 0x65,
+    0x5b, 0x1d, 0xc4, 0x15, 0x22, 0xdf, 0x77, 0x13, 0xd4, 0x18, 0x05, 0x6d, 0x4e, 0x37, 0xfa, 0x6b, 0x11, 0xfa, 0x76,
+    0xe1, 0xd8, 0x8d, 0x82, 0x48, 0x88, 0xc0, 0xea, 0x35, 0x15, 0x03, 0xb2, 0xce, 0x63, 0x17, 0xa1, 0x49, 0x77, 0x0b,
+    0x51, 0xde, 0xa8, 0xac, 0x3f, 0xae, 0x43, 0xb2, 0xdd, 0x62, 0x59, 0xe0, 0xcb, 0x7e, 0xba, 0xbe, 0x07, 0xf2, 0xfb,
+    0xcd, 0xfa, 0xb3, 0x90, 0xdf, 0xaf, 0xb3, 0x2f, 0x81, 0xfc, 0x7e, 0xb3, 0xfe, 0x9f, 0x86, 0xfc, 0x3e, 0x5d, 0x7b,
+    0x90, 0xdf, 0x6a, 0x30, 0x7e, 0x2f, 0x58, 0x70, 0xf2, 0x36, 0xa0, 0x2f, 0x24, 0x0b, 0x4e, 0x5e, 0xbd, 0xf2, 0x8d,
+    0x40, 0x84, 0x46, 0xae, 0x37, 0xb2, 0x60, 0xc4, 0x6d, 0x81, 0x57, 0xa8, 0x75, 0xf2, 0x81, 0x8a, 0x32, 0x00, 0x5e,
+    0x2f, 0xff, 0x91, 0x55, 0xcb, 0x30, 0xd8, 0x0f, 0xc8, 0xcc, 0x41, 0x82, 0x0e, 0x27, 0x70, 0x7b, 0x43, 0x23, 0xcb,
+    0xea, 0x8b, 0xe0, 0xc3, 0x47, 0xa3, 0x51, 0x5c, 0x5c, 0xe2, 0xa5, 0xce, 0x6c, 0x24, 0x04, 0x3c, 0xce, 0x78, 0x69,
+    0x43, 0x44, 0x2c, 0xe3, 0xf2, 0x4c, 0xc7, 0x66, 0x29, 0xed, 0x56, 0x84, 0x88, 0xf3, 0x67, 0x80, 0x53, 0x6f, 0xf7,
+    0x66, 0x8c, 0xfd, 0x50, 0x1c, 0xb1, 0x0e, 0x20, 0xfb, 0x7c, 0xad, 0xdf, 0x9d, 0xc7, 0x25, 0x7f, 0x17, 0x57, 0x4b,
+    0x06, 0xbd, 0x84, 0xbb, 0x88, 0xe0, 0x49, 0xe5, 0xb1, 0x4d, 0x0a, 0xa8, 0x3c, 0xd3, 0x40, 0xe5, 0x1d, 0xef, 0x69,
+    0x68, 0x87, 0x45, 0xfb, 0x00, 0x1b, 0xe9, 0x72, 0x06, 0x46, 0x8b, 0x2f, 0xaf, 0xb9, 0xa8, 0x7e, 0x06, 0x3c, 0x75,
+    0xc1, 0x0b, 0xb8, 0x25, 0x20, 0x17, 0xdb, 0x70, 0x42, 0xa0, 0xc2, 0xf7, 0xec, 0x50, 0x51, 0x63, 0x8c, 0x68, 0xa2,
+    0xd1, 0x6f, 0xbc, 0x09, 0xa1, 0x77, 0x27, 0xe8, 0x8a, 0x30, 0x12, 0xde, 0x5f, 0x6b, 0x7e, 0x96, 0x81, 0xf9, 0xbc,
+    0x00, 0x28, 0x0d, 0x84, 0x43, 0x65, 0x4a, 0x6e, 0x81, 0x09, 0x1b, 0x63, 0xae, 0x94, 0xa5, 0x1e, 0x52, 0x29, 0x55,
+    0x70, 0xba, 0x82, 0xa6, 0x12, 0x70, 0xb8, 0x23, 0x09, 0x60, 0xa6, 0xb6, 0x30, 0x88, 0x6e, 0x9b, 0xd2, 0x2c, 0x8d,
+    0x9c, 0x22, 0xcd, 0xe1, 0x93, 0x52, 0x05, 0x3a, 0x7d, 0x96, 0xc4, 0x15, 0xbf, 0x94, 0x05, 0x84, 0xc2, 0x6d, 0xa5,
+    0x50, 0xa4, 0xdf, 0x67, 0x62, 0x7d, 0xc5, 0x8b, 0x2c, 0x39, 0x5b, 0x66, 0x65, 0x05, 0xf9, 0xe6, 0xfa, 0xf4, 0x5b,
+    0xd4, 0xd3, 0x02, 0xe7, 0x4d, 0x4d, 0x0a, 0x33, 0xf3, 0x78, 0xac, 0x76, 0x3a, 0xa8, 0x57, 0xbd, 0xd7, 0x06, 0xfb,
+    0xbd, 0x39, 0xd1, 0xe3, 0xd6, 0x7a, 0xb0, 0x9a, 0xd4, 0x66, 0xaa, 0x82, 0x38, 0x02, 0xea, 0xc0, 0x8e, 0xe2, 0x76,
+    0x33, 0x0f, 0x93, 0x76, 0xca, 0x76, 0xbb, 0x93, 0x09, 0x0e, 0xee, 0x56, 0x12, 0xdc, 0x12, 0x61, 0xc5, 0x1f, 0x2a,
+    0x08, 0x96, 0xd9, 0x70, 0x12, 0x99, 0x70, 0xac, 0x05, 0xff, 0x6b, 0xcd, 0x0d, 0x16, 0x7c, 0xa8, 0x1d, 0xf2, 0x9c,
+    0xe4, 0x5c, 0x0f, 0x80, 0x67, 0xc3, 0xa6, 0x67, 0x67, 0x0e, 0xf6, 0x53, 0x7e, 0xcb, 0x21, 0x60, 0x4b, 0xe7, 0x28,
+    0x2e, 0xa6, 0xda, 0x9a, 0xd7, 0xb0, 0x12, 0xf4, 0xcb, 0xbe, 0xd3, 0x38, 0xb5, 0x09, 0x0f, 0x87, 0xcf, 0xc6, 0xa4,
+    0xd6, 0xa6, 0xe5, 0x38, 0xcf, 0xf6, 0xb7, 0x5a, 0x0b, 0xee, 0xd9, 0xae, 0x07, 0xda, 0x74, 0x0a, 0x68, 0xd7, 0x48,
+    0xc5, 0x3d, 0xdd, 0xaf, 0x49, 0xed, 0xe6, 0xd5, 0x0a, 0x7a, 0xfe, 0x50, 0x87, 0xcb, 0xd9, 0xa3, 0x4d, 0xa6, 0xab,
+    0xac, 0xff, 0xc8, 0x6c, 0x58, 0xb8, 0xc6, 0x46, 0xad, 0xf5, 0x8c, 0xfb, 0xa8, 0x6c, 0x1d, 0xd9, 0xf4, 0x0c, 0xb1,
+    0xac, 0x73, 0xb7, 0x8f, 0xd4, 0x23, 0x57, 0x51, 0xb2, 0xba, 0xb3, 0xf0, 0x5b, 0x9e, 0x84, 0x5d, 0x0d, 0x53, 0x8c,
+    0xb8, 0xe9, 0x02, 0x02, 0x55, 0x82, 0xf8, 0x3d, 0xfc, 0xe3, 0xd1, 0xa6, 0x49, 0x3d, 0xea, 0x7d, 0xef, 0x33, 0xfc,
+    0x9d, 0xa5, 0xf0, 0xb7, 0xaa, 0xff, 0xa0, 0x9b, 0x2b, 0x5e, 0x2d, 0x65, 0x1a, 0x05, 0xef, 0x4e, 0x4e, 0x3f, 0x04,
+    0x1a, 0x00, 0x1d, 0xaf, 0x01, 0x46, 0xf1, 0x6b, 0xa0, 0x96, 0x40, 0x11, 0x92, 0xcb, 0x4b, 0xc4, 0x00, 0xd4, 0x20,
+    0xf2, 0xa7, 0x4b, 0x79, 0x73, 0x9c, 0xe7, 0x3e, 0xaf, 0x6a, 0xe8, 0x9b, 0x66, 0xdf, 0x1a, 0xc4, 0x21, 0x04, 0x91,
+    0xdb, 0x28, 0x2b, 0xcf, 0xb4, 0x92, 0x24, 0x3d, 0x3b, 0xbf, 0x3b, 0xd3, 0x82, 0x18, 0x0b, 0xc2, 0xf8, 0xfc, 0x8f,
+    0xc3, 0x34, 0xbb, 0xde, 0x43, 0x22, 0xcc, 0x02, 0xb0, 0x60, 0xcf, 0xf9, 0xf9, 0xba, 0xaa, 0xa4, 0x18, 0x16, 0xf2,
+    0x26, 0x38, 0x3a, 0x54, 0x0f, 0x26, 0x43, 0xac, 0x1e, 0x83, 0xbd, 0xff, 0x4a, 0xf2, 0x2c, 0xf9, 0xc8, 0x82, 0x47,
+    0x9b, 0x8c, 0x1d, 0xb5, 0x48, 0xed, 0xb8, 0x0e, 0x8e, 0xa0, 0xad, 0x7b, 0xc7, 0x79, 0x7e, 0xb8, 0xaf, 0xbe, 0x38,
+    0x3a, 0xdc, 0x4f, 0xb3, 0xeb, 0x23, 0x0f, 0x0f, 0xdf, 0x99, 0xb7, 0x22, 0xf2, 0x98, 0xbb, 0xbe, 0x82, 0x1f, 0x6b,
+    0xc2, 0x43, 0x7b, 0xe0, 0x83, 0xd0, 0xc4, 0x44, 0x13, 0x41, 0x41, 0x4b, 0x18, 0xc3, 0xf1, 0xb6, 0xdd, 0x86, 0xd6,
+    0xf6, 0x26, 0xf1, 0x80, 0x69, 0x0a, 0x60, 0x08, 0x30, 0x0b, 0x4d, 0x08, 0x4d, 0x6a, 0x12, 0x1a, 0xf8, 0x9c, 0x98,
+    0xd0, 0xa2, 0xa6, 0x40, 0xf1, 0xdf, 0xc4, 0x2b, 0x23, 0x6b, 0xd2, 0x77, 0x77, 0xd3, 0xfa, 0x59, 0x63, 0x1c, 0xa3,
+    0xf6, 0xa8, 0x1a, 0x40, 0xab, 0x5e, 0x79, 0xdf, 0xc0, 0x82, 0x78, 0x31, 0xac, 0x68, 0xd0, 0x22, 0x15, 0x20, 0x1e,
+    0xf4, 0xa5, 0x5a, 0x9c, 0x86, 0xf3, 0x92, 0xca, 0x05, 0x61, 0x47, 0xe1, 0x06, 0xb9, 0xdb, 0x52, 0x11, 0xcb, 0x48,
+    0xd6, 0x0e, 0x5d, 0x52, 0xcd, 0xce, 0xd1, 0xa3, 0x8d, 0x40, 0x40, 0xc3, 0x92, 0x1d, 0x35, 0xe7, 0xab, 0x8a, 0xcf,
+    0x87, 0x4b, 0x0e, 0x6e, 0x30, 0xc1, 0xde, 0x7f, 0xa5, 0xe7, 0xb9, 0x9d, 0x14, 0xb5, 0x22, 0x97, 0xb1, 0x48, 0x73,
+    0xfe, 0x21, 0x3e, 0xff, 0x01, 0xf3, 0xbc, 0x38, 0xcf, 0x9f, 0x43, 0x86, 0x3a, 0x38, 0x7a, 0xb4, 0x49, 0xaa, 0xd1,
+    0xcb, 0xb7, 0x1f, 0x5e, 0x7f, 0xf8, 0xe7, 0xd9, 0xf3, 0xe3, 0x0f, 0x2f, 0xbf, 0x3f, 0x79, 0xff, 0xfa, 0xe5, 0xe9,
+    0xdc, 0xfa, 0x9d, 0x2a, 0x38, 0x33, 0xb2, 0xd8, 0x6e, 0x5d, 0xbe, 0x5f, 0xdf, 0xbe, 0x78, 0xf9, 0xea, 0xf5, 0xdb,
+    0x97, 0x2f, 0x6a, 0x35, 0x97, 0xed, 0x86, 0xc0, 0x0e, 0x8d, 0x33, 0xc1, 0x0b, 0x28, 0x5e, 0x07, 0x55, 0xc4, 0x66,
+    0x6b, 0x14, 0xbe, 0x66, 0xd3, 0x75, 0xc0, 0x02, 0x58, 0x64, 0x7b, 0x7a, 0xb3, 0x40, 0xc3, 0xa5, 0xd9, 0x38, 0xfe,
+    0x12, 0xf3, 0x7b, 0xf3, 0x12, 0xbf, 0x7b, 0x2f, 0x6f, 0x4c, 0x57, 0xf4, 0x08, 0x29, 0x80, 0xad, 0xd9, 0xf3, 0x3f,
+    0x0e, 0x7d, 0xa1, 0x16, 0xde, 0xfc, 0x55, 0xb9, 0xf0, 0xab, 0x0e, 0xf6, 0xb4, 0x81, 0x5d, 0x00, 0xf1, 0x21, 0x82,
+    0xa3, 0xc3, 0x7d, 0x3f, 0xf7, 0xd1, 0x1f, 0xd1, 0xcf, 0x5e, 0xe7, 0xb0, 0x54, 0x18, 0x87, 0x66, 0xda, 0xce, 0x21,
+    0x04, 0x11, 0x8c, 0xdc, 0x31, 0xa5, 0x56, 0x90, 0x21, 0x57, 0x92, 0x44, 0x76, 0x12, 0x95, 0xe1, 0x88, 0x29, 0xed,
+    0x0f, 0xfd, 0xd7, 0xf5, 0x19, 0x2f, 0xe2, 0x5c, 0x94, 0xb2, 0x08, 0xa0, 0x1f, 0xed, 0xb0, 0x0e, 0x7b, 0x5e, 0xf8,
+    0x14, 0xec, 0x51, 0x27, 0x79, 0x87, 0x11, 0xd9, 0x6f, 0x7f, 0xea, 0x75, 0xec, 0x0f, 0xe2, 0x7e, 0xec, 0xe9, 0xce,
+    0xb4, 0xc8, 0x8b, 0x6d, 0xe0, 0xfd, 0xe1, 0x37, 0xe6, 0x27, 0x19, 0xfd, 0x87, 0xa4, 0x97, 0x31, 0xbd, 0x8a, 0xe9,
+    0xa9, 0x58, 0xd4, 0x9d, 0xb3, 0x63, 0x43, 0xbb, 0x50, 0x3e, 0x0d, 0x01, 0x20, 0x42, 0xb3, 0xed, 0x9a, 0x99, 0xcd,
+    0x46, 0x5a, 0xa5, 0xf5, 0x21, 0x2e, 0x2e, 0xb9, 0x89, 0xa8, 0x62, 0xde, 0x56, 0x7a, 0x54, 0x88, 0x37, 0x2c, 0x80,
+    0x9e, 0xd2, 0xd3, 0x9a, 0xff, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xe6, 0xaa, 0xac, 0xe4, 0x0a, 0x58,
+    0xea, 0xf8, 0x52, 0x8b, 0x48, 0x68, 0xc8, 0xbf, 0xac, 0xba, 0xed, 0x96, 0x8f, 0x70, 0x49, 0x02, 0x5f, 0x36, 0xaa,
+    0xe4, 0xe5, 0x65, 0xce, 0xc3, 0xc0, 0xc4, 0xf8, 0x08, 0xa8, 0xad, 0x66, 0xf6, 0x7f, 0x8a, 0x3b, 0xda, 0xe5, 0xb6,
+    0x6d, 0xe4, 0xff, 0x7b, 0x0a, 0x86, 0xc9, 0xa5, 0x62, 0x42, 0xd2, 0xa4, 0x64, 0xd9, 0x8e, 0x64, 0xd9, 0x6d, 0x93,
+    0x74, 0xce, 0x1d, 0xb7, 0xe9, 0x24, 0xbe, 0xcc, 0x5d, 0x5d, 0x8f, 0x45, 0x51, 0x90, 0xc4, 0x0b, 0x45, 0x6a, 0x48,
+    0xca, 0x96, 0xab, 0xf2, 0x9e, 0xa5, 0xcf, 0x72, 0x4f, 0x76, 0xb3, 0xbb, 0x00, 0x08, 0x7e, 0xe8, 0xc3, 0x4d, 0x7a,
+    0x37, 0x3d, 0x5f, 0x44, 0x10, 0x00, 0x81, 0x05, 0xb0, 0xbb, 0xd8, 0xcf, 0x27, 0x8e, 0x08, 0xac, 0x69, 0xe4, 0x9b,
+    0x8e, 0x96, 0x98, 0x31, 0x93, 0x91, 0xe7, 0x88, 0xc1, 0x44, 0x11, 0xea, 0x1d, 0x6a, 0x21, 0xf8, 0xba, 0x14, 0x47,
+    0xd7, 0x1a, 0xc7, 0xcb, 0x51, 0xc8, 0x2c, 0xdc, 0xee, 0xf0, 0xc9, 0xf5, 0x68, 0x39, 0x1a, 0x41, 0x32, 0x95, 0x27,
+    0x8e, 0x09, 0xe1, 0x61, 0xe2, 0x14, 0xaf, 0x6d, 0xb9, 0xd1, 0x87, 0x49, 0xd9, 0x59, 0x75, 0xf8, 0x60, 0xd2, 0x01,
+    0x12, 0x19, 0xfa, 0x40, 0x06, 0x57, 0xb4, 0x86, 0x53, 0x3b, 0xd0, 0x3f, 0xc0, 0xee, 0x4b, 0xf5, 0x7e, 0xd3, 0xd1,
+    0x1f, 0x5c, 0xeb, 0x1f, 0x10, 0xc6, 0x98, 0x64, 0xf8, 0x35, 0xed, 0x5e, 0xdd, 0xd4, 0x49, 0x37, 0xbd, 0xc4, 0x74,
+    0x03, 0x20, 0x9b, 0x7d, 0x13, 0x78, 0xd3, 0x28, 0x4e, 0xb3, 0xc0, 0xd7, 0x6f, 0xfa, 0x17, 0x41, 0xeb, 0x7a, 0x9e,
+    0xb5, 0x8c, 0x1b, 0xd3, 0xcf, 0xd4, 0x4c, 0x25, 0x02, 0x61, 0x62, 0xa2, 0x92, 0x4d, 0x95, 0xd4, 0x13, 0xb4, 0xb5,
+    0xa2, 0x40, 0xcd, 0x58, 0xc9, 0xcf, 0x06, 0x50, 0xaf, 0x92, 0xf6, 0x04, 0xf3, 0x37, 0xe9, 0xd8, 0xd2, 0xe8, 0xd3,
+    0x85, 0xe2, 0xf5, 0x72, 0x8d, 0xa4, 0x3c, 0x2b, 0xa8, 0x25, 0x86, 0xea, 0x15, 0xfe, 0x2d, 0xf4, 0xfc, 0x44, 0xb5,
+    0xcd, 0x2c, 0xd1, 0xdd, 0xe1, 0x37, 0x65, 0xbe, 0x00, 0xe8, 0x37, 0x18, 0x46, 0x44, 0x71, 0xa6, 0x41, 0xfc, 0x19,
+    0xf8, 0xe2, 0xb0, 0x6a, 0xcb, 0xc5, 0x7b, 0x6d, 0x19, 0x39, 0x47, 0x06, 0xdf, 0x22, 0xf1, 0x6b, 0xf1, 0x28, 0x64,
+    0xa5, 0x40, 0x13, 0xc4, 0xd3, 0x47, 0xb0, 0x80, 0x59, 0x7c, 0x19, 0xdf, 0x57, 0xd5, 0x15, 0xaf, 0x87, 0xbb, 0x69,
+    0x2f, 0x12, 0x40, 0xd8, 0x6f, 0x22, 0xf9, 0x5e, 0x8b, 0xe7, 0x0f, 0x15, 0x8c, 0x4e, 0xe5, 0x4c, 0xa1, 0x7d, 0x86,
+    0xe0, 0x61, 0x32, 0x30, 0xe7, 0x42, 0x5a, 0x00, 0x28, 0x89, 0x93, 0xe9, 0x61, 0x7e, 0x2b, 0x32, 0x1c, 0x8b, 0xfc,
+    0xc2, 0x0a, 0x71, 0x06, 0xec, 0x1a, 0x2d, 0x96, 0x19, 0x46, 0xc4, 0x85, 0x01, 0xb0, 0x5c, 0xd7, 0x30, 0xc2, 0x26,
+    0x60, 0xe9, 0x82, 0x4d, 0xcc, 0x75, 0x2d, 0x18, 0xd7, 0xcb, 0x88, 0xe7, 0x05, 0xdc, 0x85, 0xe8, 0x1d, 0xc5, 0x49,
+    0xf0, 0x98, 0xf0, 0x59, 0xf8, 0x66, 0x11, 0x4d, 0xbe, 0xe5, 0xa3, 0xda, 0xa5, 0x01, 0x31, 0xf8, 0x84, 0xf8, 0xfa,
+    0xad, 0xb0, 0x71, 0xae, 0x10, 0x24, 0xb3, 0x34, 0xcb, 0xe1, 0xb3, 0x75, 0x94, 0x9f, 0x3f, 0x5b, 0xa7, 0xf9, 0xe0,
+    0xd9, 0xda, 0x03, 0x46, 0x2e, 0xd7, 0x61, 0x9e, 0x85, 0x3b, 0x4d, 0x31, 0x3b, 0xd8, 0x53, 0x54, 0xae, 0xa1, 0x3e,
+    0x7d, 0xc0, 0xb5, 0xe6, 0x8b, 0x24, 0x98, 0x7b, 0xc9, 0x03, 0x29, 0xd9, 0x4d, 0x55, 0x13, 0x6f, 0xe8, 0x1a, 0xa1,
+    0x75, 0x9a, 0x2e, 0x61, 0x78, 0x5d, 0xfb, 0x5a, 0x96, 0x31, 0x3e, 0x39, 0xa9, 0x69, 0x84, 0x6f, 0xdd, 0xea, 0x2f,
+    0x99, 0x3d, 0x66, 0x99, 0x17, 0x84, 0xd4, 0xa4, 0x2f, 0x52, 0xc8, 0xd7, 0x66, 0x93, 0x96, 0x67, 0x13, 0x95, 0x77,
+    0x0b, 0x4e, 0x86, 0x10, 0x3e, 0x8d, 0x1b, 0x67, 0x86, 0xa9, 0xa5, 0x9a, 0xd7, 0x8f, 0xde, 0xfd, 0x4f, 0xa1, 0xcf,
+    0x00, 0xfa, 0x11, 0x40, 0x9f, 0x45, 0x7e, 0x3c, 0x66, 0x7f, 0x7f, 0x7f, 0x21, 0x73, 0x59, 0x81, 0x58, 0x66, 0xc8,
+    0xb7, 0x61, 0x8a, 0xdc, 0x42, 0x82, 0x9c, 0x02, 0x65, 0x9d, 0x2a, 0x76, 0x4c, 0x92, 0xeb, 0xda, 0x39, 0x8d, 0x9d,
+    0x8d, 0x69, 0xd4, 0x83, 0x18, 0x5b, 0x25, 0xf9, 0xe9, 0x01, 0xd5, 0x26, 0xda, 0x46, 0x95, 0x00, 0x0c, 0x09, 0xcc,
+    0xb0, 0x80, 0x02, 0xa4, 0xdd, 0x1c, 0xb8, 0xc5, 0xf5, 0xc1, 0x9e, 0xa3, 0xf0, 0xdb, 0x3d, 0x2f, 0x33, 0x26, 0xd8,
+    0x4a, 0x3f, 0x3b, 0xc5, 0x44, 0x5a, 0x40, 0x9d, 0x21, 0xf4, 0xc6, 0xe9, 0x01, 0x3d, 0x6a, 0x95, 0xfd, 0x5f, 0x74,
+    0x22, 0x2e, 0x72, 0x3d, 0xde, 0xc1, 0xa3, 0x0e, 0x06, 0xe4, 0x6d, 0x87, 0x52, 0x2f, 0xd7, 0xb5, 0x39, 0x67, 0x84,
+    0x78, 0x8c, 0x1f, 0x08, 0x00, 0xe0, 0xc0, 0x49, 0xd5, 0xb5, 0xb9, 0xb7, 0xc2, 0x99, 0x8b, 0x37, 0xde, 0xaa, 0xe5,
+    0xf2, 0x57, 0xb6, 0x04, 0x54, 0x5a, 0x3e, 0x5a, 0x3e, 0x5f, 0x5c, 0xb0, 0xee, 0x17, 0x42, 0xdb, 0xd6, 0x0c, 0xb5,
+    0xa6, 0x0d, 0x8b, 0x3b, 0x13, 0x8b, 0x3b, 0xde, 0xb0, 0xb8, 0xe3, 0x2d, 0x8b, 0x1b, 0xf2, 0x85, 0xd4, 0x24, 0xe8,
+    0x12, 0xf4, 0xd8, 0x92, 0xc0, 0xe3, 0x6c, 0x45, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, 0x86, 0x60, 0xb1, 0xb4, 0x01,
+    0x56, 0x4d, 0x70, 0x51, 0x00, 0xa1, 0xa2, 0x94, 0xb4, 0x74, 0xe8, 0xc4, 0xb4, 0x21, 0x2f, 0x66, 0x2b, 0xac, 0x4e,
+    0x17, 0x36, 0x29, 0xe5, 0xfc, 0x6e, 0xcd, 0x36, 0x4c, 0x74, 0xb6, 0x65, 0xa2, 0x7e, 0xe9, 0xe4, 0xf2, 0x59, 0xd3,
+    0x19, 0x54, 0xe7, 0x04, 0x5b, 0x10, 0x8c, 0x38, 0x71, 0xc7, 0x94, 0xb7, 0xe1, 0x66, 0x84, 0xaa, 0x6c, 0xa8, 0x85,
+    0x97, 0xa6, 0xf7, 0x71, 0x02, 0x5a, 0x10, 0xe8, 0xe6, 0x71, 0x3b, 0x6a, 0x1e, 0x44, 0x3c, 0xc0, 0xca, 0xc6, 0xbd,
+    0x54, 0xbc, 0x57, 0x77, 0x54, 0xbb, 0xdb, 0xa5, 0x1a, 0x0b, 0x2f, 0xcb, 0x58, 0x82, 0x30, 0xf7, 0x20, 0x12, 0x77,
+    0x0d, 0xd8, 0xff, 0x97, 0x4d, 0xd6, 0x80, 0x41, 0x42, 0xa3, 0xc0, 0xe9, 0x88, 0x9f, 0x17, 0xc0, 0x47, 0x25, 0x82,
+    0xe8, 0x2a, 0xb1, 0xda, 0x12, 0x09, 0xf7, 0x1f, 0xf1, 0xb0, 0xb6, 0x12, 0xc5, 0x9b, 0xc8, 0x3d, 0x32, 0xec, 0x85,
+    0x37, 0xfe, 0x00, 0xba, 0xb6, 0x56, 0xdb, 0x04, 0xbb, 0x59, 0x35, 0x32, 0x5b, 0x42, 0x8c, 0x9d, 0x5f, 0xa0, 0x48,
+    0xc4, 0x91, 0xdc, 0x2a, 0x09, 0x1c, 0x1a, 0x3d, 0x6b, 0x72, 0xb3, 0x6e, 0xe7, 0x07, 0xd3, 0xc0, 0xa8, 0xe1, 0x4c,
+    0x40, 0x6c, 0xe1, 0xe0, 0x4c, 0xde, 0xaf, 0x42, 0xd3, 0x3d, 0x32, 0x40, 0x18, 0x7b, 0x0d, 0x29, 0x46, 0x1d, 0x71,
+    0x79, 0x1d, 0x26, 0x40, 0xa2, 0xae, 0x9d, 0x9b, 0xfc, 0xf9, 0x14, 0x7f, 0xb9, 0x37, 0xf9, 0xf3, 0x11, 0xfe, 0x6a,
+    0xdf, 0x60, 0x32, 0xb9, 0x86, 0x4b, 0xbb, 0x32, 0x67, 0xfd, 0xac, 0xb4, 0x9d, 0xc8, 0x24, 0xec, 0xf1, 0x04, 0xfa,
+    0xe9, 0xb3, 0x75, 0x0a, 0x4e, 0x90, 0xea, 0x1c, 0x22, 0x3b, 0x31, 0xf2, 0xc6, 0xf2, 0xe9, 0x86, 0xf2, 0x91, 0xf1,
+    0x3f, 0xa6, 0xf2, 0xb8, 0x4b, 0xe2, 0x82, 0xa2, 0x94, 0x45, 0x0e, 0xb7, 0xa3, 0x20, 0xf2, 0x92, 0x87, 0x5b, 0xba,
+    0x4a, 0xb4, 0x04, 0x9f, 0x2e, 0x45, 0x29, 0xc4, 0x4a, 0x96, 0x35, 0x50, 0x99, 0x22, 0x73, 0x7d, 0xe0, 0x64, 0x7e,
+    0xf0, 0x8f, 0x44, 0x61, 0xd1, 0x4a, 0x97, 0x4d, 0xbe, 0x20, 0xa5, 0x0f, 0xdd, 0x3e, 0x5b, 0xb7, 0x58, 0xbd, 0x9b,
+    0xca, 0x6c, 0x2b, 0x3c, 0x20, 0x2c, 0x0f, 0x5e, 0x5c, 0xe7, 0xe3, 0xa0, 0x87, 0x2a, 0xa6, 0x51, 0xbc, 0xb2, 0x9e,
+    0xad, 0xb3, 0x73, 0x7d, 0xee, 0x25, 0x9f, 0xd8, 0xd8, 0xf2, 0x83, 0xc4, 0x0f, 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x17,
+    0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xcc, 0x50, 0x69, 0xbc, 0xf3, 0x9e, 0x2b, 0x60, 0x42, 0xe2, 0x39, 0x64, 0x4c, 0x1b,
+    0xa0, 0xa0, 0xbd, 0x96, 0xc2, 0xad, 0x82, 0x29, 0x2c, 0x6a, 0x99, 0x60, 0xf3, 0x08, 0x7a, 0x6c, 0x70, 0x22, 0x35,
+    0x75, 0x5c, 0x2f, 0xdd, 0x54, 0xa7, 0x4a, 0x82, 0x49, 0x99, 0x05, 0xf1, 0x16, 0x7b, 0xf8, 0xe3, 0x9f, 0xa3, 0xfc,
+    0xd4, 0xfb, 0x7f, 0x8e, 0x73, 0x78, 0x9b, 0x3f, 0xa8, 0x36, 0xf6, 0xd2, 0x74, 0x39, 0x67, 0x63, 0xd2, 0x97, 0x9d,
+    0x17, 0x43, 0x29, 0x33, 0xf2, 0xea, 0x70, 0x7e, 0x59, 0xb6, 0x8f, 0x0f, 0x5f, 0x83, 0x1e, 0x1f, 0x38, 0xba, 0x78,
+    0x32, 0xd1, 0x8b, 0x2b, 0xf5, 0x8e, 0x66, 0xee, 0xe1, 0x2f, 0xcb, 0xef, 0xde, 0x3a, 0xdf, 0xc9, 0xc6, 0x91, 0x6e,
+    0xe4, 0x43, 0xa1, 0x94, 0xe4, 0x8c, 0xa9, 0x32, 0x5e, 0x31, 0xa3, 0x89, 0x17, 0x6d, 0x9e, 0xce, 0x75, 0x69, 0x97,
+    0x2d, 0x18, 0x1b, 0x83, 0xbd, 0xaa, 0x59, 0x2b, 0xbd, 0x0d, 0xd9, 0x1d, 0x93, 0x0a, 0xcf, 0xfa, 0xc7, 0x1a, 0x5a,
+    0x60, 0x44, 0x36, 0xae, 0x48, 0xe5, 0x6c, 0x95, 0x32, 0xa5, 0x21, 0xce, 0x81, 0xcf, 0x5c, 0xdd, 0xe5, 0x95, 0x5d,
+    0x3d, 0x34, 0x75, 0x65, 0x00, 0x1b, 0x47, 0x76, 0xbe, 0xa1, 0xbc, 0x87, 0xe9, 0x98, 0x9b, 0xc7, 0x66, 0xba, 0x46,
+    0x0f, 0x22, 0x58, 0x73, 0x38, 0x85, 0xb0, 0xf9, 0x5b, 0x85, 0xf4, 0x61, 0x13, 0xc4, 0x9a, 0x64, 0x52, 0xba, 0x90,
+    0xf1, 0x34, 0x2e, 0x84, 0x56, 0x9e, 0xe6, 0x08, 0x73, 0x9a, 0x46, 0x2c, 0x4d, 0x37, 0x42, 0x47, 0xae, 0xb0, 0xa9,
+    0x17, 0xb5, 0xcb, 0x93, 0x2f, 0xca, 0x4d, 0xc7, 0x04, 0x0a, 0x8c, 0xb3, 0xa9, 0x7e, 0x0b, 0xd1, 0xf9, 0xed, 0x9c,
+    0x9b, 0x6c, 0x24, 0xd3, 0x91, 0xce, 0xd5, 0xe9, 0x9b, 0xde, 0xdf, 0xeb, 0x7c, 0x50, 0x25, 0xb2, 0xd8, 0x38, 0xb4,
+    0x56, 0x09, 0xd5, 0xd5, 0x44, 0x31, 0xd8, 0x81, 0x18, 0x53, 0x05, 0x9f, 0xb1, 0xc9, 0x84, 0xf9, 0x59, 0x6a, 0x08,
+    0xc1, 0x8c, 0x0c, 0xa0, 0x0a, 0x8e, 0x33, 0x4f, 0x06, 0xfa, 0x8f, 0xe0, 0x46, 0x2e, 0xe2, 0x0c, 0xf1, 0x01, 0x89,
+    0x1b, 0x4a, 0x33, 0x98, 0xa8, 0xc7, 0x32, 0x88, 0xf8, 0x57, 0x20, 0x3f, 0x76, 0x43, 0x39, 0x0e, 0x8d, 0xe3, 0xfb,
+    0x62, 0x13, 0xc4, 0xd2, 0xb0, 0x63, 0x3b, 0xb6, 0xd9, 0x76, 0x56, 0xd7, 0xee, 0x77, 0x5d, 0xd7, 0xc9, 0x75, 0x13,
+    0xdc, 0x97, 0x3e, 0xed, 0x7b, 0xc2, 0xb1, 0x55, 0x07, 0x5a, 0x2d, 0xa3, 0xc7, 0xb4, 0x6b, 0xbb, 0xaf, 0x5c, 0xdd,
+    0x24, 0xab, 0x31, 0x05, 0x91, 0xf9, 0xf1, 0x1d, 0x4b, 0x3e, 0x7b, 0x2a, 0xe5, 0xce, 0xf7, 0x1b, 0xcf, 0x91, 0xeb,
+    0x00, 0xc6, 0xcd, 0xe2, 0xc5, 0x23, 0xa6, 0xd0, 0xd1, 0x4d, 0xdd, 0x0f, 0xe3, 0x94, 0xa9, 0x73, 0x20, 0x01, 0xc3,
+    0x67, 0x4e, 0xe2, 0xa7, 0xf7, 0x6f, 0x3f, 0x7c, 0xd0, 0x4d, 0x4c, 0x86, 0x99, 0xaa, 0xbd, 0xf3, 0x0d, 0xb5, 0x03,
+    0xd5, 0x37, 0xee, 0x3b, 0x22, 0x27, 0x74, 0x85, 0x2c, 0xef, 0x39, 0x2a, 0xab, 0x6d, 0x39, 0x4e, 0x66, 0xf8, 0x97,
+    0xe9, 0xde, 0xb7, 0xd7, 0xbc, 0x1a, 0x70, 0xc3, 0x76, 0x5a, 0x56, 0x2a, 0x99, 0x07, 0xd1, 0x6d, 0x43, 0xa9, 0xb7,
+    0x6a, 0x28, 0x85, 0x8b, 0x53, 0x0d, 0x57, 0x2d, 0xe3, 0xb9, 0x42, 0x8a, 0x21, 0x97, 0xf1, 0x2e, 0x70, 0x29, 0xd7,
+    0x97, 0xcf, 0x18, 0x34, 0x0f, 0x66, 0x5e, 0x1d, 0x75, 0x43, 0x31, 0xbf, 0x73, 0x48, 0xd8, 0xfa, 0x21, 0xd8, 0xbc,
+    0x31, 0x55, 0xe3, 0x55, 0x66, 0xd3, 0xa4, 0xc5, 0xaa, 0xd2, 0x09, 0xb1, 0x93, 0xb7, 0x19, 0x9b, 0x2f, 0x58, 0xe2,
+    0x65, 0xcb, 0x84, 0xdd, 0x86, 0xf1, 0xfd, 0x93, 0xc2, 0xa2, 0x7c, 0x47, 0xe5, 0x59, 0x30, 0x9d, 0xc9, 0xda, 0xe7,
+    0x2d, 0x36, 0x90, 0x0b, 0xb8, 0xf5, 0x03, 0xf9, 0x7f, 0x7e, 0xb7, 0xed, 0xff, 0xfc, 0xbe, 0xb3, 0x2a, 0x74, 0x9f,
+    0x0f, 0xcd, 0x6c, 0xb0, 0xc7, 0xbe, 0x68, 0xfe, 0x52, 0x19, 0xe6, 0xcd, 0x75, 0x6a, 0x8b, 0x00, 0xef, 0x6b, 0x4b,
+    0x50, 0x2b, 0x2c, 0xef, 0x9b, 0x47, 0x0d, 0x0c, 0xe6, 0xb5, 0x73, 0x64, 0x50, 0xe9, 0xb3, 0x86, 0x36, 0x34, 0x7a,
+    0x7b, 0xad, 0xc8, 0x1f, 0x87, 0xf0, 0xae, 0x39, 0x7c, 0xe6, 0xf0, 0xb9, 0x14, 0xf0, 0xf5, 0x70, 0x28, 0xd3, 0xab,
+    0xa9, 0x4d, 0xc1, 0xca, 0xfd, 0xbc, 0x56, 0xc2, 0x89, 0x67, 0xcf, 0x31, 0xc8, 0xfd, 0x7c, 0xf0, 0x7a, 0x88, 0xf6,
+    0x58, 0xa7, 0xa3, 0xa4, 0x60, 0x56, 0x36, 0xa2, 0x36, 0xb2, 0xa7, 0xae, 0x75, 0x5a, 0xc3, 0x6b, 0x50, 0x8a, 0x39,
+    0xb7, 0xf2, 0xa1, 0x61, 0xbe, 0x1e, 0x72, 0x31, 0x0e, 0x37, 0x01, 0xed, 0x55, 0xb7, 0x36, 0x17, 0x82, 0x96, 0x80,
+    0x6e, 0x6a, 0xa4, 0x5b, 0xc1, 0xca, 0xac, 0x90, 0x9a, 0xa1, 0xf0, 0x1c, 0x6e, 0xf0, 0xc3, 0x1c, 0x53, 0x7e, 0xbc,
+    0xdb, 0x64, 0x26, 0xf5, 0xd3, 0x6e, 0x33, 0xa9, 0xab, 0xbd, 0xcc, 0xa4, 0x7e, 0xfa, 0xe2, 0x66, 0x52, 0xef, 0x54,
+    0x33, 0x29, 0x58, 0xc4, 0xb7, 0x6c, 0x2f, 0xdb, 0x25, 0x61, 0x11, 0x11, 0xdf, 0xa7, 0x03, 0x97, 0xf3, 0xaf, 0xa9,
+    0x3f, 0x63, 0x70, 0x27, 0xe7, 0xab, 0x12, 0xc6, 0x53, 0xb0, 0x63, 0xfa, 0xf3, 0x2d, 0x8e, 0xc2, 0x78, 0xaa, 0xda,
+    0x1b, 0x45, 0x3c, 0xe8, 0x69, 0x11, 0xc8, 0x88, 0x6c, 0x7c, 0x1c, 0x53, 0x84, 0x3d, 0xb2, 0x0e, 0x0d, 0x25, 0xb1,
+    0xb3, 0x34, 0xe0, 0x6a, 0x0b, 0x2b, 0xa0, 0x1e, 0x1a, 0x10, 0xc9, 0x86, 0xed, 0x97, 0x22, 0xbc, 0x83, 0xda, 0x83,
+    0x34, 0x94, 0xa5, 0x50, 0x09, 0x6b, 0xfd, 0x97, 0x95, 0xfb, 0xed, 0xb5, 0xdb, 0xef, 0xb8, 0xe0, 0x9f, 0x0c, 0x37,
+    0x3a, 0x2c, 0x70, 0xfa, 0x9d, 0x0e, 0x14, 0xdc, 0x2b, 0x05, 0x6d, 0x28, 0x08, 0x94, 0x82, 0x2e, 0x14, 0xf8, 0x4a,
+    0xc1, 0x11, 0x14, 0x8c, 0x95, 0x82, 0x63, 0x28, 0xb8, 0xd3, 0xf3, 0xeb, 0x48, 0x0e, 0xf7, 0xd8, 0xb8, 0x31, 0xe9,
+    0x06, 0x21, 0xca, 0x8e, 0x4d, 0x17, 0x0c, 0x87, 0xbc, 0x69, 0x2f, 0x36, 0x49, 0x98, 0xd7, 0x4b, 0xcc, 0xfb, 0x19,
+    0xa3, 0x58, 0xc9, 0x6f, 0x90, 0xe6, 0xd8, 0x59, 0x0c, 0xa6, 0xc3, 0x22, 0x06, 0x81, 0x80, 0x83, 0xa6, 0x1b, 0x20,
+    0xa0, 0xe9, 0xcb, 0x95, 0x13, 0x71, 0x1c, 0x94, 0xb5, 0x2c, 0xde, 0xd1, 0xe7, 0x2c, 0xb9, 0x05, 0x0a, 0x6b, 0x8e,
+    0x96, 0x2a, 0x04, 0xfc, 0x12, 0x3a, 0xfd, 0x37, 0x6c, 0xb4, 0x9c, 0x6a, 0x97, 0xf1, 0x74, 0xa7, 0x7a, 0x5e, 0x7d,
+    0x05, 0xa3, 0xd4, 0x49, 0xd9, 0x61, 0x89, 0x6d, 0xc9, 0xbf, 0x45, 0x8f, 0x79, 0xb9, 0x7e, 0x06, 0x63, 0xd3, 0x32,
+    0x32, 0x0e, 0x81, 0xef, 0x00, 0x8c, 0x14, 0xfd, 0xf8, 0x25, 0xc0, 0x59, 0x79, 0xbe, 0xf2, 0x94, 0xf1, 0x9c, 0xfd,
+    0xc0, 0xd2, 0xd4, 0x9b, 0x8a, 0xfa, 0xf5, 0x71, 0x82, 0x41, 0x8c, 0xbc, 0x7f, 0x21, 0x00, 0x41, 0x72, 0x16, 0xd4,
+    0xec, 0x1e, 0x92, 0xf8, 0x5e, 0x03, 0xcb, 0x1a, 0xd8, 0x50, 0x85, 0x0d, 0x40, 0x60, 0xc3, 0x12, 0x96, 0xb5, 0xf5,
+    0x70, 0xf8, 0xef, 0x58, 0x58, 0x2d, 0xcc, 0xbc, 0x69, 0xb5, 0x88, 0xf6, 0x41, 0xae, 0x8e, 0x4d, 0x2a, 0xcb, 0x4b,
+    0x85, 0x9f, 0xa3, 0xfd, 0x0d, 0xe3, 0xe9, 0x9f, 0xaa, 0xfa, 0xdd, 0xa2, 0xb2, 0xff, 0x10, 0x99, 0x41, 0x36, 0xb4,
+    0x11, 0xc6, 0x9a, 0x0d, 0x20, 0xec, 0x45, 0xd9, 0xcc, 0x42, 0xef, 0xaa, 0x56, 0x3b, 0x32, 0x4c, 0x1b, 0xd7, 0x76,
+    0x5d, 0xf5, 0x29, 0xed, 0x25, 0xd3, 0x91, 0xd7, 0x72, 0xdb, 0xc7, 0xa6, 0xf8, 0xb3, 0x9d, 0xae, 0x91, 0x63, 0x0f,
+    0xda, 0x38, 0xb8, 0x5b, 0x4f, 0xe2, 0x28, 0xb3, 0x26, 0xde, 0x3c, 0x08, 0x1f, 0x7a, 0xf3, 0x38, 0x8a, 0xd3, 0x85,
+    0xe7, 0xb3, 0x3e, 0x79, 0xd0, 0x81, 0x2b, 0x69, 0x1f, 0xa3, 0x15, 0x70, 0x87, 0x39, 0xd7, 0x6e, 0x27, 0x6c, 0x4e,
+    0xad, 0x65, 0x30, 0x82, 0x49, 0xc8, 0x56, 0x39, 0xff, 0x7c, 0xa9, 0x32, 0x55, 0xc5, 0x2d, 0x47, 0x2d, 0x80, 0x23,
+    0xe5, 0x91, 0x0e, 0x20, 0xbe, 0x4f, 0x7f, 0xe1, 0x8d, 0x31, 0x38, 0x9f, 0xdd, 0xee, 0x26, 0x6c, 0xae, 0xd9, 0xdd,
+    0x8d, 0x9d, 0x27, 0xf1, 0xfd, 0x19, 0x8c, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0x27, 0xf8, 0xc6, 0x42, 0xe7, 0x0a, 0xd1,
+    0x8f, 0x85, 0x17, 0x71, 0xe8, 0x8d, 0xcd, 0xfb, 0xf0, 0xba, 0xd7, 0xd6, 0x9c, 0xfe, 0x3c, 0x88, 0x2c, 0x9a, 0xce,
+    0xb1, 0xb3, 0x50, 0xfa, 0x52, 0xe1, 0x67, 0xac, 0xb1, 0xba, 0xab, 0x39, 0x7d, 0xb8, 0xac, 0x4d, 0xc2, 0xf8, 0xbe,
+    0x37, 0x0b, 0xc6, 0x63, 0x16, 0xf5, 0x71, 0xcc, 0xb2, 0x90, 0x85, 0x61, 0xb0, 0x48, 0x83, 0xb4, 0x3f, 0xf7, 0x56,
+    0xbc, 0xd7, 0xc3, 0x4d, 0xbd, 0x76, 0x78, 0xaf, 0x9d, 0xbd, 0x7b, 0x55, 0xba, 0x01, 0x47, 0x0e, 0xea, 0x87, 0x0f,
+    0xad, 0xab, 0x39, 0x95, 0x79, 0xee, 0xdd, 0xeb, 0x22, 0x61, 0xeb, 0xb9, 0x97, 0x4c, 0x83, 0xa8, 0xe7, 0xe4, 0xf6,
+    0xdd, 0x9a, 0x36, 0xc6, 0xd3, 0x93, 0x93, 0x93, 0xdc, 0x1e, 0x8b, 0x27, 0x67, 0x3c, 0xce, 0x6d, 0x5f, 0x3c, 0x4d,
+    0x26, 0x8e, 0x33, 0x99, 0xe4, 0x76, 0x20, 0x0a, 0x3a, 0x6d, 0x7f, 0xdc, 0x69, 0xe7, 0xf6, 0xbd, 0x52, 0x23, 0xb7,
+    0x19, 0x7f, 0x4a, 0xd8, 0xb8, 0x8f, 0x1b, 0xe9, 0x9e, 0x96, 0xfe, 0xd8, 0x71, 0x72, 0xc4, 0x00, 0xd7, 0x25, 0xdc,
+    0x84, 0x82, 0x9d, 0x9b, 0xf5, 0xde, 0x35, 0xb5, 0xe2, 0x73, 0xbe, 0xdf, 0x58, 0x6f, 0xec, 0x25, 0x9f, 0x6e, 0x34,
+    0x65, 0x16, 0x9e, 0x47, 0xd5, 0xd6, 0x02, 0x0c, 0xd6, 0xaa, 0x07, 0x51, 0xab, 0xfa, 0xa3, 0x38, 0x81, 0x33, 0x9b,
+    0x78, 0xe3, 0x60, 0x99, 0xf6, 0xdc, 0xf6, 0x62, 0x25, 0x8a, 0xf8, 0x5e, 0x2f, 0x0a, 0xf0, 0xec, 0xf5, 0xd2, 0x38,
+    0x0c, 0xc6, 0xa2, 0x68, 0xd3, 0x59, 0x72, 0xdb, 0x46, 0x1f, 0x7d, 0xb6, 0x03, 0x8c, 0x3c, 0xe0, 0x85, 0xa1, 0x66,
+    0x77, 0x52, 0x8d, 0x79, 0x29, 0xca, 0x73, 0x35, 0x27, 0x25, 0xb8, 0xa0, 0x7f, 0xb6, 0x7b, 0xb8, 0x58, 0xc9, 0x3d,
+    0xef, 0x1e, 0x2d, 0x56, 0xf9, 0xd7, 0x73, 0x36, 0x0e, 0x3c, 0xad, 0x55, 0xec, 0x26, 0xd7, 0x01, 0x99, 0xaf, 0xb1,
+    0xde, 0xb0, 0x4d, 0xc5, 0xb1, 0x80, 0xe8, 0x7e, 0x4f, 0x82, 0xf9, 0x22, 0x4e, 0x32, 0x2f, 0xca, 0xf2, 0x7c, 0x78,
+    0x93, 0xe7, 0xfd, 0xab, 0xa0, 0x75, 0xfd, 0xcf, 0x16, 0xd1, 0x69, 0xd2, 0x91, 0xe4, 0xc6, 0x8d, 0xf9, 0x96, 0xa9,
+    0xf6, 0x18, 0x40, 0xc6, 0xd0, 0x16, 0x43, 0xad, 0x4c, 0x54, 0xb2, 0x5e, 0x99, 0x80, 0x2c, 0xab, 0x93, 0x7d, 0x47,
+    0xb9, 0x0a, 0x52, 0x20, 0xa8, 0xf0, 0x96, 0x0d, 0xae, 0x14, 0xdb, 0x0e, 0x60, 0x56, 0xb0, 0x32, 0x99, 0xd6, 0x3f,
+    0xdb, 0xc4, 0x33, 0x7e, 0xb3, 0x9b, 0x67, 0xfc, 0x39, 0xdb, 0x87, 0x67, 0xfc, 0xe6, 0x8b, 0xf3, 0x8c, 0xcf, 0xea,
+    0xa6, 0xf5, 0x17, 0xf1, 0x40, 0x97, 0x12, 0x7d, 0x20, 0x4d, 0x09, 0x05, 0xad, 0xb9, 0xf8, 0xc3, 0x96, 0xf0, 0xa2,
+    0x37, 0x4a, 0xc3, 0x46, 0x94, 0x1b, 0x84, 0xaf, 0xef, 0xa2, 0xc1, 0x3f, 0x12, 0xf5, 0x79, 0x32, 0x19, 0xbc, 0x89,
+    0x95, 0x02, 0xf9, 0xc4, 0x4d, 0x1d, 0x4a, 0x01, 0x06, 0xe8, 0x8d, 0xb0, 0x70, 0xc4, 0x14, 0x0c, 0xe0, 0x9f, 0x4c,
+    0x16, 0xbd, 0x63, 0x69, 0xd9, 0xd5, 0x2f, 0x0f, 0xa1, 0x25, 0xcd, 0x29, 0x85, 0x17, 0x4a, 0x4d, 0x94, 0x38, 0x65,
+    0x19, 0x77, 0x1b, 0xfd, 0xf6, 0xe1, 0x62, 0xdc, 0xba, 0x88, 0x8d, 0x3c, 0x48, 0xdf, 0x55, 0x7d, 0x40, 0xb8, 0xae,
+    0x65, 0xa0, 0x4e, 0x27, 0xe7, 0xd6, 0x59, 0x6a, 0x8e, 0x65, 0x78, 0x4d, 0xcd, 0xcf, 0x4b, 0x33, 0xed, 0xa9, 0x0d,
+    0x79, 0xae, 0xa7, 0x1a, 0x31, 0xe6, 0x06, 0xf8, 0x6b, 0xce, 0x01, 0x62, 0xfa, 0x2a, 0x74, 0x9d, 0x1d, 0x53, 0xf3,
+    0x60, 0x9c, 0xe7, 0x46, 0x5f, 0x00, 0x42, 0x21, 0xb4, 0x6c, 0x17, 0x13, 0x97, 0xde, 0x4b, 0x0b, 0x02, 0xae, 0x91,
+    0x23, 0x75, 0xdb, 0x05, 0xa8, 0xaf, 0xb9, 0x72, 0x8e, 0xc3, 0x4c, 0xd7, 0x08, 0x7c, 0x64, 0xd6, 0xa0, 0x4c, 0x08,
+    0xd4, 0xfa, 0x12, 0xfe, 0xe2, 0x95, 0x28, 0xa8, 0xdb, 0x47, 0x12, 0x70, 0x50, 0xff, 0x0e, 0x8e, 0xee, 0x44, 0xfe,
+    0xb9, 0x0e, 0xb0, 0xc7, 0xeb, 0xe0, 0x43, 0xae, 0x4b, 0xde, 0x0f, 0xb7, 0xdf, 0xd9, 0xe9, 0x01, 0x34, 0x38, 0xab,
+    0xa8, 0xe9, 0x77, 0x58, 0xff, 0x01, 0x2b, 0x91, 0xde, 0x9b, 0x76, 0x7a, 0xaf, 0xbd, 0x58, 0x8b, 0x20, 0x11, 0x99,
+    0xb7, 0xb0, 0xe0, 0x8a, 0x8f, 0xb8, 0x97, 0x63, 0x3c, 0x25, 0x1e, 0x45, 0x7f, 0x99, 0x02, 0x6e, 0xc4, 0x8b, 0x2a,
+    0xe2, 0x9f, 0xbe, 0xbf, 0x4c, 0xd2, 0x38, 0xe9, 0x2d, 0xe2, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0xae, 0x11, 0x3e,
+    0x02, 0x3c, 0x37, 0xeb, 0x78, 0xe1, 0xf9, 0x41, 0xf6, 0xd0, 0x73, 0x38, 0x4b, 0xe1, 0xf4, 0x39, 0x77, 0xe0, 0x34,
+    0xd6, 0xef, 0x71, 0x68, 0xbe, 0x44, 0xc6, 0x2f, 0xa9, 0xb3, 0x33, 0xea, 0x36, 0xef, 0x2b, 0x6f, 0x29, 0x4c, 0x06,
+    0xb0, 0x1f, 0x5e, 0x62, 0x4d, 0x01, 0xcb, 0xc3, 0x52, 0x3b, 0x63, 0x36, 0x35, 0x11, 0x6b, 0x83, 0x5c, 0x5e, 0xfc,
+    0xd9, 0x5d, 0x43, 0x73, 0x9a, 0x8b, 0x81, 0xe3, 0x31, 0xf6, 0x19, 0x59, 0xcf, 0x83, 0xa4, 0x52, 0xe6, 0x3e, 0x35,
+    0x47, 0x6c, 0x12, 0x27, 0x8c, 0x42, 0xaa, 0xba, 0x27, 0x8b, 0xd5, 0xfe, 0xdd, 0x6f, 0x9f, 0x7e, 0x73, 0x3f, 0x51,
+    0x9c, 0xb5, 0x44, 0x67, 0xc6, 0x8e, 0xde, 0xea, 0xf4, 0x0c, 0x58, 0x43, 0x82, 0xbc, 0x4f, 0xd1, 0xab, 0x7a, 0xba,
+    0xde, 0x6f, 0x8c, 0x5c, 0xb5, 0x88, 0x39, 0xcd, 0x4b, 0x58, 0xe8, 0x65, 0xc1, 0x9d, 0xe0, 0x19, 0x3b, 0x47, 0x8b,
+    0x95, 0x58, 0x63, 0x24, 0x78, 0x8f, 0x58, 0xa4, 0xca, 0x50, 0xc4, 0x22, 0x55, 0x8b, 0x71, 0x91, 0xfa, 0xb5, 0xd9,
+    0x88, 0x60, 0x0e, 0x15, 0x4a, 0xdf, 0x5d, 0xac, 0x54, 0x12, 0x5d, 0x34, 0x93, 0x94, 0xba, 0x1a, 0x85, 0x6b, 0x1e,
+    0x8c, 0xc7, 0x21, 0xcb, 0x4b, 0x0b, 0x5d, 0x5e, 0x4b, 0x05, 0x38, 0x12, 0x0e, 0xde, 0x28, 0x8d, 0xc3, 0x65, 0xc6,
+    0x9a, 0xc1, 0x45, 0xc0, 0x69, 0x3b, 0x05, 0x70, 0xf0, 0x77, 0x79, 0xac, 0x5d, 0x60, 0xb7, 0x61, 0x9b, 0x38, 0x7d,
+    0x08, 0xba, 0x6b, 0x75, 0xca, 0x43, 0x87, 0x57, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0x20, 0x4b, 0x84, 0xbd, 0x35,
+    0xdb, 0xe5, 0x65, 0x32, 0xf0, 0xa8, 0x2c, 0xca, 0xcb, 0x93, 0xf9, 0x73, 0xce, 0xd8, 0xab, 0xe6, 0x33, 0xf6, 0x4a,
+    0x9c, 0xb1, 0xed, 0x3b, 0xf3, 0xe9, 0xc4, 0x85, 0xff, 0xfa, 0xc5, 0x84, 0x7a, 0x8e, 0xd6, 0x59, 0xac, 0x34, 0x77,
+    0xb1, 0xd2, 0xac, 0xf6, 0x62, 0xa5, 0x61, 0xd7, 0x68, 0x7f, 0x61, 0xda, 0x6d, 0xc3, 0x74, 0x34, 0x28, 0x84, 0x3f,
+    0xa7, 0xf4, 0xca, 0x3d, 0x84, 0x77, 0xd0, 0xaa, 0x5b, 0x7f, 0xd7, 0xde, 0x7e, 0xd4, 0xe9, 0x2c, 0x09, 0xa4, 0x6d,
+    0xd8, 0x99, 0x37, 0x1a, 0xb1, 0x71, 0x6f, 0x12, 0xfb, 0xcb, 0xf4, 0xdf, 0x7c, 0xfc, 0x1c, 0x88, 0x5b, 0x11, 0x41,
+    0xa5, 0x1f, 0xd1, 0x14, 0x14, 0x25, 0x77, 0x4c, 0xf4, 0xb0, 0x96, 0xeb, 0xd4, 0xa3, 0x08, 0xc1, 0x6d, 0xfb, 0xb0,
+    0x61, 0x93, 0x37, 0x03, 0xfa, 0x4f, 0x5b, 0xa5, 0xcd, 0x28, 0xe6, 0x33, 0xc0, 0xb2, 0x15, 0x1c, 0x8f, 0x87, 0x06,
+    0x5f, 0x4d, 0xe7, 0xa4, 0x79, 0xb8, 0xd7, 0xe2, 0x4b, 0x37, 0x82, 0xa8, 0x70, 0xba, 0xc5, 0x9d, 0x3e, 0xb6, 0xf7,
+    0xba, 0x69, 0x8f, 0xd4, 0x7a, 0xdd, 0x42, 0x10, 0x8a, 0xba, 0x7b, 0x62, 0xf9, 0xa7, 0xaf, 0x0e, 0xe1, 0x3f, 0xe2,
+    0xea, 0x7f, 0xce, 0x9a, 0x18, 0xf5, 0x8b, 0xb2, 0x95, 0x35, 0xb1, 0x4a, 0xc8, 0x88, 0xef, 0x5f, 0x7f, 0x32, 0x79,
+    0x5c, 0x83, 0xbd, 0x6b, 0x93, 0xe9, 0x52, 0xb5, 0xf6, 0xb7, 0x71, 0x0c, 0xd9, 0x2b, 0xeb, 0xd5, 0x05, 0x78, 0xc8,
+    0x90, 0x3c, 0x1b, 0x40, 0x23, 0x71, 0x8f, 0x20, 0x2d, 0xbe, 0x8e, 0x6d, 0xe8, 0x2a, 0xf1, 0x76, 0xd3, 0x55, 0xe2,
+    0xcd, 0xee, 0xab, 0xc4, 0xf7, 0x7b, 0x5d, 0x25, 0xde, 0x7c, 0xf1, 0xab, 0xc4, 0xdb, 0xfa, 0x55, 0xe2, 0x2a, 0x16,
+    0xd6, 0xaa, 0xe6, 0xc5, 0x92, 0xff, 0xfc, 0x48, 0x4a, 0xb9, 0xcb, 0x78, 0xd0, 0x75, 0x28, 0xea, 0xef, 0xd5, 0x1f,
+    0xbe, 0x58, 0xe0, 0x46, 0x7c, 0x8f, 0xe6, 0x5b, 0xc5, 0xd5, 0x82, 0x63, 0x76, 0xfc, 0x8e, 0x52, 0x1c, 0xc6, 0xd1,
+    0xf4, 0x27, 0x50, 0xca, 0x82, 0x38, 0x30, 0x51, 0x5e, 0x04, 0xe9, 0x4f, 0xf1, 0x62, 0xb9, 0xb8, 0x80, 0xbe, 0x3e,
+    0x06, 0x69, 0x30, 0x0a, 0x99, 0x74, 0xc6, 0x25, 0x73, 0x33, 0x2e, 0x13, 0x07, 0xfb, 0x4e, 0xf1, 0xd3, 0x5b, 0x89,
+    0x9f, 0x68, 0x01, 0xca, 0x7f, 0x93, 0x1d, 0x9b, 0xde, 0x7c, 0x11, 0x11, 0x4a, 0x40, 0x65, 0xd0, 0x8f, 0xbf, 0x8c,
+    0x5c, 0xc5, 0x46, 0xc3, 0x2c, 0x85, 0xbd, 0xc3, 0xc6, 0x7e, 0x58, 0xed, 0x52, 0xb3, 0x34, 0x4c, 0x19, 0x85, 0xaa,
+    0x2e, 0x86, 0x9f, 0xc7, 0xcb, 0x94, 0x8d, 0xe3, 0xfb, 0x48, 0x37, 0x23, 0x69, 0xc0, 0x0f, 0x1a, 0x4e, 0xd9, 0x06,
+    0xf3, 0x27, 0x7e, 0x40, 0x46, 0x39, 0x4e, 0x5a, 0x3a, 0xa4, 0xef, 0x5c, 0x2e, 0x2c, 0x52, 0x35, 0x5b, 0x38, 0x45,
+    0x5d, 0x26, 0xfa, 0x79, 0xd2, 0x6a, 0xc5, 0x83, 0xc7, 0xb5, 0x14, 0xa6, 0x1a, 0xb1, 0xcd, 0xa5, 0xc2, 0x69, 0x2b,
+    0x12, 0xc2, 0x45, 0x11, 0x0a, 0xa2, 0x61, 0xe1, 0xf8, 0x1b, 0x72, 0x0b, 0x2d, 0xde, 0x42, 0x20, 0x8d, 0x7c, 0xc9,
+    0xd7, 0x83, 0x07, 0x46, 0xa0, 0xc7, 0xd7, 0x0a, 0x18, 0xdf, 0xdd, 0xb1, 0x24, 0xf4, 0x1e, 0x5a, 0x46, 0x1e, 0x47,
+    0x3f, 0x00, 0x00, 0xde, 0xc4, 0xf7, 0x91, 0x5a, 0x01, 0xf3, 0x95, 0x34, 0xec, 0xa5, 0xc6, 0x10, 0x1e, 0xe0, 0x14,
+    0xa2, 0x8c, 0x00, 0x32, 0xc5, 0x4e, 0xd9, 0x3f, 0x4c, 0xfa, 0xf7, 0x9f, 0x46, 0x6e, 0x5e, 0xc6, 0xf2, 0x43, 0x7f,
+    0x5f, 0xec, 0xf1, 0x99, 0xe7, 0xcf, 0x9f, 0x6c, 0x9e, 0x76, 0x39, 0x43, 0x79, 0x43, 0x6b, 0x63, 0xe3, 0x29, 0x80,
+    0x51, 0x5c, 0xc5, 0x4b, 0x7f, 0x86, 0x86, 0xa5, 0x5f, 0x6e, 0xbe, 0x19, 0xf4, 0x89, 0x89, 0x3a, 0xe5, 0xd4, 0x2b,
+    0x45, 0x05, 0x14, 0xf0, 0xfb, 0x6f, 0x21, 0x06, 0xe5, 0xff, 0x11, 0x0c, 0xf5, 0x5d, 0xc3, 0x6f, 0xf1, 0xc1, 0xe3,
+    0x36, 0x6f, 0x1f, 0xf2, 0x49, 0xf2, 0xe8, 0x0e, 0x42, 0xb9, 0xd6, 0x8c, 0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0x48, 0x6a,
+    0x9b, 0x82, 0xc4, 0x89, 0xaf, 0x30, 0x9b, 0xae, 0xe9, 0xdc, 0xac, 0xdf, 0x64, 0x1c, 0x5b, 0x55, 0x90, 0x0c, 0x37,
+    0x79, 0x60, 0x88, 0xbe, 0xaa, 0xef, 0xe6, 0x41, 0x64, 0x62, 0x20, 0xf4, 0xfa, 0x1b, 0x6f, 0x05, 0xa1, 0x80, 0x01,
+    0xb9, 0x55, 0x5f, 0x41, 0xa1, 0xa9, 0xfa, 0xa4, 0x41, 0xb6, 0x23, 0xbd, 0x11, 0x12, 0x42, 0x8b, 0x37, 0xfc, 0x8b,
+    0xa6, 0x69, 0x9a, 0xbc, 0x46, 0x68, 0xf2, 0x1e, 0x81, 0xe5, 0x78, 0x1d, 0x00, 0x6d, 0x49, 0xbe, 0x58, 0x51, 0x09,
+    0xdc, 0x0c, 0x50, 0x27, 0x2b, 0x0a, 0x78, 0xb4, 0xbb, 0xae, 0x23, 0x0a, 0xc4, 0x85, 0x1e, 0x22, 0x95, 0x79, 0x09,
+    0x04, 0xc5, 0xed, 0x69, 0x78, 0x61, 0xc7, 0xb7, 0x5c, 0x12, 0xac, 0x39, 0xf4, 0x38, 0xec, 0xb3, 0xe6, 0xb0, 0x68,
+    0x91, 0x82, 0x05, 0x41, 0xeb, 0x50, 0x89, 0x72, 0x6c, 0xb2, 0x06, 0xdc, 0x88, 0xf7, 0xa2, 0x55, 0x36, 0x67, 0xd1,
+    0x52, 0xc7, 0xb4, 0x48, 0x18, 0xa6, 0x0e, 0xea, 0xbc, 0x21, 0x66, 0x0b, 0xb0, 0x4d, 0x73, 0xcb, 0x19, 0xd1, 0xc2,
+    0x94, 0xa3, 0x54, 0xcf, 0xf4, 0xb9, 0x62, 0x33, 0xe5, 0xb8, 0xad, 0x4a, 0x21, 0xf8, 0x92, 0xc6, 0x55, 0x27, 0x29,
+    0xb2, 0x3c, 0x86, 0x3e, 0x28, 0x40, 0x04, 0x17, 0x17, 0x09, 0xb0, 0xb7, 0xbc, 0xea, 0xa2, 0x49, 0x8d, 0x8c, 0x57,
+    0x11, 0x14, 0x25, 0x46, 0xbd, 0x1b, 0x3e, 0x4e, 0x88, 0xcd, 0xb3, 0xb1, 0x1f, 0xbf, 0xd6, 0xcf, 0x86, 0x49, 0x7f,
+    0x62, 0x0f, 0x44, 0x48, 0x08, 0x54, 0x9f, 0xd8, 0x03, 0xd8, 0xfe, 0xbd, 0x05, 0x69, 0x8a, 0xbe, 0x05, 0x5d, 0x9b,
+    0x10, 0xed, 0xde, 0x87, 0x78, 0x4d, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x48, 0x6c, 0x2c, 0x0e,
+    0x31, 0x37, 0xa9, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x0b, 0xd7, 0x71, 0x0e, 0x6a, 0xf5, 0x41, 0x90,
+    0xdd, 0x54, 0xdb, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x0b, 0xbb, 0xdd, 0xaf, 0xd1, 0x68, 0x25, 0x9c, 0xe2, 0x10,
+    0xc5, 0x5f, 0x67, 0xcf, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x26, 0xea, 0x38, 0xb6, 0x9c, 0xcb, 0xbf, 0x86, 0x75,
+    0xd2, 0x4f, 0xc1, 0x1c, 0x29, 0xb5, 0xc7, 0x10, 0x02, 0x02, 0xb7, 0xe0, 0x18, 0xfd, 0x55, 0x7b, 0xa9, 0xb5, 0xe8,
+    0xf8, 0x18, 0xc6, 0x50, 0x66, 0x8c, 0x16, 0x1e, 0x5c, 0x6a, 0x07, 0x95, 0x2f, 0xa6, 0x55, 0x0c, 0xc7, 0x43, 0x8f,
+    0xb2, 0x42, 0xa3, 0xb7, 0x95, 0x5b, 0xc0, 0xfe, 0x37, 0x90, 0x4f, 0x7b, 0x04, 0x3e, 0xff, 0x50, 0x03, 0xc2, 0x87,
+    0xef, 0xec, 0x70, 0xb9, 0x28, 0x77, 0x57, 0x26, 0x92, 0xfb, 0x77, 0x86, 0x44, 0x07, 0x75, 0x68, 0xb2, 0xbf, 0x66,
+    0x72, 0xf7, 0xc8, 0x2e, 0x59, 0x34, 0x2e, 0x77, 0x58, 0xa1, 0x5f, 0xfb, 0x77, 0x57, 0xc2, 0x28, 0x10, 0x57, 0x3f,
+    0x6e, 0xc0, 0x28, 0x79, 0x1c, 0xe1, 0xe6, 0xa7, 0xe3, 0x16, 0xec, 0xc5, 0xc5, 0x60, 0x03, 0x0a, 0x8a, 0x25, 0x9b,
+    0x29, 0x42, 0x71, 0x08, 0xde, 0x8c, 0x2e, 0xb7, 0x2d, 0xc1, 0x88, 0x6e, 0xdc, 0x89, 0x99, 0xb0, 0x29, 0x2c, 0xda,
+    0x04, 0x3c, 0x1c, 0xe3, 0xbe, 0x52, 0xeb, 0x60, 0xb7, 0xd4, 0x3a, 0xdb, 0x25, 0xb5, 0x26, 0xef, 0xa5, 0xfb, 0xc4,
+    0x5b, 0x28, 0xfe, 0x6f, 0x82, 0x39, 0x57, 0xdd, 0xe0, 0x4a, 0xa2, 0x6e, 0x74, 0x76, 0x12, 0xad, 0x6a, 0xbd, 0x91,
+    0x95, 0x20, 0x8a, 0xbf, 0x95, 0x0b, 0x8a, 0x50, 0xa8, 0xab, 0xb2, 0xf1, 0xab, 0x42, 0x36, 0x4e, 0xb7, 0x9a, 0xc2,
+    0x71, 0x45, 0x70, 0xff, 0x8a, 0x4b, 0x98, 0xbc, 0x1d, 0x14, 0xae, 0x61, 0xc5, 0x48, 0x15, 0x6f, 0xa7, 0xe2, 0xa2,
+    0xa1, 0xb8, 0xd0, 0x89, 0x5b, 0x46, 0xd9, 0x93, 0xae, 0x5c, 0xb5, 0x70, 0xa9, 0x2b, 0xca, 0x41, 0xea, 0x8e, 0x43,
+    0x96, 0xc5, 0xea, 0xb6, 0x29, 0xbb, 0xbb, 0xa8, 0xaf, 0x95, 0x4d, 0x22, 0xfd, 0x52, 0x08, 0xc0, 0x42, 0x4c, 0x5f,
+    0xd1, 0x6b, 0x4b, 0x1b, 0x08, 0x1c, 0x64, 0x83, 0x13, 0xdd, 0x6e, 0xe9, 0x3c, 0xa5, 0x0c, 0x28, 0xb4, 0xf0, 0xaa,
+    0x0c, 0x02, 0xe1, 0x7b, 0xb3, 0x6e, 0xa0, 0xf2, 0x48, 0xe4, 0x39, 0x7d, 0x07, 0xf1, 0xa2, 0xe6, 0xa8, 0x8a, 0x7c,
+    0x3c, 0x99, 0x16, 0x99, 0xe7, 0x62, 0xd5, 0x7a, 0xa7, 0x24, 0xc4, 0x59, 0x73, 0x4f, 0x94, 0xb2, 0x8c, 0x9e, 0xd7,
+    0xe8, 0x89, 0xef, 0xf2, 0xad, 0x93, 0x2c, 0x23, 0x0c, 0xef, 0x6e, 0x65, 0x89, 0xe7, 0x7f, 0x52, 0x86, 0x2c, 0xe4,
+    0x9c, 0x20, 0x03, 0x2e, 0x6b, 0x0a, 0xfa, 0x1e, 0x46, 0x43, 0x64, 0x3d, 0xbb, 0x9d, 0x2a, 0xd2, 0x97, 0xde, 0x53,
+    0xa7, 0xe3, 0xbd, 0x9a, 0x1c, 0x56, 0x84, 0xa2, 0xed, 0x6e, 0x59, 0x64, 0xbe, 0x61, 0x1c, 0xd9, 0x6c, 0x39, 0x1f,
+    0xad, 0x55, 0xd9, 0xaa, 0x22, 0x72, 0xad, 0x8b, 0x59, 0xd5, 0xcf, 0x4e, 0x26, 0x93, 0xb2, 0xa0, 0xd1, 0xd1, 0x0e,
+    0x51, 0x58, 0xf8, 0xd4, 0x71, 0x9c, 0xea, 0xd8, 0xb7, 0x83, 0xdd, 0x42, 0xb9, 0xed, 0x49, 0xe3, 0x88, 0x11, 0xb6,
+    0xbb, 0xe0, 0x57, 0x07, 0x47, 0x6e, 0x17, 0x27, 0xbb, 0x64, 0x16, 0xd1, 0x27, 0x63, 0x88, 0x20, 0x63, 0xf3, 0xb4,
+    0xe7, 0x33, 0xd4, 0xc1, 0xd8, 0xca, 0x81, 0x46, 0xc3, 0x01, 0x6b, 0x0a, 0xa6, 0x22, 0xae, 0xd8, 0x15, 0x8e, 0x86,
+    0xf2, 0xf0, 0x9a, 0xf0, 0x5e, 0x7c, 0x04, 0x0f, 0xca, 0xba, 0x2e, 0xd3, 0xc6, 0x69, 0x75, 0x9d, 0xbf, 0x96, 0xea,
+    0x69, 0x40, 0x00, 0xd7, 0x42, 0xa1, 0x4d, 0xf2, 0x59, 0xfc, 0x7f, 0x29, 0xff, 0x7f, 0xb5, 0x58, 0x95, 0xed, 0x47,
+    0x4e, 0x40, 0xa2, 0x5d, 0x9c, 0x16, 0x1a, 0x75, 0xd3, 0x1e, 0x90, 0x56, 0x06, 0x13, 0x55, 0x81, 0x0e, 0x4a, 0xfa,
+    0x52, 0x0e, 0x8c, 0x06, 0xf1, 0x3b, 0x72, 0xcc, 0xb0, 0xc4, 0x85, 0x08, 0xb1, 0xc8, 0xe0, 0x06, 0x73, 0x30, 0x5f,
+    0x9e, 0xa0, 0xfe, 0xa0, 0xb4, 0x27, 0x40, 0x1b, 0x5f, 0x9b, 0xdb, 0x5e, 0xe2, 0xfe, 0xaa, 0x5e, 0x4b, 0x74, 0x0c,
+    0x20, 0x73, 0xe1, 0x10, 0xa2, 0x21, 0x81, 0x56, 0xd9, 0xdc, 0x34, 0x4a, 0xf9, 0x56, 0xd5, 0xb3, 0x89, 0x81, 0x61,
+    0x77, 0xcd, 0x55, 0xa8, 0x6f, 0xa1, 0x2d, 0x80, 0xc9, 0xf2, 0xed, 0x87, 0xcf, 0x16, 0x2c, 0xb1, 0xba, 0x1f, 0x5d,
+    0x5c, 0x72, 0xdc, 0xbf, 0x16, 0xd2, 0xce, 0x94, 0xce, 0x3f, 0xca, 0x17, 0xbf, 0x6f, 0x14, 0xe8, 0x5d, 0x95, 0x24,
+    0x74, 0xdc, 0x5a, 0xbc, 0x6d, 0xec, 0x55, 0x7b, 0x1e, 0x44, 0xfb, 0xd7, 0xf5, 0x56, 0x7b, 0xd7, 0x05, 0x82, 0xb1,
+    0x77, 0x65, 0xa0, 0x38, 0x64, 0xb9, 0x90, 0x0d, 0xbe, 0x57, 0x04, 0x8a, 0xaa, 0x93, 0xaf, 0x8e, 0xad, 0x88, 0xcb,
+    0xbf, 0x5a, 0x02, 0xf3, 0xb9, 0x57, 0x8e, 0x03, 0x4d, 0xa4, 0x29, 0xd3, 0x8f, 0xb5, 0x13, 0xed, 0xb8, 0xa3, 0x1d,
+    0x39, 0x3a, 0xdd, 0xc2, 0x06, 0x7a, 0xb7, 0x5d, 0x78, 0xef, 0x1d, 0x3a, 0xfa, 0xd9, 0xe9, 0x54, 0x10, 0x89, 0x49,
+    0x10, 0x86, 0x84, 0x2a, 0xd2, 0x2c, 0x89, 0x3f, 0xb1, 0xb2, 0x9a, 0x85, 0xca, 0xb8, 0x11, 0x48, 0x5b, 0x3c, 0xc2,
+    0xd9, 0xf1, 0xbd, 0x45, 0x0f, 0xcf, 0x86, 0x5a, 0x08, 0x06, 0x9c, 0x54, 0x8a, 0x9f, 0x00, 0x1a, 0x3c, 0xd2, 0xcf,
+    0x4e, 0x21, 0x8a, 0x9f, 0x36, 0x1e, 0xe8, 0x3f, 0xb4, 0x8f, 0x35, 0xb7, 0x7b, 0x67, 0x75, 0x7c, 0xc7, 0x72, 0xed,
+    0x43, 0xcd, 0xb1, 0x8f, 0xac, 0xb6, 0x7d, 0xac, 0xb5, 0xed, 0x2e, 0xfc, 0xeb, 0xbb, 0xf6, 0x2b, 0xcd, 0x81, 0x27,
+    0xcd, 0xb5, 0x3b, 0xf8, 0x6f, 0xdb, 0x3e, 0xbe, 0xeb, 0x10, 0xa5, 0xf7, 0x74, 0x31, 0xe4, 0xca, 0x28, 0xc0, 0x09,
+    0x44, 0x3f, 0x38, 0x3b, 0x5d, 0xa6, 0x4c, 0x5b, 0x0d, 0xf4, 0x57, 0xba, 0x36, 0x4b, 0xd8, 0x64, 0xa0, 0x3f, 0xf5,
+    0x94, 0x52, 0xf7, 0xa4, 0xb1, 0xb8, 0x7d, 0xdc, 0x58, 0xdc, 0x39, 0x6a, 0x2c, 0x3e, 0xec, 0x96, 0x8b, 0x0f, 0xa6,
+    0xf4, 0x4a, 0x49, 0xa2, 0x37, 0xf7, 0xb2, 0x24, 0x58, 0xb5, 0x5c, 0x0d, 0xd0, 0xb5, 0x05, 0xff, 0x1c, 0xb7, 0x0d,
+    0xd9, 0x6a, 0x04, 0xad, 0x24, 0x34, 0x8e, 0x4f, 0x34, 0xf7, 0xe8, 0x6f, 0xed, 0x23, 0x1f, 0xea, 0x41, 0xca, 0x47,
+    0xf8, 0xbb, 0xeb, 0x9c, 0xf8, 0x8e, 0x06, 0x0d, 0x5d, 0xf8, 0x6f, 0xd6, 0x6d, 0xfb, 0xf4, 0xe0, 0xc0, 0xfb, 0x8f,
+    0xee, 0x71, 0xea, 0x58, 0x2e, 0xfc, 0xf7, 0xab, 0x54, 0xb9, 0x83, 0xc2, 0x5f, 0xed, 0xf7, 0xd0, 0xd1, 0x3a, 0x27,
+    0xb3, 0xb6, 0xfd, 0xea, 0xee, 0xd8, 0x3e, 0x99, 0xb9, 0xc7, 0x1f, 0xe9, 0x29, 0xb4, 0xda, 0xf6, 0x2b, 0xf8, 0xfb,
+    0xd8, 0x71, 0x66, 0x96, 0x6b, 0x9f, 0xdc, 0x75, 0xec, 0x4e, 0x68, 0x1d, 0xd9, 0x27, 0xf0, 0xf7, 0x2b, 0x80, 0x17,
+    0xe0, 0xca, 0x73, 0x74, 0x6a, 0xb0, 0x31, 0x2a, 0xf6, 0x1b, 0xea, 0x47, 0xda, 0x87, 0x5a, 0xf7, 0xf0, 0x6f, 0x27,
+    0x77, 0xd6, 0xe1, 0xcc, 0x6d, 0xdf, 0x59, 0x1b, 0x7f, 0x7e, 0x04, 0xc8, 0x6f, 0x5f, 0x38, 0x00, 0x23, 0x26, 0xe5,
+    0xf8, 0xcb, 0xd0, 0xbc, 0xdc, 0x24, 0x46, 0x7f, 0xbf, 0x5b, 0x8c, 0xfe, 0xdd, 0x72, 0x1f, 0x31, 0xfa, 0xfb, 0x2f,
+    0x2e, 0x46, 0xbf, 0xac, 0x5a, 0x71, 0xbf, 0xaf, 0x06, 0x0f, 0xff, 0x79, 0x5d, 0x65, 0x92, 0x03, 0xaf, 0x75, 0x7d,
+    0xb5, 0xbc, 0x81, 0xb8, 0x3a, 0xef, 0xe3, 0xc1, 0x77, 0xcb, 0x92, 0x89, 0x52, 0x0c, 0x18, 0xe0, 0x7d, 0x4c, 0x18,
+    0xe0, 0xd7, 0xe5, 0x00, 0xec, 0x22, 0x38, 0xd5, 0x0c, 0xc6, 0xd6, 0xcc, 0x0b, 0x27, 0x92, 0xe2, 0x42, 0x49, 0x1f,
+    0x8b, 0xc1, 0x66, 0x1e, 0x88, 0x09, 0x28, 0x6b, 0x96, 0xf3, 0x28, 0xed, 0x1d, 0x39, 0x80, 0xe6, 0xdb, 0x93, 0x24,
+    0xaf, 0x34, 0xb6, 0x45, 0x24, 0xa2, 0x5b, 0x6e, 0xd3, 0xbf, 0xf1, 0x3d, 0x9a, 0xac, 0x35, 0xf7, 0xee, 0xd6, 0xfb,
+    0xd5, 0xc0, 0x16, 0x44, 0x98, 0xf4, 0x01, 0xb3, 0xd1, 0xf4, 0xbe, 0x6c, 0x38, 0x56, 0x31, 0x15, 0xdc, 0x3c, 0x52,
+    0x18, 0x49, 0xb5, 0xbd, 0x5b, 0x36, 0x3c, 0xdb, 0x35, 0xcd, 0x86, 0xcf, 0x97, 0x9a, 0x6f, 0xb1, 0x7a, 0x93, 0x1d,
+    0x57, 0x41, 0x55, 0x49, 0x7d, 0xd5, 0x08, 0x90, 0x82, 0xf7, 0x2c, 0x4c, 0xe3, 0x0a, 0xc6, 0xc7, 0xd1, 0x90, 0x1a,
+    0x3b, 0xca, 0xbb, 0x52, 0x9f, 0xaa, 0x39, 0xdd, 0x8b, 0x35, 0xf2, 0x83, 0xc1, 0xaf, 0xc0, 0xd8, 0x70, 0x7a, 0x3c,
+    0x8a, 0x55, 0x38, 0xaf, 0x95, 0x7e, 0x89, 0xd5, 0xce, 0x67, 0xee, 0xba, 0xce, 0xda, 0x6c, 0x34, 0xa4, 0x75, 0xd9,
+    0x5c, 0xd0, 0x68, 0xfc, 0x3c, 0x99, 0xad, 0xe6, 0x64, 0x5a, 0x8c, 0x96, 0xb9, 0xdb, 0x3a, 0x13, 0xf5, 0x9e, 0xc2,
+    0x26, 0x36, 0xf9, 0x83, 0xea, 0x25, 0xbe, 0x9e, 0x40, 0x9a, 0xe2, 0x1e, 0x32, 0x11, 0x0a, 0x07, 0xd5, 0x46, 0x1b,
+    0xdb, 0xfe, 0x16, 0xf3, 0x0f, 0xb5, 0x63, 0xde, 0x09, 0xda, 0xea, 0x6e, 0xb3, 0x18, 0x91, 0xae, 0x0d, 0xeb, 0x92,
+    0x02, 0xd5, 0xed, 0x1e, 0x9b, 0xee, 0x91, 0x69, 0x1f, 0x77, 0x8d, 0x5c, 0x1c, 0x38, 0xb5, 0xcb, 0x12, 0x40, 0xc0,
+    0x64, 0x57, 0x0e, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc2, 0x1c, 0x50, 0x7d, 0x99, 0xe7, 0xfd, 0xd7, 0x32, 0xcd, 0x60,
+    0x8e, 0x82, 0x25, 0x43, 0x73, 0x65, 0x6b, 0xc4, 0xb2, 0x7b, 0xc6, 0xa2, 0x0d, 0xaa, 0xdc, 0xaa, 0xf5, 0xf3, 0x9f,
+    0x67, 0x0b, 0x9a, 0x93, 0x9d, 0xc5, 0x28, 0x8b, 0xf8, 0xfe, 0x10, 0xa6, 0xba, 0xf9, 0xd0, 0xfc, 0x71, 0x13, 0xc2,
+    0xfd, 0xd7, 0x6e, 0x84, 0x9b, 0xb1, 0x7d, 0x10, 0xee, 0xbf, 0xbe, 0x38, 0xc2, 0xfd, 0x51, 0x45, 0xb8, 0x25, 0x4f,
+    0x95, 0x42, 0x26, 0xfa, 0x01, 0x9f, 0x5b, 0x10, 0x75, 0xf7, 0xa5, 0x7e, 0x40, 0xec, 0xa5, 0xae, 0x64, 0x43, 0xfd,
+    0x58, 0x4a, 0xef, 0x82, 0x57, 0x76, 0x0c, 0x3f, 0x4a, 0xa9, 0x24, 0x20, 0x53, 0xa8, 0xcc, 0x79, 0x0d, 0x7d, 0x5e,
+    0x44, 0x59, 0x68, 0xbf, 0xe7, 0xd7, 0x12, 0x50, 0x41, 0x7c, 0x17, 0x27, 0x73, 0x0f, 0x43, 0xaf, 0xe9, 0x98, 0x16,
+    0x0e, 0x1e, 0x1c, 0xf0, 0x8e, 0xf2, 0xe3, 0x68, 0x2c, 0xe5, 0xe8, 0x6c, 0x70, 0x4d, 0xfc, 0xa0, 0xfe, 0xc0, 0xbc,
+    0x44, 0x37, 0xe9, 0x35, 0x2c, 0xee, 0x8b, 0x8e, 0xf3, 0xa2, 0x7d, 0xf8, 0xe2, 0xc8, 0x81, 0xff, 0xb9, 0xac, 0x93,
+    0x9b, 0xbc, 0xe2, 0x3c, 0x8e, 0x20, 0x33, 0x85, 0xa8, 0xb9, 0xa9, 0xda, 0x3d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd,
+    0x95, 0xc6, 0xde, 0x43, 0x51, 0xa7, 0xb1, 0xc6, 0x2c, 0x5e, 0x2a, 0xc3, 0x6a, 0x18, 0x4d, 0x10, 0x2d, 0x41, 0x32,
+    0xa4, 0xd4, 0x50, 0x5f, 0xf3, 0xe9, 0x16, 0xf3, 0x62, 0x9d, 0xfc, 0xa6, 0x48, 0x7f, 0x23, 0xd2, 0x70, 0xec, 0x84,
+    0x20, 0x17, 0xaa, 0x3b, 0x18, 0x3c, 0x1b, 0x13, 0xc0, 0x68, 0x90, 0x7c, 0xae, 0xc8, 0x71, 0x8e, 0x0b, 0x94, 0x25,
+    0xcb, 0xc8, 0xa7, 0x34, 0xe6, 0xde, 0x28, 0x6d, 0x05, 0x07, 0x10, 0x97, 0x13, 0x3f, 0x6c, 0xe0, 0xaa, 0x79, 0x67,
+    0x4e, 0x91, 0x2b, 0x20, 0x15, 0xab, 0xe2, 0xbd, 0xc8, 0xcc, 0x84, 0x32, 0x8c, 0xe2, 0xd2, 0x5a, 0x03, 0xef, 0x85,
+    0x6c, 0xf8, 0x22, 0x33, 0x21, 0xcb, 0x27, 0x2c, 0xf7, 0xf3, 0xe7, 0x54, 0x0b, 0xf2, 0xee, 0xd1, 0xb4, 0xce, 0x7d,
+    0x99, 0xab, 0x4b, 0xd7, 0xbc, 0x69, 0xac, 0x63, 0xae, 0xae, 0x9e, 0x6f, 0xc6, 0x2f, 0x5f, 0x9e, 0x0d, 0x5c, 0x83,
+    0x67, 0x8d, 0x2c, 0xa5, 0x38, 0xba, 0xdc, 0x4f, 0x35, 0x6e, 0x34, 0x3a, 0x6d, 0x2d, 0x82, 0x68, 0x2a, 0x34, 0xd3,
+    0x12, 0x7b, 0x41, 0xca, 0x01, 0x52, 0x81, 0x79, 0x42, 0x45, 0x2d, 0xea, 0xdc, 0xb1, 0x04, 0x32, 0x5e, 0x0e, 0xf4,
+    0x8e, 0xed, 0xd8, 0x8e, 0x2e, 0x1b, 0x4e, 0x82, 0xe9, 0x60, 0x1d, 0x67, 0x1e, 0x24, 0x6f, 0x09, 0xe3, 0x29, 0x78,
+    0x7e, 0x64, 0x41, 0x16, 0x42, 0x26, 0x10, 0x70, 0x01, 0x99, 0xd3, 0xad, 0x31, 0xe7, 0xf6, 0xb8, 0x5e, 0xf2, 0x09,
+    0xb3, 0xc1, 0x09, 0xa7, 0x2f, 0x8c, 0x3f, 0xf3, 0x03, 0x10, 0xc3, 0x96, 0xde, 0x82, 0x5c, 0x84, 0x2c, 0x49, 0x2d,
+    0xd5, 0xbe, 0xbd, 0xa7, 0x41, 0x1b, 0xc8, 0x13, 0x8e, 0x1d, 0x4c, 0x12, 0x6f, 0x0e, 0x41, 0xb3, 0xd7, 0xb9, 0xc9,
+    0x31, 0xad, 0xce, 0x51, 0xad, 0xe6, 0xbe, 0x3a, 0x32, 0xb5, 0xb6, 0x6b, 0x6a, 0x0e, 0xa0, 0x5b, 0x3d, 0x37, 0xd7,
+    0xf9, 0x4d, 0x7f, 0x97, 0x8a, 0x8e, 0xf0, 0xcb, 0x53, 0x9a, 0x07, 0x29, 0xe7, 0xb8, 0xf0, 0x33, 0xa3, 0xd0, 0x81,
+    0x2d, 0x25, 0x9c, 0x75, 0x40, 0x62, 0xfa, 0x2b, 0xb6, 0xca, 0x0c, 0xcc, 0x94, 0xc1, 0xab, 0x04, 0xc6, 0x1a, 0x5d,
+    0xd3, 0x82, 0x48, 0x0b, 0x7e, 0xfb, 0xad, 0x15, 0x80, 0xf9, 0xfd, 0x40, 0x81, 0x0f, 0x3c, 0x1b, 0x25, 0x80, 0x05,
+    0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0x2c, 0x7e, 0x70, 0xc5, 0x9e, 0x1d, 0x7a, 0xd1, 0x14,
+    0x50, 0x9a, 0x17, 0x4d, 0x6b, 0x06, 0x04, 0xe4, 0x5d, 0x57, 0x29, 0x2d, 0xba, 0x2a, 0x94, 0xfb, 0xe9, 0xb7, 0x0f,
+    0x57, 0x94, 0x09, 0x08, 0xb2, 0x4e, 0x7b, 0x63, 0x74, 0x05, 0x2b, 0x74, 0x0f, 0x2f, 0x07, 0x5f, 0x9d, 0xce, 0x59,
+    0xe6, 0x91, 0xe0, 0x12, 0xae, 0x78, 0xc0, 0x0e, 0x68, 0xbe, 0xc8, 0xe2, 0x49, 0x17, 0xbc, 0x31, 0xbb, 0x0b, 0x7c,
+    0x7e, 0x4f, 0x33, 0x35, 0x4e, 0xa7, 0x2c, 0xb4, 0x51, 0x1a, 0xb8, 0x26, 0x99, 0xc8, 0xfa, 0x1e, 0x06, 0x18, 0x1c,
+    0x44, 0xb1, 0x7e, 0xf6, 0x95, 0xf4, 0x26, 0xda, 0xb4, 0x08, 0x90, 0x8e, 0xef, 0x3a, 0x61, 0xe1, 0xbf, 0x07, 0x5f,
+    0x01, 0xe1, 0xfe, 0xea, 0x46, 0x37, 0xfa, 0x99, 0x8d, 0xf7, 0x98, 0xaf, 0x1a, 0xd2, 0xd2, 0xe1, 0x1d, 0x95, 0x5f,
+    0x36, 0x3b, 0xca, 0x65, 0x13, 0x7e, 0xef, 0xbe, 0xba, 0x9e, 0x9d, 0x22, 0x41, 0x3b, 0x83, 0xdb, 0xc5, 0xba, 0x74,
+    0xe7, 0x74, 0xfb, 0x78, 0x41, 0x1d, 0x85, 0x9e, 0xff, 0x49, 0xdc, 0x50, 0xd5, 0x87, 0x7d, 0xee, 0xa2, 0x92, 0xb3,
+    0x6b, 0xdc, 0xcb, 0xb8, 0x95, 0xd7, 0xf8, 0x65, 0xfc, 0xd4, 0xfd, 0x2c, 0xc8, 0xe4, 0x65, 0x18, 0x1f, 0x72, 0xd0,
+    0xe6, 0xe0, 0xf8, 0x8a, 0xeb, 0x0f, 0x5c, 0x50, 0xdd, 0x93, 0xbf, 0x75, 0xef, 0x5c, 0x67, 0xd6, 0x76, 0x6d, 0xb8,
+    0xe6, 0xcc, 0x3a, 0xf6, 0x71, 0x68, 0x75, 0xec, 0x63, 0xf8, 0xfb, 0x08, 0x57, 0x2f, 0xab, 0x6d, 0x1f, 0x7e, 0x74,
+    0xdb, 0xa1, 0x75, 0x62, 0x1f, 0xc3, 0xdf, 0x25, 0xb5, 0xfa, 0x19, 0x2f, 0x3d, 0x70, 0xe1, 0xf9, 0xaa, 0x84, 0x05,
+    0x94, 0xdf, 0x52, 0x8b, 0x60, 0x96, 0xc8, 0x5b, 0x83, 0x26, 0x02, 0x50, 0x86, 0x6e, 0x8a, 0x80, 0x80, 0x51, 0xbf,
+    0x05, 0x79, 0xb2, 0x31, 0xc2, 0xbb, 0x30, 0xc8, 0x88, 0x8a, 0x9c, 0xef, 0x9b, 0x8f, 0x11, 0x6f, 0xd3, 0x1c, 0x6a,
+    0x5b, 0xa4, 0x0e, 0x22, 0xd5, 0xc5, 0xdf, 0x17, 0x18, 0x45, 0x47, 0x04, 0x07, 0x57, 0xb0, 0x52, 0x91, 0xbe, 0x2e,
+    0xdf, 0x3d, 0x70, 0xf4, 0x1b, 0x65, 0x32, 0x7d, 0xca, 0x17, 0xed, 0x9b, 0xab, 0x33, 0x64, 0xef, 0x7f, 0xb4, 0x1f,
+    0xcc, 0x1a, 0x4a, 0xfd, 0x88, 0x38, 0x9e, 0xe3, 0x20, 0x91, 0xc3, 0x53, 0x50, 0xb4, 0xdb, 0x1c, 0xa3, 0xdc, 0x80,
+    0x3c, 0x13, 0x17, 0xc0, 0x25, 0xdf, 0x79, 0xa1, 0x62, 0x7a, 0xa1, 0xb4, 0x7c, 0x22, 0x31, 0xff, 0xf3, 0xe7, 0xc5,
+    0xe0, 0xac, 0xca, 0xb8, 0x4f, 0xdd, 0x2e, 0x90, 0xdd, 0x2e, 0xeb, 0x6c, 0xb5, 0x02, 0xda, 0x1d, 0x08, 0xb6, 0x08,
+    0x1d, 0x29, 0x34, 0xfd, 0x42, 0xc7, 0xb8, 0xd1, 0x14, 0xa9, 0xa6, 0x61, 0x84, 0x10, 0xba, 0x95, 0xab, 0x8e, 0x6e,
+    0xf4, 0x23, 0xa1, 0x30, 0x8b, 0xb6, 0x04, 0xbf, 0xe5, 0x77, 0x31, 0x1d, 0x40, 0xb3, 0x65, 0x1e, 0x3b, 0x5c, 0x1a,
+    0xff, 0xdf, 0x93, 0x40, 0xf7, 0x22, 0xd0, 0xf0, 0x55, 0x4e, 0x6b, 0xc9, 0xdd, 0x44, 0xd2, 0x55, 0x22, 0xa8, 0x2c,
+    0x3d, 0xd7, 0xa1, 0x08, 0x12, 0x10, 0x61, 0xce, 0x31, 0x69, 0xde, 0x24, 0xa9, 0x45, 0x51, 0x60, 0x06, 0x10, 0xfd,
+    0xb9, 0x25, 0x5c, 0x9d, 0x8c, 0xe7, 0xcf, 0x37, 0x12, 0x21, 0x52, 0x27, 0xab, 0xa9, 0x17, 0x75, 0x15, 0xbf, 0xe9,
+    0x2a, 0x8a, 0x91, 0xfd, 0x22, 0xd6, 0x10, 0x56, 0x59, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0x79, 0x99, 0xcd, 0xf5, 0x20,
+    0x2d, 0x85, 0xb8, 0x9b, 0x2e, 0xeb, 0x80, 0x3d, 0x16, 0x0f, 0xb6, 0xc5, 0x23, 0xcb, 0x3d, 0x5b, 0x7f, 0x5c, 0x72,
+    0x3f, 0x64, 0xe8, 0xe3, 0x37, 0xa7, 0x08, 0x9e, 0xf2, 0x2e, 0xf3, 0x28, 0xc2, 0x86, 0x4a, 0x72, 0xe3, 0xcc, 0x13,
+    0x89, 0x3e, 0x80, 0x2f, 0xef, 0x37, 0x2a, 0x0c, 0x15, 0x5f, 0xe5, 0xb3, 0x77, 0x57, 0xdf, 0x68, 0x7c, 0xff, 0x93,
+    0x7e, 0x0b, 0x2f, 0x32, 0x14, 0xef, 0x7e, 0x40, 0xf1, 0xee, 0x35, 0x9e, 0xe7, 0x01, 0xa2, 0xc6, 0xe7, 0x07, 0x04,
+    0x41, 0x5d, 0x63, 0x91, 0x4f, 0x5a, 0xbf, 0xf9, 0x32, 0xcc, 0x82, 0x85, 0x97, 0x64, 0x07, 0xd0, 0xd4, 0x02, 0x24,
+    0xa7, 0x6f, 0xf2, 0x60, 0x26, 0xc5, 0xa1, 0x10, 0xaa, 0x65, 0x91, 0xd0, 0x1c, 0x4e, 0x82, 0x50, 0x2a, 0x0e, 0xc5,
+    0x07, 0x3c, 0xdf, 0x67, 0x8b, 0x6c, 0xa0, 0x7b, 0x0b, 0xc8, 0x7b, 0x80, 0x91, 0x8c, 0x0f, 0x62, 0x3f, 0x63, 0x99,
+    0x95, 0x66, 0x09, 0xf3, 0xe6, 0xba, 0x0c, 0xeb, 0x59, 0xef, 0x2f, 0x5d, 0x8e, 0xe6, 0x41, 0x26, 0x23, 0xe3, 0xd1,
+    0x04, 0x41, 0x85, 0x07, 0x43, 0x3c, 0x1b, 0xe6, 0x1c, 0x84, 0x97, 0xf1, 0xb4, 0xb2, 0xa3, 0x0a, 0xce, 0xe5, 0x1c,
+    0xa3, 0xae, 0xf2, 0x58, 0xf7, 0x63, 0xf4, 0xc8, 0xb9, 0xe5, 0x5e, 0xd7, 0x32, 0x80, 0x9f, 0x7e, 0x76, 0xca, 0xaf,
+    0xb7, 0x1a, 0x06, 0x0a, 0xd0, 0xbb, 0x0e, 0xc4, 0x95, 0xdd, 0xe4, 0x8f, 0x7d, 0xc0, 0x2b, 0x03, 0x69, 0xa2, 0x9e,
+    0x31, 0xc2, 0x37, 0x8d, 0xe5, 0x0a, 0x18, 0xa1, 0x92, 0x8a, 0x77, 0xe6, 0x9e, 0x49, 0x07, 0x20, 0x1c, 0x15, 0xf2,
+    0x4a, 0xbf, 0xfd, 0xf6, 0x7a, 0xf8, 0x9f, 0xdf, 0x21, 0x0c, 0xf9, 0xcc, 0x15, 0x5e, 0xd0, 0xd7, 0x6a, 0x2d, 0xce,
+    0x7d, 0x9a, 0x43, 0x54, 0xef, 0xb3, 0xb1, 0x08, 0x0b, 0x22, 0xb6, 0x56, 0x3e, 0xbc, 0x11, 0xa1, 0x9e, 0x20, 0xd5,
+    0x80, 0x21, 0x7c, 0xb5, 0x87, 0xb0, 0xbc, 0x43, 0x11, 0x22, 0x40, 0xfb, 0x65, 0xf5, 0xed, 0x31, 0xa4, 0xcd, 0xad,
+    0x65, 0x00, 0x50, 0x06, 0x88, 0x7b, 0xe8, 0xec, 0xd4, 0xe3, 0xc2, 0x57, 0x60, 0x3f, 0xd2, 0xde, 0x01, 0x4c, 0x73,
+    0x16, 0xcf, 0x99, 0x1d, 0xc4, 0x07, 0xf7, 0x6c, 0x64, 0x79, 0x8b, 0x80, 0xe4, 0xcb, 0x28, 0x77, 0xd3, 0x88, 0xf3,
+    0x93, 0x0a, 0x5a, 0xe2, 0xaf, 0xf3, 0x02, 0x94, 0x71, 0x01, 0x28, 0xf8, 0xe9, 0x9d, 0x95, 0xa3, 0xf5, 0xd9, 0x22,
+    0x36, 0x7c, 0x19, 0xcb, 0x9f, 0x53, 0xd0, 0x3d, 0x11, 0x5f, 0xaf, 0x78, 0xb0, 0xe2, 0xc9, 0x44, 0x8d, 0xb0, 0x67,
+    0x97, 0xbf, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x41, 0x5f, 0xaa, 0x7f, 0x42, 0xfe, 0x84, 0xf4, 0xb5, 0x3c, 0x18,
+    0x23, 0x9c, 0xe7, 0x5a, 0xa4, 0x3e, 0x09, 0x92, 0xa7, 0x54, 0x89, 0x23, 0x8a, 0x6a, 0x0c, 0xe8, 0x0d, 0xac, 0xc9,
+    0x93, 0xc1, 0x80, 0xf0, 0x58, 0x15, 0x9d, 0x01, 0x94, 0x1a, 0xe2, 0xe4, 0xc3, 0x64, 0x33, 0x68, 0x68, 0x91, 0x07,
+    0x17, 0x36, 0xaa, 0x4e, 0xa7, 0x3e, 0xc6, 0x03, 0x4f, 0xec, 0xaf, 0xd2, 0x0e, 0x84, 0x9d, 0xc5, 0x17, 0x16, 0x10,
+    0xb8, 0xe8, 0xa7, 0x82, 0xc7, 0xb5, 0xaf, 0x09, 0x65, 0x5b, 0xa1, 0xf7, 0x10, 0x2b, 0x9a, 0x75, 0xee, 0x64, 0x7f,
+    0x89, 0xa5, 0x57, 0xc2, 0xb9, 0xad, 0x76, 0x92, 0x64, 0xac, 0xf1, 0xfa, 0x69, 0x52, 0x83, 0x83, 0xef, 0x3a, 0x4c,
+    0x6a, 0xdd, 0xf2, 0x64, 0x10, 0x3b, 0xe6, 0xc5, 0x41, 0x2b, 0xbd, 0xc4, 0x73, 0x9f, 0x9f, 0x1e, 0xc0, 0xfc, 0x20,
+    0x30, 0x40, 0x89, 0x33, 0x0a, 0x0c, 0x88, 0x3e, 0xe0, 0xa5, 0x64, 0x1d, 0x70, 0x31, 0x16, 0x4c, 0x1d, 0xde, 0x1c,
+    0x65, 0x28, 0xd0, 0x52, 0x95, 0x3a, 0xb3, 0xe2, 0x34, 0x73, 0x79, 0xbb, 0x63, 0xf3, 0xff, 0xba, 0xc4, 0xc0, 0xfc,
+    0x79, 0x3f, 0x63, 0xc2, 0xef, 0xf6, 0x32, 0xdb, 0xe0, 0x9a, 0xbb, 0xa9, 0x0a, 0x31, 0xac, 0x5b, 0x2a, 0x14, 0xfb,
+    0x78, 0x5b, 0xad, 0x82, 0x35, 0x92, 0xd5, 0x16, 0x5e, 0x4b, 0x7f, 0x8a, 0x3b, 0xbe, 0x56, 0x1b, 0x4b, 0xa1, 0xde,
+    0x65, 0x36, 0x80, 0xaa, 0x42, 0xd8, 0xee, 0x2d, 0x16, 0x54, 0xd9, 0xe8, 0x9f, 0x1e, 0xd0, 0xbd, 0xf3, 0x8c, 0x76,
+    0xd8, 0xd9, 0x29, 0x58, 0x17, 0xd2, 0xa2, 0x7b, 0x8b, 0x05, 0x5f, 0x52, 0xfa, 0x45, 0x6f, 0x0e, 0x66, 0xd9, 0x3c,
+    0x3c, 0xfb, 0x2f, 0x85, 0x07, 0xd6, 0xc5, 0xa2, 0x59, 0x03, 0x00};
+
+}  // namespace web_server
+}  // namespace esphome
+#endif
+#endif
diff --git a/esphome/components/web_server/web_server.cpp b/esphome/components/web_server/web_server.cpp
index 6a7b4121f0..d72307991f 100644
--- a/esphome/components/web_server/web_server.cpp
+++ b/esphome/components/web_server/web_server.cpp
@@ -27,7 +27,11 @@
 #endif
 
 #ifdef USE_WEBSERVER_LOCAL
-#include "server_index.h"
+#if USE_WEBSERVER_VERSION == 2
+#include "server_index_v2.h"
+#elif USE_WEBSERVER_VERSION == 3
+#include "server_index_v3.h"
+#endif
 #endif
 
 namespace esphome {

From 989a64bdcf9ae9a1b0723d77b20ba6c26d74d89d Mon Sep 17 00:00:00 2001
From: esphomebot <esphome@nabucasa.com>
Date: Tue, 30 Apr 2024 09:45:03 +1200
Subject: [PATCH 70/81] Update webserver local assets to 20240429-211523
 (#6657)

---
 .../components/captive_portal/captive_index.h |  196 +--
 .../components/web_server/server_index_v2.h   | 1237 +++++++++--------
 .../components/web_server/server_index_v3.h   |  725 +++++-----
 3 files changed, 1083 insertions(+), 1075 deletions(-)

diff --git a/esphome/components/captive_portal/captive_index.h b/esphome/components/captive_portal/captive_index.h
index d262a89b09..8835762fb3 100644
--- a/esphome/components/captive_portal/captive_index.h
+++ b/esphome/components/captive_portal/captive_index.h
@@ -1,106 +1,108 @@
 #pragma once
 // Generated from https://github.com/esphome/esphome-webserver
-#include "esphome/core/hal.h"
-namespace esphome {
 
+#include "esphome/core/hal.h"
+
+namespace esphome {
 namespace captive_portal {
 
 const uint8_t INDEX_GZ[] PROGMEM = {
-    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdd, 0x58, 0x69, 0x6f, 0xdc, 0x36, 0x1a, 0xfe, 0xde,
-    0x5f, 0xc1, 0x2a, 0x49, 0x47, 0xd3, 0x58, 0xd4, 0x35, 0x9a, 0x53, 0x9a, 0xc2, 0xf1, 0xa6, 0x68, 0x81, 0xa4, 0x0d,
-    0x60, 0xb7, 0xfd, 0x10, 0x04, 0x30, 0x47, 0xa2, 0x46, 0x8c, 0x25, 0x4a, 0x2b, 0x72, 0xae, 0x0c, 0x66, 0x7f, 0xfb,
-    0xbe, 0x24, 0x35, 0xe3, 0xb1, 0x37, 0x5e, 0x6c, 0x8a, 0x2d, 0x8a, 0xd6, 0x71, 0x68, 0x1e, 0xef, 0xf9, 0x88, 0xef,
-    0x21, 0xc5, 0x5f, 0x67, 0x75, 0x2a, 0x77, 0x0d, 0x45, 0x85, 0xac, 0xca, 0x79, 0xac, 0x46, 0x54, 0x12, 0xbe, 0x4c,
-    0x28, 0x87, 0x15, 0x25, 0xd9, 0x3c, 0xae, 0xa8, 0x24, 0x28, 0x2d, 0x48, 0x2b, 0xa8, 0x4c, 0x7e, 0xb9, 0xf9, 0xde,
-    0x19, 0x23, 0x77, 0x1e, 0x97, 0x8c, 0xdf, 0xa1, 0x96, 0x96, 0x09, 0x4b, 0x6b, 0x8e, 0x8a, 0x96, 0xe6, 0x49, 0x46,
-    0x24, 0x99, 0xb2, 0x8a, 0x2c, 0xa9, 0x22, 0xd0, 0x6c, 0x9c, 0x54, 0x34, 0x59, 0x33, 0xba, 0x69, 0xea, 0x56, 0x22,
-    0xa0, 0x94, 0x94, 0xcb, 0xc4, 0xda, 0xb0, 0x4c, 0x16, 0x49, 0x46, 0xd7, 0x2c, 0xa5, 0x8e, 0x5e, 0x5c, 0x30, 0xce,
-    0x24, 0x23, 0xa5, 0x23, 0x52, 0x52, 0xd2, 0xc4, 0xbf, 0x58, 0x09, 0xda, 0xea, 0x05, 0x59, 0xc0, 0x9a, 0xd7, 0x16,
-    0x88, 0x14, 0x69, 0xcb, 0x1a, 0x89, 0x94, 0xbd, 0x49, 0x55, 0x67, 0xab, 0x92, 0xce, 0x5d, 0x97, 0x08, 0xb0, 0x4b,
-    0xb8, 0x8c, 0x67, 0x74, 0x8b, 0x87, 0x61, 0x98, 0x06, 0x64, 0x94, 0xe3, 0x8f, 0xe2, 0x2b, 0xf0, 0x6c, 0x55, 0x81,
-    0x3a, 0x5c, 0xd6, 0x29, 0x91, 0xac, 0xe6, 0x58, 0x50, 0xd2, 0xa6, 0x45, 0x92, 0x24, 0xd6, 0x77, 0x82, 0xac, 0xa9,
-    0xf5, 0xcd, 0x37, 0xf6, 0x89, 0x68, 0x49, 0xe5, 0xeb, 0x92, 0xaa, 0xa9, 0x78, 0xb5, 0xbb, 0x21, 0xcb, 0x9f, 0xc0,
-    0x72, 0xdb, 0x22, 0x82, 0x65, 0xd4, 0xea, 0xbf, 0xf7, 0x3e, 0x60, 0x21, 0x77, 0x25, 0xc5, 0x19, 0x13, 0x4d, 0x49,
-    0x76, 0x89, 0xb5, 0x00, 0xa9, 0x77, 0x56, 0x7f, 0x96, 0xaf, 0x78, 0xaa, 0x84, 0x23, 0x61, 0xd3, 0xfe, 0xbe, 0xa4,
-    0x60, 0x5e, 0xf2, 0x96, 0xc8, 0x02, 0x57, 0x64, 0x6b, 0x9b, 0x09, 0xe3, 0x76, 0xf0, 0xad, 0x4d, 0x5f, 0xfa, 0x9e,
-    0xd7, 0xbf, 0xd0, 0x83, 0xd7, 0x77, 0xe1, 0xef, 0xac, 0xa5, 0x72, 0xd5, 0x72, 0x44, 0xec, 0xdb, 0xb8, 0x01, 0x4a,
-    0x94, 0x25, 0x56, 0xe5, 0x07, 0xd8, 0xf3, 0xc6, 0xc8, 0x9f, 0xe0, 0x20, 0x72, 0x7c, 0x1f, 0x87, 0x8e, 0x1f, 0xa5,
-    0x23, 0x27, 0x42, 0xfe, 0x00, 0x86, 0x20, 0xc0, 0x11, 0xf2, 0x3e, 0x59, 0x28, 0x67, 0x65, 0x99, 0x58, 0xbc, 0xe6,
-    0xd4, 0x42, 0x42, 0xb6, 0xf5, 0x1d, 0x4d, 0xac, 0x74, 0xd5, 0xb6, 0x60, 0xff, 0x55, 0x5d, 0xd6, 0x2d, 0xc0, 0xf5,
-    0x15, 0x7a, 0xf0, 0xf3, 0xc5, 0x2a, 0x64, 0x4b, 0xb8, 0xc8, 0xeb, 0xb6, 0x4a, 0x2c, 0xfd, 0x50, 0xec, 0xe7, 0x7b,
-    0x79, 0x40, 0x6a, 0xe8, 0x9f, 0x1d, 0x3a, 0x75, 0xcb, 0x96, 0x8c, 0x27, 0x96, 0x1f, 0x20, 0x7f, 0x0c, 0x6a, 0x6f,
-    0xfb, 0x87, 0x13, 0x26, 0x44, 0x61, 0xd2, 0x79, 0x59, 0xdb, 0xef, 0x6f, 0x63, 0xb1, 0x5e, 0xa2, 0x6d, 0x55, 0x72,
-    0x91, 0x58, 0x85, 0x94, 0xcd, 0xd4, 0x75, 0x37, 0x9b, 0x0d, 0xde, 0x84, 0xb8, 0x6e, 0x97, 0x6e, 0xe0, 0x79, 0x9e,
-    0x0b, 0x14, 0x16, 0x32, 0xf7, 0xc3, 0x0a, 0x06, 0x16, 0x2a, 0x28, 0x5b, 0x16, 0x52, 0xcf, 0xe7, 0xcf, 0xf7, 0xf4,
-    0x10, 0x2b, 0x8a, 0xf9, 0xed, 0x87, 0x33, 0x2d, 0xec, 0x4c, 0x0b, 0xfd, 0xee, 0x0c, 0xcd, 0xde, 0x5b, 0x65, 0xd4,
-    0x88, 0x04, 0x28, 0x40, 0x9e, 0xfe, 0x17, 0x38, 0x6a, 0xde, 0xad, 0x9c, 0x47, 0x2b, 0x74, 0xb6, 0x82, 0xbf, 0x80,
-    0x5f, 0x50, 0x0d, 0x9d, 0xc9, 0x89, 0xdd, 0x57, 0xc7, 0x6b, 0xdf, 0xbb, 0xdf, 0x50, 0x3c, 0x3f, 0x0c, 0xcf, 0xd7,
-    0x4e, 0xf0, 0xab, 0x22, 0x50, 0xd8, 0x9f, 0x98, 0x9c, 0xa0, 0xf0, 0x7f, 0x1d, 0x92, 0x08, 0x45, 0xdd, 0x4e, 0xe4,
-    0xa8, 0xf9, 0x69, 0xa5, 0x34, 0xa1, 0x68, 0x0d, 0x54, 0x95, 0x33, 0x74, 0x22, 0x12, 0xa2, 0xb0, 0x33, 0x09, 0x66,
-    0xb0, 0x3d, 0x04, 0xe6, 0xb3, 0x3d, 0x27, 0xfc, 0xd4, 0x53, 0x30, 0x4f, 0x2d, 0xeb, 0x1e, 0x83, 0xfa, 0x1c, 0x03,
-    0xfc, 0xb1, 0x86, 0x3b, 0x67, 0x59, 0x80, 0x11, 0x95, 0x69, 0x61, 0x5b, 0x2e, 0x44, 0x5e, 0xce, 0x96, 0x10, 0x15,
-    0x35, 0xb7, 0xfa, 0x58, 0x16, 0x94, 0xdb, 0x47, 0x56, 0xc5, 0x48, 0xf5, 0x89, 0xfd, 0xf8, 0x44, 0xf6, 0xf7, 0xa7,
-    0xf8, 0x90, 0x4c, 0x42, 0x1c, 0x4a, 0xac, 0x22, 0xfa, 0xe2, 0xb4, 0xbb, 0xa8, 0xb3, 0xdd, 0x13, 0xa1, 0x53, 0xf8,
-    0x26, 0x6e, 0x18, 0xe7, 0xb4, 0xbd, 0xa1, 0x5b, 0x78, 0x86, 0x6f, 0x2f, 0xaf, 0xd0, 0x65, 0x96, 0xb5, 0x54, 0x88,
-    0x29, 0xb2, 0x5e, 0x4a, 0x88, 0x91, 0xf4, 0x7f, 0x97, 0xe5, 0x3f, 0x90, 0xf5, 0x1b, 0xfb, 0x9e, 0xa1, 0x9f, 0xa8,
-    0xdc, 0xd4, 0xed, 0x5d, 0x27, 0x4d, 0x99, 0x36, 0x53, 0x11, 0xd8, 0x82, 0x9d, 0xa4, 0x11, 0x58, 0x94, 0x90, 0x5f,
-    0x6c, 0xbf, 0x0f, 0x7a, 0x9a, 0x7b, 0xaf, 0xf8, 0x11, 0xa8, 0xdb, 0x38, 0x63, 0x6b, 0x94, 0x96, 0x90, 0x41, 0x20,
-    0x94, 0x8c, 0x28, 0x0b, 0x75, 0x61, 0x53, 0xf3, 0x14, 0xb8, 0xef, 0x12, 0xeb, 0x33, 0x19, 0xe2, 0xd5, 0xee, 0xc7,
-    0xcc, 0xee, 0x09, 0xc8, 0x0d, 0xbd, 0x3e, 0x5e, 0x93, 0x72, 0x45, 0x51, 0x82, 0x64, 0xc1, 0xc4, 0xbd, 0x81, 0xb3,
-    0x27, 0xd9, 0x1a, 0x71, 0x07, 0x5c, 0x39, 0x1c, 0x0b, 0xbb, 0x6f, 0x1d, 0xa3, 0x34, 0x26, 0x26, 0x87, 0x5a, 0xcf,
-    0xac, 0x47, 0x16, 0x39, 0x25, 0xcd, 0xa5, 0x75, 0x1f, 0xcd, 0xcf, 0xf7, 0xc2, 0xe6, 0xb8, 0x05, 0xed, 0xfd, 0xc3,
-    0x69, 0x33, 0x16, 0x0d, 0xe1, 0x8f, 0x19, 0x95, 0x81, 0x2a, 0x68, 0x20, 0xf1, 0xc1, 0x4c, 0x45, 0x0e, 0x10, 0x9d,
-    0x14, 0xba, 0xe4, 0x38, 0x7d, 0xbe, 0x67, 0x20, 0x51, 0xe5, 0xb3, 0x93, 0xc4, 0xd8, 0x05, 0x68, 0xe6, 0xb7, 0x87,
-    0xfe, 0xbd, 0x1f, 0xff, 0x5c, 0xd1, 0x76, 0x77, 0x4d, 0x4b, 0x9a, 0xca, 0xba, 0xb5, 0xad, 0x67, 0xa0, 0x05, 0xae,
-    0x92, 0x76, 0xf8, 0x87, 0x9b, 0xb7, 0x6f, 0x92, 0xda, 0x6e, 0xfb, 0x17, 0x4f, 0x51, 0xab, 0x6a, 0xf1, 0x1e, 0xaa,
-    0xc5, 0xbf, 0x92, 0x9e, 0xaa, 0x17, 0xbd, 0x0f, 0xc0, 0xaa, 0xfd, 0xbd, 0xbd, 0x2f, 0x1a, 0x2a, 0xb0, 0x5f, 0x42,
-    0x72, 0xb8, 0x50, 0x1e, 0x3a, 0xc3, 0xa8, 0x7f, 0x00, 0xfd, 0x60, 0x01, 0xd8, 0xad, 0xf3, 0x3e, 0xe4, 0x7f, 0x95,
-    0x82, 0xe7, 0xdf, 0xee, 0x17, 0xf5, 0xd6, 0x11, 0xec, 0x13, 0xe3, 0xcb, 0x29, 0xe3, 0x05, 0x6d, 0x99, 0x3c, 0x80,
-    0xb9, 0x50, 0x42, 0x9a, 0x95, 0xdc, 0x37, 0x24, 0xcb, 0xd4, 0x49, 0xd4, 0x6c, 0x67, 0x39, 0x14, 0x1c, 0x45, 0x49,
-    0xa7, 0x3e, 0xad, 0x0e, 0xe6, 0x5c, 0xe7, 0x96, 0xe9, 0x24, 0x7a, 0x71, 0x50, 0x17, 0x6e, 0x2f, 0xe1, 0x61, 0x39,
-    0xa4, 0x64, 0x4b, 0x3e, 0x4d, 0xc1, 0x70, 0xda, 0x1a, 0xa6, 0x9c, 0x54, 0xac, 0xdc, 0x4d, 0x05, 0x64, 0x39, 0x07,
-    0x2a, 0x11, 0xcb, 0x0f, 0x8b, 0x95, 0x94, 0x35, 0x07, 0xdd, 0x6d, 0x46, 0xdb, 0xa9, 0x37, 0x33, 0x13, 0xa7, 0x25,
-    0x19, 0x5b, 0x89, 0x29, 0x0e, 0x5b, 0x5a, 0xcd, 0x16, 0x24, 0xbd, 0x5b, 0xb6, 0xf5, 0x8a, 0x67, 0x4e, 0xaa, 0xb2,
-    0xf0, 0xf4, 0x99, 0x9f, 0x93, 0x90, 0xa6, 0xb3, 0x6e, 0x95, 0xe7, 0xf9, 0x0c, 0xa0, 0xa0, 0x8e, 0xc9, 0x6a, 0xd3,
-    0x00, 0x0f, 0x14, 0xdb, 0x99, 0x99, 0x38, 0x50, 0x1b, 0xc6, 0x46, 0x28, 0x11, 0x2f, 0x66, 0x47, 0x77, 0xbc, 0x19,
-    0xa4, 0x77, 0x01, 0x42, 0x1a, 0x88, 0x6d, 0x30, 0xf3, 0x50, 0x11, 0xc6, 0xcf, 0xad, 0x57, 0xd7, 0x64, 0xd6, 0x95,
-    0x27, 0x80, 0x45, 0xab, 0xd1, 0x45, 0x6a, 0x06, 0x05, 0xc8, 0x14, 0xd9, 0x69, 0x30, 0xf4, 0x9a, 0xed, 0x01, 0x77,
-    0x17, 0x64, 0x7f, 0xa4, 0xce, 0x4b, 0xba, 0x9d, 0x7d, 0x5c, 0x09, 0xc9, 0xf2, 0x9d, 0xd3, 0x15, 0xe9, 0x29, 0x5c,
-    0x16, 0x28, 0xce, 0x0b, 0x20, 0xa5, 0x94, 0xcf, 0xb4, 0x0e, 0x87, 0x49, 0x5a, 0x89, 0x0e, 0xa7, 0x93, 0x18, 0x7d,
-    0x41, 0x1f, 0xca, 0xfa, 0x6f, 0xd4, 0xea, 0x2e, 0xee, 0x2b, 0xd2, 0x42, 0xd1, 0x70, 0x16, 0x35, 0x60, 0x5a, 0x4d,
-    0x9d, 0x11, 0x3c, 0xab, 0x6e, 0x4b, 0x09, 0x03, 0xcf, 0xc1, 0x4c, 0x5d, 0x7b, 0x8f, 0x78, 0xfb, 0xcd, 0x16, 0x89,
-    0xba, 0x64, 0x59, 0x47, 0xa7, 0x49, 0x90, 0x77, 0x82, 0xc7, 0x87, 0xc7, 0x8d, 0xd4, 0xde, 0x11, 0xea, 0x41, 0x3e,
-    0x26, 0xbe, 0xf7, 0x99, 0x27, 0x92, 0xe5, 0x79, 0xb0, 0xc8, 0x4f, 0x48, 0xa9, 0x12, 0x7a, 0x60, 0xdd, 0xad, 0x08,
-    0x06, 0x20, 0xe0, 0xf8, 0x6c, 0x60, 0x7e, 0x60, 0x3a, 0x2c, 0xf6, 0x67, 0x52, 0xf4, 0x55, 0x9d, 0xae, 0xda, 0xd2,
-    0xb6, 0x3e, 0x73, 0x75, 0x5f, 0x84, 0x57, 0xf7, 0x25, 0xae, 0xf7, 0x74, 0x89, 0xeb, 0x21, 0xd5, 0x14, 0xbd, 0xaa,
-    0xb7, 0x49, 0x4f, 0x17, 0x9b, 0x01, 0xfc, 0xf6, 0x5e, 0x84, 0xaf, 0x81, 0xff, 0xff, 0x52, 0xbb, 0x7e, 0x77, 0xe1,
-    0xfa, 0x82, 0xaa, 0xf5, 0x85, 0x15, 0xcb, 0x78, 0xa7, 0x9c, 0x87, 0x19, 0x94, 0x26, 0x86, 0x05, 0x5b, 0xfa, 0x7f,
-    0x04, 0xb4, 0xff, 0x89, 0x63, 0x78, 0xe9, 0x8f, 0xf1, 0x04, 0xe9, 0xc1, 0x40, 0x84, 0xc3, 0x31, 0x1a, 0x5d, 0x0d,
-    0xf0, 0xc0, 0x47, 0xaa, 0x1d, 0x1a, 0xa2, 0x11, 0x1e, 0x03, 0xc1, 0x10, 0x87, 0x23, 0xd8, 0x40, 0x81, 0x8f, 0xa3,
-    0x37, 0x41, 0x88, 0x87, 0x11, 0x50, 0x05, 0x1e, 0x0e, 0x03, 0x64, 0x68, 0x87, 0x38, 0x00, 0x71, 0x8a, 0x24, 0xac,
-    0x00, 0xe8, 0x34, 0xc4, 0xde, 0x08, 0xc4, 0x0d, 0xb1, 0x37, 0xc1, 0xe3, 0x21, 0x1a, 0xe3, 0x11, 0x40, 0x87, 0x07,
-    0x51, 0xe9, 0x44, 0xd8, 0x87, 0xed, 0x70, 0x48, 0xc6, 0x78, 0x10, 0x22, 0x3d, 0x18, 0x38, 0x46, 0x20, 0xc2, 0xc1,
-    0x9e, 0xff, 0x26, 0xc4, 0xc1, 0x08, 0xf4, 0x0e, 0x06, 0x97, 0x20, 0x76, 0x32, 0x40, 0x66, 0x34, 0xf0, 0x82, 0x82,
-    0xe8, 0x29, 0xd0, 0x82, 0xbf, 0x2f, 0x68, 0x00, 0x89, 0x8f, 0x42, 0x3c, 0x81, 0xd8, 0xf5, 0x15, 0xbf, 0x19, 0x0d,
-    0x6e, 0xbe, 0x8f, 0xbc, 0xdf, 0x8d, 0x59, 0xf8, 0xf7, 0xc5, 0xcc, 0x57, 0x08, 0xc0, 0x14, 0x74, 0x83, 0x1c, 0xa4,
-    0x07, 0xa3, 0x1b, 0x98, 0xc7, 0x57, 0x13, 0x34, 0x06, 0xae, 0xe1, 0x18, 0x4d, 0x50, 0xa4, 0xd0, 0x05, 0xf6, 0x81,
-    0x61, 0x72, 0x80, 0xe9, 0x0b, 0x61, 0x1c, 0xfc, 0x85, 0x61, 0x7c, 0xca, 0xa7, 0xbf, 0xb0, 0x4b, 0x7f, 0x46, 0x0a,
-    0x82, 0x76, 0x4c, 0xb7, 0x61, 0xb1, 0x6b, 0x3e, 0x0f, 0xa8, 0x2e, 0x0a, 0xde, 0xf6, 0xa1, 0x1b, 0x99, 0xc7, 0x85,
-    0x8f, 0x58, 0x96, 0x40, 0x57, 0x3f, 0x3f, 0x6b, 0xf5, 0x81, 0xd0, 0x3f, 0x1e, 0xc1, 0xec, 0x41, 0xe3, 0x6e, 0xce,
-    0x74, 0xa5, 0x9f, 0xdf, 0x14, 0x14, 0xbd, 0xbe, 0x7e, 0x07, 0x2f, 0x7f, 0x65, 0x89, 0x78, 0xbd, 0x81, 0x77, 0xcc,
-    0x1d, 0x92, 0xb5, 0xfa, 0x6a, 0xc0, 0xa1, 0x8d, 0x54, 0x53, 0x78, 0x3d, 0x41, 0x5d, 0x1f, 0x81, 0x31, 0x8e, 0x17,
-    0xed, 0xfc, 0x5d, 0x49, 0x89, 0xa0, 0x68, 0xc9, 0xd6, 0x14, 0x31, 0x09, 0x2d, 0x42, 0x45, 0x91, 0x64, 0x6a, 0x38,
-    0x31, 0x6a, 0x3a, 0x68, 0x77, 0xb5, 0x12, 0xd3, 0x28, 0x83, 0x25, 0x20, 0x66, 0xde, 0x75, 0xc4, 0x71, 0x11, 0x1a,
-    0xab, 0xae, 0xa9, 0x94, 0xd0, 0x4c, 0x28, 0xab, 0xc2, 0x79, 0xac, 0xde, 0x6e, 0x11, 0xd1, 0xef, 0x0c, 0x89, 0xbb,
-    0x61, 0x39, 0x53, 0xdf, 0x0c, 0xe6, 0xb1, 0xee, 0x22, 0x95, 0x04, 0xd5, 0xc8, 0x98, 0x0f, 0x1c, 0x7a, 0x56, 0x52,
-    0xbe, 0x84, 0x97, 0x56, 0x78, 0x4c, 0xd0, 0x57, 0xa4, 0xb4, 0xa8, 0x4b, 0xe8, 0x5b, 0x92, 0xeb, 0xeb, 0x1f, 0xff,
-    0xa1, 0xbe, 0x86, 0x28, 0x13, 0x4e, 0x9c, 0xf0, 0x0a, 0x60, 0x18, 0xd5, 0xa4, 0xe3, 0x1b, 0x0e, 0xcc, 0x77, 0x8d,
-    0x06, 0x5a, 0x78, 0xf0, 0x2f, 0x7b, 0x20, 0xe5, 0xdd, 0x71, 0xb3, 0x93, 0xa4, 0xff, 0xeb, 0x7e, 0xd4, 0x30, 0x89,
-    0xd5, 0xa2, 0x62, 0x72, 0x7e, 0x0d, 0x06, 0xc6, 0xae, 0x39, 0x00, 0xe7, 0x94, 0x03, 0x86, 0xb6, 0xe8, 0x78, 0x00,
-    0xec, 0x9f, 0x6f, 0x2e, 0xd1, 0x2f, 0x0d, 0x5c, 0x6e, 0x6a, 0xb0, 0xd7, 0x5e, 0x56, 0x54, 0x16, 0x75, 0x96, 0xbc,
-    0xfb, 0xf9, 0xfa, 0xe6, 0xe4, 0xf1, 0x4a, 0x13, 0x21, 0xca, 0x53, 0xf3, 0xbd, 0x65, 0x55, 0x4a, 0xd6, 0x90, 0x56,
-    0x6a, 0xb1, 0x8e, 0x8a, 0x8e, 0xa3, 0x47, 0xfa, 0x3c, 0x67, 0x25, 0x35, 0x4e, 0x75, 0x8c, 0xee, 0x1c, 0x7d, 0xce,
-    0xc6, 0xa3, 0xee, 0x47, 0x56, 0xba, 0xe6, 0x02, 0xb9, 0xe6, 0x36, 0xb9, 0xfa, 0x6b, 0xd4, 0xbf, 0x01, 0x14, 0xee,
+    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdd, 0x58, 0x6d, 0x6f, 0xdb, 0x38, 0x12, 0xfe, 0xde,
+    0x5f, 0x31, 0xa7, 0x36, 0x6b, 0x6b, 0x1b, 0x51, 0x22, 0xe5, 0xb7, 0xd8, 0x92, 0x16, 0x69, 0xae, 0x8b, 0x5d, 0xa0,
+    0xdd, 0x2d, 0x90, 0x6c, 0xef, 0x43, 0x51, 0x20, 0xb4, 0x34, 0xb2, 0xd8, 0x48, 0xa4, 0x4e, 0xa4, 0x5f, 0x52, 0xc3,
+    0xf7, 0xdb, 0x0f, 0x94, 0x6c, 0xc7, 0xe9, 0x35, 0x87, 0xeb, 0xe2, 0x0e, 0x87, 0xdd, 0x18, 0x21, 0x86, 0xe4, 0xcc,
+    0x70, 0xe6, 0xf1, 0x0c, 0x67, 0xcc, 0xe8, 0x2f, 0x99, 0x4a, 0xcd, 0x7d, 0x8d, 0x50, 0x98, 0xaa, 0x4c, 0x22, 0x3b,
+    0x42, 0xc9, 0xe5, 0x22, 0x46, 0x99, 0x44, 0x05, 0xf2, 0x2c, 0x89, 0x2a, 0x34, 0x1c, 0xd2, 0x82, 0x37, 0x1a, 0x4d,
+    0xfc, 0xdb, 0xcd, 0x8f, 0xde, 0x04, 0xfc, 0x24, 0x2a, 0x85, 0xbc, 0x83, 0x06, 0xcb, 0x58, 0xa4, 0x4a, 0x42, 0xd1,
+    0x60, 0x1e, 0x67, 0xdc, 0xf0, 0xa9, 0xa8, 0xf8, 0x02, 0x2d, 0x43, 0x2b, 0x26, 0x79, 0x85, 0xf1, 0x4a, 0xe0, 0xba,
+    0x56, 0x8d, 0x81, 0x54, 0x49, 0x83, 0xd2, 0xc4, 0xce, 0x5a, 0x64, 0xa6, 0x88, 0x33, 0x5c, 0x89, 0x14, 0xbd, 0x76,
+    0x72, 0x2e, 0xa4, 0x30, 0x82, 0x97, 0x9e, 0x4e, 0x79, 0x89, 0x31, 0x3d, 0x5f, 0x6a, 0x6c, 0xda, 0x09, 0x9f, 0x97,
+    0x18, 0x4b, 0xe5, 0xf8, 0x49, 0xa4, 0xd3, 0x46, 0xd4, 0x06, 0xac, 0xbd, 0x71, 0xa5, 0xb2, 0x65, 0x89, 0x89, 0xef,
+    0x73, 0xad, 0xd1, 0x68, 0x5f, 0xc8, 0x0c, 0x37, 0x64, 0x14, 0x86, 0x29, 0xe3, 0xe3, 0x9c, 0x7c, 0xd2, 0xcf, 0x32,
+    0x95, 0x2e, 0x2b, 0x94, 0x86, 0x94, 0x2a, 0xe5, 0x46, 0x28, 0x49, 0x34, 0xf2, 0x26, 0x2d, 0xe2, 0x38, 0x76, 0x7e,
+    0xd0, 0x7c, 0x85, 0xce, 0x77, 0xdf, 0xf5, 0x8f, 0x4c, 0x0b, 0x34, 0xaf, 0x4b, 0xb4, 0xa4, 0x7e, 0x75, 0x7f, 0xc3,
+    0x17, 0xbf, 0xf0, 0x0a, 0xfb, 0x0e, 0xd7, 0x22, 0x43, 0xc7, 0xfd, 0x10, 0x7c, 0x24, 0xda, 0xdc, 0x97, 0x48, 0x32,
+    0xa1, 0xeb, 0x92, 0xdf, 0xc7, 0xce, 0xbc, 0x54, 0xe9, 0x9d, 0xe3, 0xce, 0xf2, 0xa5, 0x4c, 0xad, 0x72, 0xd0, 0x7d,
+    0x74, 0xb7, 0x25, 0x1a, 0x30, 0xf1, 0x5b, 0x6e, 0x0a, 0x52, 0xf1, 0x4d, 0xbf, 0x23, 0x84, 0xec, 0xb3, 0xef, 0xfb,
+    0xf8, 0x92, 0x06, 0x81, 0x7b, 0xde, 0x0e, 0x81, 0xeb, 0xd3, 0x20, 0x98, 0x35, 0x68, 0x96, 0x8d, 0x04, 0xde, 0xbf,
+    0x8d, 0x6a, 0x6e, 0x0a, 0xc8, 0x62, 0xa7, 0xa2, 0x8c, 0x04, 0xc1, 0x04, 0xe8, 0x05, 0x61, 0x43, 0x8f, 0x52, 0x12,
+    0x7a, 0x74, 0x98, 0x8e, 0xbd, 0x21, 0xd0, 0x81, 0x37, 0x04, 0xc6, 0xc8, 0x10, 0x82, 0xcf, 0x0e, 0xe4, 0xa2, 0x2c,
+    0x63, 0x47, 0x2a, 0x89, 0x0e, 0x68, 0xd3, 0xa8, 0x3b, 0x8c, 0x9d, 0x74, 0xd9, 0x34, 0x28, 0xcd, 0x95, 0x2a, 0x55,
+    0xe3, 0xf8, 0xc9, 0x33, 0x78, 0xf4, 0xf7, 0xcd, 0x47, 0x98, 0x86, 0x4b, 0x9d, 0xab, 0xa6, 0x8a, 0x9d, 0xf6, 0x4b,
+    0xe9, 0xbf, 0xd8, 0x9a, 0x1d, 0xd8, 0xc1, 0x3d, 0xd9, 0xf4, 0x54, 0x23, 0x16, 0x42, 0xc6, 0x0e, 0x65, 0x40, 0x27,
+    0x8e, 0x9f, 0xdc, 0xba, 0xbb, 0x23, 0x26, 0xdc, 0x62, 0xb2, 0xf7, 0x52, 0xf5, 0x3f, 0xdc, 0x46, 0x7a, 0xb5, 0x80,
+    0x4d, 0x55, 0x4a, 0x1d, 0x3b, 0x85, 0x31, 0xf5, 0xd4, 0xf7, 0xd7, 0xeb, 0x35, 0x59, 0x87, 0x44, 0x35, 0x0b, 0x9f,
+    0x05, 0x41, 0xe0, 0xeb, 0xd5, 0xc2, 0x81, 0x2e, 0x3e, 0x1c, 0x36, 0x70, 0xa0, 0x40, 0xb1, 0x28, 0x4c, 0x4b, 0x27,
+    0x2f, 0xb6, 0xb8, 0x8b, 0x2c, 0x47, 0x72, 0xfb, 0xf1, 0xe4, 0x14, 0x71, 0x72, 0x0a, 0xfe, 0x70, 0x82, 0x66, 0xef,
+    0xad, 0x35, 0x6a, 0xcc, 0x19, 0x30, 0x08, 0xda, 0x0f, 0xf3, 0x2c, 0xbd, 0x9f, 0x79, 0x5f, 0xcc, 0xe0, 0x64, 0x06,
+    0x0c, 0x9e, 0x01, 0xb0, 0x6a, 0xe4, 0x5d, 0x1c, 0xc5, 0xa9, 0xdd, 0x5e, 0xd1, 0xe0, 0x61, 0xc1, 0xca, 0xfc, 0x34,
+    0x3a, 0x9d, 0x7b, 0xec, 0xbd, 0x65, 0xb0, 0xd8, 0x1f, 0x85, 0x3c, 0x56, 0xd0, 0xf7, 0x23, 0x3e, 0x84, 0xe1, 0x7e,
+    0x65, 0xe8, 0x59, 0xfa, 0x38, 0xb3, 0x27, 0xc1, 0x70, 0xc5, 0x0a, 0x5a, 0x79, 0x23, 0x6f, 0xc8, 0x43, 0x08, 0xf7,
+    0x26, 0x85, 0x10, 0xae, 0x58, 0x31, 0x7a, 0x3f, 0x3a, 0x5d, 0xf3, 0xc2, 0xcf, 0x3d, 0x0b, 0xf3, 0xd4, 0x71, 0x1e,
+    0x30, 0x50, 0xa7, 0x18, 0x90, 0x4f, 0x4a, 0xc8, 0xbe, 0xe3, 0xb8, 0xbb, 0x1c, 0x4d, 0x5a, 0xf4, 0x1d, 0x3f, 0x55,
+    0x32, 0x17, 0x0b, 0xf2, 0x49, 0x2b, 0xe9, 0xb8, 0xc4, 0x14, 0x28, 0xfb, 0x07, 0x51, 0x2b, 0x88, 0xed, 0x4e, 0xff,
+    0xcb, 0x1d, 0xe3, 0x6e, 0x8f, 0xf9, 0x61, 0x84, 0x29, 0x31, 0x36, 0xc4, 0x66, 0xf4, 0xf9, 0x71, 0x75, 0xae, 0xb2,
+    0xfb, 0x27, 0x52, 0xa7, 0xa0, 0x5d, 0xde, 0x08, 0x29, 0xb1, 0xb9, 0xc1, 0x8d, 0x89, 0x9d, 0xb7, 0x97, 0x57, 0x70,
+    0x99, 0x65, 0x0d, 0x6a, 0x3d, 0x05, 0xe7, 0xa5, 0x21, 0x15, 0x4f, 0xff, 0x73, 0x5d, 0xf4, 0x91, 0xae, 0xbf, 0x89,
+    0x1f, 0x05, 0xfc, 0x82, 0x66, 0xad, 0x9a, 0xbb, 0xbd, 0x36, 0x6b, 0xda, 0xcc, 0x66, 0x60, 0x13, 0x1b, 0xc2, 0x6b,
+    0x4d, 0x74, 0x29, 0x52, 0xec, 0x53, 0x97, 0x54, 0xbc, 0x7e, 0xf0, 0x4a, 0x1e, 0x80, 0xba, 0x8d, 0x32, 0xb1, 0x82,
+    0xb4, 0xe4, 0x5a, 0xc7, 0x8e, 0xec, 0x54, 0x39, 0xb0, 0x4f, 0x1b, 0x25, 0xd3, 0x52, 0xa4, 0x77, 0xb1, 0xf3, 0x95,
+    0x1b, 0xe2, 0xd5, 0xfd, 0xcf, 0x59, 0xbf, 0xa7, 0xb5, 0xc8, 0x7a, 0x2e, 0x59, 0xf1, 0x72, 0x89, 0x10, 0x83, 0x29,
+    0x84, 0x7e, 0x30, 0x70, 0xf6, 0xa4, 0x58, 0xad, 0xef, 0x7a, 0x2e, 0xc9, 0x55, 0xba, 0xd4, 0x7d, 0xd7, 0x39, 0x64,
+    0x69, 0xc4, 0xbb, 0x3b, 0xd4, 0x79, 0xee, 0x7c, 0x61, 0x91, 0x57, 0x62, 0x6e, 0x9c, 0x87, 0x6c, 0x7e, 0xb1, 0xd5,
+    0x7d, 0x49, 0x1a, 0xad, 0x85, 0xbb, 0x3b, 0x2e, 0x46, 0xba, 0xe6, 0xf2, 0x4b, 0x41, 0x6b, 0xa0, 0x4d, 0x1a, 0x49,
+    0x2c, 0x65, 0x33, 0xa7, 0xe6, 0xf2, 0x78, 0xa0, 0xcf, 0x0f, 0xe4, 0x8b, 0xad, 0xe8, 0x4b, 0x7b, 0x4b, 0xde, 0x1d,
+    0x35, 0x46, 0x7e, 0x26, 0x56, 0xc9, 0xed, 0xce, 0x7d, 0xf0, 0xe3, 0xef, 0x4b, 0x6c, 0xee, 0xaf, 0xb1, 0xc4, 0xd4,
+    0xa8, 0xa6, 0xef, 0x3c, 0x97, 0x68, 0x1c, 0xb7, 0x73, 0xf8, 0xa7, 0x9b, 0xb7, 0x6f, 0x62, 0xd5, 0x6f, 0xdc, 0xf3,
+    0xa7, 0xb8, 0x6d, 0xb5, 0xf8, 0xd0, 0x60, 0xf9, 0x8f, 0xb8, 0x67, 0xeb, 0x45, 0xef, 0xa3, 0xe3, 0x92, 0xd6, 0xdf,
+    0xdb, 0x87, 0xa2, 0x61, 0x13, 0xfb, 0xe5, 0xa6, 0x2a, 0xcf, 0xad, 0x87, 0xde, 0x68, 0xe8, 0xee, 0x6e, 0x77, 0xee,
+    0xce, 0x9d, 0x45, 0x7e, 0x77, 0xef, 0x27, 0x51, 0x7b, 0x05, 0x27, 0xdf, 0x6f, 0xe7, 0x6a, 0xe3, 0x69, 0xf1, 0x59,
+    0xc8, 0xc5, 0x54, 0xc8, 0x02, 0x1b, 0x61, 0x76, 0x99, 0x58, 0x9d, 0x0b, 0x59, 0x2f, 0xcd, 0xb6, 0xe6, 0x59, 0x66,
+    0x77, 0x86, 0xf5, 0x66, 0x96, 0x2b, 0x69, 0x2c, 0x27, 0x4e, 0x29, 0x56, 0xbb, 0x6e, 0xbf, 0xbd, 0x5b, 0xa6, 0x17,
+    0xc3, 0xb3, 0x9d, 0x0d, 0xb8, 0xad, 0xc1, 0x8d, 0xf1, 0x78, 0x29, 0x16, 0x72, 0x9a, 0xa2, 0x34, 0xd8, 0x74, 0x42,
+    0x39, 0xaf, 0x44, 0x79, 0x3f, 0xd5, 0x5c, 0x6a, 0x4f, 0x63, 0x23, 0xf2, 0xdd, 0x7c, 0x69, 0x8c, 0x92, 0xdb, 0xb9,
+    0x6a, 0x32, 0x6c, 0xa6, 0xc1, 0xac, 0x23, 0xbc, 0x86, 0x67, 0x62, 0xa9, 0xa7, 0x24, 0x6c, 0xb0, 0x9a, 0xcd, 0x79,
+    0x7a, 0xb7, 0x68, 0xd4, 0x52, 0x66, 0x5e, 0x6a, 0x6f, 0xe1, 0xe9, 0x73, 0x9a, 0xf3, 0x10, 0xd3, 0xd9, 0x7e, 0x96,
+    0xe7, 0xf9, 0xac, 0x14, 0x12, 0xbd, 0xee, 0x56, 0x9b, 0x32, 0x32, 0xb0, 0x62, 0x27, 0x66, 0x12, 0x66, 0x17, 0x3a,
+    0x1b, 0x69, 0x10, 0x9c, 0xcd, 0x0e, 0xee, 0x04, 0xb3, 0x74, 0xd9, 0x68, 0xd5, 0x4c, 0x6b, 0x25, 0xac, 0x99, 0xbb,
+    0x8a, 0x0b, 0x79, 0x6a, 0xbd, 0x0d, 0x93, 0xd9, 0xbe, 0x3c, 0x4d, 0x85, 0x6c, 0x8f, 0x69, 0x8b, 0xd4, 0xac, 0x12,
+    0xb2, 0x2b, 0xb2, 0x53, 0x36, 0x0a, 0xea, 0xcd, 0x8e, 0xec, 0x03, 0x64, 0x7b, 0xe0, 0xce, 0x4b, 0xdc, 0xcc, 0x3e,
+    0x2d, 0xb5, 0x11, 0xf9, 0xbd, 0xb7, 0x2f, 0xd2, 0x53, 0x5d, 0xf3, 0x14, 0xbd, 0x39, 0x9a, 0x35, 0xa2, 0x9c, 0xb5,
+    0x67, 0x78, 0xc2, 0x60, 0xa5, 0xf7, 0x38, 0x1d, 0xd5, 0xb4, 0x01, 0xfa, 0x58, 0xd7, 0xbf, 0xe3, 0xb6, 0xb1, 0xb8,
+    0xad, 0x78, 0xb3, 0x10, 0xd2, 0x9b, 0x2b, 0x63, 0x54, 0x35, 0xf5, 0xc6, 0xf5, 0x66, 0xb6, 0x5f, 0xb2, 0xca, 0xa6,
+    0xd4, 0x9a, 0xd9, 0xd6, 0xde, 0x03, 0xde, 0xb4, 0xde, 0x80, 0x56, 0xa5, 0xc8, 0xf6, 0x7c, 0x2d, 0x0b, 0x04, 0x47,
+    0x78, 0xe8, 0xb0, 0xde, 0x80, 0x5d, 0x3b, 0x40, 0x3d, 0xc8, 0x27, 0x9c, 0x06, 0x5f, 0xf9, 0x46, 0xb2, 0x3c, 0x67,
+    0xf3, 0xfc, 0x88, 0x94, 0x2d, 0xa1, 0x3b, 0xb1, 0x8f, 0x0a, 0x36, 0xa8, 0x37, 0xb3, 0xc3, 0x77, 0x33, 0xa8, 0x37,
+    0x3b, 0xd1, 0xa6, 0xc5, 0xf6, 0x44, 0x4b, 0x1b, 0xaa, 0xd3, 0x65, 0x53, 0xf6, 0x9d, 0xaf, 0x84, 0xee, 0x59, 0x78,
+    0xf5, 0x50, 0xe2, 0x7a, 0x4f, 0x97, 0xb8, 0x1e, 0xd8, 0xa6, 0xe8, 0x95, 0xda, 0xc4, 0xbd, 0xb6, 0xd8, 0x0c, 0x80,
+    0x0d, 0x7a, 0x67, 0xe1, 0xeb, 0xb3, 0xf0, 0xea, 0xbf, 0x52, 0xbb, 0x7e, 0x77, 0xe1, 0xfa, 0x86, 0xaa, 0xf5, 0x8d,
+    0x15, 0xab, 0xf3, 0xce, 0x3a, 0x7f, 0x16, 0xbe, 0x76, 0xdc, 0x9d, 0x20, 0x5a, 0x2c, 0xe8, 0xff, 0x02, 0xda, 0x7f,
+    0xc5, 0x31, 0xbc, 0xa4, 0x13, 0x72, 0x01, 0xed, 0xd0, 0x41, 0x44, 0xc2, 0x09, 0x8c, 0xaf, 0x06, 0x64, 0x40, 0xc1,
+    0xb6, 0x43, 0x23, 0x18, 0x93, 0xc9, 0x05, 0xd0, 0x11, 0x09, 0xc7, 0x40, 0x19, 0x30, 0x4a, 0x86, 0x6f, 0x58, 0x48,
+    0x46, 0x43, 0x18, 0x5f, 0xb1, 0x80, 0x84, 0x0c, 0x3a, 0xde, 0x11, 0x61, 0x0c, 0x42, 0xcb, 0x12, 0x56, 0x01, 0xb0,
+    0x34, 0x24, 0xc1, 0x18, 0x02, 0x18, 0x91, 0xe0, 0x82, 0x4c, 0x46, 0x30, 0x21, 0x63, 0x0a, 0x8c, 0x0c, 0x86, 0xa5,
+    0x37, 0x24, 0x14, 0x46, 0x24, 0x1c, 0xf1, 0x09, 0x19, 0x84, 0xd0, 0x0e, 0x1d, 0x1c, 0x63, 0xc2, 0x98, 0x47, 0x02,
+    0xfa, 0x26, 0x24, 0x6c, 0x0c, 0x63, 0x32, 0x18, 0x5c, 0xd2, 0x11, 0xb9, 0x18, 0x40, 0x37, 0x76, 0xf0, 0x52, 0x06,
+    0xc3, 0xa7, 0x40, 0x63, 0x7f, 0x5e, 0xd0, 0x42, 0xc2, 0x28, 0x84, 0xe4, 0x62, 0xc2, 0x6d, 0x5f, 0xca, 0xa0, 0x1b,
+    0x3b, 0xdc, 0x28, 0x85, 0xe0, 0x77, 0x63, 0x16, 0xfe, 0x79, 0x31, 0xa3, 0x16, 0x01, 0x46, 0x06, 0xe1, 0x25, 0x0d,
+    0xc9, 0x08, 0xda, 0xa1, 0x3b, 0x9b, 0x32, 0x98, 0x5c, 0x5d, 0xc0, 0x04, 0x46, 0x64, 0x34, 0x81, 0x0b, 0x18, 0x5a,
+    0x74, 0x2f, 0xc8, 0x64, 0xd0, 0x09, 0x79, 0x8c, 0x7c, 0x2b, 0x8c, 0x83, 0x3f, 0x30, 0x8c, 0x4f, 0xf9, 0xf4, 0x07,
+    0x76, 0xe9, 0xff, 0x71, 0x05, 0x45, 0x7e, 0xd7, 0x86, 0x45, 0x7e, 0xf7, 0x3c, 0x60, 0xbb, 0xa8, 0x24, 0xb2, 0xdd,
+    0x48, 0x12, 0x15, 0x14, 0x44, 0x16, 0x57, 0x3c, 0x4d, 0x4e, 0x5a, 0xfd, 0xc8, 0x2f, 0xe8, 0x61, 0xab, 0xa0, 0xc9,
+    0xa3, 0xc6, 0xbd, 0xdb, 0x6b, 0x2b, 0x7d, 0x72, 0x53, 0x20, 0xbc, 0xbe, 0x7e, 0x07, 0x6b, 0x51, 0x96, 0x20, 0xd5,
+    0x1a, 0x4c, 0x73, 0x0f, 0x46, 0xd9, 0x57, 0x03, 0x89, 0xa9, 0xb1, 0xa4, 0x29, 0x10, 0xf6, 0x7d, 0x04, 0x21, 0x24,
+    0x9a, 0x37, 0xc9, 0xbb, 0x12, 0xb9, 0x46, 0x58, 0x88, 0x15, 0x82, 0x30, 0xa0, 0x55, 0x85, 0x60, 0x84, 0x1d, 0x8e,
+    0x82, 0x2d, 0x5f, 0xe4, 0x77, 0x87, 0x74, 0x8d, 0xb2, 0xc8, 0x62, 0x89, 0x26, 0xd9, 0x77, 0xc4, 0x51, 0x11, 0x76,
+    0x56, 0x5d, 0xa3, 0x31, 0x42, 0x2e, 0xac, 0x55, 0x61, 0x12, 0xd9, 0x5f, 0xb7, 0xc0, 0xdb, 0xdf, 0x0c, 0xb1, 0xbf,
+    0x16, 0xb9, 0xb0, 0x6f, 0x06, 0x49, 0xd4, 0x76, 0x91, 0x56, 0x83, 0x6d, 0x64, 0xba, 0x07, 0x8e, 0x96, 0x2a, 0x51,
+    0x2e, 0x4c, 0x11, 0x87, 0x0c, 0xea, 0x92, 0xa7, 0x58, 0xa8, 0x32, 0xc3, 0x26, 0xbe, 0xbe, 0xfe, 0xf9, 0xaf, 0xf6,
+    0x35, 0xc4, 0x9a, 0x70, 0x94, 0xac, 0xf5, 0x5d, 0x27, 0x68, 0x89, 0xbd, 0xdc, 0x68, 0xd0, 0xbd, 0x6b, 0xd4, 0x5c,
+    0xeb, 0xb5, 0x6a, 0xb2, 0x47, 0x5a, 0xde, 0x1d, 0x16, 0xf7, 0x9a, 0xda, 0xff, 0xb6, 0x1f, 0xed, 0x84, 0xf4, 0x72,
+    0x5e, 0x09, 0x93, 0x5c, 0xf3, 0x15, 0x46, 0x7e, 0xb7, 0x91, 0x44, 0xbe, 0x75, 0xa0, 0xe3, 0x2d, 0xf6, 0x32, 0x05,
+    0x4d, 0x7e, 0xbd, 0xb9, 0x84, 0xdf, 0xea, 0x8c, 0x1b, 0xec, 0xb0, 0x6f, 0xbd, 0xac, 0xd0, 0x14, 0x2a, 0x8b, 0xdf,
+    0xfd, 0x7a, 0x7d, 0x73, 0xf4, 0x78, 0xd9, 0x32, 0x01, 0xca, 0xb4, 0x7b, 0x6f, 0x59, 0x96, 0x46, 0xd4, 0xbc, 0x31,
+    0xad, 0x5a, 0xcf, 0x66, 0xc7, 0xc1, 0xa3, 0x76, 0x3f, 0x17, 0x25, 0x76, 0x4e, 0xed, 0x05, 0xfd, 0x04, 0xbe, 0x66,
+    0xe3, 0xe1, 0xec, 0x2f, 0xac, 0xf4, 0xbb, 0x00, 0xf2, 0xbb, 0x68, 0xf2, 0xdb, 0xd7, 0xa8, 0x7f, 0x02, 0x14, 0xee,
     0xbc, 0x64, 0x9d, 0x12, 0x00, 0x00};
 
 }  // namespace captive_portal
diff --git a/esphome/components/web_server/server_index_v2.h b/esphome/components/web_server/server_index_v2.h
index 21beecfff7..31c2d1fd85 100644
--- a/esphome/components/web_server/server_index_v2.h
+++ b/esphome/components/web_server/server_index_v2.h
@@ -1,633 +1,636 @@
 #pragma once
 // Generated from https://github.com/esphome/esphome-webserver
+
 #ifdef USE_WEBSERVER_LOCAL
 #if USE_WEBSERVER_VERSION == 2
-#include "esphome/core/hal.h"
-namespace esphome {
 
+#include "esphome/core/hal.h"
+
+namespace esphome {
 namespace web_server {
 
 const uint8_t INDEX_GZ[] PROGMEM = {
-    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc5, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3,
+    0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xcd, 0x7d, 0xd9, 0x92, 0xdb, 0x46, 0xb6, 0xe0, 0xf3,
     0xdc, 0xaf, 0x40, 0xc1, 0xd5, 0x25, 0x64, 0x33, 0x89, 0x22, 0x59, 0xda, 0x0c, 0x56, 0x92, 0x5d, 0x2a, 0xc9, 0x2d,
     0xbb, 0xb5, 0xd8, 0x2a, 0xc9, 0x6e, 0x9b, 0x66, 0x57, 0xa1, 0x88, 0x24, 0x99, 0x16, 0x88, 0xa4, 0x13, 0xc9, 0x5a,
     0x4c, 0xe2, 0xc6, 0x7c, 0xc0, 0x44, 0x4c, 0xc4, 0x3c, 0xcd, 0xcb, 0xc4, 0xdc, 0x87, 0xf9, 0x88, 0x79, 0xbe, 0x9f,
-    0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x3b, 0xa1, 0x90, 0x44, 0xe4,
-    0x7a, 0xf2, 0xe4, 0xc9, 0xb3, 0x27, 0x70, 0xbc, 0x97, 0xf0, 0x91, 0xbc, 0x9d, 0x53, 0x6f, 0x2a, 0x67, 0x69, 0xef,
-    0xd8, 0xfc, 0x4b, 0xe3, 0xa4, 0x77, 0x9c, 0xb2, 0xec, 0xa3, 0x27, 0x68, 0x4a, 0xd8, 0x88, 0x67, 0xde, 0x54, 0xd0,
-    0x31, 0x49, 0x62, 0x19, 0x47, 0x6c, 0x16, 0x4f, 0xa8, 0x77, 0xd8, 0x3b, 0x9e, 0x51, 0x19, 0x7b, 0xa3, 0x69, 0x2c,
-    0x72, 0x2a, 0xc9, 0x87, 0xf7, 0x5f, 0x34, 0x9f, 0xf6, 0x8e, 0xf3, 0x91, 0x60, 0x73, 0xe9, 0xc1, 0x90, 0x64, 0xc6,
-    0x93, 0x45, 0x4a, 0x7b, 0x87, 0x87, 0xd7, 0xd7, 0xd7, 0xe1, 0x4f, 0xf9, 0x3f, 0x8d, 0x78, 0x96, 0x4b, 0xef, 0x15,
-    0xb9, 0x66, 0x59, 0xc2, 0xaf, 0x31, 0x95, 0xe4, 0x55, 0x78, 0x36, 0x8d, 0x13, 0x7e, 0xfd, 0x8e, 0x73, 0x79, 0x70,
-    0x10, 0xe8, 0xc7, 0xdb, 0xd3, 0xb3, 0x33, 0x42, 0xc8, 0x15, 0x67, 0x89, 0xd7, 0x5a, 0xad, 0xaa, 0xc2, 0x30, 0x8b,
-    0x25, 0xbb, 0xa2, 0xba, 0x0b, 0x3a, 0x38, 0xf0, 0xe3, 0x84, 0xcf, 0x25, 0x4d, 0xce, 0xe4, 0x6d, 0x4a, 0xcf, 0xa6,
-    0x94, 0xca, 0xdc, 0x67, 0x99, 0xf7, 0x9c, 0x8f, 0x16, 0x33, 0x9a, 0xc9, 0x70, 0x2e, 0xb8, 0xe4, 0x00, 0xc9, 0xc1,
-    0x81, 0x2f, 0xe8, 0x3c, 0x8d, 0x47, 0x14, 0xea, 0x4f, 0xcf, 0xce, 0xaa, 0x1e, 0x55, 0x23, 0xcc, 0x24, 0x39, 0xbb,
-    0x9d, 0x5d, 0xf2, 0x34, 0x40, 0x38, 0x95, 0x24, 0xa3, 0xd7, 0xde, 0x77, 0x34, 0xfe, 0xf8, 0x3a, 0x9e, 0x77, 0x47,
-    0x69, 0x9c, 0xe7, 0xde, 0xa5, 0x5c, 0xaa, 0x25, 0x88, 0xc5, 0x48, 0x72, 0x11, 0x48, 0x4c, 0x31, 0x43, 0x4b, 0x36,
-    0x0e, 0xe4, 0x94, 0xe5, 0xe1, 0xf9, 0xfe, 0x28, 0xcf, 0xdf, 0xd1, 0x7c, 0x91, 0xca, 0x7d, 0xb2, 0xd7, 0xc2, 0x6c,
-    0x8f, 0x10, 0x26, 0x91, 0x9c, 0x0a, 0x7e, 0xed, 0xbd, 0x10, 0x82, 0x8b, 0xc0, 0x3f, 0x3d, 0x3b, 0xd3, 0x2d, 0x3c,
-    0x96, 0x7b, 0x19, 0x97, 0x5e, 0x39, 0x5e, 0x7c, 0x99, 0xd2, 0xd0, 0xfb, 0x90, 0x53, 0xef, 0x62, 0x91, 0xe5, 0xf1,
-    0x98, 0x9e, 0x9e, 0x9d, 0x5d, 0x78, 0x5c, 0x78, 0x17, 0xa3, 0x3c, 0xbf, 0xf0, 0x58, 0x96, 0x4b, 0x1a, 0x27, 0xa1,
-    0x8f, 0xba, 0x6a, 0xb2, 0x51, 0x9e, 0xbf, 0xa7, 0x37, 0x92, 0x48, 0xac, 0x1e, 0x25, 0xa1, 0xc5, 0x84, 0x4a, 0x2f,
-    0x2f, 0xd7, 0x15, 0xa0, 0x65, 0x4a, 0xa5, 0x27, 0x89, 0xaa, 0xe7, 0x5d, 0x8d, 0x7b, 0xaa, 0x1f, 0x65, 0x97, 0x8d,
-    0x03, 0x2a, 0x0f, 0x0e, 0x64, 0x89, 0x67, 0xa4, 0x97, 0xe6, 0x31, 0x42, 0xf7, 0x6c, 0xd9, 0xc1, 0x01, 0x0d, 0x53,
-    0x9a, 0x4d, 0xe4, 0x94, 0x10, 0xd2, 0xee, 0xb2, 0x83, 0x83, 0x40, 0x92, 0x54, 0x86, 0x13, 0x2a, 0x03, 0x8a, 0x10,
-    0xae, 0x7a, 0x1f, 0x1c, 0x04, 0x1a, 0x09, 0x9c, 0x68, 0xc4, 0xd5, 0x70, 0x8c, 0x42, 0x83, 0xfd, 0xb3, 0xdb, 0x6c,
-    0x14, 0xb8, 0xf0, 0x23, 0xcc, 0x0e, 0x0e, 0x52, 0x19, 0xe6, 0x30, 0x22, 0x96, 0x08, 0x15, 0x82, 0xca, 0x85, 0xc8,
-    0x3c, 0x59, 0x48, 0x7e, 0x26, 0x05, 0xcb, 0x26, 0x01, 0x5a, 0xda, 0x32, 0xa7, 0x63, 0x51, 0x68, 0x70, 0xbf, 0x96,
-    0x44, 0x90, 0x1e, 0xcc, 0x78, 0x29, 0x03, 0xd8, 0x45, 0x3e, 0xf6, 0x04, 0x21, 0x7e, 0xae, 0xfa, 0xfa, 0x7d, 0x11,
-    0x89, 0x86, 0xef, 0x63, 0x0d, 0x25, 0x66, 0x12, 0xe1, 0x8f, 0x24, 0x10, 0x38, 0x0c, 0x43, 0x89, 0x48, 0x6f, 0x69,
-    0xb1, 0x22, 0x9c, 0x75, 0xf6, 0xc5, 0xa0, 0x35, 0x8c, 0x64, 0x28, 0x68, 0xb2, 0x18, 0xd1, 0x20, 0x60, 0x38, 0xc7,
-    0x19, 0x22, 0x3d, 0xd6, 0x08, 0x38, 0xe9, 0xc1, 0x76, 0xf3, 0xfa, 0x5e, 0x13, 0xb2, 0xd7, 0x42, 0x06, 0x46, 0x6e,
-    0x01, 0x04, 0x0c, 0x1b, 0x78, 0x38, 0x21, 0x7e, 0xb6, 0x98, 0x5d, 0x52, 0xe1, 0x97, 0xcd, 0xba, 0x35, 0xb2, 0x58,
-    0xe4, 0xd4, 0x1b, 0xe5, 0xb9, 0x37, 0x5e, 0x64, 0x23, 0xc9, 0x78, 0xe6, 0xf9, 0x0d, 0xde, 0xf0, 0x35, 0x39, 0x94,
-    0xd4, 0xe0, 0xa3, 0x02, 0x05, 0x39, 0x6a, 0x88, 0x41, 0xd6, 0x68, 0x0f, 0x31, 0x40, 0x89, 0xba, 0x66, 0x3c, 0x83,
-    0x00, 0x8a, 0x05, 0xac, 0xb1, 0xc0, 0x1f, 0x24, 0xac, 0x52, 0x2d, 0x91, 0xca, 0xbe, 0x08, 0x37, 0x0f, 0x0a, 0x91,
-    0xe1, 0x2c, 0x9e, 0x07, 0x94, 0xf4, 0xa8, 0x22, 0xae, 0x38, 0x1b, 0x01, 0xac, 0xb5, 0x7d, 0xeb, 0xd3, 0x88, 0x86,
-    0x15, 0x49, 0xa1, 0x48, 0x86, 0x63, 0x2e, 0x5e, 0xc4, 0xa3, 0x29, 0xf4, 0x2b, 0x09, 0x26, 0xb1, 0xe7, 0x6d, 0x24,
-    0x68, 0x2c, 0xe9, 0x8b, 0x94, 0xc2, 0x53, 0xe0, 0xab, 0x9e, 0x3e, 0xc2, 0x39, 0x79, 0x15, 0xa6, 0x4c, 0xbe, 0xe1,
-    0xd9, 0x88, 0x76, 0x73, 0x87, 0xba, 0x18, 0xec, 0xfb, 0x89, 0x94, 0x82, 0x5d, 0x2e, 0x24, 0x0d, 0xfc, 0x0c, 0x5a,
-    0xf8, 0x38, 0x47, 0x98, 0x85, 0x92, 0xde, 0xc8, 0x53, 0x9e, 0x49, 0x9a, 0x49, 0x42, 0x2d, 0x52, 0xb1, 0x08, 0xe3,
-    0xf9, 0x9c, 0x66, 0xc9, 0xe9, 0x94, 0xa5, 0x49, 0xc0, 0x50, 0x81, 0x0a, 0x1c, 0x4b, 0x02, 0x6b, 0x24, 0x3d, 0x11,
-    0xc1, 0x3f, 0xbb, 0x57, 0x13, 0x48, 0xd2, 0x53, 0x87, 0x82, 0x12, 0xdf, 0xef, 0x8e, 0xb9, 0x08, 0xcc, 0x0a, 0x3c,
-    0x3e, 0xf6, 0x24, 0xcc, 0xf1, 0x6e, 0x91, 0xd2, 0x1c, 0xd1, 0x06, 0x61, 0xe5, 0x36, 0x1a, 0x04, 0x7f, 0x0d, 0x14,
-    0x5f, 0xa0, 0x40, 0xa0, 0x48, 0x74, 0xaf, 0x62, 0xe1, 0x7d, 0x61, 0x4e, 0xd4, 0x4f, 0x96, 0x9b, 0x4d, 0x25, 0xf9,
-    0x29, 0x94, 0x62, 0x91, 0x4b, 0x9a, 0xbc, 0xbf, 0x9d, 0xd3, 0x1c, 0xbf, 0x94, 0x64, 0x2a, 0xfb, 0x53, 0x19, 0xd2,
-    0xd9, 0x5c, 0xde, 0x9e, 0x29, 0xc6, 0x18, 0xf9, 0x3e, 0x1e, 0x41, 0x4b, 0x41, 0xe3, 0x11, 0x30, 0x33, 0x83, 0xad,
-    0xaf, 0x79, 0x7a, 0x3b, 0x66, 0x69, 0x7a, 0xb6, 0x98, 0xcf, 0xb9, 0x90, 0xf8, 0xaf, 0x64, 0x29, 0x79, 0x85, 0x1a,
-    0xd8, 0xcb, 0x65, 0x7e, 0xcd, 0xe4, 0x68, 0x1a, 0x48, 0xb4, 0x1c, 0xc5, 0x39, 0xf5, 0x9e, 0x71, 0x9e, 0xd2, 0x38,
-    0x8b, 0x04, 0x11, 0xfd, 0x97, 0x32, 0xca, 0x16, 0x69, 0xda, 0xbd, 0x14, 0x34, 0xfe, 0xd8, 0x55, 0xd5, 0x6f, 0x2f,
-    0x7f, 0xa2, 0x23, 0x19, 0xa9, 0xdf, 0x27, 0x42, 0xc4, 0xb7, 0xd0, 0x90, 0x10, 0x68, 0xd6, 0x17, 0xd1, 0x57, 0x67,
-    0x6f, 0xdf, 0x84, 0xfa, 0x90, 0xb0, 0xf1, 0x6d, 0x20, 0xca, 0x83, 0x27, 0x0a, 0x3c, 0x16, 0x7c, 0xb6, 0x36, 0xb5,
-    0xc6, 0x9a, 0xe8, 0xee, 0x00, 0x81, 0x12, 0xb1, 0xa7, 0x87, 0x76, 0x21, 0x78, 0xa3, 0x68, 0x1e, 0x2a, 0x89, 0x99,
-    0x17, 0xfe, 0x89, 0x74, 0x71, 0x20, 0xd0, 0xdd, 0xd0, 0x4a, 0x71, 0xbb, 0xa4, 0x44, 0xc1, 0x39, 0x07, 0x09, 0x03,
-    0x30, 0x8e, 0x62, 0x39, 0x9a, 0x2e, 0xa9, 0x1a, 0xac, 0xb0, 0x10, 0xd3, 0xa2, 0xc0, 0xd7, 0x25, 0xbd, 0xcb, 0x3d,
-    0x42, 0x84, 0x62, 0x54, 0x44, 0xae, 0x56, 0x82, 0x10, 0x81, 0xf0, 0x77, 0x64, 0x19, 0xdb, 0xf5, 0x44, 0x7b, 0x2d,
-    0x0c, 0xe7, 0x32, 0xd2, 0xdc, 0x05, 0x8f, 0x78, 0x76, 0x45, 0x85, 0xa4, 0x22, 0xfa, 0x2b, 0x16, 0x74, 0x9c, 0x02,
-    0x14, 0x7b, 0x6d, 0x3c, 0x8d, 0xf3, 0xd3, 0x69, 0x9c, 0x4d, 0x68, 0x12, 0x5d, 0xcb, 0x02, 0xff, 0x9d, 0xf8, 0x63,
-    0x96, 0xc5, 0x29, 0xfb, 0x85, 0x26, 0xbe, 0x91, 0x06, 0x27, 0x1e, 0xbd, 0x91, 0x34, 0x4b, 0x72, 0xef, 0xe5, 0xfb,
-    0xd7, 0xaf, 0xcc, 0x3e, 0xd6, 0x04, 0x04, 0x5a, 0xe6, 0x8b, 0x39, 0x15, 0x01, 0xc2, 0x46, 0x40, 0xbc, 0x60, 0x8a,
-    0x39, 0xbe, 0x8e, 0xe7, 0xba, 0x84, 0xe5, 0x1f, 0xe6, 0x49, 0x2c, 0xe9, 0xd7, 0x34, 0x4b, 0x58, 0x36, 0x21, 0x7b,
-    0x6d, 0x5d, 0x3e, 0x8d, 0x4d, 0x45, 0x52, 0x16, 0x9d, 0xef, 0xbf, 0x48, 0xd5, 0xba, 0xcb, 0xc7, 0x45, 0x80, 0x8a,
-    0x5c, 0xc6, 0x92, 0x8d, 0xbc, 0x38, 0x49, 0xbe, 0xcc, 0x98, 0x64, 0x0a, 0x40, 0x01, 0xdb, 0x03, 0x24, 0x4a, 0xb5,
-    0xa8, 0xb0, 0x80, 0x07, 0x08, 0x07, 0x81, 0x11, 0x00, 0x53, 0x64, 0xf6, 0xeb, 0xe0, 0xa0, 0x62, 0xf7, 0x7d, 0x1a,
-    0xe9, 0x4a, 0x32, 0x18, 0xa2, 0x70, 0xbe, 0xc8, 0x61, 0xa3, 0xed, 0x14, 0x20, 0x5d, 0xf8, 0x65, 0x4e, 0xc5, 0x15,
-    0x4d, 0x4a, 0xe2, 0xc8, 0x03, 0xb4, 0x5c, 0x9b, 0xc3, 0x1c, 0x0b, 0x49, 0x06, 0xc3, 0xae, 0xcb, 0xb7, 0xa9, 0xa1,
-    0x73, 0xc1, 0xe7, 0x54, 0x48, 0x46, 0xf3, 0x92, 0x95, 0x04, 0x20, 0x45, 0x4b, 0x76, 0x92, 0x13, 0xbb, 0xbe, 0x79,
-    0xc0, 0x30, 0x45, 0x35, 0x86, 0x61, 0x05, 0xed, 0x8b, 0x2b, 0x25, 0x31, 0x72, 0xcc, 0x10, 0x96, 0x1a, 0xd2, 0x1c,
-    0xa1, 0x02, 0x61, 0x69, 0xc1, 0xd5, 0xac, 0xc8, 0xcc, 0x76, 0x0b, 0xa2, 0x9a, 0x7c, 0xa7, 0x44, 0x35, 0x30, 0xb4,
-    0x58, 0xd2, 0x83, 0x83, 0x80, 0x86, 0x25, 0x51, 0x90, 0xbd, 0xb6, 0xd9, 0x23, 0x07, 0x59, 0x3b, 0xc0, 0x86, 0x89,
-    0x25, 0xa6, 0x08, 0xef, 0xd1, 0x30, 0xe3, 0x27, 0xa3, 0x11, 0xcd, 0x73, 0x2e, 0x0e, 0x0e, 0xf6, 0x54, 0xfb, 0x52,
-    0x9b, 0x80, 0x3d, 0x7c, 0x7b, 0x9d, 0x55, 0x10, 0xa0, 0x4a, 0xc2, 0x1a, 0xb9, 0x20, 0x41, 0x4e, 0x29, 0x85, 0xc3,
-    0xef, 0x5b, 0xc5, 0x23, 0xf2, 0xcf, 0xcf, 0xfd, 0x86, 0xc4, 0x06, 0x0d, 0x13, 0x6a, 0xa7, 0xbe, 0x7d, 0x4e, 0xb5,
-    0x6a, 0xa5, 0x14, 0x8f, 0x0d, 0xcc, 0xe8, 0xf3, 0x13, 0x26, 0x74, 0xcc, 0x32, 0x67, 0xd9, 0x35, 0x90, 0xb0, 0xc4,
-    0x39, 0x2a, 0x9c, 0x0d, 0xdd, 0x3a, 0xb4, 0xd2, 0x69, 0xf4, 0xce, 0x2d, 0x27, 0x4a, 0x8f, 0x70, 0xb6, 0x71, 0x40,
-    0x87, 0x05, 0x56, 0xa8, 0xb7, 0xab, 0xc9, 0x14, 0xa0, 0x03, 0x39, 0xec, 0x9a, 0x7a, 0x92, 0x6b, 0xcc, 0x09, 0xfa,
-    0xf3, 0x82, 0xe6, 0x52, 0xd3, 0x71, 0x20, 0x71, 0x86, 0x19, 0x2a, 0xe0, 0xb8, 0x8d, 0xd9, 0x64, 0x21, 0x40, 0xdd,
-    0x81, 0xa3, 0x48, 0xb3, 0xc5, 0x8c, 0xda, 0xa7, 0x6d, 0xb0, 0xbd, 0x9d, 0x83, 0x40, 0xcc, 0x81, 0xa6, 0xef, 0x26,
-    0x27, 0x80, 0x55, 0xa2, 0xd5, 0xea, 0x3b, 0x3b, 0x48, 0xb5, 0x95, 0xa5, 0x8a, 0xb6, 0xb6, 0x27, 0x7f, 0x47, 0x46,
-    0x1e, 0xef, 0xb5, 0x35, 0xf4, 0x7f, 0x1f, 0x92, 0xbd, 0x56, 0x49, 0xc1, 0x06, 0xa7, 0x1a, 0x18, 0x8d, 0xc2, 0xb7,
-    0x7a, 0x20, 0xa4, 0xa4, 0x7b, 0x8d, 0x58, 0xc2, 0xe9, 0x06, 0x9d, 0x4e, 0xc9, 0x00, 0xf4, 0x8c, 0x70, 0x3a, 0xdc,
-    0x45, 0x4c, 0x96, 0x1b, 0x04, 0x72, 0xb3, 0xae, 0x62, 0x1a, 0x57, 0x75, 0xa6, 0xb1, 0xb6, 0x08, 0x7f, 0x5e, 0x76,
-    0xf1, 0x4b, 0x1a, 0x33, 0xc7, 0xbc, 0xaa, 0xc2, 0x4c, 0x01, 0x53, 0x2d, 0xc9, 0x19, 0xe2, 0x4d, 0x3c, 0xa3, 0x79,
-    0x40, 0x11, 0xde, 0xd5, 0x40, 0x13, 0x27, 0x34, 0x19, 0x3a, 0x62, 0x33, 0x07, 0xb1, 0xc9, 0x90, 0xd6, 0xca, 0xea,
-    0xc7, 0x2d, 0xc7, 0x74, 0x90, 0x0f, 0x2b, 0x65, 0xce, 0x59, 0xbc, 0x92, 0xc7, 0x86, 0xba, 0x2d, 0xfe, 0x74, 0x99,
-    0x46, 0x9a, 0x52, 0x1a, 0x72, 0x84, 0xf7, 0x5a, 0xeb, 0xfb, 0x68, 0x5b, 0x55, 0x6b, 0x1c, 0x0c, 0x61, 0x1f, 0x94,
-    0xb8, 0x08, 0x59, 0xae, 0xfe, 0xaf, 0x9d, 0x33, 0x40, 0xdb, 0x19, 0x90, 0x45, 0x38, 0x4e, 0x63, 0x19, 0xb4, 0x0f,
-    0x5b, 0xa0, 0x89, 0x5e, 0x51, 0x90, 0x26, 0x08, 0x6d, 0x2e, 0x85, 0x86, 0x8b, 0x2c, 0x9f, 0xb2, 0xb1, 0x0c, 0x62,
-    0xa9, 0x18, 0x0a, 0x4d, 0x73, 0xea, 0xc9, 0x9a, 0x3e, 0xac, 0x98, 0x4d, 0x0c, 0xa4, 0x56, 0x2a, 0x5f, 0xd4, 0x42,
-    0xaa, 0x98, 0x16, 0xf0, 0x86, 0x4a, 0x97, 0xae, 0x78, 0x8c, 0x6d, 0xcd, 0x40, 0x5f, 0x6c, 0xf7, 0xf5, 0x88, 0x91,
-    0x61, 0x05, 0xcc, 0x51, 0x59, 0x59, 0xe4, 0xf2, 0x07, 0x53, 0x28, 0x43, 0xc9, 0x5f, 0xf1, 0x6b, 0x2a, 0x4e, 0x63,
-    0x00, 0x3e, 0xd2, 0xdd, 0x0b, 0x2d, 0x06, 0x14, 0xb7, 0x97, 0x5d, 0x4b, 0x2f, 0xe7, 0x6a, 0xe1, 0x5f, 0x0b, 0x3e,
-    0x63, 0x39, 0x05, 0x4d, 0x4d, 0xe3, 0x3f, 0x83, 0x53, 0xa6, 0x8e, 0x23, 0x88, 0x1a, 0x5a, 0xd2, 0xd7, 0xc9, 0xab,
-    0x3a, 0x7d, 0x9d, 0xef, 0xbf, 0x98, 0x58, 0xf6, 0x57, 0x3f, 0xc4, 0x08, 0x07, 0xc6, 0x9e, 0x70, 0xa4, 0x5c, 0x38,
-    0x45, 0x46, 0xbc, 0xaf, 0x56, 0xd2, 0x31, 0xdb, 0x6a, 0xba, 0x22, 0xd5, 0xc7, 0x06, 0x15, 0x71, 0x92, 0x80, 0x56,
-    0x27, 0x78, 0x9a, 0x3a, 0x82, 0x0a, 0xb3, 0x6e, 0x29, 0x9a, 0xce, 0xf7, 0x5f, 0x9c, 0xdd, 0x25, 0x9d, 0xa0, 0xde,
-    0x15, 0x50, 0x16, 0xd0, 0x2c, 0xa1, 0x02, 0xcc, 0x48, 0x67, 0xb7, 0x8c, 0x8c, 0x3d, 0xe5, 0x59, 0x46, 0x47, 0x92,
-    0x26, 0x60, 0xa5, 0x30, 0x22, 0xc3, 0x29, 0xcf, 0x65, 0x59, 0x58, 0x41, 0xcf, 0x1c, 0xe8, 0x59, 0x38, 0x8a, 0xd3,
-    0x34, 0xd0, 0x16, 0xc9, 0x8c, 0x5f, 0xd1, 0x2d, 0x50, 0x77, 0x6b, 0x20, 0x97, 0xc3, 0x50, 0x67, 0x18, 0x1a, 0xe6,
-    0xf3, 0x94, 0x8d, 0x68, 0x29, 0xb8, 0xce, 0x42, 0x96, 0x25, 0xf4, 0x06, 0xf8, 0x08, 0xea, 0xf5, 0x7a, 0x2d, 0xdc,
-    0x46, 0x85, 0x46, 0xf8, 0x72, 0x03, 0xb1, 0x77, 0x88, 0x4c, 0x20, 0x32, 0xd2, 0x5b, 0x6e, 0xe3, 0x07, 0x14, 0x39,
-    0x72, 0x92, 0x59, 0xcb, 0x4a, 0xf3, 0x66, 0x84, 0x13, 0x9a, 0x52, 0x49, 0x2d, 0x2f, 0x07, 0xfd, 0x59, 0x1f, 0xdd,
-    0x77, 0x25, 0xfe, 0x4a, 0x72, 0xb2, 0xa7, 0xcc, 0xee, 0x79, 0x5e, 0x5a, 0xea, 0xd5, 0xf6, 0x54, 0xd8, 0xee, 0x4b,
-    0xbd, 0x3d, 0xb1, 0x94, 0xf1, 0x68, 0xaa, 0x4d, 0xf4, 0x60, 0x63, 0x49, 0xd5, 0x18, 0x86, 0xaf, 0x97, 0x87, 0xe8,
-    0x83, 0x05, 0x73, 0x1b, 0x0a, 0xce, 0x0c, 0x53, 0xa0, 0x60, 0xf5, 0xe9, 0x6d, 0x3b, 0x8d, 0xd3, 0xf4, 0x32, 0x1e,
-    0x7d, 0xac, 0x53, 0x7f, 0x45, 0x06, 0x64, 0x9d, 0x1b, 0x3b, 0x55, 0x0e, 0xcb, 0x72, 0xd7, 0x6d, 0xb9, 0x74, 0xed,
-    0xa0, 0x04, 0x7b, 0xad, 0x8a, 0xec, 0xeb, 0x1b, 0xbd, 0x93, 0xda, 0x15, 0x44, 0xcc, 0xac, 0x2c, 0x00, 0x2e, 0xf0,
-    0x49, 0x8a, 0xb3, 0xfc, 0xc0, 0xd0, 0x1d, 0xd8, 0x1a, 0xc5, 0x1a, 0x20, 0x12, 0x2d, 0x8b, 0x84, 0xe5, 0xbb, 0x31,
-    0xf0, 0x87, 0x40, 0xf9, 0xdc, 0x99, 0xe1, 0xbe, 0x80, 0x96, 0x3c, 0xce, 0xa8, 0xcc, 0x25, 0x64, 0x46, 0x9b, 0xb0,
-    0x8c, 0xe6, 0x6f, 0xa0, 0xb9, 0x28, 0x7a, 0x7f, 0xab, 0xab, 0x40, 0x27, 0x03, 0x28, 0xf2, 0xae, 0xab, 0x4c, 0xd4,
-    0x28, 0xc0, 0xf0, 0x54, 0xa6, 0x44, 0x6e, 0x56, 0x33, 0x1e, 0x8d, 0xba, 0xae, 0xed, 0x6f, 0xc3, 0x72, 0x39, 0x09,
-    0x82, 0x20, 0x07, 0xfb, 0xcd, 0xea, 0xf5, 0xd5, 0x22, 0xf2, 0x8d, 0x45, 0xe4, 0xa1, 0x63, 0x64, 0xa1, 0x8a, 0x96,
-    0x9d, 0xee, 0xd1, 0x5f, 0x91, 0xdb, 0x08, 0x94, 0xd5, 0x10, 0xf8, 0x33, 0x2a, 0xd9, 0x6d, 0x4a, 0x24, 0xe6, 0xc6,
-    0xc0, 0x31, 0x94, 0x06, 0x0c, 0xa3, 0xea, 0x92, 0x21, 0x7d, 0x34, 0x6a, 0xc6, 0x6e, 0x86, 0x39, 0x5a, 0xd3, 0xec,
-    0x8b, 0xc2, 0xe0, 0x88, 0x22, 0xb3, 0x37, 0x35, 0x95, 0xd8, 0xc1, 0x0a, 0xce, 0x88, 0x51, 0x83, 0xb5, 0xd6, 0xb3,
-    0x8e, 0x9b, 0x72, 0x5c, 0x38, 0xa8, 0x15, 0x6a, 0x6a, 0xfa, 0xa4, 0x55, 0xac, 0x32, 0x84, 0xa7, 0x56, 0x23, 0xe5,
-    0xd5, 0xba, 0x09, 0xf1, 0xad, 0x37, 0xc2, 0xef, 0x2f, 0x6b, 0x26, 0x61, 0xe4, 0x34, 0x2b, 0x22, 0x60, 0xa9, 0x7c,
-    0x1b, 0xba, 0xb7, 0xd1, 0x4c, 0x6d, 0x1c, 0x07, 0xe1, 0xdc, 0x45, 0xb8, 0x83, 0xd9, 0x4c, 0x73, 0xae, 0x6c, 0x48,
-    0xa6, 0xf5, 0xbe, 0x01, 0xc5, 0x5c, 0xef, 0xc3, 0x06, 0x12, 0xd7, 0x15, 0x4f, 0x45, 0x82, 0x60, 0xc0, 0xe6, 0xa0,
-    0xdc, 0xb9, 0xf2, 0x21, 0x00, 0xd8, 0xd9, 0x6a, 0xb5, 0x41, 0x74, 0x5b, 0xf5, 0x4f, 0x14, 0x56, 0x46, 0xe1, 0x6a,
-    0x75, 0x2d, 0x51, 0x60, 0x34, 0x5f, 0x4c, 0x51, 0xdf, 0x72, 0xdc, 0x93, 0x57, 0xd0, 0x4a, 0x29, 0xa2, 0x55, 0x49,
-    0x69, 0x32, 0xd4, 0x69, 0xb6, 0xbe, 0x4f, 0xd2, 0x61, 0xdb, 0xa7, 0x1b, 0xdc, 0x4b, 0x15, 0x1a, 0x31, 0x5d, 0x2d,
-    0xf9, 0xd4, 0x0c, 0xcd, 0x10, 0x42, 0x51, 0xae, 0xac, 0x98, 0xbd, 0x6d, 0x86, 0xe5, 0xc1, 0x41, 0xee, 0x0c, 0x74,
-    0x5e, 0xb2, 0x89, 0x9f, 0x02, 0x10, 0xc9, 0xf9, 0x6d, 0xa6, 0x74, 0x97, 0x9f, 0xac, 0x10, 0xda, 0x30, 0x4b, 0x5b,
-    0x5d, 0xb0, 0xc6, 0xe3, 0xeb, 0x98, 0x49, 0xaf, 0x1c, 0x45, 0x5b, 0xe3, 0x01, 0x45, 0x4b, 0xa3, 0x6a, 0x84, 0x82,
-    0x82, 0xf2, 0x08, 0x3c, 0xc1, 0xaa, 0xd0, 0x9a, 0xee, 0x47, 0x53, 0x0a, 0x8e, 0x60, 0xab, 0x45, 0x94, 0x76, 0xe1,
-    0x9e, 0x91, 0x22, 0x66, 0xe0, 0xed, 0xb0, 0x17, 0xeb, 0xdd, 0x6b, 0x76, 0xc0, 0x9c, 0x8a, 0x31, 0x17, 0x33, 0x5b,
-    0x57, 0xac, 0x3d, 0x1b, 0xce, 0xc8, 0xc6, 0xc1, 0xd6, 0xb1, 0x8d, 0xfa, 0xdf, 0x5d, 0x33, 0xba, 0x2b, 0x73, 0xbd,
-    0x26, 0x4a, 0x4b, 0xe9, 0xab, 0xfd, 0x81, 0x96, 0x32, 0x73, 0xd7, 0xbc, 0x37, 0xce, 0xd4, 0xae, 0x76, 0x98, 0xec,
-    0xb5, 0xbb, 0xa5, 0xcd, 0x67, 0xa9, 0xa1, 0xab, 0x1d, 0x1b, 0x46, 0xa4, 0xf2, 0x45, 0x9a, 0x18, 0x60, 0x19, 0xc2,
-    0xd4, 0xd0, 0xd1, 0x35, 0x4b, 0xd3, 0xaa, 0xf4, 0xd7, 0xf0, 0xf5, 0xdc, 0xf0, 0xf5, 0xcc, 0xf2, 0x75, 0xe0, 0x14,
-    0xc0, 0xd7, 0xf5, 0x70, 0x55, 0xf7, 0x6c, 0xe3, 0x74, 0x66, 0x9a, 0xa3, 0xe7, 0xca, 0x8e, 0x86, 0xf9, 0x16, 0x16,
-    0x02, 0x54, 0x6a, 0x5e, 0x1f, 0x03, 0xe3, 0x84, 0x01, 0x03, 0x50, 0xbb, 0x30, 0xa9, 0xeb, 0xa2, 0xf8, 0x18, 0x20,
-    0x9c, 0x17, 0xb4, 0xa4, 0xec, 0x93, 0x17, 0xe0, 0xa4, 0x73, 0x96, 0x03, 0x42, 0x4c, 0x15, 0xff, 0x2a, 0x25, 0xca,
-    0xae, 0x8e, 0x99, 0xd5, 0xe5, 0x76, 0x75, 0xc0, 0xe9, 0xab, 0xd5, 0x25, 0x77, 0xf3, 0x7a, 0xb5, 0x3c, 0x56, 0x2e,
-    0xaf, 0xda, 0xef, 0xd5, 0x2a, 0x58, 0x2b, 0x01, 0xff, 0xbd, 0x31, 0x51, 0x44, 0x39, 0x3a, 0xf0, 0x00, 0x17, 0x33,
-    0x50, 0x50, 0xe8, 0x45, 0x97, 0x22, 0xee, 0xd5, 0xa7, 0x1c, 0x3c, 0xca, 0x4d, 0xaf, 0xfb, 0x9f, 0xf2, 0xd9, 0x1c,
-    0xb4, 0xb1, 0x35, 0x92, 0x9e, 0x50, 0x33, 0x61, 0x55, 0x5f, 0x6c, 0x29, 0xab, 0xf5, 0x51, 0xe7, 0xb1, 0x46, 0x4d,
-    0xa5, 0xbd, 0xbc, 0xd7, 0x2a, 0x16, 0x65, 0x51, 0xc9, 0x38, 0xb6, 0x39, 0x55, 0x4e, 0xd7, 0x5d, 0x32, 0xb6, 0xe2,
-    0x6d, 0xc0, 0x34, 0x1f, 0x66, 0xc0, 0xeb, 0x1c, 0xf6, 0x63, 0xc9, 0xdd, 0xdd, 0xff, 0xa2, 0x42, 0xce, 0xb2, 0x58,
-    0x43, 0xdf, 0xb2, 0x28, 0x4e, 0xb4, 0x91, 0x8d, 0x4f, 0x76, 0x5b, 0xc3, 0x55, 0x9d, 0x31, 0x16, 0x07, 0x43, 0x7c,
-    0xb2, 0xa9, 0x3a, 0x92, 0xe5, 0x8c, 0x27, 0x34, 0xf2, 0xf9, 0x9c, 0x66, 0x7e, 0x01, 0x5e, 0x55, 0xb3, 0xf7, 0x23,
-    0x19, 0x2c, 0xdf, 0xd5, 0xdd, 0xab, 0xd1, 0x49, 0x01, 0xde, 0xaf, 0x2f, 0x36, 0x1d, 0xaf, 0xdf, 0x52, 0x91, 0x2b,
-    0x45, 0xb4, 0xd4, 0x69, 0xbf, 0xa8, 0xc4, 0xd2, 0x17, 0xd1, 0xce, 0xf6, 0x95, 0x09, 0xe2, 0xb7, 0xc3, 0xc7, 0xe1,
-    0x91, 0x8f, 0x94, 0x5b, 0xf8, 0x2b, 0x73, 0xe0, 0x9f, 0x5b, 0xb7, 0xf0, 0x0b, 0xf2, 0xbc, 0xee, 0x15, 0x4e, 0x24,
-    0x79, 0xd1, 0x7f, 0x61, 0x2d, 0x66, 0x9e, 0xb2, 0xd1, 0x6d, 0xe0, 0xa7, 0x4c, 0x36, 0x21, 0xf4, 0xe6, 0xe3, 0xa5,
-    0xae, 0x00, 0x97, 0xa2, 0x72, 0x67, 0x17, 0xd6, 0xd6, 0xc3, 0x52, 0x12, 0x7f, 0x3f, 0x65, 0x72, 0xdf, 0xc7, 0x33,
-    0x72, 0x01, 0x3f, 0xf6, 0x97, 0xc1, 0xeb, 0x58, 0x4e, 0x43, 0x11, 0x67, 0x09, 0x9f, 0x05, 0xa8, 0xe1, 0xfb, 0x28,
-    0xcc, 0x95, 0xbd, 0xf1, 0x39, 0x2a, 0xf6, 0x2f, 0xf0, 0x8d, 0x24, 0x7e, 0xdf, 0x6f, 0xcc, 0xf0, 0x1b, 0x49, 0x2e,
-    0x8e, 0xf7, 0x97, 0x37, 0xb2, 0xe8, 0x5d, 0xe0, 0x9b, 0xd2, 0x63, 0x8f, 0xbf, 0x26, 0x01, 0x22, 0xbd, 0x1b, 0x03,
-    0xcd, 0x29, 0x9f, 0x69, 0xcf, 0xbd, 0x8f, 0xf0, 0x07, 0x88, 0xab, 0x88, 0x8a, 0xdb, 0x98, 0xd0, 0xca, 0x1e, 0xf1,
-    0xb9, 0x72, 0x11, 0xf8, 0x07, 0x07, 0x4e, 0x59, 0xa9, 0x2a, 0xe0, 0x13, 0x49, 0x6a, 0x06, 0x39, 0x7e, 0xaf, 0x22,
-    0x34, 0x27, 0x32, 0x10, 0xc8, 0x0e, 0x13, 0x58, 0x3f, 0xb4, 0x39, 0x9a, 0x62, 0xa0, 0x3d, 0x0c, 0x21, 0x93, 0x54,
-    0xc4, 0x92, 0x8b, 0x21, 0x72, 0xd5, 0x0f, 0xfc, 0x37, 0x72, 0x31, 0xf0, 0xfe, 0xd3, 0x3f, 0xfd, 0x38, 0xfe, 0x51,
-    0x0c, 0x2f, 0xf0, 0x5b, 0x72, 0x78, 0x1c, 0xf4, 0xa3, 0x60, 0xaf, 0xd9, 0x5c, 0xfd, 0x78, 0x38, 0xf8, 0x47, 0xdc,
-    0xfc, 0xe5, 0xa4, 0xf9, 0xc3, 0x10, 0xad, 0x82, 0x1f, 0x0f, 0xfb, 0x03, 0xf3, 0x34, 0xf8, 0x47, 0xef, 0xc7, 0x7c,
-    0xf8, 0x67, 0x5d, 0xb8, 0x8f, 0xd0, 0xe1, 0x04, 0x2f, 0x24, 0x39, 0x6c, 0x36, 0x7b, 0x87, 0x13, 0x3c, 0x97, 0xe4,
-    0x10, 0xfe, 0xbf, 0x24, 0xef, 0xe8, 0xe4, 0xc5, 0xcd, 0x3c, 0xb8, 0xe8, 0xad, 0xf6, 0x97, 0x7f, 0x2b, 0x60, 0xd4,
-    0xc1, 0x3f, 0x7e, 0xfc, 0x31, 0xf7, 0x1f, 0xf4, 0xc8, 0xe1, 0xb0, 0x81, 0x02, 0x28, 0xfd, 0x33, 0x51, 0xff, 0x06,
-    0xfd, 0x68, 0xf0, 0x0f, 0x03, 0x85, 0xff, 0xe0, 0xc7, 0x8b, 0xe3, 0x1e, 0x19, 0xae, 0x02, 0x7f, 0xf5, 0x00, 0xad,
-    0x10, 0x5a, 0xed, 0xa3, 0x0b, 0xec, 0x4f, 0x7c, 0x84, 0x27, 0x92, 0x1c, 0x3e, 0x38, 0x9c, 0xe0, 0x2b, 0x49, 0x0e,
-    0xfd, 0xc3, 0x09, 0x7e, 0x21, 0xc9, 0xe1, 0x3f, 0x82, 0x7e, 0xa4, 0x3d, 0x6c, 0x2b, 0xe5, 0xde, 0x58, 0x41, 0x70,
-    0x23, 0x16, 0x34, 0x5e, 0x49, 0x26, 0x53, 0x8a, 0xf6, 0x0f, 0x19, 0x3e, 0x53, 0x68, 0x0a, 0x24, 0x38, 0x61, 0xc0,
-    0xb6, 0x0b, 0x96, 0xe7, 0xb0, 0xd9, 0x40, 0x33, 0xfb, 0x91, 0xc0, 0xda, 0x0f, 0x90, 0x47, 0x12, 0x5f, 0xc5, 0xe9,
-    0x82, 0xe6, 0x11, 0x2d, 0x10, 0x1e, 0x91, 0x33, 0x19, 0xb4, 0x11, 0x7e, 0x27, 0xe1, 0x47, 0x07, 0xe1, 0x33, 0x13,
-    0xc0, 0x84, 0x83, 0xac, 0x89, 0x2a, 0xe3, 0x5a, 0x63, 0xf1, 0x11, 0x9e, 0x6f, 0xa9, 0x94, 0x53, 0xf0, 0x2e, 0x20,
-    0x3c, 0xae, 0x85, 0x3b, 0xf1, 0x35, 0xb1, 0x24, 0xf1, 0x5e, 0x50, 0xfa, 0x5d, 0x9c, 0x7e, 0xa4, 0x22, 0xb8, 0xc1,
-    0xed, 0xce, 0xe7, 0x58, 0xb9, 0xa0, 0xf7, 0xda, 0xa8, 0x5b, 0xc6, 0xaa, 0x4e, 0xa5, 0x8e, 0x11, 0x80, 0x90, 0xad,
-    0xfb, 0x62, 0x60, 0xc7, 0xf7, 0xc4, 0x86, 0xc3, 0x4a, 0xc4, 0xd7, 0x3e, 0xaa, 0xc7, 0x45, 0x59, 0x76, 0x15, 0xa7,
-    0x2c, 0xf1, 0x24, 0x9d, 0xcd, 0xd3, 0x58, 0x52, 0xcf, 0xac, 0xd7, 0x8b, 0x61, 0x20, 0xbf, 0x54, 0x19, 0x12, 0xc7,
-    0xe0, 0x4c, 0x6c, 0xc0, 0x09, 0xce, 0x4a, 0x00, 0xd1, 0x29, 0xa3, 0x76, 0xbc, 0xae, 0x82, 0x5f, 0xeb, 0xf1, 0xbd,
-    0x66, 0x1b, 0x1c, 0x61, 0x43, 0x25, 0x9e, 0x73, 0x9c, 0x11, 0x10, 0xa2, 0x9d, 0xbe, 0x7f, 0x9c, 0x5f, 0x4d, 0x7a,
-    0x3e, 0xc4, 0x66, 0x38, 0x79, 0xab, 0xfc, 0x42, 0xd0, 0x60, 0x4a, 0x5a, 0xdd, 0xe9, 0x31, 0xed, 0x4e, 0x1b, 0x0d,
-    0xab, 0x43, 0xa7, 0x44, 0x0c, 0xa6, 0xba, 0x7b, 0x8c, 0x13, 0xbc, 0x20, 0xcd, 0x36, 0x9e, 0x90, 0x96, 0xea, 0xd2,
-    0x9d, 0x1c, 0xa7, 0x66, 0x9a, 0x83, 0x83, 0x80, 0x87, 0x69, 0x9c, 0xcb, 0x2f, 0xc1, 0xd8, 0x27, 0x13, 0x9c, 0x10,
-    0x1e, 0xd2, 0x1b, 0x3a, 0x0a, 0x52, 0x84, 0x13, 0xc3, 0x69, 0x50, 0x17, 0x4d, 0x88, 0xd3, 0x0c, 0x8c, 0x08, 0xf2,
-    0xb6, 0x9f, 0x0c, 0xda, 0x43, 0x42, 0x88, 0xbf, 0xd7, 0x6c, 0xfa, 0x7d, 0x4e, 0x16, 0x32, 0x82, 0x12, 0x47, 0x55,
-    0x26, 0x73, 0x28, 0xea, 0x38, 0x45, 0xc1, 0x0b, 0x19, 0x4a, 0x9a, 0xcb, 0x00, 0x8a, 0xc1, 0xfc, 0xcf, 0x2d, 0x61,
-    0xfb, 0xc7, 0x87, 0x7e, 0x03, 0x4a, 0x15, 0x71, 0x22, 0xcc, 0xc9, 0x25, 0x8a, 0x92, 0xc1, 0xd1, 0xd0, 0xe5, 0xff,
-    0xaa, 0x10, 0x26, 0xbf, 0xec, 0x27, 0x83, 0x96, 0x9a, 0xbc, 0xe7, 0xf7, 0x03, 0x4e, 0x72, 0xad, 0xa0, 0xf5, 0xf3,
-    0xe8, 0xad, 0x5a, 0x2a, 0x8a, 0x0c, 0x70, 0x66, 0xde, 0x05, 0x69, 0x76, 0xa2, 0x60, 0xe1, 0x2e, 0xa2, 0x09, 0x93,
-    0x19, 0x2c, 0xe0, 0x98, 0x40, 0x7b, 0xcc, 0x09, 0xcc, 0x58, 0x75, 0xbb, 0x8c, 0xcc, 0xf3, 0x03, 0xff, 0x41, 0xff,
-    0x4a, 0x46, 0x13, 0xa9, 0xa7, 0xbf, 0x92, 0xab, 0x15, 0xfc, 0x3f, 0x91, 0x7d, 0x4e, 0x2e, 0x55, 0xd1, 0xc2, 0x14,
-    0xcd, 0xa1, 0xe8, 0x6d, 0x04, 0xa0, 0xe2, 0xbc, 0x54, 0xb2, 0xf4, 0x9e, 0x5c, 0x11, 0x05, 0xfb, 0xc1, 0x81, 0x18,
-    0x4c, 0x1b, 0xed, 0x21, 0xf8, 0xf7, 0x85, 0xcc, 0xbf, 0x63, 0x72, 0x1a, 0xf8, 0x87, 0x3d, 0x1f, 0xf5, 0x7d, 0x0f,
-    0xb6, 0xb6, 0x9b, 0x35, 0x88, 0xc6, 0x70, 0xda, 0x78, 0x23, 0xa3, 0x45, 0x8f, 0xb4, 0xfa, 0x01, 0x33, 0xfe, 0x3c,
-    0x84, 0x53, 0xc3, 0x38, 0x5b, 0x78, 0x81, 0x1a, 0x52, 0x36, 0xec, 0xf3, 0x02, 0x35, 0x66, 0x8d, 0x2b, 0x14, 0xa5,
-    0x8d, 0x59, 0x23, 0x58, 0x10, 0x42, 0x9a, 0x9d, 0xb2, 0x9b, 0x95, 0x7e, 0x53, 0x14, 0x5d, 0x59, 0x67, 0xe7, 0x40,
-    0x1d, 0x87, 0xac, 0x11, 0x88, 0x01, 0x1d, 0xae, 0x56, 0xfe, 0x71, 0xbf, 0xe7, 0xa3, 0x46, 0x60, 0x09, 0xed, 0xd0,
-    0x52, 0x1a, 0x42, 0x98, 0x0d, 0x0b, 0x13, 0x4a, 0x7a, 0x59, 0x0b, 0x1b, 0x2d, 0xab, 0xc3, 0xee, 0xf0, 0x00, 0x5a,
-    0x94, 0x76, 0x8c, 0xd6, 0x57, 0xe7, 0xb0, 0x4c, 0x4b, 0xcc, 0x19, 0x69, 0x61, 0x4e, 0xac, 0xef, 0x7a, 0x4a, 0x64,
-    0x45, 0xf0, 0x29, 0xa9, 0x9a, 0xe3, 0x41, 0x8c, 0x93, 0x21, 0x79, 0xad, 0xed, 0x91, 0xae, 0xf5, 0x8b, 0xd3, 0x94,
-    0xbc, 0x5c, 0x8b, 0xde, 0xc6, 0x10, 0x5b, 0xb9, 0x0e, 0x47, 0x0b, 0x21, 0x68, 0x26, 0xdf, 0xf0, 0xc4, 0xa8, 0x69,
-    0x34, 0x05, 0x4b, 0x09, 0xc2, 0xb2, 0x18, 0x74, 0xb4, 0x8e, 0x3d, 0x19, 0x8b, 0x8d, 0xea, 0x09, 0x59, 0x68, 0xf5,
-    0x49, 0x05, 0x6b, 0xbb, 0x13, 0x63, 0x17, 0x07, 0x08, 0x2f, 0x4c, 0x14, 0x37, 0x08, 0xc3, 0x70, 0x12, 0x8e, 0xa0,
-    0x1a, 0x26, 0xc8, 0x51, 0xa1, 0xce, 0x51, 0x90, 0x93, 0xeb, 0x30, 0xa3, 0x37, 0x6a, 0xd6, 0x00, 0x55, 0x92, 0xd9,
-    0x1e, 0xaf, 0xe3, 0x69, 0x57, 0xb1, 0x9b, 0x3c, 0xcc, 0x78, 0x42, 0x01, 0x3d, 0x10, 0xb7, 0x37, 0x45, 0xd3, 0x38,
-    0x77, 0xe3, 0x53, 0x15, 0x7c, 0x03, 0xd7, 0x79, 0x3d, 0x01, 0x8f, 0xaf, 0xd2, 0xb5, 0xca, 0xc6, 0xda, 0x0d, 0x8e,
-    0x10, 0x1b, 0x07, 0x93, 0x10, 0xe2, 0x7a, 0x8a, 0x84, 0x24, 0x98, 0x72, 0x13, 0x97, 0xa8, 0x66, 0xe5, 0x98, 0x57,
-    0x24, 0x19, 0xf0, 0x46, 0x43, 0x79, 0xa1, 0x17, 0x9a, 0x24, 0x26, 0x08, 0x5f, 0x95, 0x67, 0xcb, 0xb6, 0x7b, 0x2b,
-    0x49, 0x7d, 0xaa, 0xe0, 0xaa, 0xee, 0xce, 0x6d, 0x48, 0x89, 0x94, 0xa7, 0x50, 0x06, 0x33, 0x84, 0x9f, 0x91, 0xc3,
-    0x60, 0x10, 0xf6, 0xff, 0x32, 0x44, 0xfd, 0x20, 0xfc, 0x33, 0x3a, 0xd4, 0x9c, 0xe3, 0x0a, 0x75, 0x53, 0x3d, 0xc7,
-    0x52, 0xc5, 0x2f, 0xdb, 0x58, 0x79, 0x12, 0xa3, 0x0c, 0x67, 0xf1, 0x8c, 0x46, 0xcf, 0xe0, 0x90, 0x5b, 0xc2, 0x79,
-    0x2b, 0x31, 0x50, 0x52, 0xf4, 0xcc, 0xf0, 0x92, 0xd0, 0xef, 0xbf, 0x92, 0xe5, 0x53, 0xdf, 0xef, 0x3f, 0xaf, 0x9e,
-    0xfe, 0xe2, 0xf7, 0x7f, 0x91, 0xd1, 0xcf, 0x85, 0xf1, 0x76, 0xd7, 0xe6, 0x78, 0x6c, 0xe7, 0x28, 0xf4, 0xd6, 0x38,
-    0xb8, 0x5b, 0xa0, 0x4d, 0x47, 0xc7, 0x04, 0x15, 0x6c, 0x5c, 0x32, 0xa3, 0x3c, 0x94, 0xf1, 0x04, 0x90, 0xea, 0xec,
-    0x41, 0xee, 0xc6, 0xf5, 0xab, 0x15, 0x03, 0xa9, 0x58, 0x7a, 0x05, 0x64, 0x4e, 0x7a, 0x2d, 0xb4, 0xac, 0xb5, 0x55,
-    0x3a, 0x53, 0x3d, 0x8e, 0x5e, 0xf2, 0xe9, 0x2b, 0xd2, 0xea, 0x5e, 0x1d, 0x4f, 0xba, 0x57, 0x8d, 0x06, 0xca, 0x2d,
-    0x69, 0x2d, 0x06, 0x57, 0x43, 0xfc, 0x35, 0x38, 0xf5, 0x5c, 0x5a, 0xc2, 0xb5, 0xe5, 0x75, 0xcc, 0xf2, 0x1a, 0x8d,
-    0xac, 0x40, 0x5d, 0xa7, 0xeb, 0x44, 0x77, 0x2d, 0x0a, 0x8d, 0x93, 0x75, 0x52, 0x7b, 0x8a, 0x54, 0x09, 0x24, 0x43,
-    0x11, 0x42, 0x6e, 0x24, 0xda, 0x3a, 0x2a, 0x8c, 0x09, 0xdd, 0xd5, 0x99, 0x05, 0xf6, 0xa9, 0xa5, 0x44, 0x00, 0x58,
-    0x80, 0xae, 0xa5, 0x27, 0x78, 0x86, 0x17, 0x8d, 0xb6, 0x22, 0xf3, 0x66, 0xbb, 0x5b, 0x1f, 0xeb, 0x49, 0x35, 0x16,
-    0x5e, 0x34, 0xc8, 0xac, 0xc4, 0x52, 0x91, 0x35, 0x1a, 0x45, 0x3d, 0xd8, 0x69, 0x4f, 0x6e, 0x2d, 0x00, 0x71, 0xb3,
-    0x9e, 0x94, 0x61, 0x25, 0x6c, 0x25, 0x53, 0x59, 0xc8, 0xb2, 0x8c, 0x0a, 0x90, 0xa2, 0x44, 0x62, 0x56, 0x14, 0x95,
-    0x64, 0x07, 0x31, 0x8a, 0x29, 0x11, 0xc0, 0x79, 0x94, 0xdd, 0x85, 0x33, 0xcc, 0xf1, 0x54, 0xf1, 0x0d, 0x42, 0xc8,
-    0x99, 0x4d, 0x67, 0x91, 0x8a, 0x07, 0xa5, 0x84, 0x39, 0x32, 0x29, 0x27, 0x34, 0x3c, 0xdf, 0x3f, 0xe5, 0x77, 0xda,
-    0x64, 0x03, 0x36, 0x8c, 0x54, 0xb3, 0xd4, 0x70, 0xae, 0x98, 0x7c, 0x08, 0x24, 0x2a, 0xa3, 0x23, 0xa1, 0x62, 0x80,
-    0xcf, 0x99, 0xa0, 0x4a, 0x07, 0xdf, 0xb7, 0x76, 0x5f, 0x5a, 0x57, 0x20, 0x53, 0xd7, 0x7b, 0x03, 0x88, 0x8c, 0xc1,
-    0xb9, 0x93, 0x91, 0x8d, 0x66, 0xe7, 0xfb, 0x27, 0x6f, 0xb7, 0xd9, 0xc0, 0xab, 0x95, 0xb1, 0x7e, 0x95, 0x6e, 0x83,
-    0xe3, 0x0a, 0xd2, 0xd4, 0xfc, 0x88, 0x82, 0x54, 0xa9, 0x48, 0x71, 0x20, 0x80, 0x8a, 0xce, 0xf7, 0x4f, 0xde, 0x07,
-    0x42, 0xf9, 0x96, 0x10, 0x76, 0x97, 0x1d, 0x70, 0x12, 0x4c, 0x09, 0x45, 0x7a, 0xed, 0x25, 0xeb, 0xe2, 0x8e, 0x00,
-    0x8f, 0xa6, 0xaa, 0x12, 0x2c, 0x88, 0x01, 0x1b, 0x92, 0xd4, 0x60, 0x80, 0xa4, 0x08, 0xa7, 0x35, 0xbb, 0x8c, 0xc0,
-    0x06, 0xa8, 0xb9, 0xce, 0x60, 0x27, 0x42, 0xad, 0xfa, 0x21, 0x9c, 0xaa, 0x59, 0x65, 0xa1, 0x85, 0xc7, 0xb3, 0x8d,
-    0xac, 0xb4, 0xca, 0x1c, 0xfd, 0x16, 0x6c, 0x27, 0xfb, 0xf0, 0x86, 0x58, 0x4b, 0xc2, 0x14, 0x3c, 0xb7, 0xe9, 0x63,
-    0xe7, 0xfb, 0x27, 0xaf, 0x4d, 0x06, 0xd9, 0x3c, 0xb6, 0xfc, 0x7e, 0xc3, 0xc4, 0x3c, 0x79, 0x1d, 0x56, 0xb5, 0xaa,
-    0xf1, 0xf9, 0xfe, 0xc9, 0x87, 0x6d, 0xcd, 0xa0, 0xbc, 0x58, 0x54, 0x36, 0xbe, 0x82, 0x6f, 0x49, 0xd3, 0x68, 0x69,
-    0x84, 0x43, 0xc4, 0x0a, 0xac, 0x04, 0x52, 0x94, 0x17, 0xa5, 0x6b, 0xe4, 0x39, 0xce, 0x88, 0x0a, 0x03, 0xd5, 0x77,
-    0xcd, 0xa8, 0x79, 0x8c, 0x67, 0x67, 0x23, 0x3e, 0xa7, 0x3b, 0x62, 0x43, 0x37, 0x28, 0x64, 0x33, 0x48, 0x9d, 0x51,
-    0xa0, 0x33, 0xbc, 0xd7, 0x42, 0xdd, 0xba, 0xf8, 0xca, 0x14, 0x91, 0xf2, 0x9a, 0x6c, 0xc1, 0x53, 0xd2, 0xc2, 0x29,
-    0x69, 0xe1, 0x98, 0xe4, 0x83, 0x96, 0x16, 0x10, 0xdd, 0xb8, 0x1c, 0x57, 0x8b, 0x19, 0xc8, 0x0a, 0x33, 0xa7, 0x55,
-    0x0b, 0xe0, 0xa4, 0x1b, 0x2b, 0xdf, 0xa3, 0x92, 0xe9, 0x89, 0x22, 0x8b, 0xf7, 0x01, 0xc7, 0x5c, 0x0d, 0x7c, 0xc6,
-    0x2e, 0x53, 0x48, 0x2c, 0x81, 0x55, 0x61, 0x89, 0xa2, 0xb2, 0x69, 0xdb, 0x34, 0x8d, 0x43, 0xb5, 0x4f, 0x1c, 0xc7,
-    0x21, 0x70, 0x6e, 0x1c, 0x9b, 0x3c, 0x9c, 0x7c, 0xb3, 0xcb, 0xe3, 0x83, 0x83, 0x40, 0x77, 0xfa, 0x52, 0x06, 0xdc,
-    0xd6, 0x57, 0x91, 0xbb, 0x6f, 0x35, 0xaf, 0x48, 0x90, 0x82, 0xbf, 0xd1, 0x48, 0x87, 0x05, 0x84, 0xa1, 0x83, 0xb8,
-    0x8e, 0x41, 0x0b, 0xbc, 0xd2, 0xf5, 0xea, 0xcb, 0x6f, 0x34, 0xca, 0x28, 0x6d, 0x1d, 0x5b, 0x37, 0x38, 0x2b, 0xae,
-    0x82, 0x32, 0xf5, 0xa7, 0xb5, 0x91, 0x2f, 0x65, 0x41, 0x40, 0xcc, 0xa5, 0x59, 0x66, 0x17, 0xe3, 0x1c, 0x09, 0x06,
-    0xed, 0xbe, 0x34, 0x59, 0x0b, 0x58, 0x65, 0x57, 0x99, 0x46, 0x96, 0x9d, 0x75, 0x50, 0x64, 0x1b, 0x41, 0x54, 0x0a,
-    0x1a, 0x35, 0x0a, 0x43, 0xde, 0xef, 0x37, 0x73, 0x2e, 0x71, 0x8e, 0x8c, 0x93, 0x4b, 0x41, 0xa1, 0x90, 0xd5, 0x29,
-    0x91, 0xf2, 0x92, 0xcc, 0x77, 0x93, 0xfc, 0x89, 0x43, 0xf2, 0xcf, 0x08, 0x75, 0xc8, 0x5f, 0xbb, 0x38, 0x42, 0x6e,
-    0x9c, 0x0b, 0xb9, 0xad, 0x3a, 0x9d, 0x13, 0x70, 0xa2, 0xd5, 0x31, 0x5a, 0x0b, 0x2b, 0xee, 0x60, 0x28, 0xee, 0x09,
-    0x51, 0x6e, 0x48, 0x6c, 0x63, 0xc0, 0x41, 0x15, 0x54, 0x83, 0xa9, 0xb7, 0xf9, 0xf4, 0x5c, 0x0e, 0x78, 0xf2, 0xe1,
-    0xee, 0x78, 0xe8, 0xe9, 0x7c, 0xf3, 0xe4, 0x3a, 0xb9, 0x9f, 0xb0, 0x6a, 0xe7, 0xe0, 0xd6, 0x33, 0x41, 0x61, 0xfe,
-    0x32, 0x8e, 0x5d, 0x67, 0x3e, 0x6b, 0x87, 0xd0, 0xca, 0x3f, 0x80, 0xb6, 0xdd, 0x56, 0x2d, 0xa8, 0x33, 0x2c, 0xf0,
-    0x23, 0x9d, 0x81, 0x1a, 0x8b, 0x1d, 0xec, 0xe3, 0x44, 0x35, 0xa0, 0x59, 0xb2, 0xbd, 0xfa, 0x59, 0x61, 0xc8, 0x44,
-    0x83, 0x86, 0x96, 0xc0, 0xff, 0x34, 0xc9, 0x03, 0xdd, 0x28, 0xb9, 0x00, 0x08, 0x9a, 0x2b, 0x3c, 0x55, 0x08, 0xf3,
-    0xfd, 0xca, 0xfb, 0xfe, 0x72, 0x8f, 0x90, 0x79, 0xe5, 0x7d, 0x7c, 0x57, 0xa5, 0x5e, 0x01, 0x59, 0xa0, 0x08, 0xcc,
-    0xc7, 0xb2, 0x40, 0x87, 0x2f, 0xcf, 0x6c, 0x73, 0x65, 0x42, 0x86, 0x95, 0xc6, 0xed, 0x84, 0x36, 0x95, 0x5b, 0x4e,
-    0xd7, 0x5b, 0x34, 0xac, 0xd5, 0xee, 0x43, 0xed, 0x7b, 0xa9, 0x60, 0x84, 0xe7, 0xf7, 0xaa, 0xb5, 0x1d, 0xb7, 0xf8,
-    0xb8, 0x9e, 0xbf, 0xb2, 0xb6, 0x29, 0x21, 0xcb, 0x72, 0x2a, 0xe4, 0x33, 0x3a, 0xe6, 0x02, 0x62, 0x16, 0x25, 0x4e,
-    0x50, 0xb1, 0xef, 0xf8, 0xed, 0xd4, 0xfa, 0x9c, 0x40, 0xc1, 0xda, 0x02, 0xd5, 0xaf, 0x8f, 0x2a, 0x68, 0x7d, 0xbe,
-    0xde, 0x6b, 0x7e, 0x70, 0xf0, 0xa1, 0x42, 0x93, 0x81, 0x52, 0x41, 0xe1, 0x30, 0x2d, 0xad, 0xd2, 0x98, 0x48, 0xee,
-    0x7e, 0x50, 0x3a, 0x01, 0x2c, 0xc3, 0x70, 0x79, 0xcf, 0x4b, 0x22, 0x8b, 0xc9, 0x3a, 0x8b, 0x37, 0xce, 0x09, 0xe6,
-    0x1a, 0x2e, 0xc0, 0xe1, 0xc1, 0xd4, 0xd6, 0xde, 0xa2, 0xbc, 0x4a, 0x86, 0x2d, 0x61, 0x38, 0x05, 0x64, 0x05, 0xca,
-    0x0c, 0x71, 0x28, 0x70, 0xab, 0x59, 0x72, 0x0a, 0x7a, 0xe5, 0x14, 0xe7, 0xe1, 0x14, 0xd2, 0x5f, 0x6b, 0x47, 0x16,
-    0x21, 0xac, 0x13, 0x73, 0x9c, 0x54, 0x82, 0x93, 0x97, 0xdb, 0x5c, 0xca, 0x96, 0xa8, 0xa9, 0x92, 0x3a, 0xaa, 0x05,
-    0x2a, 0x3b, 0x84, 0x57, 0x01, 0x33, 0x8a, 0x9b, 0x8d, 0x9b, 0x01, 0x03, 0x7e, 0x26, 0x03, 0x1d, 0x8c, 0x02, 0x99,
-    0xc1, 0xc3, 0x45, 0x50, 0x9b, 0xba, 0xcb, 0x55, 0x37, 0x6c, 0x10, 0x37, 0x75, 0xd1, 0xc4, 0x55, 0x5c, 0xef, 0xb4,
-    0xe2, 0xa5, 0x63, 0x9d, 0x41, 0x2d, 0x2d, 0x17, 0xac, 0x12, 0x49, 0x9c, 0xe5, 0x8f, 0x75, 0x52, 0x74, 0xd9, 0x08,
-    0x53, 0x05, 0xc6, 0x4b, 0xb5, 0x07, 0xb4, 0x00, 0xfa, 0x5a, 0x9e, 0x48, 0x67, 0x47, 0xad, 0x13, 0x5b, 0xcd, 0xe9,
-    0x48, 0xfd, 0x77, 0x90, 0xea, 0xb2, 0x7e, 0xe6, 0x5f, 0x2a, 0x59, 0xc8, 0x70, 0x5e, 0x63, 0xec, 0x99, 0x62, 0xec,
-    0x08, 0xf4, 0x34, 0x9b, 0xf8, 0xdd, 0x37, 0x19, 0x2f, 0xcc, 0x48, 0x39, 0x43, 0x62, 0x5f, 0x97, 0xd1, 0x72, 0xe7,
-    0xf7, 0xda, 0x6e, 0x44, 0x8c, 0x40, 0x16, 0x10, 0x36, 0x9c, 0x3d, 0x43, 0x38, 0x6f, 0x34, 0xba, 0xf9, 0x31, 0xad,
-    0x9c, 0x24, 0x15, 0x8c, 0x0c, 0x02, 0xba, 0x40, 0xf0, 0x35, 0x19, 0x0a, 0x21, 0x7f, 0x9b, 0x99, 0x9d, 0x83, 0xaf,
-    0xfd, 0xe4, 0x5d, 0xe0, 0x72, 0x35, 0xb7, 0x6d, 0x19, 0x34, 0x85, 0xf5, 0x04, 0x55, 0xc0, 0xe5, 0xeb, 0xbb, 0x13,
-    0x3c, 0x00, 0xee, 0xbd, 0x36, 0x86, 0x54, 0x34, 0xd4, 0x95, 0x9a, 0x25, 0x94, 0xa7, 0xaf, 0x8b, 0xaa, 0xac, 0x44,
-    0x77, 0xb2, 0xae, 0xac, 0x8c, 0x59, 0x49, 0xf2, 0xa2, 0xc8, 0x69, 0x15, 0xde, 0x5f, 0x4b, 0xbf, 0x54, 0xc2, 0x65,
-    0xd3, 0xdb, 0x7e, 0x3a, 0x27, 0x12, 0x3b, 0x84, 0xfa, 0xf5, 0xae, 0xd8, 0x47, 0x05, 0x26, 0x9c, 0x6b, 0x23, 0x14,
-    0x7f, 0xde, 0x26, 0x14, 0x71, 0x66, 0x8e, 0xbc, 0x12, 0x88, 0xed, 0x7b, 0x08, 0x44, 0xe3, 0x66, 0xb7, 0x32, 0x11,
-    0xd4, 0x91, 0x9a, 0x4c, 0xac, 0x6f, 0x29, 0xc9, 0x30, 0x33, 0xbb, 0xd1, 0xeb, 0xac, 0x56, 0x6c, 0xd0, 0x02, 0x37,
-    0x92, 0xef, 0xc3, 0xcf, 0xb6, 0xfe, 0xe9, 0x70, 0x62, 0xed, 0x06, 0x0e, 0x58, 0x69, 0xb2, 0xa0, 0x10, 0x12, 0x9c,
-    0x03, 0x95, 0x94, 0xa5, 0x68, 0xda, 0x50, 0x90, 0x21, 0x70, 0xc2, 0xca, 0x30, 0x13, 0x40, 0xac, 0x64, 0x85, 0x31,
-    0x20, 0x83, 0xad, 0xb9, 0x7f, 0xd6, 0xbc, 0xfc, 0xb4, 0x26, 0x5a, 0x93, 0x2b, 0x5a, 0x7d, 0xa8, 0xe5, 0x1b, 0x18,
-    0x08, 0x8c, 0x7e, 0xb8, 0xa7, 0x4c, 0xd0, 0x4a, 0x94, 0x23, 0x57, 0x0e, 0xe1, 0x16, 0x38, 0xd1, 0xf6, 0x3e, 0xe8,
-    0x08, 0xef, 0x16, 0x69, 0x82, 0xb9, 0x43, 0xd7, 0x2f, 0x89, 0xac, 0xb1, 0x92, 0x29, 0x31, 0x96, 0x12, 0x8e, 0x15,
-    0x99, 0x4a, 0x92, 0x0d, 0x5a, 0x43, 0x50, 0x40, 0xbb, 0xe9, 0x71, 0x56, 0x99, 0xc0, 0x69, 0xa3, 0x81, 0x62, 0x3b,
-    0xeb, 0x74, 0xc0, 0x1a, 0xe9, 0x10, 0x53, 0x9c, 0x6a, 0xc3, 0xe4, 0xec, 0xe0, 0x20, 0x88, 0xab, 0x79, 0x07, 0xe9,
-    0x10, 0x61, 0xbe, 0x5a, 0x05, 0x0a, 0xac, 0x18, 0xad, 0x56, 0xb1, 0x0b, 0x96, 0xaa, 0x86, 0x6e, 0xf3, 0xbe, 0x24,
-    0x73, 0x25, 0x00, 0xe7, 0x00, 0x61, 0x83, 0x04, 0xb1, 0x71, 0xef, 0xc5, 0xe0, 0x8e, 0x6a, 0x64, 0x83, 0xb4, 0xd1,
-    0x1e, 0x3a, 0x8c, 0x6b, 0x90, 0x0e, 0x49, 0x5c, 0xf0, 0x83, 0x83, 0xbd, 0xdc, 0x88, 0xc8, 0x9f, 0x40, 0x94, 0xfd,
-    0xa4, 0x24, 0x8b, 0x1e, 0xd0, 0xdd, 0x8d, 0x75, 0x67, 0x40, 0x49, 0x51, 0x66, 0x5b, 0x6d, 0xbb, 0x5a, 0x16, 0x44,
-    0xd9, 0x08, 0x9b, 0x60, 0x70, 0x1f, 0x2c, 0xfb, 0x92, 0xcc, 0x5f, 0xc9, 0x32, 0xc7, 0xfa, 0xe7, 0xad, 0x99, 0xd5,
-    0x61, 0x18, 0xc6, 0x62, 0xa2, 0x62, 0x19, 0x36, 0x0c, 0xab, 0x88, 0xff, 0xc8, 0x80, 0xe9, 0x4c, 0x3c, 0x28, 0xe7,
-    0x1a, 0x12, 0x0d, 0xbe, 0x55, 0x6d, 0xec, 0x5d, 0x92, 0x9f, 0xb6, 0x7a, 0x19, 0x34, 0x24, 0xcf, 0x7f, 0x2b, 0x24,
-    0x0f, 0x0d, 0x24, 0x9a, 0x3c, 0xd6, 0x70, 0xb6, 0x03, 0x17, 0x3f, 0xc9, 0x35, 0x9c, 0xed, 0xc6, 0xad, 0xc5, 0xd4,
-    0x2f, 0xbb, 0xe0, 0x73, 0x78, 0x83, 0x06, 0xb4, 0x2a, 0x70, 0xa0, 0x7c, 0xb4, 0xae, 0x7b, 0x69, 0x56, 0x0a, 0xc2,
-    0x54, 0x92, 0x80, 0xd5, 0x0f, 0x40, 0xa5, 0x8d, 0x3a, 0x86, 0x2f, 0x8b, 0xe6, 0xc8, 0x71, 0x09, 0xd4, 0x53, 0x57,
-    0x80, 0x9c, 0x8c, 0xb7, 0x7d, 0x7e, 0x70, 0x00, 0xb6, 0x01, 0x28, 0x71, 0xe1, 0x28, 0x9e, 0xcb, 0x85, 0x00, 0x55,
-    0x2a, 0xb7, 0xbf, 0xa1, 0x18, 0x6e, 0x81, 0xa8, 0x32, 0xf8, 0x01, 0x05, 0xf3, 0x38, 0xcf, 0xd9, 0x95, 0x2e, 0x33,
-    0xbf, 0x31, 0x27, 0x96, 0x94, 0x73, 0xad, 0x13, 0x66, 0xa8, 0x9b, 0x19, 0x3a, 0xad, 0xa3, 0xed, 0xc5, 0x15, 0xcd,
-    0xe4, 0x2b, 0x96, 0x4b, 0x9a, 0xc1, 0xf2, 0x2b, 0x8a, 0x83, 0x15, 0xe5, 0x08, 0x0e, 0x6c, 0xad, 0x57, 0x9c, 0x24,
-    0x77, 0x76, 0x91, 0x75, 0x1d, 0x68, 0x1a, 0x67, 0x49, 0xaa, 0x27, 0x71, 0xf3, 0x19, 0x6d, 0x0e, 0x67, 0xd9, 0xd2,
-    0xcd, 0xa7, 0xa9, 0x94, 0x0d, 0xc5, 0xdd, 0x03, 0x46, 0xac, 0x24, 0xb0, 0xd2, 0xf3, 0x4e, 0xad, 0x05, 0x22, 0xde,
-    0x3b, 0x36, 0xc1, 0x5d, 0x09, 0x96, 0x0e, 0x47, 0x0d, 0xeb, 0x70, 0x5a, 0xba, 0xf9, 0x72, 0xeb, 0x95, 0xb6, 0x6d,
-    0xc2, 0x41, 0xd1, 0xc9, 0xe3, 0xdd, 0x96, 0xd5, 0x6b, 0x2b, 0x39, 0xac, 0xb4, 0x60, 0xf7, 0x65, 0xcc, 0x68, 0x69,
-    0xc9, 0x0b, 0xd9, 0xa3, 0xb8, 0x2f, 0xc9, 0x73, 0xb8, 0x33, 0xf4, 0x52, 0xce, 0xd2, 0xb5, 0xab, 0x31, 0xdd, 0xfd,
-    0x52, 0xfb, 0xdf, 0x97, 0xc1, 0x4b, 0xfc, 0x1e, 0x02, 0xbb, 0x5f, 0x55, 0xcd, 0x37, 0x03, 0xba, 0x5f, 0x55, 0x08,
-    0xfa, 0x2a, 0xda, 0x68, 0xe7, 0x04, 0x72, 0x3b, 0xe1, 0xd3, 0xb0, 0xe5, 0x5b, 0x6d, 0xe9, 0x67, 0x1d, 0x46, 0xd2,
-    0x99, 0x96, 0xea, 0x3c, 0xe0, 0x2a, 0x4f, 0x0d, 0xf2, 0xe5, 0xea, 0x16, 0x12, 0x35, 0x19, 0x86, 0x5a, 0x87, 0xdf,
-    0xb5, 0x3d, 0x46, 0xc6, 0x64, 0xda, 0xce, 0xf8, 0x3a, 0x16, 0x72, 0x1f, 0x4e, 0x19, 0xdf, 0xb8, 0x87, 0x37, 0x25,
-    0xe0, 0x41, 0xbb, 0xdf, 0x14, 0x8e, 0xb1, 0x9d, 0xeb, 0x7b, 0x40, 0xee, 0xf8, 0x84, 0x5b, 0xdd, 0xad, 0x6e, 0x65,
-    0x7c, 0x0d, 0xf6, 0x3f, 0xc2, 0x53, 0x7b, 0x39, 0x8e, 0x1a, 0x0e, 0x4c, 0xa3, 0x65, 0x51, 0x3a, 0x05, 0xb8, 0x56,
-    0xde, 0x04, 0xc2, 0xbc, 0x50, 0x01, 0xee, 0x1f, 0xf0, 0x37, 0x86, 0x25, 0x8e, 0x4b, 0x8e, 0x73, 0x72, 0x5f, 0x8e,
-    0xa8, 0xc1, 0x2f, 0xe3, 0xf7, 0x40, 0xc7, 0x8a, 0x42, 0x0b, 0x4b, 0x45, 0xcf, 0xb9, 0x59, 0xc8, 0xce, 0xb4, 0x54,
-    0x4c, 0xcb, 0x94, 0x1a, 0x35, 0xcd, 0x96, 0x3c, 0x4e, 0x6b, 0x65, 0xcb, 0xf2, 0x54, 0xd5, 0xe6, 0x45, 0x3b, 0xb0,
-    0x58, 0x85, 0x16, 0x57, 0xab, 0xa0, 0x8e, 0x6a, 0xc2, 0x9c, 0x48, 0x06, 0xc2, 0xcc, 0xc9, 0xa8, 0xa8, 0x69, 0xd6,
-    0xba, 0x4f, 0x80, 0xd6, 0x13, 0x8a, 0xac, 0x6e, 0x5e, 0x83, 0xc3, 0x75, 0x21, 0xe8, 0xee, 0xae, 0x4f, 0x01, 0xeb,
-    0xd5, 0x95, 0x13, 0x39, 0x18, 0xfa, 0xb9, 0x4c, 0x95, 0xad, 0x72, 0x5a, 0xb7, 0xe0, 0x17, 0xdd, 0x91, 0x2c, 0x6b,
-    0x50, 0xb7, 0x59, 0xef, 0x24, 0x1b, 0x3d, 0xe7, 0xbb, 0x92, 0x8d, 0x6a, 0xda, 0xee, 0x5e, 0x0b, 0xdd, 0x9d, 0x96,
-    0xaa, 0xe7, 0xda, 0xde, 0xe4, 0x37, 0x4c, 0xd7, 0x06, 0xda, 0xd4, 0x68, 0xb6, 0x5c, 0xe5, 0xac, 0x28, 0xc6, 0xe5,
-    0x65, 0x02, 0x95, 0xbb, 0x33, 0xd6, 0xf4, 0x6f, 0xac, 0x46, 0x75, 0x1d, 0x37, 0xf8, 0x81, 0x4c, 0x52, 0x7e, 0x19,
-    0xa7, 0xef, 0x61, 0xbe, 0xaa, 0xf2, 0xe5, 0x6d, 0x22, 0x62, 0x49, 0x0d, 0x77, 0xa9, 0x60, 0xf8, 0xc1, 0x81, 0xe1,
-    0x07, 0xcd, 0xa7, 0xab, 0xfe, 0x78, 0xf9, 0xaa, 0x1c, 0x20, 0x1a, 0x17, 0x96, 0x65, 0x9c, 0xcb, 0xed, 0x73, 0xac,
-    0xb3, 0xb0, 0xf3, 0x92, 0x85, 0x9d, 0xcb, 0x60, 0x7d, 0xa8, 0x20, 0xf8, 0x66, 0xfb, 0x28, 0x9b, 0x9c, 0xed, 0x9b,
-    0xea, 0xe0, 0x7f, 0x13, 0xdd, 0xd9, 0xc7, 0xe1, 0x72, 0x47, 0xe1, 0x91, 0x4a, 0x57, 0xd1, 0x20, 0xbf, 0x83, 0xb4,
-    0x03, 0x49, 0x7a, 0xce, 0x9d, 0x83, 0x4a, 0x4e, 0xd9, 0x44, 0xa0, 0x60, 0xb4, 0xc8, 0x25, 0x9f, 0x99, 0x31, 0x73,
-    0x73, 0xcd, 0x48, 0x55, 0x82, 0x2b, 0x5a, 0x45, 0xdb, 0xa3, 0xfa, 0x45, 0xae, 0xe5, 0x47, 0x96, 0x25, 0x51, 0x8e,
-    0x8d, 0x14, 0xc9, 0xa3, 0xac, 0x20, 0x36, 0xd9, 0x78, 0xb3, 0x0e, 0x8f, 0x59, 0xc6, 0xf2, 0x29, 0x15, 0x01, 0x47,
-    0xcb, 0x5d, 0x93, 0x71, 0x08, 0xc8, 0xe8, 0xc9, 0xf0, 0xb7, 0xd5, 0x85, 0xbf, 0x10, 0x46, 0x03, 0x3f, 0xd0, 0x8c,
-    0xca, 0x29, 0x4f, 0x20, 0x31, 0x25, 0x4c, 0xca, 0x1b, 0x4d, 0x07, 0x07, 0x7b, 0x81, 0xaf, 0xdc, 0x12, 0x70, 0xf5,
-    0xdb, 0xad, 0x41, 0xfd, 0x25, 0x5c, 0xcf, 0xa9, 0xa6, 0xa6, 0x68, 0x49, 0xd7, 0x6f, 0xb2, 0xc8, 0xf0, 0x23, 0xbd,
-    0xc5, 0x02, 0x15, 0x45, 0xa4, 0xa1, 0xf6, 0xc7, 0x8c, 0xa6, 0x89, 0x8f, 0x3f, 0xd2, 0xdb, 0xa8, 0xbc, 0x2d, 0xae,
-    0x2e, 0x37, 0xab, 0x0d, 0xf4, 0xf9, 0x75, 0xe6, 0xe3, 0x6a, 0x92, 0x68, 0x59, 0x60, 0x2e, 0xd8, 0x04, 0x88, 0xf3,
-    0x6f, 0xf4, 0x36, 0xd2, 0xe3, 0x31, 0xe7, 0xb2, 0x1e, 0x5a, 0x5a, 0xd4, 0x87, 0x4e, 0xb1, 0xbb, 0x0d, 0xc6, 0xa0,
-    0x18, 0xa8, 0xbe, 0x43, 0x52, 0x6b, 0x57, 0x99, 0x87, 0x08, 0x15, 0xf7, 0x5d, 0x0a, 0xfe, 0xc2, 0x15, 0x6d, 0xb2,
-    0x96, 0xfa, 0xba, 0xd6, 0x89, 0x42, 0x87, 0x2a, 0xd7, 0xe3, 0x3c, 0x10, 0xf6, 0xd4, 0x99, 0x3b, 0x08, 0x8e, 0x23,
-    0xec, 0x0b, 0x69, 0x06, 0x8d, 0xbe, 0xd5, 0x29, 0x21, 0x55, 0x24, 0xe9, 0x75, 0xd5, 0xcf, 0x3b, 0x0f, 0x00, 0xef,
-    0x90, 0xd2, 0x12, 0xab, 0xeb, 0x98, 0x85, 0x4d, 0x17, 0xfd, 0x4e, 0x92, 0x60, 0x69, 0x97, 0x10, 0x09, 0x17, 0x8b,
-    0xb2, 0x00, 0x2a, 0x34, 0xf4, 0xa5, 0x33, 0x00, 0xd9, 0x38, 0x60, 0x1b, 0x52, 0x33, 0x53, 0x52, 0x33, 0x74, 0x30,
-    0xbe, 0x43, 0x4a, 0x52, 0x85, 0x0c, 0xa5, 0x44, 0x2a, 0xa1, 0x67, 0x36, 0xd7, 0x90, 0x90, 0xbb, 0xa1, 0xe5, 0xf5,
-    0x39, 0xbd, 0xe7, 0x59, 0x0d, 0xac, 0x40, 0x8d, 0x83, 0x8a, 0x08, 0x96, 0x44, 0x75, 0x83, 0xc2, 0xba, 0x73, 0x84,
-    0xcd, 0x6f, 0x0d, 0x78, 0x68, 0x97, 0x45, 0x2c, 0x4a, 0x82, 0x29, 0x5a, 0x8a, 0x60, 0x8a, 0x33, 0xc8, 0x47, 0xe4,
-    0x45, 0x09, 0x3f, 0x75, 0x77, 0xa3, 0x96, 0xad, 0xbc, 0xfd, 0x8a, 0x1f, 0x28, 0xf3, 0x12, 0x72, 0x34, 0xb1, 0xb0,
-    0x3c, 0x45, 0x04, 0xea, 0xae, 0x9d, 0xb3, 0x6d, 0x5f, 0x99, 0x14, 0x1d, 0x03, 0xd8, 0x77, 0x32, 0x58, 0x3a, 0xab,
-    0x70, 0xef, 0x72, 0x9b, 0x2b, 0x7f, 0x26, 0xd8, 0x57, 0x25, 0x91, 0x06, 0x39, 0x59, 0x93, 0x38, 0x77, 0xe7, 0x5a,
-    0xfe, 0xbc, 0xa0, 0xe2, 0xf6, 0x8c, 0x42, 0xae, 0x33, 0x87, 0xbb, 0xbe, 0xd5, 0x36, 0x54, 0x79, 0xea, 0xfd, 0x4c,
-    0x29, 0x2b, 0x45, 0xfd, 0x12, 0xe0, 0xfa, 0x15, 0xc1, 0x42, 0x45, 0x1b, 0x1d, 0x47, 0x8c, 0x3e, 0x2d, 0x74, 0xe7,
-    0xe5, 0x49, 0xda, 0x65, 0xe0, 0x5f, 0xab, 0x30, 0x6d, 0x82, 0x05, 0x98, 0xbb, 0x17, 0x52, 0x07, 0xf9, 0x70, 0xdd,
-    0x2b, 0x03, 0x45, 0x10, 0xbe, 0xcb, 0x76, 0x2f, 0x75, 0x5b, 0xd6, 0xec, 0xee, 0xa5, 0xd6, 0x82, 0x7e, 0x2a, 0xe5,
-    0x07, 0x9b, 0x79, 0xca, 0xcb, 0xcb, 0xac, 0x28, 0x50, 0x01, 0xe0, 0x7d, 0xdf, 0x0d, 0x82, 0xef, 0x4d, 0xd2, 0x60,
-    0x08, 0xb1, 0xd8, 0xb3, 0x94, 0x5b, 0x26, 0x5e, 0xcd, 0xff, 0xfd, 0xc6, 0xfc, 0xdf, 0x3b, 0x57, 0x4e, 0xc1, 0x34,
-    0x9a, 0x64, 0x34, 0xb1, 0xac, 0x13, 0x69, 0x02, 0x54, 0x7a, 0x5b, 0x2e, 0xc9, 0xc7, 0x8b, 0x08, 0x34, 0xae, 0xe5,
-    0x98, 0x67, 0xb2, 0x39, 0x8e, 0x67, 0x2c, 0xbd, 0x8d, 0x16, 0xac, 0x39, 0xe3, 0x19, 0xcf, 0xe7, 0xf1, 0x88, 0xe2,
-    0xfc, 0x36, 0x97, 0x74, 0xd6, 0x5c, 0x30, 0xfc, 0x92, 0xa6, 0x57, 0x54, 0xb2, 0x51, 0x8c, 0xfd, 0x13, 0xc1, 0xe2,
-    0xd4, 0x7b, 0x13, 0x0b, 0xc1, 0xaf, 0x7d, 0xfc, 0x8e, 0x5f, 0x72, 0xc9, 0xf1, 0xdb, 0x9b, 0xdb, 0x09, 0xcd, 0xf0,
-    0x87, 0xcb, 0x45, 0x26, 0x17, 0x38, 0x8f, 0xb3, 0xbc, 0x99, 0x53, 0xc1, 0xc6, 0xdd, 0x11, 0x4f, 0xb9, 0x68, 0x42,
-    0xca, 0xf6, 0x8c, 0x46, 0x29, 0x9b, 0x4c, 0xa5, 0x97, 0xc4, 0xe2, 0x63, 0xb7, 0xd9, 0x9c, 0x0b, 0x36, 0x8b, 0xc5,
-    0x6d, 0x53, 0xb5, 0x88, 0x3e, 0x6b, 0x1d, 0xc5, 0x9f, 0x8f, 0x1f, 0x76, 0xa5, 0x88, 0xb3, 0x9c, 0xc1, 0x36, 0x45,
-    0x71, 0x9a, 0x7a, 0x47, 0x8f, 0x5a, 0xb3, 0x7c, 0x4f, 0x07, 0xf2, 0xe2, 0x4c, 0x16, 0x17, 0xf8, 0x23, 0xc0, 0x1d,
-    0x5e, 0xca, 0x0c, 0x5f, 0x2e, 0xa4, 0xe4, 0xd9, 0x72, 0xb4, 0x10, 0x39, 0x17, 0xd1, 0x9c, 0xb3, 0x4c, 0x52, 0xd1,
-    0xbd, 0xe4, 0x22, 0xa1, 0xa2, 0x29, 0xe2, 0x84, 0x2d, 0xf2, 0xe8, 0xe1, 0xfc, 0xa6, 0x0b, 0x9a, 0xc5, 0x44, 0xf0,
-    0x45, 0x96, 0x98, 0xb9, 0x58, 0x36, 0xa5, 0x82, 0x49, 0xb7, 0x42, 0xbd, 0xc2, 0x24, 0x4a, 0x59, 0x46, 0x63, 0xd1,
-    0x9c, 0x40, 0x67, 0x30, 0x8b, 0x5a, 0x09, 0x9d, 0x60, 0x31, 0xb9, 0x8c, 0x83, 0x76, 0xe7, 0x09, 0xb6, 0x7f, 0xc3,
-    0x47, 0xc8, 0x6b, 0x6d, 0x2f, 0x6e, 0xb7, 0x5a, 0x7f, 0x42, 0xdd, 0xb5, 0x59, 0x14, 0x40, 0x51, 0x7b, 0x7e, 0xe3,
-    0xe5, 0x1c, 0x72, 0xda, 0xb6, 0xf5, 0xec, 0xce, 0xe3, 0x04, 0x12, 0x82, 0xa3, 0xce, 0xfc, 0xa6, 0x80, 0xd5, 0x45,
-    0x3a, 0xc9, 0xd4, 0x2c, 0xd2, 0x3c, 0x2d, 0x7f, 0x2b, 0xc4, 0x4f, 0xb7, 0x43, 0xdc, 0xb1, 0x10, 0x57, 0x58, 0x6f,
-    0x26, 0x0b, 0xa1, 0x62, 0xab, 0x51, 0x3b, 0xd7, 0x80, 0x4c, 0xf9, 0x15, 0x15, 0x16, 0x0e, 0xf5, 0xf0, 0x9b, 0xc1,
-    0xe8, 0x6c, 0x07, 0xe3, 0xe9, 0xa7, 0xc0, 0x10, 0x59, 0xb2, 0xac, 0xef, 0x6b, 0x5b, 0xd0, 0x59, 0x77, 0x4a, 0x81,
-    0x9e, 0xa2, 0x0e, 0xfc, 0xbe, 0x66, 0x89, 0x9c, 0xea, 0x9f, 0x8a, 0x9c, 0xaf, 0x75, 0xdd, 0xa3, 0x56, 0x4b, 0x3f,
-    0xe7, 0xec, 0x17, 0x1a, 0xb5, 0x43, 0x68, 0x50, 0x5c, 0xe0, 0xbf, 0x95, 0x97, 0x79, 0xeb, 0xdc, 0x13, 0xff, 0xe0,
-    0xde, 0xf2, 0x75, 0x92, 0x14, 0xab, 0x1b, 0xd1, 0x58, 0x58, 0x59, 0xa9, 0x85, 0x0f, 0xb8, 0xed, 0xd4, 0x79, 0x22,
-    0xac, 0x57, 0xde, 0xe2, 0x64, 0xfd, 0x1f, 0x74, 0xde, 0x45, 0x04, 0x91, 0x0e, 0x27, 0xd9, 0x90, 0x77, 0xb3, 0x1e,
-    0x69, 0x75, 0xb3, 0x66, 0x13, 0x05, 0x9c, 0x88, 0x41, 0x66, 0xd2, 0xf3, 0x02, 0xd6, 0xe7, 0xca, 0xd8, 0xce, 0x51,
-    0xc4, 0xe1, 0xaa, 0xe9, 0x6a, 0x55, 0x85, 0x01, 0x98, 0xba, 0xae, 0xf1, 0x37, 0x69, 0x1a, 0xe0, 0xdc, 0xe1, 0xe4,
-    0x99, 0x7d, 0xb1, 0x8b, 0xb0, 0xbc, 0x22, 0xe5, 0x23, 0x85, 0xb9, 0x70, 0x1e, 0xcb, 0x29, 0x78, 0x29, 0x4a, 0xf1,
-    0x53, 0x25, 0x31, 0xf9, 0x87, 0x3e, 0xea, 0x8b, 0x32, 0xc3, 0x0d, 0x32, 0xf9, 0x44, 0x01, 0xa3, 0x7c, 0x23, 0x09,
-    0x8c, 0x88, 0x7f, 0x21, 0xda, 0xa6, 0xb3, 0x16, 0xdd, 0xf8, 0xbe, 0x16, 0x1d, 0xcd, 0x24, 0x53, 0xb9, 0xdb, 0x36,
-    0xe2, 0x30, 0x8d, 0xf3, 0xf3, 0x91, 0xbe, 0x2b, 0x99, 0x57, 0x37, 0x03, 0x62, 0x05, 0xbd, 0x36, 0xd2, 0xa8, 0x50,
-    0xf6, 0xe8, 0xf7, 0x72, 0xa7, 0x7d, 0x22, 0xee, 0xb2, 0x4f, 0xca, 0x85, 0xe7, 0x7c, 0x21, 0x46, 0x10, 0x8e, 0x34,
-    0x52, 0x6f, 0xd3, 0x71, 0xe3, 0x2b, 0x15, 0xc3, 0xc7, 0xd2, 0xc9, 0x04, 0x95, 0x98, 0xb9, 0x2f, 0x95, 0xa0, 0x2a,
-    0xe4, 0xa5, 0xef, 0x6b, 0x18, 0x11, 0x67, 0x97, 0x04, 0x32, 0x3b, 0x51, 0x49, 0x8d, 0x41, 0x46, 0x7a, 0x59, 0xb8,
-    0xc8, 0xd8, 0xcf, 0x0b, 0x7a, 0xce, 0x40, 0xd7, 0x64, 0x21, 0x4b, 0x54, 0xac, 0x09, 0x64, 0x5f, 0xb3, 0x0d, 0xc1,
-    0x0b, 0x96, 0xe8, 0x8d, 0xc9, 0x54, 0xa5, 0xc9, 0x6d, 0xf2, 0x9b, 0x3e, 0xf8, 0x8b, 0x41, 0x3b, 0x60, 0x38, 0xe1,
-    0xb3, 0x98, 0x65, 0x91, 0x72, 0xf9, 0x96, 0x83, 0x45, 0xd0, 0x1a, 0xb3, 0x24, 0xca, 0xcc, 0xf6, 0xb4, 0x51, 0xf8,
-    0x13, 0x67, 0x99, 0xea, 0x5a, 0x74, 0xb9, 0x42, 0xa8, 0x46, 0x1f, 0xb1, 0x08, 0x3e, 0xd1, 0x72, 0x8d, 0x23, 0xec,
-    0x56, 0x97, 0xd7, 0xce, 0x6b, 0x3b, 0xd0, 0x5a, 0xdb, 0x28, 0x6d, 0x04, 0xf0, 0xf5, 0xd2, 0x9c, 0x0b, 0x19, 0x04,
-    0x53, 0x9c, 0x22, 0xd2, 0x9b, 0x2a, 0x67, 0xd7, 0x71, 0xaa, 0xfe, 0xeb, 0x37, 0xdb, 0x51, 0xbb, 0x34, 0xdf, 0x6b,
-    0xb7, 0x81, 0x75, 0x72, 0x94, 0xb9, 0x51, 0xaa, 0x96, 0x51, 0xfe, 0xd6, 0x4b, 0xad, 0x9e, 0xcb, 0xe5, 0x62, 0x73,
-    0xdc, 0xb4, 0xa8, 0x0a, 0x6a, 0x40, 0xa8, 0x60, 0xd1, 0x8e, 0xa9, 0x50, 0x51, 0xad, 0xbb, 0x54, 0x25, 0x2f, 0xb4,
-    0x88, 0x3e, 0xdf, 0x5f, 0x0a, 0x33, 0x63, 0x71, 0xc1, 0xac, 0x93, 0xa9, 0x4e, 0x72, 0x85, 0xc1, 0x88, 0xa3, 0x87,
-    0x6e, 0x6b, 0xa6, 0x61, 0xb9, 0x25, 0x62, 0x2b, 0xdd, 0x86, 0xfa, 0x91, 0x0a, 0x52, 0x85, 0xbb, 0x36, 0x06, 0x80,
-    0x5c, 0xbd, 0x6d, 0x80, 0x81, 0xd9, 0x9a, 0x4b, 0xbb, 0x04, 0xd0, 0xc6, 0xc6, 0x14, 0x2e, 0xd2, 0x5c, 0xec, 0x2f,
-    0xbf, 0x91, 0xc5, 0xa1, 0xd3, 0x54, 0xfd, 0x66, 0x09, 0xfc, 0x0f, 0x12, 0x70, 0xa9, 0x95, 0xd2, 0xc8, 0xff, 0xfa,
-    0xed, 0xd9, 0x7b, 0x1f, 0x5f, 0xf2, 0xe4, 0x36, 0xf2, 0xa5, 0x58, 0x50, 0xbf, 0x40, 0xa1, 0x9c, 0xd2, 0xac, 0x7c,
-    0x19, 0x0f, 0x4f, 0x69, 0x98, 0xf2, 0x89, 0xbe, 0x94, 0xb9, 0x6e, 0x24, 0x8f, 0x2e, 0x8e, 0xd5, 0x4b, 0xa6, 0x7a,
-    0xc7, 0x52, 0xbf, 0xde, 0x4b, 0x0a, 0xf8, 0xd9, 0x83, 0x10, 0xca, 0xf1, 0xa1, 0x9c, 0xaa, 0x87, 0x33, 0x38, 0x30,
-    0xea, 0x69, 0x7f, 0xb9, 0x41, 0x4c, 0x7d, 0x18, 0x62, 0xda, 0xd3, 0x4b, 0xc8, 0x55, 0xab, 0x8b, 0x68, 0x74, 0x71,
-    0x51, 0x1c, 0x1f, 0xc2, 0x58, 0x87, 0x76, 0x5c, 0x80, 0xd0, 0xf6, 0x2f, 0x09, 0x0c, 0x5e, 0x36, 0x24, 0x48, 0x0f,
-    0x86, 0x80, 0x79, 0x93, 0x1e, 0x2c, 0x12, 0x08, 0x0c, 0x7a, 0x27, 0x65, 0x89, 0x3a, 0xb1, 0xba, 0x68, 0x17, 0x04,
-    0xba, 0x61, 0x45, 0xf7, 0xda, 0x9b, 0x5a, 0xed, 0xaf, 0x05, 0x29, 0x71, 0xa1, 0xbb, 0x40, 0xf0, 0xbf, 0x82, 0xec,
-    0xf8, 0x50, 0xe3, 0xe1, 0xc2, 0x7d, 0xb5, 0x89, 0x7e, 0xed, 0x40, 0x89, 0xad, 0x41, 0x2e, 0xf1, 0x47, 0x89, 0x3f,
-    0x5e, 0xa8, 0xa6, 0x56, 0x18, 0x81, 0x96, 0x04, 0x42, 0xbb, 0x65, 0xb5, 0x8e, 0x11, 0x4f, 0xd3, 0x78, 0x9e, 0xd3,
-    0xc8, 0xfe, 0x30, 0x72, 0x09, 0xc4, 0xdb, 0xa6, 0x22, 0x60, 0xd2, 0x6b, 0x4e, 0x41, 0x5d, 0xd8, 0xd4, 0x52, 0xae,
-    0x62, 0x11, 0x34, 0x9b, 0xa3, 0xe6, 0xe5, 0x04, 0x15, 0x72, 0xba, 0x74, 0xa5, 0xda, 0xe3, 0x56, 0xab, 0x0b, 0xb9,
-    0x90, 0xcd, 0x38, 0x65, 0x93, 0x2c, 0x4a, 0xe9, 0x58, 0x16, 0x12, 0x6e, 0xa9, 0x2d, 0xad, 0x1a, 0x11, 0x76, 0x1e,
-    0x09, 0x3a, 0xf3, 0x42, 0xf8, 0xf7, 0xee, 0x89, 0x0b, 0x99, 0x44, 0x99, 0x9c, 0x36, 0x55, 0xd6, 0x2d, 0xdc, 0x19,
-    0x90, 0xd3, 0xda, 0xf3, 0xd2, 0x99, 0x68, 0x44, 0x41, 0xc5, 0x2a, 0xa4, 0xf0, 0xe4, 0x14, 0x4b, 0xe1, 0xb6, 0xcb,
-    0xd0, 0x72, 0x63, 0x05, 0x9b, 0x92, 0xfe, 0x08, 0x15, 0xb9, 0x52, 0x8c, 0x37, 0x1b, 0x5b, 0x75, 0xa9, 0xfe, 0xb4,
-    0x81, 0x3e, 0x47, 0xb1, 0x2b, 0xb4, 0x63, 0x79, 0xa9, 0x7b, 0xdc, 0x07, 0x99, 0x35, 0x95, 0x13, 0xbb, 0x3d, 0x50,
-    0xc1, 0xb2, 0xf9, 0x42, 0x0e, 0x94, 0x53, 0x5b, 0xc0, 0x05, 0x89, 0x21, 0x76, 0x4a, 0x00, 0x07, 0xc3, 0xa5, 0x06,
-    0x66, 0x14, 0xa7, 0xa3, 0x00, 0x20, 0xf2, 0x9a, 0xde, 0x53, 0x41, 0x67, 0xa8, 0x3b, 0x63, 0x59, 0x53, 0xd7, 0x3d,
-    0x72, 0xd4, 0x92, 0xf0, 0x09, 0x3c, 0x15, 0xa1, 0x1a, 0x0d, 0xab, 0xdc, 0xd5, 0x2d, 0xb8, 0xbc, 0x18, 0x16, 0x45,
-    0x57, 0xc8, 0x60, 0xf0, 0x3a, 0x40, 0x43, 0xfc, 0x8b, 0xf3, 0x72, 0x16, 0xdf, 0x1e, 0x15, 0x1f, 0x77, 0xd0, 0x8e,
-    0x26, 0xee, 0x59, 0x50, 0xcd, 0x7e, 0x21, 0xd0, 0xf0, 0x5d, 0xe0, 0xd3, 0x7c, 0xde, 0xd4, 0xbc, 0xab, 0xa9, 0x48,
-    0xd6, 0x87, 0xae, 0xc8, 0x78, 0x6a, 0xbf, 0x97, 0x4b, 0xc5, 0x96, 0xcc, 0x25, 0x0d, 0xed, 0x4c, 0x18, 0x96, 0x97,
-    0x7a, 0xcc, 0xb3, 0x7b, 0x8d, 0x07, 0xd5, 0xf8, 0xc9, 0xc5, 0x49, 0x9d, 0xc7, 0x01, 0x5f, 0x2a, 0x5f, 0x60, 0x17,
-    0xa7, 0x29, 0x4c, 0x78, 0x61, 0xd5, 0x17, 0xf7, 0xa5, 0x1f, 0x03, 0x39, 0x0c, 0x50, 0x61, 0xce, 0xe9, 0x33, 0xa5,
-    0x52, 0x3a, 0x6f, 0xcd, 0xdb, 0x93, 0x36, 0x58, 0xa4, 0xa5, 0x2f, 0x83, 0x70, 0x77, 0x2d, 0x2f, 0xba, 0x5b, 0xf1,
-    0x2e, 0xad, 0x90, 0x7a, 0x6a, 0x41, 0xc4, 0x17, 0x59, 0xe2, 0x7b, 0x7f, 0x19, 0xa5, 0x6c, 0xf4, 0x91, 0xf8, 0xfb,
-    0xcb, 0x00, 0x6d, 0x5e, 0x7b, 0x54, 0x5c, 0xc1, 0x32, 0x6c, 0x54, 0x77, 0xa4, 0x67, 0xa1, 0xc3, 0x8b, 0xf5, 0x5b,
-    0x71, 0xfc, 0xde, 0xfe, 0x12, 0x18, 0x8f, 0x9e, 0xa7, 0x77, 0x51, 0x9c, 0x57, 0xef, 0xba, 0xaa, 0xa0, 0x00, 0x34,
-    0xeb, 0x72, 0x4f, 0x11, 0x15, 0xf1, 0x3f, 0x49, 0x69, 0xbe, 0xa7, 0x99, 0x1a, 0xc0, 0x29, 0x0d, 0x7f, 0xf3, 0xbd,
-    0xbf, 0x94, 0x65, 0xb4, 0xf4, 0x68, 0xa8, 0x94, 0x0c, 0xe2, 0xc3, 0x5c, 0x60, 0xc6, 0x86, 0x09, 0x95, 0x31, 0x4b,
-    0x75, 0x97, 0xae, 0x35, 0xc0, 0xd7, 0x56, 0xb4, 0x5a, 0xe5, 0xf5, 0xb5, 0xb0, 0x3a, 0x06, 0xd5, 0xca, 0x8e, 0x0f,
-    0x2b, 0xb8, 0xd5, 0xca, 0xd4, 0x99, 0x74, 0x43, 0x83, 0xd5, 0x0a, 0x75, 0x9d, 0xf7, 0x97, 0x91, 0xba, 0x36, 0x04,
-    0x00, 0x72, 0x03, 0x20, 0x04, 0xad, 0xf5, 0xb5, 0x98, 0x20, 0x25, 0x3c, 0x94, 0xb1, 0x98, 0x50, 0xb9, 0x86, 0xd8,
-    0x54, 0xe7, 0xa8, 0x76, 0x6d, 0x80, 0x7a, 0x03, 0xda, 0xb8, 0x0e, 0xed, 0x05, 0x20, 0xbd, 0xbf, 0xbf, 0x64, 0x05,
-    0xd9, 0x5f, 0xd2, 0x6c, 0xc4, 0x13, 0xfa, 0xe1, 0xdd, 0x97, 0x70, 0xc9, 0x91, 0x67, 0x60, 0x58, 0x4c, 0x11, 0x08,
-    0x4e, 0xb5, 0x39, 0x5a, 0x84, 0x70, 0x25, 0x42, 0x34, 0x27, 0xf0, 0xd4, 0x5c, 0x0a, 0xc4, 0xc2, 0xf7, 0xfa, 0x1a,
-    0x72, 0x9a, 0x68, 0x98, 0x49, 0xa6, 0x7a, 0xf1, 0xe2, 0xf8, 0x50, 0xb7, 0xd6, 0x22, 0x40, 0x37, 0x02, 0x24, 0xa8,
-    0x73, 0x5a, 0xe1, 0x00, 0xf2, 0x9a, 0x5d, 0x3c, 0x24, 0xec, 0xaa, 0x24, 0x36, 0x75, 0x81, 0xaa, 0x77, 0x9c, 0xc6,
-    0x97, 0x34, 0xed, 0xed, 0x2f, 0xb3, 0xd5, 0xaa, 0x55, 0x1c, 0x1f, 0xea, 0x47, 0xef, 0x58, 0xf1, 0x0d, 0xfd, 0xc2,
-    0x4b, 0xb5, 0xc5, 0x70, 0x2b, 0x11, 0xb2, 0x3d, 0x6d, 0x9a, 0x53, 0x64, 0x06, 0x28, 0x7c, 0x4f, 0x25, 0x58, 0xa8,
-    0x46, 0xa5, 0x42, 0x54, 0xf8, 0x1e, 0x4b, 0x36, 0xcb, 0x72, 0x49, 0xe7, 0x50, 0x3a, 0x5d, 0xad, 0xda, 0x85, 0xef,
-    0xcd, 0x58, 0x06, 0x4f, 0xd9, 0x6a, 0xa5, 0x2e, 0xfc, 0xcd, 0x58, 0x16, 0xb4, 0x80, 0x6c, 0x7d, 0x6f, 0x16, 0xdf,
-    0xa8, 0x05, 0xdb, 0x9a, 0xf8, 0x26, 0x68, 0x9b, 0xaa, 0xb0, 0xc4, 0x4f, 0x0e, 0x14, 0x57, 0xed, 0x68, 0x6a, 0x76,
-    0x34, 0xc1, 0x0b, 0x7d, 0x95, 0x89, 0x04, 0x09, 0x49, 0xb7, 0xef, 0x68, 0x62, 0x77, 0x74, 0xb1, 0x63, 0x47, 0x17,
-    0x77, 0xec, 0x68, 0x6c, 0x76, 0xcf, 0x2b, 0x71, 0xc7, 0x57, 0xab, 0x76, 0xab, 0xc2, 0xde, 0xf1, 0x61, 0xc2, 0xae,
-    0x60, 0x37, 0x40, 0xcd, 0x93, 0x6c, 0x46, 0xb7, 0x13, 0x65, 0x1d, 0xc5, 0xf4, 0x57, 0x61, 0xb2, 0x44, 0x42, 0x56,
-    0x47, 0x82, 0x4b, 0xd6, 0x65, 0xc8, 0xed, 0x8f, 0x24, 0x6c, 0x06, 0x68, 0xc8, 0x01, 0x0d, 0x53, 0x83, 0x86, 0x8b,
-    0xe2, 0x1c, 0x24, 0x82, 0x5a, 0xcd, 0xbd, 0x28, 0x0f, 0x5a, 0xfb, 0xbd, 0xdd, 0x14, 0x06, 0xc1, 0xf0, 0x6b, 0x2e,
-    0x12, 0x3f, 0xd2, 0x4d, 0x7f, 0x15, 0x62, 0x66, 0x2c, 0x33, 0xa9, 0x55, 0x3b, 0x29, 0xab, 0xaa, 0x77, 0xe9, 0xab,
-    0xf3, 0xe8, 0x91, 0x6e, 0x31, 0x8f, 0xa5, 0xa4, 0x22, 0x33, 0x74, 0xea, 0xfb, 0x2e, 0xb6, 0xff, 0x7f, 0x91, 0xdc,
-    0x16, 0x26, 0x12, 0x5b, 0x26, 0x62, 0xa9, 0xcd, 0x68, 0xe7, 0x86, 0xc1, 0x6b, 0x59, 0xb4, 0x57, 0xa9, 0xab, 0xb7,
-    0xc8, 0xb5, 0x10, 0x74, 0x11, 0x18, 0x2c, 0x8b, 0x19, 0x4d, 0xce, 0x15, 0x37, 0xee, 0x8f, 0x2e, 0x8c, 0x76, 0xba,
-    0x26, 0xdb, 0xaa, 0x0e, 0xd8, 0xff, 0x71, 0xd1, 0x79, 0xf2, 0xf0, 0xd4, 0xc7, 0x9a, 0xa1, 0xf3, 0xf1, 0xd8, 0x47,
-    0x85, 0x77, 0xbf, 0x6e, 0xed, 0x87, 0x3f, 0x2e, 0xbe, 0x78, 0xd1, 0xfa, 0xa2, 0xec, 0x9c, 0xf9, 0xa8, 0xb8, 0x30,
-    0xc1, 0x7c, 0x2b, 0x97, 0x1c, 0x78, 0xed, 0x8a, 0xc6, 0x71, 0xb6, 0x7b, 0x39, 0x03, 0x77, 0x39, 0xf9, 0x9c, 0xd2,
-    0x04, 0xfb, 0x9e, 0x8f, 0x37, 0x4a, 0xcf, 0x53, 0x7a, 0x45, 0xed, 0x6b, 0x06, 0xb7, 0x4c, 0xb6, 0xa5, 0xc7, 0x88,
-    0x2f, 0x32, 0x69, 0xb2, 0x1a, 0x0c, 0x5f, 0x75, 0x96, 0x74, 0xa1, 0xd6, 0xe0, 0x1a, 0x04, 0xb7, 0x5a, 0xa8, 0xd5,
-    0x45, 0x55, 0x71, 0x81, 0x7d, 0x07, 0x80, 0x9d, 0x90, 0xf5, 0x77, 0x94, 0x47, 0x2d, 0xdc, 0xda, 0x05, 0x1b, 0x6e,
-    0xa3, 0xc8, 0xf7, 0x87, 0x16, 0x4f, 0xca, 0x31, 0x59, 0x7b, 0x3b, 0xc4, 0x4e, 0x7c, 0x7d, 0x12, 0x03, 0x97, 0x02,
-    0x06, 0xcb, 0x68, 0x9e, 0xef, 0x44, 0x40, 0xb9, 0x89, 0xd8, 0xaf, 0x5a, 0xfb, 0x3b, 0x46, 0xc1, 0x2d, 0x0c, 0x07,
-    0x4c, 0x01, 0x5c, 0x86, 0x47, 0x4d, 0x2b, 0x3a, 0x1e, 0xd3, 0x51, 0xe9, 0xd7, 0x85, 0x40, 0xd7, 0x98, 0xa5, 0x12,
-    0xe2, 0x3d, 0x2a, 0x10, 0xe3, 0xbf, 0xe1, 0x19, 0xf5, 0x91, 0x4d, 0xdd, 0x34, 0xf0, 0x1b, 0x61, 0xbf, 0x1d, 0x1e,
-    0x3d, 0x62, 0x1d, 0x16, 0x33, 0xcb, 0x6a, 0x65, 0x7d, 0x3a, 0xb5, 0xf2, 0x3a, 0x22, 0xb9, 0x72, 0xda, 0xec, 0x3a,
-    0x40, 0xf7, 0x3b, 0x26, 0xcb, 0xf6, 0x17, 0x8f, 0xda, 0xad, 0xc2, 0xc7, 0x3e, 0x0c, 0x77, 0xdf, 0x53, 0xa2, 0x7a,
-    0x1d, 0x41, 0xaf, 0x45, 0xf6, 0x6b, 0xfa, 0x75, 0xda, 0x9f, 0xb7, 0x7d, 0xac, 0xdf, 0x1a, 0x80, 0x8a, 0x92, 0x19,
-    0x8c, 0xc0, 0xd3, 0xf9, 0xbb, 0x97, 0x52, 0x1f, 0xfc, 0x7e, 0xf0, 0x3c, 0x6e, 0xb7, 0x7c, 0xec, 0xe7, 0x92, 0xcf,
-    0x7f, 0xc5, 0x12, 0x8e, 0x7c, 0xec, 0x8f, 0x52, 0x9e, 0x53, 0x77, 0x0d, 0x5a, 0x77, 0xfd, 0xfd, 0x8b, 0xd0, 0x10,
-    0xcd, 0x05, 0xcd, 0x73, 0xcf, 0x1d, 0xdf, 0x90, 0xd2, 0x27, 0x18, 0xe6, 0x56, 0x8a, 0xcb, 0xa9, 0x54, 0x78, 0xd1,
-    0x17, 0xfa, 0x5d, 0xaa, 0xd2, 0x65, 0x1b, 0xc4, 0xa6, 0x44, 0x40, 0xc9, 0xd8, 0xb4, 0x2a, 0xf5, 0xc9, 0x99, 0xb7,
-    0x1c, 0x3d, 0x3d, 0xb1, 0x0e, 0x00, 0x6f, 0x4e, 0x50, 0x2b, 0x99, 0xb1, 0xec, 0x7c, 0x4b, 0x69, 0x7c, 0xb3, 0xa5,
-    0x14, 0xf4, 0xb3, 0x12, 0x3a, 0xf3, 0xae, 0x99, 0x4f, 0x63, 0xbd, 0xd2, 0x72, 0x5c, 0x10, 0x13, 0xe5, 0xa4, 0xfc,
-    0x04, 0xa4, 0xce, 0x36, 0xa8, 0x11, 0x7e, 0xfb, 0x74, 0x50, 0xf2, 0xab, 0xa6, 0xa3, 0x37, 0x9f, 0xde, 0x73, 0x47,
-    0xaf, 0xf9, 0x1d, 0xd8, 0x37, 0xf7, 0xc6, 0xd7, 0xd1, 0xbf, 0xa5, 0xd8, 0xa8, 0x1e, 0xe5, 0x16, 0x8c, 0x52, 0x36,
-    0xab, 0x76, 0x61, 0x13, 0x4c, 0xa5, 0x74, 0x40, 0xf2, 0x90, 0x3b, 0x88, 0xd6, 0x3e, 0xce, 0xe1, 0x4a, 0x24, 0xbc,
-    0x77, 0x62, 0x21, 0xe8, 0x79, 0xca, 0xaf, 0xd7, 0xdf, 0xa3, 0xb5, 0xbb, 0xf1, 0x94, 0x4d, 0xa6, 0xce, 0x3d, 0x27,
-    0x4a, 0x4a, 0xd4, 0xdf, 0x39, 0x41, 0xf1, 0xaf, 0xff, 0x12, 0x86, 0xff, 0xfa, 0x2f, 0x9f, 0x6c, 0x0a, 0xc3, 0x17,
-    0x17, 0x58, 0x56, 0xc3, 0xee, 0x26, 0xf0, 0xed, 0x33, 0xd5, 0x71, 0xbe, 0xbd, 0xcd, 0xc6, 0x26, 0x40, 0xfd, 0xc6,
-    0x16, 0x6c, 0x14, 0xea, 0x03, 0xe0, 0xfd, 0x16, 0xc0, 0x60, 0x5d, 0x9f, 0x84, 0x0c, 0x1a, 0xfd, 0x2e, 0xd0, 0x2e,
-    0x50, 0x74, 0xaf, 0x1d, 0xf9, 0xed, 0x18, 0xfe, 0xd4, 0x1a, 0x7e, 0x27, 0xf8, 0xc6, 0x1f, 0x30, 0xba, 0xb8, 0x28,
-    0x13, 0xda, 0xdc, 0xae, 0x70, 0x61, 0xbe, 0xbf, 0x51, 0x62, 0x64, 0x7f, 0xd4, 0x42, 0x3d, 0x75, 0x1d, 0x8f, 0x8c,
-    0x2e, 0x5e, 0xc3, 0x5b, 0x72, 0x8e, 0x2f, 0x85, 0x75, 0xa8, 0xde, 0xc1, 0x9f, 0x61, 0x88, 0xfa, 0xaa, 0xd4, 0xa0,
-    0x1b, 0xcc, 0x19, 0x4a, 0x41, 0xe1, 0x07, 0x30, 0xf1, 0xe8, 0xc2, 0x58, 0x77, 0xa7, 0xda, 0xed, 0x11, 0xad, 0x93,
-    0xb6, 0x71, 0x87, 0xd4, 0x90, 0x8e, 0xbd, 0xf7, 0x0a, 0x5f, 0xaa, 0x31, 0xad, 0xac, 0x69, 0xe5, 0x5a, 0x02, 0x55,
-    0xfe, 0xa2, 0x50, 0x61, 0xf1, 0xbf, 0xee, 0x8a, 0xdc, 0xfd, 0xfd, 0xd3, 0x91, 0x3b, 0x7e, 0xaf, 0xc8, 0xdd, 0xdf,
-    0xff, 0xf0, 0xc8, 0xdd, 0x5f, 0xdd, 0xc8, 0x1d, 0x6c, 0xe2, 0x97, 0xf7, 0x8a, 0xae, 0xd9, 0xc8, 0x07, 0xbf, 0xce,
-    0x49, 0xdb, 0x68, 0xb2, 0x29, 0x9f, 0x40, 0x68, 0xed, 0xdf, 0x3f, 0x52, 0x96, 0xf2, 0x89, 0x1b, 0x27, 0x83, 0xb7,
-    0xa4, 0x42, 0x60, 0xac, 0x6b, 0x23, 0x5a, 0x26, 0x36, 0xd5, 0x2a, 0x6f, 0x80, 0x34, 0x1f, 0xda, 0x37, 0x16, 0xf8,
-    0x51, 0xf9, 0xd6, 0xa1, 0x16, 0xee, 0xd8, 0xe8, 0x55, 0xa4, 0x02, 0x5f, 0x65, 0xc7, 0x4e, 0xc3, 0x5e, 0x6f, 0x70,
-    0x47, 0xe8, 0xda, 0xb7, 0xaa, 0xe8, 0xdb, 0xee, 0x4b, 0xff, 0xc7, 0x9b, 0xf6, 0xb3, 0x41, 0xbb, 0x7b, 0xd4, 0x9e,
-    0xf9, 0x91, 0x0f, 0x52, 0x4a, 0x15, 0xb4, 0xba, 0x47, 0x47, 0x50, 0x70, 0xed, 0x14, 0x74, 0xa0, 0x80, 0x39, 0x05,
-    0x8f, 0xa0, 0x60, 0xe4, 0x14, 0x3c, 0x86, 0x82, 0xc4, 0x29, 0x78, 0x02, 0x05, 0x57, 0x7e, 0x31, 0x60, 0x25, 0xb8,
-    0x4f, 0xd0, 0x10, 0x6b, 0xe3, 0xc1, 0x96, 0x3d, 0xc1, 0x6d, 0x08, 0x99, 0xc5, 0x13, 0x95, 0xe9, 0x03, 0x0e, 0xb8,
-    0x88, 0xe3, 0xeb, 0x29, 0xcd, 0x22, 0x08, 0x5a, 0x3e, 0x57, 0x32, 0x26, 0x94, 0xfc, 0x3d, 0x9b, 0x51, 0xfb, 0x7d,
-    0x0a, 0x8b, 0x07, 0xcf, 0x47, 0x83, 0xd6, 0xb0, 0xe8, 0x96, 0x3b, 0xa7, 0x63, 0x6d, 0x26, 0xeb, 0x43, 0xef, 0x65,
-    0x55, 0xa7, 0xa7, 0x6b, 0x96, 0x7b, 0xbe, 0x23, 0x66, 0xe3, 0x78, 0x03, 0xc6, 0x29, 0xbf, 0x6e, 0xde, 0xf8, 0xbd,
-    0xed, 0x71, 0x1c, 0x80, 0xa8, 0x8c, 0xe3, 0xa8, 0x35, 0x95, 0x4f, 0xef, 0xe3, 0x49, 0xf9, 0xfb, 0x35, 0xcd, 0xf3,
-    0x78, 0x62, 0x5a, 0xee, 0x8e, 0xdb, 0x28, 0x10, 0xdd, 0x98, 0x8d, 0x05, 0x02, 0x62, 0x2f, 0xb0, 0x59, 0x60, 0x4e,
-    0x9b, 0x50, 0x0c, 0x60, 0xa7, 0x1e, 0xc5, 0x51, 0xd3, 0xd7, 0x8b, 0x64, 0x3c, 0xa9, 0x0a, 0x8e, 0xe7, 0x82, 0xaa,
-    0x52, 0x8d, 0xe1, 0xe2, 0xf8, 0x10, 0x0a, 0x74, 0xf5, 0x8e, 0x68, 0x8d, 0xb5, 0xdd, 0x77, 0xc7, 0x6c, 0x3c, 0x1b,
-    0xad, 0x71, 0xf3, 0x5b, 0xca, 0xe4, 0x96, 0xcd, 0x18, 0xc1, 0x67, 0xed, 0x11, 0xfc, 0x31, 0x11, 0x88, 0xcf, 0xc6,
-    0xe3, 0xf1, 0x9d, 0xd1, 0x9b, 0xcf, 0x92, 0x31, 0xed, 0xd0, 0x47, 0x5d, 0xc8, 0x7d, 0x68, 0x1a, 0x9f, 0x7f, 0xbb,
-    0x50, 0xb8, 0x5b, 0xde, 0xaf, 0x31, 0x84, 0x07, 0xe4, 0x74, 0x79, 0xff, 0x48, 0x4e, 0x31, 0x17, 0x74, 0x39, 0x8b,
-    0xc5, 0x84, 0x65, 0x51, 0xab, 0x08, 0xaf, 0x4c, 0xe8, 0xe3, 0xb3, 0xa7, 0x4f, 0x9f, 0x16, 0x61, 0x62, 0x9f, 0x5a,
-    0x49, 0x52, 0x84, 0xa3, 0x65, 0xb9, 0x8c, 0x56, 0x6b, 0x3c, 0x2e, 0x42, 0x66, 0x0b, 0x8e, 0x3a, 0xa3, 0xe4, 0xa8,
-    0x53, 0x84, 0xd7, 0x4e, 0x8b, 0x22, 0xa4, 0xe6, 0x49, 0xd0, 0xa4, 0x96, 0x40, 0xf1, 0xa4, 0xd5, 0x2a, 0x42, 0x4d,
-    0x68, 0x4b, 0xb0, 0x88, 0xf4, 0xcf, 0x28, 0x5e, 0x48, 0x0e, 0x2c, 0xb9, 0xcb, 0x65, 0x30, 0x38, 0x37, 0x2f, 0xa7,
-    0xd0, 0x1f, 0x72, 0x28, 0xd0, 0x10, 0x7f, 0xe9, 0x06, 0x29, 0x80, 0x98, 0x55, 0x70, 0x82, 0xdb, 0x18, 0x46, 0xad,
-    0x1a, 0x28, 0x4b, 0x55, 0x7f, 0x49, 0x78, 0x15, 0xbb, 0x00, 0xfe, 0x03, 0x2d, 0xf5, 0x5b, 0xd4, 0x24, 0xdd, 0xc1,
-    0xf5, 0x29, 0xfd, 0x24, 0xd7, 0xbf, 0xbd, 0x0f, 0xd3, 0xa7, 0xf4, 0x8f, 0x66, 0xfa, 0xe6, 0x55, 0xa3, 0x9a, 0xe9,
-    0x6b, 0xb6, 0x36, 0x93, 0xc4, 0x1f, 0x4d, 0xe9, 0xe8, 0xe3, 0x25, 0xbf, 0x69, 0xc2, 0x91, 0x10, 0xbe, 0xe2, 0xa7,
-    0xfb, 0xbf, 0x35, 0xd9, 0xc2, 0x0e, 0xe6, 0x7c, 0x07, 0x42, 0x89, 0xcd, 0xb7, 0x19, 0xf1, 0xdf, 0x5a, 0xb3, 0x4a,
-    0x97, 0x8c, 0xc7, 0xc4, 0x7f, 0x3b, 0x1e, 0xfb, 0xf6, 0x8a, 0x5d, 0x2c, 0xa9, 0x6a, 0xf5, 0xa6, 0x56, 0xa2, 0x5a,
-    0x7d, 0xf1, 0x85, 0x5b, 0xe6, 0x16, 0x98, 0x10, 0x87, 0x1b, 0xce, 0x30, 0x35, 0x09, 0xcb, 0xe1, 0xa8, 0xc1, 0xe7,
-    0x29, 0xea, 0xef, 0xf8, 0x13, 0xb5, 0xd7, 0x31, 0x97, 0x00, 0x6f, 0x79, 0x87, 0xf4, 0xfa, 0xfd, 0xf2, 0x09, 0xb5,
-    0xe9, 0x6e, 0xcf, 0x6e, 0xbf, 0x4c, 0x82, 0x99, 0x44, 0x05, 0xcb, 0xdf, 0x66, 0x6b, 0x77, 0x47, 0x34, 0x8c, 0x84,
-    0xb8, 0xcb, 0x2a, 0x24, 0x9f, 0x4c, 0x52, 0xf8, 0x40, 0xc8, 0xb2, 0xf6, 0xde, 0x51, 0xdd, 0xbd, 0x5f, 0x5b, 0x6f,
-    0xe4, 0x76, 0x34, 0x6f, 0xe9, 0x54, 0xdf, 0x2b, 0xd2, 0x39, 0xc7, 0x57, 0xe6, 0xc3, 0x35, 0xca, 0x22, 0x5b, 0x1a,
-    0xfe, 0xbf, 0xd4, 0x99, 0xaa, 0x12, 0xb2, 0x34, 0xf4, 0xc0, 0x49, 0x51, 0x98, 0x1c, 0xff, 0x84, 0xe5, 0x73, 0x78,
-    0x1f, 0xa6, 0xee, 0x49, 0x3f, 0xc5, 0xc2, 0xf3, 0x6b, 0x27, 0x8e, 0x50, 0xdb, 0xae, 0xc2, 0x06, 0x12, 0xb4, 0xab,
-    0x76, 0x26, 0x0b, 0xdf, 0x78, 0x7c, 0x2d, 0x12, 0x7d, 0x4f, 0xe3, 0x53, 0x47, 0x38, 0x9c, 0x15, 0x82, 0xab, 0xbf,
-    0xdc, 0x10, 0x5b, 0x65, 0x0b, 0x0a, 0x37, 0x4e, 0xa6, 0x6a, 0x34, 0xb6, 0x94, 0x57, 0x3e, 0x9f, 0xc7, 0x99, 0x66,
-    0xa3, 0xc4, 0xd7, 0xfc, 0x60, 0x7f, 0x59, 0xed, 0x7c, 0xe1, 0x5b, 0xb0, 0x35, 0xf1, 0xf6, 0x8e, 0x0f, 0xa1, 0x43,
-    0xcf, 0xab, 0x81, 0x9e, 0x6d, 0x38, 0xf3, 0x3f, 0x11, 0x56, 0xbf, 0x08, 0xf3, 0x6b, 0x1c, 0xe6, 0xd7, 0xde, 0x9f,
-    0x97, 0xcd, 0x6b, 0x7a, 0xf9, 0x91, 0xc9, 0xa6, 0x8c, 0xe7, 0x4d, 0x50, 0xf8, 0x95, 0x5f, 0xce, 0xb0, 0x67, 0x95,
-    0x1c, 0xa6, 0x6f, 0xc8, 0x77, 0x17, 0x39, 0x44, 0xdf, 0x95, 0xda, 0x1a, 0x65, 0x3c, 0xa3, 0xdd, 0x7a, 0x12, 0xa0,
-    0x1b, 0xcc, 0xb5, 0xd8, 0x1a, 0x2e, 0x39, 0x44, 0xeb, 0xe5, 0x6d, 0xd4, 0x32, 0x6c, 0xbd, 0x65, 0x23, 0xb5, 0xad,
-    0xad, 0xed, 0x23, 0x83, 0xdc, 0x86, 0x92, 0x5e, 0x62, 0x33, 0x62, 0xbd, 0x2b, 0xe2, 0xfc, 0xa9, 0x94, 0x38, 0xf0,
-    0xe6, 0xd9, 0xbf, 0x4e, 0x2e, 0xe1, 0x7a, 0xb1, 0x4a, 0x89, 0xbb, 0x0f, 0x64, 0x51, 0x3c, 0x96, 0x54, 0xe0, 0xfb,
-    0xb4, 0xbc, 0x54, 0xb7, 0x57, 0x96, 0x20, 0x66, 0xa2, 0xf6, 0xd3, 0xf9, 0xcd, 0xfd, 0x87, 0xbf, 0x7b, 0xf9, 0x85,
-    0xc1, 0x91, 0x7d, 0x9b, 0x8b, 0xef, 0x77, 0xe1, 0x20, 0xa4, 0xf1, 0x6d, 0xc4, 0x32, 0x25, 0xf3, 0x2e, 0xc1, 0x25,
-    0xd7, 0x9d, 0x73, 0x93, 0xdb, 0x29, 0x68, 0xaa, 0x3e, 0xdd, 0x66, 0xb6, 0xe2, 0xe8, 0xf1, 0xfc, 0xc6, 0xee, 0x46,
-    0x7b, 0x2d, 0x67, 0xf3, 0x0f, 0x4d, 0xcd, 0xdc, 0x9d, 0x0b, 0x5a, 0x4f, 0x2f, 0x7c, 0x34, 0xbf, 0xe9, 0x6a, 0x41,
-    0xdb, 0x14, 0x1a, 0xaa, 0xd6, 0xfc, 0xc6, 0x4d, 0x4e, 0xad, 0x06, 0xf2, 0xc2, 0xa3, 0xdc, 0xa3, 0x71, 0x4e, 0xbb,
-    0xf0, 0xbe, 0x6a, 0x36, 0x8a, 0x53, 0x23, 0xcc, 0x67, 0x2c, 0x49, 0x52, 0xda, 0xb5, 0xf2, 0xda, 0x6b, 0x3f, 0x86,
-    0xdc, 0x4e, 0x77, 0xcb, 0xea, 0xbb, 0xe2, 0x20, 0xaf, 0xc4, 0x53, 0x7c, 0x99, 0xf3, 0x14, 0x3e, 0x16, 0xb1, 0x15,
-    0x9d, 0x26, 0xe9, 0xb1, 0x55, 0x21, 0x4f, 0xfd, 0xae, 0xaf, 0xe5, 0x51, 0xeb, 0x4f, 0x5d, 0xb5, 0xe1, 0xad, 0xae,
-    0xe4, 0xf3, 0xa8, 0x79, 0x54, 0x5f, 0x08, 0x54, 0x95, 0x4b, 0xc0, 0x5b, 0x96, 0x85, 0x41, 0x5a, 0x69, 0x3e, 0xed,
-    0x85, 0x6d, 0x53, 0xa6, 0x06, 0x80, 0x17, 0x2b, 0x97, 0x45, 0x45, 0x7d, 0x31, 0xff, 0x3e, 0xa7, 0xe5, 0xf3, 0xed,
-    0xa7, 0xe5, 0x73, 0x7b, 0x5a, 0xee, 0xa6, 0xd8, 0xcf, 0xc6, 0x6d, 0xf8, 0xd3, 0xad, 0x16, 0x14, 0xb5, 0xbc, 0xa3,
-    0xf9, 0x8d, 0x07, 0x7a, 0x5a, 0xb3, 0x33, 0xbf, 0xd1, 0xa9, 0xb9, 0x10, 0x36, 0x68, 0x41, 0xb2, 0x2a, 0x6e, 0x79,
-    0x50, 0x08, 0x7f, 0x5b, 0xb5, 0xaa, 0xf6, 0x43, 0xa8, 0x83, 0x5e, 0x8f, 0x36, 0xeb, 0x3a, 0x77, 0x1f, 0xda, 0x28,
-    0xe3, 0x32, 0x88, 0x2c, 0x37, 0x46, 0xa1, 0x8c, 0x2f, 0x2f, 0x69, 0x12, 0x8d, 0xf9, 0x68, 0x91, 0xff, 0xb3, 0x81,
-    0xdf, 0x20, 0xf1, 0xce, 0x23, 0xbd, 0x36, 0x8e, 0xed, 0xaa, 0x13, 0x85, 0xed, 0x08, 0xcb, 0x72, 0x9f, 0xa2, 0x7c,
-    0x14, 0xa7, 0x34, 0xe8, 0x84, 0x0f, 0xb7, 0x1c, 0x82, 0xff, 0x90, 0xbd, 0xd9, 0xba, 0x98, 0xdf, 0x8b, 0x8c, 0x3b,
-    0x91, 0xf0, 0xab, 0x70, 0xe0, 0xee, 0x61, 0xeb, 0xe9, 0x76, 0x70, 0x07, 0x76, 0xa6, 0xa1, 0x15, 0x0a, 0x46, 0xee,
-    0x24, 0x74, 0x1c, 0x2f, 0x52, 0x79, 0xf7, 0xa8, 0xbb, 0x28, 0x63, 0x63, 0xd4, 0x3b, 0x18, 0x7a, 0xd5, 0xf6, 0x9e,
-    0x5c, 0xfa, 0xb3, 0xcf, 0x1f, 0xc2, 0x1f, 0x9d, 0x67, 0x74, 0x5b, 0xe9, 0xea, 0xda, 0x56, 0x05, 0x5d, 0x7d, 0xbf,
-    0xa6, 0x8c, 0x6b, 0x11, 0xae, 0xf4, 0xf1, 0xfb, 0xb6, 0x06, 0xad, 0xf2, 0x5e, 0xcd, 0x8d, 0x96, 0xf5, 0xab, 0x5a,
-    0xff, 0xba, 0xc1, 0xef, 0xd9, 0x76, 0xa4, 0x35, 0xd7, 0x7a, 0x5b, 0xf3, 0xed, 0xba, 0x8d, 0xc6, 0x16, 0xe3, 0xaa,
-    0xfd, 0x3e, 0xb9, 0x2d, 0x4d, 0x14, 0x1d, 0x08, 0x04, 0x2b, 0x65, 0x5f, 0x5b, 0x29, 0x8c, 0x92, 0x07, 0xf0, 0xe6,
-    0x58, 0xef, 0x66, 0x96, 0x66, 0x39, 0xf1, 0xa7, 0x52, 0xce, 0x23, 0xfd, 0xb1, 0xd3, 0xeb, 0xa3, 0x90, 0x8b, 0xc9,
-    0x61, 0xa7, 0xd5, 0x6a, 0xc1, 0x1b, 0x3f, 0x7d, 0xef, 0x8a, 0xd1, 0xeb, 0x67, 0xfc, 0x86, 0xf8, 0x4f, 0xbc, 0xa7,
-    0xde, 0x93, 0x23, 0xef, 0xd1, 0x63, 0xdf, 0x53, 0xec, 0x9c, 0xf8, 0x4f, 0x8e, 0x7c, 0x4f, 0xb3, 0x73, 0xe2, 0x3f,
-    0x7a, 0xec, 0xf7, 0x8e, 0x27, 0x56, 0x25, 0x83, 0x2b, 0x83, 0x5a, 0xdf, 0xc9, 0xa5, 0xe0, 0x1f, 0x69, 0xfd, 0xe0,
-    0xea, 0x32, 0x93, 0x89, 0xd6, 0xb1, 0x8f, 0x70, 0x7a, 0x47, 0xf1, 0x3c, 0x52, 0x44, 0xe1, 0x16, 0x82, 0x5b, 0x46,
-    0x97, 0xaa, 0x29, 0x40, 0xcd, 0xbc, 0xf4, 0x7b, 0xc7, 0x90, 0x35, 0xee, 0x25, 0xc4, 0x7f, 0xdd, 0x79, 0xe2, 0xb5,
-    0x1f, 0x5f, 0x35, 0x1f, 0x8e, 0x5a, 0xcd, 0xb6, 0xd7, 0x6e, 0x76, 0xc2, 0x27, 0x5e, 0x47, 0xff, 0xeb, 0xb5, 0xbc,
-    0x23, 0xaf, 0x1d, 0x3e, 0xf1, 0x8e, 0xbc, 0x4e, 0xf8, 0xe4, 0xea, 0xa1, 0x4e, 0x27, 0x88, 0xfd, 0xc3, 0xde, 0x31,
-    0x7c, 0xb8, 0xf2, 0x86, 0xf8, 0x9f, 0xfb, 0xfa, 0xf3, 0xb0, 0xfe, 0x67, 0x6e, 0x69, 0xfb, 0xe9, 0xd6, 0xe2, 0xce,
-    0x93, 0xad, 0xc5, 0x47, 0x8f, 0xb7, 0x16, 0x3f, 0x7c, 0x54, 0x2f, 0x3e, 0x9c, 0xe8, 0xaa, 0xf2, 0x94, 0x13, 0x7f,
-    0x16, 0x4b, 0xc1, 0x6e, 0x82, 0xb6, 0xd7, 0xf2, 0x5a, 0x5e, 0x13, 0xfe, 0x7b, 0xd2, 0x41, 0x65, 0xaf, 0x4b, 0xe8,
-    0x55, 0xae, 0xf2, 0xc9, 0x53, 0xaf, 0xfd, 0xf8, 0x65, 0xe7, 0xf1, 0x08, 0xda, 0xa9, 0x85, 0xb6, 0xbd, 0xf6, 0xd5,
-    0xd1, 0xd3, 0x51, 0xcb, 0x83, 0x8e, 0x6d, 0xf8, 0x33, 0x7d, 0xd4, 0x19, 0xe9, 0x87, 0x16, 0xd4, 0x7f, 0xdb, 0x7e,
-    0x92, 0xb7, 0x9a, 0x6d, 0xf8, 0xf3, 0x4b, 0xa9, 0x11, 0x83, 0x3e, 0xee, 0x8e, 0xfb, 0xb0, 0xe5, 0x1d, 0x3d, 0x9d,
-    0x76, 0xc2, 0xcf, 0xaf, 0x9e, 0x84, 0x4f, 0xa7, 0xed, 0x27, 0xdf, 0xea, 0xa7, 0xb4, 0xd9, 0x09, 0x3f, 0x87, 0xbf,
-    0xdf, 0x1e, 0xb5, 0xa6, 0xcd, 0x76, 0xf8, 0xf4, 0xea, 0x28, 0x3c, 0x4a, 0x9b, 0x8f, 0xc3, 0xa7, 0xf0, 0xb7, 0x1a,
-    0x6e, 0xca, 0x67, 0xd4, 0xf7, 0x60, 0xbf, 0xd7, 0xcc, 0x2d, 0x77, 0x8e, 0xce, 0x43, 0xef, 0xd1, 0xc3, 0x97, 0x4f,
-    0xaf, 0x9a, 0x0f, 0xa7, 0xed, 0xce, 0x55, 0x73, 0xe7, 0xcf, 0x6f, 0x01, 0xf1, 0x66, 0xe0, 0x98, 0xc2, 0xf5, 0x1d,
-    0x8b, 0x38, 0xf5, 0xf6, 0xd9, 0x07, 0x38, 0xdf, 0x65, 0x5e, 0x8b, 0x4f, 0x9b, 0xd7, 0x19, 0xbd, 0x8f, 0x7d, 0x2d,
-    0xfe, 0x70, 0xfb, 0x3a, 0xa7, 0x6b, 0x4e, 0xd5, 0x5b, 0xb9, 0x61, 0x46, 0xaf, 0xdb, 0x5e, 0xef, 0x64, 0x30, 0x60,
-    0xf0, 0x95, 0xa3, 0xa2, 0x7b, 0x0b, 0x2f, 0xb8, 0x76, 0xbd, 0x0d, 0x1c, 0x0e, 0xf2, 0xad, 0xd4, 0x27, 0x99, 0xef,
-    0x42, 0x48, 0xfa, 0x69, 0x84, 0x7c, 0x7b, 0x1f, 0x7c, 0xa4, 0x7f, 0x38, 0x3e, 0xb8, 0x8b, 0x8f, 0x9a, 0x9f, 0x57,
-    0xd9, 0xb3, 0xca, 0x1e, 0x3d, 0x53, 0xcf, 0x01, 0xdc, 0xf0, 0x68, 0xf8, 0x87, 0x14, 0x8a, 0x72, 0x5f, 0xc7, 0x15,
-    0xde, 0xfc, 0x1a, 0x97, 0xb4, 0xbe, 0xce, 0x45, 0x7c, 0x63, 0xfc, 0xcf, 0xe1, 0x4b, 0x06, 0xf6, 0xe1, 0x4a, 0x5f,
-    0x30, 0x26, 0x7e, 0x27, 0x6c, 0x85, 0xad, 0xd2, 0x71, 0x00, 0x57, 0xf8, 0xc8, 0x92, 0xcb, 0x18, 0x3e, 0xa6, 0x99,
-    0xf2, 0x89, 0xfa, 0xec, 0x26, 0xbc, 0xec, 0x5c, 0x7d, 0x00, 0x55, 0xbf, 0x67, 0x3e, 0xf2, 0x7d, 0x73, 0xf1, 0x1f,
-    0xae, 0x88, 0x7d, 0x03, 0xd7, 0xe8, 0xac, 0xc7, 0x7a, 0x06, 0x36, 0xf5, 0x6b, 0x9a, 0xb0, 0x38, 0xf0, 0x83, 0xb9,
-    0xa0, 0x63, 0x2a, 0xf2, 0x66, 0xed, 0x6e, 0x99, 0xba, 0x56, 0x86, 0x7c, 0xfb, 0xd9, 0x46, 0x01, 0x2f, 0xef, 0x25,
-    0x03, 0xe3, 0xd5, 0xf2, 0x8d, 0x9a, 0xef, 0x17, 0xd8, 0x96, 0x08, 0xe0, 0xe8, 0x95, 0x6a, 0xe0, 0x6b, 0xdd, 0xa0,
-    0x1d, 0x76, 0x1e, 0x21, 0xcd, 0x4b, 0xe0, 0xa5, 0xa8, 0xdf, 0x07, 0xcd, 0xa3, 0xd6, 0x9f, 0x90, 0xd3, 0xad, 0x1c,
-    0x68, 0x68, 0x9c, 0x3a, 0xa2, 0xfa, 0xdc, 0x6d, 0xfd, 0xe2, 0x9f, 0xaf, 0x29, 0xe2, 0x33, 0xbd, 0x76, 0x78, 0xbd,
-    0xaa, 0x89, 0x1f, 0xea, 0xeb, 0xeb, 0x63, 0x36, 0x09, 0xdc, 0x8f, 0x99, 0xea, 0x97, 0xae, 0xaa, 0x6f, 0x20, 0xa3,
-    0xa2, 0x6a, 0x22, 0xd0, 0x52, 0xf9, 0xe2, 0x59, 0xe6, 0x89, 0xd5, 0x2a, 0x10, 0xe0, 0x88, 0x25, 0x0e, 0x4e, 0xe1,
-    0x19, 0xd5, 0x90, 0x2c, 0x70, 0x09, 0x90, 0x42, 0x30, 0x11, 0xfa, 0xff, 0xaa, 0xd8, 0xfe, 0x30, 0xee, 0x95, 0x30,
-    0x8d, 0xb3, 0x09, 0x50, 0x61, 0x9c, 0x4d, 0x36, 0x9c, 0x37, 0x3a, 0x9c, 0xb0, 0x56, 0x5a, 0x0d, 0x55, 0x39, 0x69,
-    0xf2, 0x67, 0xb7, 0xef, 0xcd, 0xdb, 0x99, 0x7c, 0xf0, 0x81, 0x2a, 0xdf, 0x77, 0xf5, 0x26, 0xd9, 0x06, 0x79, 0xa0,
-    0x3f, 0x0f, 0xae, 0xf2, 0xd1, 0x40, 0xfa, 0xc1, 0x95, 0x3e, 0xcf, 0xd8, 0x3c, 0xc4, 0xd7, 0xb2, 0x2f, 0xa1, 0x57,
-    0x6c, 0x64, 0x44, 0x18, 0xf6, 0xcc, 0xb5, 0xe6, 0xa6, 0xda, 0x1a, 0xd2, 0xc6, 0xda, 0xea, 0x1f, 0xc5, 0x2a, 0xbf,
-    0x98, 0x64, 0xdc, 0xef, 0x3d, 0x28, 0xbf, 0xcd, 0xb8, 0x6b, 0x13, 0xe0, 0x9b, 0xe5, 0x03, 0x41, 0xd3, 0x7f, 0x26,
-    0x0f, 0xe0, 0xab, 0xe5, 0x0f, 0x86, 0xf0, 0xc1, 0xec, 0x50, 0x89, 0x82, 0x07, 0xd5, 0xc7, 0xcb, 0x81, 0x0f, 0x36,
-    0x6e, 0x66, 0x29, 0xbe, 0xaf, 0xf8, 0x36, 0xa2, 0xba, 0xf3, 0xa8, 0x12, 0xd5, 0x9d, 0x47, 0xae, 0xf4, 0x6c, 0x7b,
-    0xed, 0x4e, 0xf8, 0xc8, 0x11, 0x00, 0x57, 0x4d, 0xf8, 0xbf, 0x26, 0x02, 0x1e, 0x86, 0x8f, 0x4a, 0x19, 0xf0, 0xaa,
-    0xdd, 0x09, 0x8f, 0xb4, 0xb8, 0xe9, 0x84, 0x8f, 0x7e, 0x50, 0x0c, 0x5a, 0x33, 0xe7, 0xfa, 0x81, 0xd8, 0x12, 0xaa,
-    0xd1, 0x49, 0x75, 0x3e, 0x0e, 0xca, 0x2f, 0xc0, 0x99, 0xf3, 0x69, 0x5c, 0x42, 0xcf, 0x63, 0x01, 0x9f, 0xe1, 0xa8,
-    0x9f, 0xdd, 0x5a, 0x1d, 0xae, 0xf1, 0x8b, 0x2d, 0x53, 0xc0, 0x09, 0xf7, 0xb1, 0x7b, 0x2f, 0x18, 0x2e, 0xd5, 0xaa,
-    0x97, 0x16, 0xdb, 0x77, 0xb7, 0xed, 0x26, 0x6d, 0xdd, 0xd0, 0xbe, 0x1f, 0x4e, 0x31, 0x0b, 0xa6, 0x5e, 0x10, 0xaf,
-    0x26, 0xf9, 0x32, 0x29, 0xd6, 0xe7, 0x87, 0xdc, 0x3e, 0xc1, 0x9d, 0xab, 0xd1, 0xb4, 0x4a, 0x3f, 0x4f, 0x18, 0x5c,
-    0x66, 0x2f, 0x0a, 0x0b, 0x7a, 0xcd, 0x19, 0x58, 0x61, 0x49, 0xf1, 0x0b, 0x9a, 0xf7, 0x7d, 0x28, 0xf2, 0x23, 0x5f,
-    0x39, 0x92, 0xfc, 0xf2, 0x53, 0x24, 0x25, 0x61, 0x57, 0x05, 0x58, 0x5d, 0x21, 0x81, 0x53, 0x0b, 0xf8, 0xf1, 0xd1,
-    0xc1, 0xc1, 0xce, 0xf3, 0xa2, 0xb4, 0x31, 0x58, 0x6b, 0xf5, 0x09, 0x03, 0x97, 0x15, 0xf9, 0x2e, 0xa2, 0xcb, 0x71,
-    0x15, 0x0a, 0x91, 0xc1, 0xd3, 0x25, 0x8d, 0x65, 0x18, 0x67, 0x3a, 0x45, 0xc1, 0x61, 0x58, 0xb8, 0x4d, 0x8f, 0x50,
-    0xc1, 0x65, 0xec, 0x7c, 0xa3, 0xd4, 0x9c, 0x73, 0x2e, 0x63, 0x7b, 0xd1, 0x2f, 0x93, 0xb5, 0x4c, 0xf8, 0x69, 0xa7,
-    0xf7, 0xf6, 0xfd, 0x89, 0xa7, 0x8f, 0xe7, 0xf1, 0xe1, 0xb4, 0xd3, 0x3b, 0x56, 0x96, 0xb9, 0xbe, 0x26, 0x44, 0xf4,
-    0x35, 0x21, 0xcf, 0x5c, 0x19, 0x83, 0x78, 0x4d, 0x71, 0xa8, 0x97, 0xed, 0x7b, 0x34, 0x1b, 0x69, 0x9f, 0xe2, 0x6c,
-    0x91, 0x4a, 0x06, 0x2f, 0xe0, 0x3d, 0x84, 0xae, 0x4d, 0xd8, 0xb0, 0x32, 0xcf, 0xd4, 0x6a, 0x38, 0x32, 0xb3, 0x1e,
-    0xc8, 0x31, 0x4b, 0xa9, 0xcd, 0x2c, 0x35, 0x43, 0x95, 0x79, 0xcf, 0x9b, 0xad, 0xf3, 0xc5, 0xe5, 0x8c, 0xc9, 0x32,
-    0x15, 0xf4, 0x83, 0xe9, 0x70, 0xac, 0xa6, 0xea, 0x5d, 0x14, 0xc6, 0x45, 0x6a, 0x3f, 0x36, 0xb2, 0xf6, 0x79, 0x77,
-    0xbd, 0x7a, 0x23, 0x21, 0xe0, 0xbe, 0xcf, 0xf4, 0xa8, 0x57, 0x3a, 0x25, 0xdd, 0xba, 0xe2, 0xf8, 0x70, 0x7a, 0xd4,
-    0xbb, 0x88, 0xe6, 0x66, 0xbc, 0x57, 0x7c, 0xe3, 0x53, 0xf1, 0x25, 0xc7, 0xec, 0xab, 0xc4, 0x76, 0x7d, 0x83, 0xd2,
-    0x00, 0x3c, 0xe2, 0xa9, 0xdf, 0x3b, 0x36, 0xca, 0x80, 0xa7, 0x82, 0xae, 0xfe, 0xa3, 0x96, 0xcd, 0x95, 0x4f, 0xb9,
-    0xd2, 0x96, 0x74, 0x17, 0x67, 0x92, 0x9a, 0x5f, 0x77, 0xda, 0xee, 0x1d, 0xc7, 0x46, 0xcd, 0x04, 0xe6, 0x91, 0x47,
-    0x87, 0xd0, 0x19, 0x74, 0xb9, 0x90, 0xf1, 0xc3, 0x6b, 0x7a, 0xd9, 0x8c, 0xe7, 0xac, 0x72, 0xa2, 0x82, 0xd2, 0x51,
-    0x4e, 0xc9, 0xab, 0x99, 0xe0, 0x67, 0xbc, 0xb6, 0x48, 0xc5, 0xc2, 0x0b, 0xe3, 0xa1, 0x55, 0xba, 0x3a, 0x8d, 0xa5,
-    0xef, 0x69, 0x0e, 0x6f, 0x3d, 0xb9, 0x46, 0xf6, 0x16, 0x7e, 0xef, 0xdf, 0xfe, 0xc7, 0xff, 0x32, 0xce, 0xd9, 0xe3,
-    0xc3, 0x69, 0xdb, 0x8e, 0xb5, 0x86, 0xe8, 0xe2, 0x18, 0xae, 0x97, 0x55, 0xd1, 0x44, 0x7a, 0xd3, 0x9c, 0x08, 0x96,
-    0x34, 0xa7, 0x71, 0x3a, 0xf6, 0x7b, 0xbb, 0x11, 0xe4, 0xde, 0x2b, 0x31, 0x50, 0xd7, 0x8b, 0x80, 0x04, 0x7f, 0xd3,
-    0xcd, 0x08, 0x9b, 0x60, 0xaf, 0x4e, 0xab, 0x7b, 0x4f, 0xa2, 0x3a, 0x50, 0xb5, 0xbb, 0x12, 0xc2, 0x7c, 0x93, 0xc8,
-    0x30, 0x35, 0x51, 0xbb, 0x22, 0x51, 0xf8, 0x5e, 0x19, 0x0d, 0xf9, 0xbf, 0xff, 0xf3, 0xbf, 0xfc, 0x37, 0xfb, 0x08,
-    0x41, 0x8e, 0x7f, 0xfb, 0xef, 0xff, 0xf9, 0xff, 0xfc, 0xef, 0xff, 0x0a, 0x69, 0xf5, 0x26, 0x10, 0xa2, 0xf8, 0x84,
-    0x57, 0x45, 0x41, 0x34, 0xc3, 0xf0, 0x20, 0x19, 0x6d, 0xc6, 0x72, 0xc9, 0x46, 0xf5, 0x4b, 0x13, 0x67, 0x6a, 0x42,
-    0x75, 0xd8, 0x0c, 0x74, 0xea, 0xd0, 0x16, 0x15, 0x8d, 0xd4, 0x50, 0xae, 0x68, 0xb1, 0x38, 0x3e, 0x04, 0x7c, 0xdf,
-    0xef, 0x9e, 0x59, 0x58, 0x6e, 0xc7, 0xd2, 0xba, 0xfe, 0xa0, 0xa4, 0xa8, 0xca, 0x3d, 0x70, 0xca, 0x2f, 0xe1, 0x31,
-    0xea, 0x38, 0xc5, 0x6a, 0xf7, 0x6a, 0x7d, 0xba, 0x3f, 0x2d, 0x72, 0xc9, 0xc6, 0x80, 0x72, 0xed, 0x60, 0x54, 0xf1,
-    0xcf, 0x26, 0xa8, 0x7f, 0xe9, 0x6d, 0xa1, 0x46, 0xd1, 0x36, 0xe3, 0xc3, 0xa7, 0x7f, 0x2a, 0xfe, 0x32, 0x03, 0x25,
-    0xcb, 0x0b, 0x66, 0xf1, 0x8d, 0xb1, 0x24, 0x1f, 0xb7, 0x5a, 0xf3, 0x1b, 0xb4, 0xac, 0x66, 0xc0, 0xbb, 0x26, 0x53,
-    0x4e, 0x49, 0x77, 0x40, 0x15, 0x38, 0x2d, 0xfd, 0x9f, 0x2d, 0x0f, 0x9c, 0xa8, 0x5e, 0xab, 0x28, 0xfe, 0xbc, 0x54,
-    0x2e, 0x38, 0xf6, 0x0b, 0x04, 0x38, 0x8d, 0xb7, 0xf2, 0x92, 0xbb, 0x8b, 0x5b, 0x3a, 0xbd, 0x3a, 0xba, 0xd7, 0xb4,
-    0xbd, 0x79, 0x7d, 0xca, 0x0d, 0xd0, 0xba, 0xa1, 0xd5, 0x87, 0x10, 0x2c, 0x9d, 0xb6, 0xf1, 0xb4, 0xb3, 0x2c, 0x87,
-    0x97, 0x92, 0xcf, 0xdc, 0x88, 0x2c, 0x8d, 0xe9, 0x88, 0x8e, 0xad, 0x97, 0xd7, 0xd4, 0xeb, 0x68, 0x6b, 0x31, 0x3d,
-    0xda, 0x32, 0x97, 0x01, 0x49, 0x45, 0x62, 0xbd, 0x56, 0xf1, 0x19, 0x9c, 0xc0, 0xe5, 0x38, 0xe5, 0xb1, 0x8c, 0x14,
-    0xc1, 0x76, 0xdd, 0xb8, 0x6e, 0x0c, 0x6c, 0x86, 0x2f, 0x1d, 0x78, 0xba, 0xba, 0x29, 0xf8, 0x5b, 0xeb, 0x97, 0xdc,
-    0x8a, 0x50, 0x75, 0x77, 0x87, 0xd2, 0xee, 0x9a, 0x6f, 0x4d, 0xb8, 0xf4, 0x4d, 0xcd, 0xcf, 0x61, 0x64, 0x4c, 0x07,
-    0x6d, 0xaf, 0xd7, 0xa2, 0x5a, 0xd7, 0x7e, 0x25, 0x03, 0x5f, 0x81, 0xe9, 0xaf, 0xb7, 0x52, 0x85, 0xd0, 0xea, 0x0d,
-    0xf9, 0xb6, 0xb4, 0x82, 0xe2, 0xf9, 0x5c, 0x35, 0x44, 0xdd, 0xe3, 0x43, 0xad, 0xbc, 0x02, 0xf7, 0x50, 0xb9, 0x00,
-    0x3a, 0xf4, 0x6e, 0x1a, 0x99, 0xa3, 0xa0, 0x7f, 0x99, 0xa0, 0x3c, 0x7c, 0xac, 0xaa, 0xf7, 0xff, 0x00, 0xbb, 0x9f,
-    0x49, 0x8d, 0x3d, 0x86, 0x00, 0x00};
+    0x72, 0x7f, 0x60, 0xe6, 0x13, 0x26, 0x4e, 0x2e, 0x40, 0x82, 0x4b, 0xa9, 0xbc, 0xdc, 0x1b, 0x13, 0x0a, 0x49, 0x44,
+    0xae, 0x27, 0x4f, 0x9e, 0x3c, 0x7b, 0x02, 0xc7, 0x7b, 0x09, 0x1f, 0xc9, 0xdb, 0x39, 0xf5, 0xa6, 0x72, 0x96, 0xf6,
+    0x8e, 0xcd, 0xbf, 0x34, 0x4e, 0x7a, 0xc7, 0x29, 0xcb, 0x3e, 0x7a, 0x82, 0xa6, 0x84, 0x8d, 0x78, 0xe6, 0x4d, 0x05,
+    0x1d, 0x93, 0x24, 0x96, 0x71, 0xc4, 0x66, 0xf1, 0x84, 0x7a, 0x87, 0xbd, 0xe3, 0x19, 0x95, 0xb1, 0x37, 0x9a, 0xc6,
+    0x22, 0xa7, 0x92, 0x7c, 0x78, 0xff, 0x45, 0xf3, 0x69, 0xef, 0x38, 0x1f, 0x09, 0x36, 0x97, 0x1e, 0x0c, 0x49, 0x66,
+    0x3c, 0x59, 0xa4, 0xb4, 0x77, 0x78, 0x78, 0x7d, 0x7d, 0x1d, 0xfe, 0x94, 0xff, 0xd3, 0x88, 0x67, 0xb9, 0xf4, 0x5e,
+    0x91, 0x6b, 0x96, 0x25, 0xfc, 0x1a, 0x53, 0x49, 0x5e, 0x85, 0x67, 0xd3, 0x38, 0xe1, 0xd7, 0xef, 0x38, 0x97, 0x07,
+    0x07, 0x81, 0x7e, 0xbc, 0x3d, 0x3d, 0x3b, 0x23, 0x84, 0x5c, 0x71, 0x96, 0x78, 0xad, 0xd5, 0xaa, 0x2a, 0x0c, 0xb3,
+    0x58, 0xb2, 0x2b, 0xaa, 0xbb, 0xa0, 0x83, 0x03, 0x3f, 0x4e, 0xf8, 0x5c, 0xd2, 0xe4, 0x4c, 0xde, 0xa6, 0xf4, 0x6c,
+    0x4a, 0xa9, 0xcc, 0x7d, 0x96, 0x79, 0xcf, 0xf9, 0x68, 0x31, 0xa3, 0x99, 0x0c, 0xe7, 0x82, 0x4b, 0x0e, 0x90, 0x1c,
+    0x1c, 0xf8, 0x82, 0xce, 0xd3, 0x78, 0x44, 0xa1, 0xfe, 0xf4, 0xec, 0xac, 0xea, 0x51, 0x35, 0xc2, 0x4c, 0x92, 0xb3,
+    0xdb, 0xd9, 0x25, 0x4f, 0x03, 0x84, 0x53, 0x49, 0x32, 0x7a, 0xed, 0x7d, 0x47, 0xe3, 0x8f, 0xaf, 0xe3, 0x79, 0x77,
+    0x94, 0xc6, 0x79, 0xee, 0x5d, 0xca, 0xa5, 0x5a, 0x82, 0x58, 0x8c, 0x24, 0x17, 0x81, 0xc4, 0x14, 0x33, 0xb4, 0x64,
+    0xe3, 0x40, 0x4e, 0x59, 0x1e, 0x9e, 0xef, 0x8f, 0xf2, 0xfc, 0x1d, 0xcd, 0x17, 0xa9, 0xdc, 0x27, 0x7b, 0x2d, 0xcc,
+    0xf6, 0x08, 0x61, 0x12, 0xc9, 0xa9, 0xe0, 0xd7, 0xde, 0x0b, 0x21, 0xb8, 0x08, 0xfc, 0xd3, 0xb3, 0x33, 0xdd, 0xc2,
+    0x63, 0xb9, 0x97, 0x71, 0xe9, 0x95, 0xe3, 0xc5, 0x97, 0x29, 0x0d, 0xbd, 0x0f, 0x39, 0xf5, 0x2e, 0x16, 0x59, 0x1e,
+    0x8f, 0xe9, 0xe9, 0xd9, 0xd9, 0x85, 0xc7, 0x85, 0x77, 0x31, 0xca, 0xf3, 0x0b, 0x8f, 0x65, 0xb9, 0xa4, 0x71, 0x12,
+    0xfa, 0xa8, 0xab, 0x26, 0x1b, 0xe5, 0xf9, 0x7b, 0x7a, 0x23, 0x89, 0xc4, 0xea, 0x51, 0x12, 0x5a, 0x4c, 0xa8, 0xf4,
+    0xf2, 0x72, 0x5d, 0x01, 0x5a, 0xa6, 0x54, 0x7a, 0x92, 0xa8, 0x7a, 0xde, 0xd5, 0xb8, 0xa7, 0xfa, 0x51, 0x76, 0xd9,
+    0x38, 0xa0, 0xf2, 0xe0, 0x40, 0x96, 0x78, 0x46, 0x7a, 0x69, 0x1e, 0x23, 0x74, 0xcf, 0x96, 0x1d, 0x1c, 0xd0, 0x30,
+    0xa5, 0xd9, 0x44, 0x4e, 0x09, 0x21, 0xed, 0x2e, 0x3b, 0x38, 0x08, 0x24, 0x49, 0x65, 0x38, 0xa1, 0x32, 0xa0, 0x08,
+    0xe1, 0xaa, 0xf7, 0xc1, 0x41, 0xa0, 0x91, 0xc0, 0x89, 0x46, 0x5c, 0x0d, 0xc7, 0x28, 0x34, 0xd8, 0x3f, 0xbb, 0xcd,
+    0x46, 0x81, 0x0b, 0x3f, 0xc2, 0xec, 0xe0, 0x20, 0x95, 0x61, 0x0e, 0x23, 0x62, 0x89, 0x50, 0x21, 0xa8, 0x5c, 0x88,
+    0xcc, 0x93, 0x85, 0xe4, 0x67, 0x52, 0xb0, 0x6c, 0x12, 0xa0, 0xa5, 0x2d, 0x73, 0x3a, 0x16, 0x85, 0x06, 0xf7, 0x6b,
+    0x49, 0x04, 0xe9, 0xc1, 0x8c, 0x97, 0x32, 0x80, 0x5d, 0xe4, 0x63, 0x4f, 0x10, 0xe2, 0xe7, 0xaa, 0xaf, 0xdf, 0x17,
+    0x91, 0x68, 0xf8, 0x3e, 0xd6, 0x50, 0x62, 0x26, 0x11, 0xfe, 0x48, 0x02, 0x81, 0xc3, 0x30, 0x94, 0x88, 0xf4, 0x96,
+    0x16, 0x2b, 0xc2, 0x59, 0x67, 0x5f, 0x0c, 0x5a, 0xc3, 0x48, 0x86, 0x82, 0x26, 0x8b, 0x11, 0x0d, 0x02, 0x86, 0x73,
+    0x9c, 0x21, 0xd2, 0x63, 0x8d, 0x80, 0x93, 0x1e, 0x6c, 0x37, 0xaf, 0xef, 0x35, 0x21, 0x7b, 0x2d, 0x64, 0x60, 0xe4,
+    0x16, 0x40, 0xc0, 0xb0, 0x81, 0x87, 0x13, 0xe2, 0x67, 0x8b, 0xd9, 0x25, 0x15, 0x7e, 0xd9, 0xac, 0x5b, 0x23, 0x8b,
+    0x45, 0x4e, 0xbd, 0x51, 0x9e, 0x7b, 0xe3, 0x45, 0x36, 0x92, 0x8c, 0x67, 0x9e, 0xdf, 0xe0, 0x0d, 0x5f, 0x93, 0x43,
+    0x49, 0x0d, 0x3e, 0x2a, 0x50, 0x90, 0xa3, 0x86, 0x18, 0x64, 0x8d, 0xf6, 0x10, 0x03, 0x94, 0xa8, 0x6b, 0xc6, 0x33,
+    0x08, 0xa0, 0x58, 0xc0, 0x1a, 0x0b, 0xfc, 0x41, 0xc2, 0x2a, 0xd5, 0x12, 0xa9, 0xec, 0x8b, 0x70, 0xf3, 0xa0, 0x10,
+    0x19, 0xce, 0xe2, 0x79, 0x40, 0x49, 0x8f, 0x2a, 0xe2, 0x8a, 0xb3, 0x11, 0xc0, 0x5a, 0xdb, 0xb7, 0x3e, 0x8d, 0x68,
+    0x58, 0x91, 0x14, 0x8a, 0x64, 0x38, 0xe6, 0xe2, 0x45, 0x3c, 0x9a, 0x42, 0xbf, 0x92, 0x60, 0x12, 0x7b, 0xde, 0x46,
+    0x82, 0xc6, 0x92, 0xbe, 0x48, 0x29, 0x3c, 0x05, 0xbe, 0xea, 0xe9, 0x23, 0x9c, 0x93, 0x57, 0x61, 0xca, 0xe4, 0x1b,
+    0x9e, 0x8d, 0x68, 0x37, 0x77, 0xa8, 0x8b, 0xc1, 0xbe, 0x9f, 0x48, 0x29, 0xd8, 0xe5, 0x42, 0xd2, 0xc0, 0xcf, 0xa0,
+    0x85, 0x8f, 0x73, 0x84, 0x59, 0x28, 0xe9, 0x8d, 0x3c, 0xe5, 0x99, 0xa4, 0x99, 0x24, 0xd4, 0x22, 0x15, 0x8b, 0x30,
+    0x9e, 0xcf, 0x69, 0x96, 0x9c, 0x4e, 0x59, 0x9a, 0x04, 0x0c, 0x15, 0xa8, 0xc0, 0xb1, 0x24, 0xb0, 0x46, 0xd2, 0x13,
+    0x11, 0xfc, 0xb3, 0x7b, 0x35, 0x81, 0x24, 0x3d, 0x75, 0x28, 0x28, 0xf1, 0xfd, 0xee, 0x98, 0x8b, 0xc0, 0xac, 0xc0,
+    0xe3, 0x63, 0x4f, 0xc2, 0x1c, 0xef, 0x16, 0x29, 0xcd, 0x11, 0x6d, 0x10, 0x56, 0x6e, 0xa3, 0x41, 0xf0, 0xd7, 0x40,
+    0xf1, 0x05, 0x0a, 0x04, 0x8a, 0x44, 0xf7, 0x2a, 0x16, 0xde, 0x17, 0xe6, 0x44, 0xfd, 0x64, 0xb9, 0xd9, 0x54, 0x92,
+    0x9f, 0x42, 0x29, 0x16, 0xb9, 0xa4, 0xc9, 0xfb, 0xdb, 0x39, 0xcd, 0xf1, 0x4b, 0x49, 0xa6, 0xb2, 0x3f, 0x95, 0x21,
+    0x9d, 0xcd, 0xe5, 0xed, 0x99, 0x62, 0x8c, 0x91, 0xef, 0xe3, 0x11, 0xb4, 0x14, 0x34, 0x1e, 0x01, 0x33, 0x33, 0xd8,
+    0xfa, 0x9a, 0xa7, 0xb7, 0x63, 0x96, 0xa6, 0x67, 0x8b, 0xf9, 0x9c, 0x0b, 0x89, 0xff, 0x4a, 0x96, 0x92, 0x57, 0xa8,
+    0x81, 0xbd, 0x5c, 0xe6, 0xd7, 0x4c, 0x8e, 0xa6, 0x81, 0x44, 0xcb, 0x51, 0x9c, 0x53, 0xef, 0x19, 0xe7, 0x29, 0x8d,
+    0xb3, 0x48, 0x10, 0xd1, 0x7f, 0x29, 0xa3, 0x6c, 0x91, 0xa6, 0xdd, 0x4b, 0x41, 0xe3, 0x8f, 0x5d, 0x55, 0xfd, 0xf6,
+    0xf2, 0x27, 0x3a, 0x92, 0x91, 0xfa, 0x7d, 0x22, 0x44, 0x7c, 0x0b, 0x0d, 0x09, 0x81, 0x66, 0x7d, 0x11, 0x7d, 0x75,
+    0xf6, 0xf6, 0x4d, 0xa8, 0x0f, 0x09, 0x1b, 0xdf, 0x06, 0xa2, 0x3c, 0x78, 0xa2, 0xc0, 0x63, 0xc1, 0x67, 0x6b, 0x53,
+    0x6b, 0xac, 0x89, 0xee, 0x0e, 0x10, 0x28, 0x11, 0x7b, 0x7a, 0x68, 0x17, 0x82, 0x37, 0x8a, 0xe6, 0xa1, 0x92, 0x98,
+    0x79, 0xe1, 0x9f, 0x48, 0x17, 0x07, 0x02, 0xdd, 0x0d, 0xad, 0x14, 0xb7, 0x4b, 0x4a, 0x14, 0x9c, 0x73, 0x90, 0x30,
+    0x00, 0xe3, 0x28, 0x96, 0xa3, 0xe9, 0x92, 0xaa, 0xc1, 0x0a, 0x0b, 0x31, 0x2d, 0x0a, 0x7c, 0x5d, 0xd2, 0xbb, 0xdc,
+    0x23, 0x44, 0x28, 0x46, 0x45, 0xe4, 0x6a, 0x25, 0x08, 0x11, 0x08, 0x7f, 0x47, 0x96, 0xb1, 0x5d, 0x4f, 0xb4, 0xd7,
+    0xc2, 0x70, 0x2e, 0x23, 0xcd, 0x5d, 0xf0, 0x88, 0x67, 0x57, 0x54, 0x48, 0x2a, 0xa2, 0xbf, 0x62, 0x41, 0xc7, 0x29,
+    0x40, 0xb1, 0xd7, 0xc6, 0xd3, 0x38, 0x3f, 0x9d, 0xc6, 0xd9, 0x84, 0x26, 0xd1, 0xb5, 0x2c, 0xf0, 0xdf, 0x89, 0x3f,
+    0x66, 0x59, 0x9c, 0xb2, 0x5f, 0x68, 0xe2, 0x1b, 0x69, 0x70, 0xe2, 0xd1, 0x1b, 0x49, 0xb3, 0x24, 0xf7, 0x5e, 0xbe,
+    0x7f, 0xfd, 0xca, 0xec, 0x63, 0x4d, 0x40, 0xa0, 0x65, 0xbe, 0x98, 0x53, 0x11, 0x20, 0x6c, 0x04, 0xc4, 0x0b, 0xa6,
+    0x98, 0xe3, 0xeb, 0x78, 0xae, 0x4b, 0x58, 0xfe, 0x61, 0x9e, 0xc4, 0x92, 0x7e, 0x4d, 0xb3, 0x84, 0x65, 0x13, 0xb2,
+    0xd7, 0xd6, 0xe5, 0xd3, 0xd8, 0x54, 0x24, 0x65, 0xd1, 0xf9, 0xfe, 0x8b, 0x54, 0xad, 0xbb, 0x7c, 0x5c, 0x04, 0xa8,
+    0xc8, 0x65, 0x2c, 0xd9, 0xc8, 0x8b, 0x93, 0xe4, 0xcb, 0x8c, 0x49, 0xa6, 0x00, 0x14, 0xb0, 0x3d, 0x40, 0xa2, 0x54,
+    0x8b, 0x0a, 0x0b, 0x78, 0x80, 0x70, 0x10, 0x18, 0x01, 0x30, 0x45, 0x66, 0xbf, 0x0e, 0x0e, 0x2a, 0x76, 0xdf, 0xa7,
+    0x91, 0xae, 0x24, 0x83, 0x21, 0x0a, 0xe7, 0x8b, 0x1c, 0x36, 0xda, 0x4e, 0x01, 0xd2, 0x85, 0x5f, 0xe6, 0x54, 0x5c,
+    0xd1, 0xa4, 0x24, 0x8e, 0x3c, 0x40, 0xcb, 0xb5, 0x39, 0xcc, 0xb1, 0x90, 0x64, 0x30, 0xec, 0xba, 0x7c, 0x9b, 0x1a,
+    0x3a, 0x17, 0x7c, 0x4e, 0x85, 0x64, 0x34, 0x2f, 0x59, 0x49, 0x00, 0x52, 0xb4, 0x64, 0x27, 0x39, 0xb1, 0xeb, 0x9b,
+    0x07, 0x0c, 0x53, 0x54, 0x63, 0x18, 0x56, 0xd0, 0xbe, 0xb8, 0x52, 0x12, 0x23, 0xc7, 0x0c, 0x61, 0xa9, 0x21, 0xcd,
+    0x11, 0x2a, 0x10, 0x96, 0x16, 0x5c, 0xcd, 0x8a, 0xcc, 0x6c, 0xb7, 0x20, 0xaa, 0xc9, 0x77, 0x4a, 0x54, 0x03, 0x43,
+    0x8b, 0x25, 0x3d, 0x38, 0x08, 0x68, 0x58, 0x12, 0x05, 0xd9, 0x6b, 0x9b, 0x3d, 0x72, 0x90, 0xb5, 0x03, 0x6c, 0x98,
+    0x58, 0x62, 0x8a, 0xf0, 0x1e, 0x0d, 0x33, 0x7e, 0x32, 0x1a, 0xd1, 0x3c, 0xe7, 0xe2, 0xe0, 0x60, 0x4f, 0xb5, 0x2f,
+    0xb5, 0x09, 0xd8, 0xc3, 0xb7, 0xd7, 0x59, 0x05, 0x01, 0xaa, 0x24, 0xac, 0x91, 0x0b, 0x12, 0xe4, 0x94, 0x52, 0x38,
+    0xfc, 0xbe, 0x55, 0x3c, 0x22, 0xff, 0xfc, 0xdc, 0x6f, 0x48, 0x6c, 0xd0, 0x30, 0xa1, 0x76, 0xea, 0xdb, 0xe7, 0x54,
+    0xab, 0x56, 0x4a, 0xf1, 0xd8, 0xc0, 0x8c, 0x3e, 0x3f, 0x61, 0x42, 0xc7, 0x2c, 0x73, 0x96, 0x5d, 0x03, 0x09, 0x4b,
+    0x9c, 0xa3, 0xc2, 0xd9, 0xd0, 0xad, 0x43, 0x2b, 0x9d, 0x46, 0xef, 0xdc, 0x72, 0xa2, 0xf4, 0x08, 0x67, 0x1b, 0x07,
+    0x74, 0x58, 0x60, 0x85, 0x7a, 0xbb, 0x9a, 0x4c, 0x01, 0x3a, 0x90, 0xc3, 0xae, 0xa9, 0x27, 0xb9, 0xc6, 0x9c, 0xa0,
+    0x3f, 0x2f, 0x68, 0x2e, 0x35, 0x1d, 0x07, 0x12, 0x67, 0x98, 0xa1, 0x02, 0x8e, 0xdb, 0x98, 0x4d, 0x16, 0x02, 0xd4,
+    0x1d, 0x38, 0x8a, 0x34, 0x5b, 0xcc, 0xa8, 0x7d, 0xda, 0x06, 0xdb, 0xdb, 0x39, 0x08, 0xc4, 0x1c, 0x68, 0xfa, 0x6e,
+    0x72, 0x02, 0x58, 0x25, 0x5a, 0xad, 0xbe, 0xb3, 0x83, 0x54, 0x5b, 0x59, 0xaa, 0x68, 0x6b, 0x7b, 0xf2, 0x77, 0x64,
+    0xe4, 0xf1, 0x5e, 0x5b, 0x43, 0xff, 0xf7, 0x21, 0xd9, 0x6b, 0x95, 0x14, 0x6c, 0x70, 0xaa, 0x81, 0xd1, 0x28, 0x7c,
+    0xab, 0x07, 0x42, 0x4a, 0xba, 0xd7, 0x88, 0x25, 0x9c, 0x6e, 0xd0, 0xe9, 0x94, 0x0c, 0x40, 0xcf, 0x08, 0xa7, 0xc3,
+    0x5d, 0xc4, 0x64, 0xb9, 0x41, 0x20, 0x37, 0xeb, 0x2a, 0xa6, 0x71, 0x55, 0x67, 0x1a, 0x6b, 0x8b, 0xf0, 0xe7, 0x65,
+    0x17, 0xbf, 0xa4, 0x31, 0x73, 0xcc, 0xab, 0x2a, 0xcc, 0x14, 0x30, 0xd5, 0x92, 0x9c, 0x21, 0xde, 0xc4, 0x33, 0x9a,
+    0x07, 0x14, 0xe1, 0x5d, 0x0d, 0x34, 0x71, 0x42, 0x93, 0xa1, 0x23, 0x36, 0x73, 0x10, 0x9b, 0x0c, 0x69, 0xad, 0xac,
+    0x7e, 0xdc, 0x72, 0x4c, 0x07, 0xf9, 0xb0, 0x52, 0xe6, 0x9c, 0xc5, 0x2b, 0x79, 0x6c, 0xa8, 0xdb, 0xe2, 0x4f, 0x97,
+    0x69, 0xa4, 0x29, 0xa5, 0x21, 0x47, 0x78, 0xaf, 0xb5, 0xbe, 0x8f, 0xb6, 0x55, 0xb5, 0xc6, 0xc1, 0x10, 0xf6, 0x41,
+    0x89, 0x8b, 0x90, 0xe5, 0xea, 0xff, 0xda, 0x39, 0x03, 0xb4, 0x9d, 0x01, 0x59, 0x84, 0xe3, 0x34, 0x96, 0x41, 0xfb,
+    0xb0, 0x05, 0x9a, 0xe8, 0x15, 0x05, 0x69, 0x82, 0xd0, 0xe6, 0x52, 0x68, 0xb8, 0xc8, 0xf2, 0x29, 0x1b, 0xcb, 0x20,
+    0x96, 0x8a, 0xa1, 0xd0, 0x34, 0xa7, 0x9e, 0xac, 0xe9, 0xc3, 0x8a, 0xd9, 0xc4, 0x40, 0x6a, 0xa5, 0xf2, 0x45, 0x2d,
+    0xa4, 0x8a, 0x69, 0x01, 0x6f, 0xa8, 0x74, 0xe9, 0x8a, 0xc7, 0xd8, 0xd6, 0x0c, 0xf4, 0xc5, 0x76, 0x5f, 0x8f, 0x18,
+    0x19, 0x56, 0xc0, 0x1c, 0x95, 0x95, 0x45, 0x2e, 0x7f, 0x30, 0x85, 0x32, 0x94, 0xfc, 0x15, 0xbf, 0xa6, 0xe2, 0x34,
+    0x06, 0xe0, 0x23, 0xdd, 0xbd, 0xd0, 0x62, 0x40, 0x71, 0x7b, 0xd9, 0xb5, 0xf4, 0x72, 0xae, 0x16, 0xfe, 0xb5, 0xe0,
+    0x33, 0x96, 0x53, 0xd0, 0xd4, 0x34, 0xfe, 0x33, 0x38, 0x65, 0xea, 0x38, 0x82, 0xa8, 0xa1, 0x25, 0x7d, 0x9d, 0xbc,
+    0xaa, 0xd3, 0xd7, 0xf9, 0xfe, 0x8b, 0x89, 0x65, 0x7f, 0xf5, 0x43, 0x8c, 0x70, 0x60, 0xec, 0x09, 0x47, 0xca, 0x85,
+    0x53, 0x64, 0xc4, 0xfb, 0x6a, 0x25, 0x1d, 0xb3, 0xad, 0xa6, 0x2b, 0x52, 0x7d, 0x6c, 0x50, 0x11, 0x27, 0x09, 0x68,
+    0x75, 0x82, 0xa7, 0xa9, 0x23, 0xa8, 0x30, 0xeb, 0x96, 0xa2, 0xe9, 0x7c, 0xff, 0xc5, 0xd9, 0x5d, 0xd2, 0x09, 0xea,
+    0x5d, 0x01, 0x65, 0x01, 0xcd, 0x12, 0x2a, 0xc0, 0x8c, 0x74, 0x76, 0xcb, 0xc8, 0xd8, 0x53, 0x9e, 0x65, 0x74, 0x24,
+    0x69, 0x02, 0x56, 0x0a, 0x23, 0x32, 0x9c, 0xf2, 0x5c, 0x96, 0x85, 0x15, 0xf4, 0xcc, 0x81, 0x9e, 0x85, 0xa3, 0x38,
+    0x4d, 0x03, 0x6d, 0x91, 0xcc, 0xf8, 0x15, 0xdd, 0x02, 0x75, 0xb7, 0x06, 0x72, 0x39, 0x0c, 0x75, 0x86, 0xa1, 0x61,
+    0x3e, 0x4f, 0xd9, 0x88, 0x96, 0x82, 0xeb, 0x2c, 0x64, 0x59, 0x42, 0x6f, 0x80, 0x8f, 0xa0, 0x5e, 0xaf, 0xd7, 0xc2,
+    0x6d, 0x54, 0x68, 0x84, 0x2f, 0x37, 0x10, 0x7b, 0x87, 0xc8, 0x04, 0x22, 0x23, 0xbd, 0xe5, 0x36, 0x7e, 0x40, 0x91,
+    0x23, 0x27, 0x99, 0xb5, 0xac, 0x34, 0x6f, 0x46, 0x38, 0xa1, 0x29, 0x95, 0xd4, 0xf2, 0x72, 0xd0, 0x9f, 0xf5, 0xd1,
+    0x7d, 0x57, 0xe2, 0xaf, 0x24, 0x27, 0x7b, 0xca, 0xec, 0x9e, 0xe7, 0xa5, 0xa5, 0x5e, 0x6d, 0x4f, 0x85, 0xed, 0xbe,
+    0xd4, 0xdb, 0x13, 0x4b, 0x19, 0x8f, 0xa6, 0xda, 0x44, 0x0f, 0x36, 0x96, 0x54, 0x8d, 0x61, 0xf8, 0x7a, 0x79, 0x88,
+    0x3e, 0x58, 0x30, 0xb7, 0xa1, 0xe0, 0xcc, 0x30, 0x05, 0x0a, 0x56, 0x9f, 0xde, 0xb6, 0xd3, 0x38, 0x4d, 0x2f, 0xe3,
+    0xd1, 0xc7, 0x3a, 0xf5, 0x57, 0x64, 0x40, 0xd6, 0xb9, 0xb1, 0x53, 0xe5, 0xb0, 0x2c, 0x77, 0xdd, 0x96, 0x4b, 0xd7,
+    0x0e, 0x4a, 0xb0, 0xd7, 0xaa, 0xc8, 0xbe, 0xbe, 0xd1, 0x3b, 0xa9, 0x5d, 0x41, 0xc4, 0xcc, 0xca, 0x02, 0xe0, 0x02,
+    0x9f, 0xa4, 0x38, 0xcb, 0x0f, 0x0c, 0xdd, 0x81, 0xad, 0x51, 0xac, 0x01, 0x22, 0xd1, 0xb2, 0x48, 0x58, 0xbe, 0x1b,
+    0x03, 0x7f, 0x08, 0x94, 0xcf, 0x9d, 0x19, 0xee, 0x0b, 0x68, 0xc9, 0xe3, 0x8c, 0xca, 0x5c, 0x42, 0x66, 0xb4, 0x09,
+    0xcb, 0x68, 0xfe, 0x06, 0x9a, 0x8b, 0xa2, 0xf7, 0xb7, 0xba, 0x0a, 0x74, 0x32, 0x80, 0x22, 0xef, 0xba, 0xca, 0x44,
+    0x8d, 0x02, 0x0c, 0x4f, 0x65, 0x4a, 0xe4, 0x66, 0x35, 0xe3, 0xd1, 0xa8, 0xeb, 0xda, 0xfe, 0x36, 0x2c, 0x97, 0x93,
+    0x20, 0x08, 0x72, 0xb0, 0xdf, 0xac, 0x5e, 0x5f, 0x2d, 0x22, 0xdf, 0x58, 0x44, 0x1e, 0x3a, 0x46, 0x16, 0xaa, 0x68,
+    0xd9, 0xe9, 0x1e, 0xfd, 0x15, 0xb9, 0x8d, 0x40, 0x59, 0x0d, 0x81, 0x3f, 0xa3, 0x92, 0xdd, 0xa6, 0x44, 0x62, 0x6e,
+    0x0c, 0x1c, 0x43, 0x69, 0xc0, 0x30, 0xaa, 0x2e, 0x19, 0xd2, 0x47, 0xa3, 0x66, 0xec, 0x66, 0x98, 0xa3, 0x35, 0xcd,
+    0xbe, 0x28, 0x0c, 0x8e, 0x28, 0x32, 0x7b, 0x53, 0x53, 0x89, 0x1d, 0xac, 0xe0, 0x8c, 0x18, 0x35, 0x58, 0x6b, 0x3d,
+    0xeb, 0xb8, 0x29, 0xc7, 0x85, 0x83, 0x5a, 0xa1, 0xa6, 0xa6, 0x4f, 0x5a, 0xc5, 0x2a, 0x43, 0x78, 0x6a, 0x35, 0x52,
+    0x5e, 0xad, 0x9b, 0x10, 0xdf, 0x7a, 0x23, 0xfc, 0xfe, 0xb2, 0x66, 0x12, 0x46, 0x4e, 0xb3, 0x22, 0x02, 0x96, 0xca,
+    0xb7, 0xa1, 0x7b, 0x1b, 0xcd, 0xd4, 0xc6, 0x71, 0x10, 0xce, 0x5d, 0x84, 0x3b, 0x98, 0xcd, 0x34, 0xe7, 0xca, 0x86,
+    0x64, 0x5a, 0xef, 0x1b, 0x50, 0xcc, 0xf5, 0x3e, 0x6c, 0x20, 0x71, 0x5d, 0xf1, 0x54, 0x24, 0x08, 0x06, 0x6c, 0x0e,
+    0xca, 0x9d, 0x2b, 0x1f, 0x02, 0x80, 0x9d, 0xad, 0x56, 0x1b, 0x44, 0xb7, 0x55, 0xff, 0x44, 0x61, 0x65, 0x14, 0xae,
+    0x56, 0xd7, 0x12, 0x05, 0x46, 0xf3, 0xc5, 0x14, 0xf5, 0x2d, 0xc7, 0x3d, 0x79, 0x05, 0xad, 0x94, 0x22, 0x5a, 0x95,
+    0x94, 0x26, 0x43, 0x9d, 0x66, 0xeb, 0xfb, 0x24, 0x1d, 0xb6, 0x7d, 0xba, 0xc1, 0xbd, 0x54, 0xa1, 0x11, 0xd3, 0xd5,
+    0x92, 0x4f, 0xcd, 0xd0, 0x0c, 0x21, 0x14, 0xe5, 0xca, 0x8a, 0xd9, 0xdb, 0x66, 0x58, 0x1e, 0x1c, 0xe4, 0xce, 0x40,
+    0xe7, 0x25, 0x9b, 0xf8, 0x29, 0x00, 0x91, 0x9c, 0xdf, 0x66, 0x4a, 0x77, 0xf9, 0xc9, 0x0a, 0xa1, 0x0d, 0xb3, 0xb4,
+    0xd5, 0x05, 0x6b, 0x3c, 0xbe, 0x8e, 0x99, 0xf4, 0xca, 0x51, 0xb4, 0x35, 0x1e, 0x50, 0xb4, 0x34, 0xaa, 0x46, 0x28,
+    0x28, 0x28, 0x8f, 0xc0, 0x13, 0xac, 0x0a, 0xad, 0xe9, 0x7e, 0x34, 0xa5, 0xe0, 0x08, 0xb6, 0x5a, 0x44, 0x69, 0x17,
+    0xee, 0x19, 0x29, 0x62, 0x06, 0xde, 0x0e, 0x7b, 0xb1, 0xde, 0xbd, 0x66, 0x07, 0xcc, 0xa9, 0x18, 0x73, 0x31, 0xb3,
+    0x75, 0xc5, 0xda, 0xb3, 0xe1, 0x8c, 0x6c, 0x1c, 0x6c, 0x1d, 0xdb, 0xa8, 0xff, 0xdd, 0x35, 0xa3, 0xbb, 0x32, 0xd7,
+    0x6b, 0xa2, 0xb4, 0x94, 0xbe, 0xda, 0x1f, 0x68, 0x29, 0x33, 0x77, 0xcd, 0x7b, 0xe3, 0x4c, 0xed, 0x6a, 0x87, 0xc9,
+    0x5e, 0xbb, 0x5b, 0xda, 0x7c, 0x96, 0x1a, 0xba, 0xda, 0xb1, 0x61, 0x44, 0x2a, 0x5f, 0xa4, 0x89, 0x01, 0x96, 0x21,
+    0x4c, 0x0d, 0x1d, 0x5d, 0xb3, 0x34, 0xad, 0x4a, 0x7f, 0x0d, 0x5f, 0xcf, 0x0d, 0x5f, 0xcf, 0x2c, 0x5f, 0x07, 0x4e,
+    0x01, 0x7c, 0x5d, 0x0f, 0x57, 0x75, 0xcf, 0x36, 0x4e, 0x67, 0xa6, 0x39, 0x7a, 0xae, 0xec, 0x68, 0x98, 0x6f, 0x61,
+    0x21, 0x40, 0xa5, 0xe6, 0xf5, 0x31, 0x30, 0x4e, 0x18, 0x30, 0x00, 0xb5, 0x0b, 0x93, 0xba, 0x2e, 0x8a, 0x8f, 0x01,
+    0xc2, 0x79, 0x41, 0x4b, 0xca, 0x3e, 0x79, 0x01, 0x4e, 0x3a, 0x67, 0x39, 0x20, 0xc4, 0x54, 0xf1, 0xaf, 0x52, 0xa2,
+    0xec, 0xea, 0x98, 0x59, 0x5d, 0x6e, 0x57, 0x07, 0x9c, 0xbe, 0x5a, 0x5d, 0x72, 0x37, 0xaf, 0x57, 0xcb, 0x63, 0xe5,
+    0xf2, 0xaa, 0xfd, 0x5e, 0xad, 0x82, 0xb5, 0x12, 0xf0, 0xdf, 0x1b, 0x13, 0x45, 0x94, 0xa3, 0x03, 0x0f, 0x70, 0x31,
+    0x03, 0x05, 0x85, 0x5e, 0x74, 0x29, 0xe2, 0x5e, 0x7d, 0xca, 0xc1, 0xa3, 0xdc, 0xf4, 0xba, 0xff, 0x29, 0x9f, 0xcd,
+    0x41, 0x1b, 0x5b, 0x23, 0xe9, 0x09, 0x35, 0x13, 0x56, 0xf5, 0xc5, 0x96, 0xb2, 0x5a, 0x1f, 0x75, 0x1e, 0x6b, 0xd4,
+    0x54, 0xda, 0xcb, 0x7b, 0xad, 0x62, 0x51, 0x16, 0x95, 0x8c, 0x63, 0x9b, 0x53, 0xe5, 0x74, 0xdd, 0x25, 0x63, 0x2b,
+    0xde, 0x06, 0x4c, 0xf3, 0x61, 0x06, 0xbc, 0xce, 0x61, 0x3f, 0x96, 0xdc, 0xdd, 0xfd, 0x2f, 0x2a, 0xe4, 0x2c, 0x8b,
+    0x35, 0xf4, 0x2d, 0x8b, 0xe2, 0x44, 0x1b, 0xd9, 0xf8, 0x64, 0xb7, 0x35, 0x5c, 0xd5, 0x19, 0x63, 0x71, 0x30, 0xc4,
+    0x27, 0x9b, 0xaa, 0x23, 0x59, 0xce, 0x78, 0x42, 0x23, 0x9f, 0xcf, 0x69, 0xe6, 0x17, 0xe0, 0x55, 0x35, 0x7b, 0x3f,
+    0x92, 0xc1, 0xf2, 0x5d, 0xdd, 0xbd, 0x1a, 0x9d, 0x14, 0xe0, 0xfd, 0xfa, 0x62, 0xd3, 0xf1, 0xfa, 0x2d, 0x15, 0xb9,
+    0x52, 0x44, 0x4b, 0x9d, 0xf6, 0x8b, 0x4a, 0x2c, 0x7d, 0x11, 0xed, 0x6c, 0x5f, 0x99, 0x20, 0x7e, 0x3b, 0x7c, 0x1c,
+    0x1e, 0xf9, 0x48, 0xb9, 0x85, 0xbf, 0x32, 0x07, 0xfe, 0xb9, 0x75, 0x0b, 0xbf, 0x20, 0xcf, 0xeb, 0x5e, 0xe1, 0x44,
+    0x92, 0x17, 0xfd, 0x17, 0xd6, 0x62, 0xe6, 0x29, 0x1b, 0xdd, 0x06, 0x7e, 0xca, 0x64, 0x13, 0x42, 0x6f, 0x3e, 0x5e,
+    0xea, 0x0a, 0x70, 0x29, 0x2a, 0x77, 0x76, 0x61, 0x6d, 0x3d, 0x2c, 0x25, 0xf1, 0xf7, 0x53, 0x26, 0xf7, 0x7d, 0x3c,
+    0x23, 0x17, 0xf0, 0x63, 0x7f, 0x19, 0xbc, 0x8e, 0xe5, 0x34, 0x14, 0x71, 0x96, 0xf0, 0x59, 0x80, 0x1a, 0xbe, 0x8f,
+    0xc2, 0x5c, 0xd9, 0x1b, 0x9f, 0xa3, 0x62, 0xff, 0x02, 0xdf, 0x48, 0xe2, 0xf7, 0xfd, 0xc6, 0x0c, 0xbf, 0x91, 0xe4,
+    0xe2, 0x78, 0x7f, 0x79, 0x23, 0x8b, 0xde, 0x05, 0xbe, 0x29, 0x3d, 0xf6, 0xf8, 0x6b, 0x12, 0x20, 0xd2, 0xbb, 0x31,
+    0xd0, 0x9c, 0xf2, 0x99, 0xf6, 0xdc, 0xfb, 0x08, 0x7f, 0x80, 0xb8, 0x8a, 0xa8, 0xb8, 0x8d, 0x09, 0xad, 0xec, 0x11,
+    0x9f, 0x2b, 0x17, 0x81, 0x7f, 0x70, 0xe0, 0x94, 0x95, 0xaa, 0x02, 0x3e, 0x91, 0xa4, 0x66, 0x90, 0xe3, 0xf7, 0x2a,
+    0x42, 0x73, 0x22, 0x03, 0x81, 0xec, 0x30, 0x81, 0xf5, 0x43, 0x9b, 0xa3, 0x29, 0x06, 0xda, 0xc3, 0x10, 0x32, 0x49,
+    0x45, 0x2c, 0xb9, 0x18, 0x22, 0x57, 0xfd, 0xc0, 0x7f, 0x23, 0x17, 0x03, 0xef, 0x3f, 0xfd, 0xd3, 0x8f, 0xe3, 0x1f,
+    0xc5, 0xf0, 0x02, 0xbf, 0x25, 0x87, 0xc7, 0x41, 0x3f, 0x0a, 0xf6, 0x9a, 0xcd, 0xd5, 0x8f, 0x87, 0x83, 0x7f, 0xc4,
+    0xcd, 0x5f, 0x4e, 0x9a, 0x3f, 0x0c, 0xd1, 0x2a, 0xf8, 0xf1, 0xb0, 0x3f, 0x30, 0x4f, 0x83, 0x7f, 0xf4, 0x7e, 0xcc,
+    0x87, 0x7f, 0xd6, 0x85, 0xfb, 0x08, 0x1d, 0x4e, 0xf0, 0x42, 0x92, 0xc3, 0x66, 0xb3, 0x77, 0x38, 0xc1, 0x73, 0x49,
+    0x0e, 0xe1, 0xff, 0x4b, 0xf2, 0x8e, 0x4e, 0x5e, 0xdc, 0xcc, 0x83, 0x8b, 0xde, 0x6a, 0x7f, 0xf9, 0xb7, 0x02, 0x46,
+    0x1d, 0xfc, 0xe3, 0xc7, 0x1f, 0x73, 0xff, 0x41, 0x8f, 0x1c, 0x0e, 0x1b, 0x28, 0x80, 0xd2, 0x3f, 0x13, 0xf5, 0x6f,
+    0xd0, 0x8f, 0x06, 0xff, 0x30, 0x50, 0xf8, 0x0f, 0x7e, 0xbc, 0x38, 0xee, 0x91, 0xe1, 0x2a, 0xf0, 0x57, 0x0f, 0xd0,
+    0x0a, 0xa1, 0xd5, 0x3e, 0xba, 0xc0, 0xfe, 0xc4, 0x47, 0x78, 0x22, 0xc9, 0xe1, 0x83, 0xc3, 0x09, 0xbe, 0x92, 0xe4,
+    0xd0, 0x3f, 0x9c, 0xe0, 0x17, 0x92, 0x1c, 0xfe, 0x23, 0xe8, 0x47, 0xda, 0xc3, 0xb6, 0x52, 0xee, 0x8d, 0x15, 0x04,
+    0x37, 0x62, 0x41, 0xe3, 0x95, 0x64, 0x32, 0xa5, 0x68, 0xff, 0x90, 0xe1, 0x33, 0x85, 0xa6, 0x40, 0x82, 0x13, 0x06,
+    0x6c, 0xbb, 0x60, 0x79, 0x0e, 0x9b, 0x0d, 0x34, 0xb3, 0x1f, 0x09, 0xac, 0xfd, 0x00, 0x79, 0x24, 0xf1, 0x55, 0x9c,
+    0x2e, 0x68, 0x1e, 0xd1, 0x02, 0xe1, 0x11, 0x39, 0x93, 0x41, 0x1b, 0xe1, 0x77, 0x12, 0x7e, 0x74, 0x10, 0x3e, 0x33,
+    0x01, 0x4c, 0x38, 0xc8, 0x9a, 0xa8, 0x32, 0xae, 0x35, 0x16, 0x1f, 0xe1, 0xf9, 0x96, 0x4a, 0x39, 0x05, 0xef, 0x02,
+    0xc2, 0xe3, 0x5a, 0xb8, 0x13, 0x5f, 0x13, 0x4b, 0x12, 0xef, 0x05, 0xa5, 0xdf, 0xc5, 0xe9, 0x47, 0x2a, 0x82, 0x1b,
+    0xdc, 0xee, 0x7c, 0x8e, 0x95, 0x0b, 0x7a, 0xaf, 0x8d, 0xba, 0x65, 0xac, 0xea, 0x54, 0xea, 0x18, 0x01, 0x08, 0xd9,
+    0xba, 0x2f, 0x06, 0x76, 0x7c, 0x4f, 0x6c, 0x38, 0xac, 0x44, 0x7c, 0xed, 0xa3, 0x7a, 0x5c, 0x94, 0x65, 0x57, 0x71,
+    0xca, 0x12, 0x4f, 0xd2, 0xd9, 0x3c, 0x8d, 0x25, 0xf5, 0xcc, 0x7a, 0xbd, 0x18, 0x06, 0xf2, 0x4b, 0x95, 0x21, 0x71,
+    0x0c, 0xce, 0xc4, 0x06, 0x9c, 0xe0, 0xac, 0x04, 0x10, 0x9d, 0x32, 0x6a, 0xc7, 0xeb, 0x2a, 0xf8, 0xb5, 0x1e, 0xdf,
+    0x6b, 0xb6, 0xc1, 0x11, 0x36, 0x54, 0xe2, 0x39, 0xc7, 0x19, 0x01, 0x21, 0xda, 0xe9, 0xfb, 0xc7, 0xf9, 0xd5, 0xa4,
+    0xe7, 0x43, 0x6c, 0x86, 0x93, 0xb7, 0xca, 0x2f, 0x04, 0x0d, 0xa6, 0xa4, 0xd5, 0x9d, 0x1e, 0xd3, 0xee, 0xb4, 0xd1,
+    0xb0, 0x3a, 0x74, 0x4a, 0xc4, 0x60, 0xaa, 0xbb, 0xc7, 0x38, 0xc1, 0x0b, 0xd2, 0x6c, 0xe3, 0x09, 0x69, 0xa9, 0x2e,
+    0xdd, 0xc9, 0x71, 0x6a, 0xa6, 0x39, 0x38, 0x08, 0x78, 0x98, 0xc6, 0xb9, 0xfc, 0x12, 0x8c, 0x7d, 0x32, 0xc1, 0x09,
+    0xe1, 0x21, 0xbd, 0xa1, 0xa3, 0x20, 0x45, 0x38, 0x31, 0x9c, 0x06, 0x75, 0xd1, 0x84, 0x38, 0xcd, 0xc0, 0x88, 0x20,
+    0x6f, 0xfb, 0xc9, 0xa0, 0x3d, 0x24, 0x84, 0xf8, 0x7b, 0xcd, 0xa6, 0xdf, 0xe7, 0x64, 0x21, 0x23, 0x28, 0x71, 0x54,
+    0x65, 0x32, 0x87, 0xa2, 0x8e, 0x53, 0x14, 0xbc, 0x90, 0xa1, 0xa4, 0xb9, 0x0c, 0xa0, 0x18, 0xcc, 0xff, 0xdc, 0x12,
+    0xb6, 0x7f, 0x7c, 0xe8, 0x37, 0xa0, 0x54, 0x11, 0x27, 0xc2, 0x9c, 0x5c, 0xa2, 0x28, 0x19, 0x1c, 0x0d, 0x5d, 0xfe,
+    0xaf, 0x0a, 0x61, 0xf2, 0xcb, 0x7e, 0x32, 0x68, 0xa9, 0xc9, 0x7b, 0x7e, 0x3f, 0xe0, 0x24, 0xd7, 0x0a, 0x5a, 0x3f,
+    0x8f, 0xde, 0xaa, 0xa5, 0xa2, 0xc8, 0x00, 0x67, 0xe6, 0x5d, 0x90, 0x66, 0x27, 0x0a, 0x16, 0xee, 0x22, 0x9a, 0x30,
+    0x99, 0xc1, 0x02, 0x8e, 0x09, 0xb4, 0xc7, 0x9c, 0xc0, 0x8c, 0x55, 0xb7, 0xcb, 0xc8, 0x3c, 0x3f, 0xf0, 0x1f, 0xf4,
+    0xaf, 0x64, 0x34, 0x91, 0x7a, 0xfa, 0x2b, 0xb9, 0x5a, 0xc1, 0xff, 0x13, 0xd9, 0xe7, 0xe4, 0x52, 0x15, 0x2d, 0x4c,
+    0xd1, 0x1c, 0x8a, 0xde, 0x46, 0x00, 0x2a, 0xce, 0x4b, 0x25, 0x4b, 0xef, 0xc9, 0x15, 0x51, 0xb0, 0x1f, 0x1c, 0x88,
+    0xc1, 0xb4, 0xd1, 0x1e, 0x82, 0x7f, 0x5f, 0xc8, 0xfc, 0x3b, 0x26, 0xa7, 0x81, 0x7f, 0xd8, 0xf3, 0x51, 0xdf, 0xf7,
+    0x60, 0x6b, 0xbb, 0x59, 0x83, 0x68, 0x0c, 0xa7, 0x8d, 0x37, 0x32, 0x5a, 0xf4, 0x48, 0xab, 0x1f, 0x30, 0xe3, 0xcf,
+    0x43, 0x38, 0x35, 0x8c, 0xb3, 0x85, 0x17, 0xa8, 0x21, 0x65, 0xc3, 0x3e, 0x2f, 0x50, 0x63, 0xd6, 0xb8, 0x42, 0x51,
+    0xda, 0x98, 0x35, 0x82, 0x05, 0x21, 0xa4, 0xd9, 0x29, 0xbb, 0x59, 0xe9, 0x37, 0x45, 0xd1, 0x95, 0x75, 0x76, 0x0e,
+    0xd4, 0x71, 0xc8, 0x1a, 0x81, 0x18, 0xd0, 0xe1, 0x6a, 0xe5, 0x1f, 0xf7, 0x7b, 0x3e, 0x6a, 0x04, 0x96, 0xd0, 0x0e,
+    0x2d, 0xa5, 0x21, 0x84, 0xd9, 0xb0, 0x30, 0xa1, 0xa4, 0x97, 0xb5, 0xb0, 0xd1, 0xb2, 0x3a, 0xec, 0x0e, 0x0f, 0xa0,
+    0x45, 0x69, 0xc7, 0x68, 0x7d, 0x75, 0x0e, 0xcb, 0xb4, 0xc4, 0x9c, 0x91, 0x16, 0xe6, 0xc4, 0xfa, 0xae, 0xa7, 0x44,
+    0x56, 0x04, 0x9f, 0x92, 0xaa, 0x39, 0x1e, 0xc4, 0x38, 0x19, 0x92, 0xd7, 0xda, 0x1e, 0xe9, 0x5a, 0xbf, 0x38, 0x4d,
+    0xc9, 0xcb, 0xb5, 0xe8, 0x6d, 0x0c, 0xb1, 0x95, 0xeb, 0x70, 0xb4, 0x10, 0x82, 0x66, 0xf2, 0x0d, 0x4f, 0x8c, 0x9a,
+    0x46, 0x53, 0xb0, 0x94, 0x20, 0x2c, 0x8b, 0x41, 0x47, 0xeb, 0xd8, 0x93, 0xb1, 0xd8, 0xa8, 0x9e, 0x90, 0x85, 0x56,
+    0x9f, 0x54, 0xb0, 0xb6, 0x3b, 0x31, 0x76, 0x71, 0x80, 0xf0, 0xc2, 0x44, 0x71, 0x83, 0x30, 0x0c, 0x27, 0xe1, 0x08,
+    0xaa, 0x61, 0x82, 0x1c, 0x15, 0xea, 0x1c, 0x05, 0x39, 0xb9, 0x0e, 0x33, 0x7a, 0xa3, 0x66, 0x0d, 0x50, 0x25, 0x99,
+    0xed, 0xf1, 0x3a, 0x9e, 0x76, 0x15, 0xbb, 0xc9, 0xc3, 0x8c, 0x27, 0x14, 0xd0, 0x03, 0x71, 0x7b, 0x53, 0x34, 0x8d,
+    0x73, 0x37, 0x3e, 0x55, 0xc1, 0x37, 0x70, 0x9d, 0xd7, 0x13, 0xf0, 0xf8, 0x2a, 0x5d, 0xab, 0x6c, 0xac, 0xdd, 0xe0,
+    0x08, 0xb1, 0x71, 0x30, 0x09, 0x21, 0xae, 0xa7, 0x48, 0x48, 0x82, 0x29, 0x37, 0x71, 0x89, 0x6a, 0x56, 0x8e, 0x79,
+    0x45, 0x92, 0x01, 0x6f, 0x34, 0x94, 0x17, 0x7a, 0xa1, 0x49, 0x62, 0x82, 0xf0, 0x55, 0x79, 0xb6, 0x6c, 0xbb, 0xb7,
+    0x92, 0xd4, 0xa7, 0x0a, 0xae, 0xea, 0xee, 0xdc, 0x86, 0x94, 0x48, 0x79, 0x0a, 0x65, 0x30, 0x43, 0xf8, 0x19, 0x39,
+    0x0c, 0x06, 0x61, 0xff, 0x2f, 0x43, 0xd4, 0x0f, 0xc2, 0x3f, 0xa3, 0x43, 0xcd, 0x39, 0xae, 0x50, 0x37, 0xd5, 0x73,
+    0x2c, 0x55, 0xfc, 0xb2, 0x8d, 0x95, 0x27, 0x31, 0xca, 0x70, 0x16, 0xcf, 0x68, 0xf4, 0x0c, 0x0e, 0xb9, 0x25, 0x9c,
+    0xb7, 0x12, 0x03, 0x25, 0x45, 0xcf, 0x0c, 0x2f, 0x09, 0xfd, 0xfe, 0x2b, 0x59, 0x3e, 0xf5, 0xfd, 0xfe, 0xf3, 0xea,
+    0xe9, 0x2f, 0x7e, 0xff, 0x17, 0x19, 0xfd, 0x5c, 0x18, 0x6f, 0x77, 0x6d, 0x8e, 0xc7, 0x76, 0x8e, 0x42, 0x6f, 0x8d,
+    0x83, 0xbb, 0x05, 0xda, 0x74, 0x74, 0x4c, 0x50, 0xc1, 0xc6, 0x25, 0x33, 0xca, 0x43, 0x19, 0x4f, 0x00, 0xa9, 0xce,
+    0x1e, 0xe4, 0x6e, 0x5c, 0xbf, 0x5a, 0x31, 0x90, 0x8a, 0xa5, 0x57, 0x40, 0xe6, 0xa4, 0xd7, 0x42, 0xcb, 0x5a, 0x5b,
+    0xa5, 0x33, 0xd5, 0xe3, 0xe8, 0x25, 0x9f, 0xbe, 0x22, 0xad, 0xee, 0xd5, 0xf1, 0xa4, 0x7b, 0xd5, 0x68, 0xa0, 0xdc,
+    0x92, 0xd6, 0x62, 0x70, 0x35, 0xc4, 0x5f, 0x83, 0x53, 0xcf, 0xa5, 0x25, 0x5c, 0x5b, 0x5e, 0xc7, 0x2c, 0xaf, 0xd1,
+    0xc8, 0x0a, 0xd4, 0x75, 0xba, 0x4e, 0x74, 0xd7, 0xa2, 0xd0, 0x38, 0x59, 0x27, 0xb5, 0xa7, 0x48, 0x95, 0x40, 0x32,
+    0x14, 0x21, 0xe4, 0x46, 0xa2, 0xad, 0xa3, 0xc2, 0x98, 0xd0, 0x5d, 0x9d, 0x59, 0x60, 0x9f, 0x5a, 0x4a, 0x04, 0x80,
+    0x05, 0xe8, 0x5a, 0x7a, 0x82, 0x67, 0x78, 0xd1, 0x68, 0x2b, 0x32, 0x6f, 0xb6, 0xbb, 0xf5, 0xb1, 0x9e, 0x54, 0x63,
+    0xe1, 0x45, 0x83, 0xcc, 0x4a, 0x2c, 0x15, 0x59, 0xa3, 0x51, 0xd4, 0x83, 0x9d, 0xf6, 0xe4, 0xd6, 0x02, 0x10, 0x37,
+    0xeb, 0x49, 0x19, 0x56, 0xc2, 0x56, 0x32, 0x95, 0x85, 0x2c, 0xcb, 0xa8, 0x00, 0x29, 0x4a, 0x24, 0x66, 0x45, 0x51,
+    0x49, 0x76, 0x10, 0xa3, 0x98, 0x12, 0x01, 0x9c, 0x47, 0xd9, 0x5d, 0x38, 0xc3, 0x1c, 0x4f, 0x15, 0xdf, 0x20, 0x84,
+    0x9c, 0xd9, 0x74, 0x16, 0xa9, 0x78, 0x50, 0x4a, 0x98, 0x23, 0x93, 0x72, 0x42, 0xc3, 0xf3, 0xfd, 0x53, 0x7e, 0xa7,
+    0x4d, 0x36, 0x60, 0xc3, 0x48, 0x35, 0x4b, 0x0d, 0xe7, 0x8a, 0xc9, 0x87, 0x40, 0xa2, 0x32, 0x3a, 0x12, 0x2a, 0x06,
+    0xf8, 0x9c, 0x09, 0xaa, 0x74, 0xf0, 0x7d, 0x6b, 0xf7, 0xa5, 0x75, 0x05, 0x32, 0x75, 0xbd, 0x37, 0x80, 0xc8, 0x18,
+    0x9c, 0x3b, 0x19, 0xd9, 0x68, 0x76, 0xbe, 0x7f, 0xf2, 0x76, 0x9b, 0x0d, 0xbc, 0x5a, 0x19, 0xeb, 0x57, 0xe9, 0x36,
+    0x38, 0xae, 0x20, 0x4d, 0xcd, 0x8f, 0x28, 0x48, 0x95, 0x8a, 0x14, 0x07, 0x02, 0xa8, 0xe8, 0x7c, 0xff, 0xe4, 0x7d,
+    0x20, 0x94, 0x6f, 0x09, 0x61, 0x77, 0xd9, 0x01, 0x27, 0xc1, 0x94, 0x50, 0xa4, 0xd7, 0x5e, 0xb2, 0x2e, 0xee, 0x08,
+    0xf0, 0x68, 0xaa, 0x2a, 0xc1, 0x82, 0x18, 0xb0, 0x21, 0x49, 0x0d, 0x06, 0x48, 0x8a, 0x70, 0x5a, 0xb3, 0xcb, 0x08,
+    0x6c, 0x80, 0x9a, 0xeb, 0x0c, 0x76, 0x22, 0xd4, 0xaa, 0x1f, 0xc2, 0xa9, 0x9a, 0x55, 0x16, 0x5a, 0x78, 0x3c, 0xdb,
+    0xc8, 0x4a, 0xab, 0xcc, 0xd1, 0x6f, 0xc1, 0x76, 0xb2, 0x0f, 0x6f, 0x88, 0xb5, 0x24, 0x4c, 0xc1, 0x73, 0x9b, 0x3e,
+    0x76, 0xbe, 0x7f, 0xf2, 0xda, 0x64, 0x90, 0xcd, 0x63, 0xcb, 0xef, 0x37, 0x4c, 0xcc, 0x93, 0xd7, 0x61, 0x55, 0xab,
+    0x1a, 0x9f, 0xef, 0x9f, 0x7c, 0xd8, 0xd6, 0x0c, 0xca, 0x8b, 0x45, 0x65, 0xe3, 0x2b, 0xf8, 0x96, 0x34, 0x8d, 0x96,
+    0x46, 0x38, 0x44, 0xac, 0xc0, 0x4a, 0x20, 0x45, 0x79, 0x51, 0xba, 0x46, 0x9e, 0xe3, 0x8c, 0xa8, 0x30, 0x50, 0x7d,
+    0xd7, 0x8c, 0x9a, 0xc7, 0x78, 0x76, 0x36, 0xe2, 0x73, 0xba, 0x23, 0x36, 0x74, 0x83, 0x42, 0x36, 0x83, 0xd4, 0x19,
+    0x05, 0x3a, 0xc3, 0x7b, 0x2d, 0xd4, 0xad, 0x8b, 0xaf, 0x4c, 0x11, 0x29, 0xaf, 0xc9, 0x16, 0x3c, 0x25, 0x2d, 0x9c,
+    0x92, 0x16, 0x8e, 0x49, 0x3e, 0x68, 0x69, 0x01, 0xd1, 0x8d, 0xcb, 0x71, 0xb5, 0x98, 0x81, 0xac, 0x30, 0x73, 0x5a,
+    0xb5, 0x00, 0x4e, 0xba, 0xb1, 0xf2, 0x3d, 0x2a, 0x99, 0x9e, 0x28, 0xb2, 0x78, 0x1f, 0x70, 0xcc, 0xd5, 0xc0, 0x67,
+    0xec, 0x32, 0x85, 0xc4, 0x12, 0x58, 0x15, 0x96, 0x28, 0x2a, 0x9b, 0xb6, 0x4d, 0xd3, 0x38, 0x54, 0xfb, 0xc4, 0x71,
+    0x1c, 0x02, 0xe7, 0xc6, 0xb1, 0xc9, 0xc3, 0xc9, 0x37, 0xbb, 0x3c, 0x3e, 0x38, 0x08, 0x74, 0xa7, 0x2f, 0x65, 0xc0,
+    0x6d, 0x7d, 0x15, 0xb9, 0xfb, 0x56, 0xf3, 0x8a, 0x04, 0x29, 0xf8, 0x1b, 0x8d, 0x74, 0x58, 0x40, 0x18, 0x3a, 0x88,
+    0xeb, 0x18, 0xb4, 0xc0, 0x2b, 0x5d, 0xaf, 0xbe, 0xfc, 0x46, 0xa3, 0x8c, 0xd2, 0xd6, 0xb1, 0x75, 0x83, 0xb3, 0xe2,
+    0x2a, 0x28, 0x53, 0x7f, 0x5a, 0x1b, 0xf9, 0x52, 0x16, 0x04, 0xc4, 0x5c, 0x9a, 0x65, 0x76, 0x31, 0xce, 0x91, 0x60,
+    0xd0, 0xee, 0x4b, 0x93, 0xb5, 0x80, 0x55, 0x76, 0x95, 0x69, 0x64, 0xd9, 0x59, 0x07, 0x45, 0xb6, 0x11, 0x44, 0xa5,
+    0xa0, 0x51, 0xa3, 0x30, 0xe4, 0xfd, 0x7e, 0x33, 0xe7, 0x12, 0xe7, 0xc8, 0x38, 0xb9, 0x14, 0x14, 0x0a, 0x59, 0x9d,
+    0x12, 0x29, 0x2f, 0xc9, 0x7c, 0x37, 0xc9, 0x9f, 0x38, 0x24, 0xff, 0x8c, 0x50, 0x87, 0xfc, 0xb5, 0x8b, 0x23, 0xe4,
+    0xc6, 0xb9, 0x90, 0xdb, 0xaa, 0xd3, 0x39, 0x01, 0x27, 0x5a, 0x1d, 0xa3, 0xb5, 0xb0, 0xe2, 0x0e, 0x86, 0xe2, 0x9e,
+    0x10, 0xe5, 0x86, 0xc4, 0x36, 0x06, 0x1c, 0x54, 0x41, 0x35, 0x98, 0x7a, 0x9b, 0x4f, 0xcf, 0xe5, 0x80, 0x27, 0x1f,
+    0xee, 0x8e, 0x87, 0x9e, 0xce, 0x37, 0x4f, 0xae, 0x93, 0xfb, 0x09, 0xab, 0x76, 0x0e, 0x6e, 0x3d, 0x13, 0x14, 0xe6,
+    0x2f, 0xe3, 0xd8, 0x75, 0xe6, 0xb3, 0x76, 0x08, 0xad, 0xfc, 0x03, 0x68, 0xdb, 0x6d, 0xd5, 0x82, 0x3a, 0xc3, 0x02,
+    0x3f, 0xd2, 0x19, 0xa8, 0xb1, 0xd8, 0xc1, 0x3e, 0x4e, 0x54, 0x03, 0x9a, 0x25, 0xdb, 0xab, 0x9f, 0x15, 0x86, 0x4c,
+    0x34, 0x68, 0x68, 0x09, 0xfc, 0x4f, 0x93, 0x3c, 0xd0, 0x8d, 0x92, 0x0b, 0x80, 0xa0, 0xb9, 0xc2, 0x53, 0x85, 0x30,
+    0xdf, 0xaf, 0xbc, 0xef, 0x2f, 0xf7, 0x08, 0x99, 0x57, 0xde, 0xc7, 0x77, 0x55, 0xea, 0x15, 0x90, 0x05, 0x8a, 0xc0,
+    0x7c, 0x2c, 0x0b, 0x74, 0xf8, 0xf2, 0xcc, 0x36, 0x57, 0x26, 0x64, 0x58, 0x69, 0xdc, 0x4e, 0x68, 0x53, 0xb9, 0xe5,
+    0x74, 0xbd, 0x45, 0xc3, 0x5a, 0xed, 0x3e, 0xd4, 0xbe, 0x97, 0x0a, 0x46, 0x78, 0x7e, 0xaf, 0x5a, 0xdb, 0x71, 0x8b,
+    0x8f, 0xeb, 0xf9, 0x2b, 0x6b, 0x9b, 0x12, 0xb2, 0x2c, 0xa7, 0x42, 0x3e, 0xa3, 0x63, 0x2e, 0x20, 0x66, 0x51, 0xe2,
+    0x04, 0x15, 0xfb, 0x8e, 0xdf, 0x4e, 0xad, 0xcf, 0x09, 0x14, 0xac, 0x2d, 0x50, 0xfd, 0xfa, 0xa8, 0x82, 0xd6, 0xe7,
+    0xeb, 0xbd, 0xe6, 0x07, 0x07, 0x1f, 0x2a, 0x34, 0x19, 0x28, 0x15, 0x14, 0x0e, 0xd3, 0xd2, 0x2a, 0x8d, 0x89, 0xe4,
+    0xee, 0x07, 0xa5, 0x13, 0xc0, 0x32, 0x0c, 0x97, 0xf7, 0xbc, 0x24, 0xb2, 0x98, 0xac, 0xb3, 0x78, 0xe3, 0x9c, 0x60,
+    0xae, 0xe1, 0x02, 0x1c, 0x1e, 0x4c, 0x6d, 0xed, 0x2d, 0xca, 0xab, 0x64, 0xd8, 0x12, 0x86, 0x53, 0x40, 0x56, 0xa0,
+    0xcc, 0x10, 0x87, 0x02, 0xb7, 0x9a, 0x25, 0xa7, 0xa0, 0x57, 0x4e, 0x71, 0x1e, 0x4e, 0x21, 0xfd, 0xb5, 0x76, 0x64,
+    0x11, 0xc2, 0x3a, 0x31, 0xc7, 0x49, 0x25, 0x38, 0x79, 0xb9, 0xcd, 0xa5, 0x6c, 0x89, 0x9a, 0x2a, 0xa9, 0xa3, 0x5a,
+    0xa0, 0xb2, 0x43, 0x78, 0x15, 0x30, 0xa3, 0xb8, 0xd9, 0xb8, 0x19, 0x30, 0xe0, 0x67, 0x32, 0xd0, 0xc1, 0x28, 0x90,
+    0x19, 0x3c, 0x5c, 0x04, 0xb5, 0xa9, 0xbb, 0x5c, 0x75, 0xc3, 0x06, 0x71, 0x53, 0x17, 0x4d, 0x5c, 0xc5, 0xf5, 0x4e,
+    0x2b, 0x5e, 0x3a, 0xd6, 0x19, 0xd4, 0xd2, 0x72, 0xc1, 0x2a, 0x91, 0xc4, 0x59, 0xfe, 0x58, 0x27, 0x45, 0x97, 0x8d,
+    0x30, 0x55, 0x60, 0xbc, 0x54, 0x7b, 0x40, 0x0b, 0xa0, 0xaf, 0xe5, 0x89, 0x74, 0x76, 0xd4, 0x3a, 0xb1, 0xd5, 0x9c,
+    0x8e, 0xd4, 0x7f, 0x07, 0xa9, 0x2e, 0xeb, 0x67, 0xfe, 0xa5, 0x92, 0x85, 0x0c, 0xe7, 0x35, 0xc6, 0x9e, 0x29, 0xc6,
+    0x8e, 0x40, 0x4f, 0xb3, 0x89, 0xdf, 0x7d, 0x93, 0xf1, 0xc2, 0x8c, 0x94, 0x33, 0x24, 0xf6, 0x75, 0x19, 0x2d, 0x77,
+    0x7e, 0xaf, 0xed, 0x46, 0xc4, 0x08, 0x64, 0x01, 0x61, 0xc3, 0xd9, 0x33, 0x84, 0xf3, 0x46, 0xa3, 0x9b, 0x1f, 0xd3,
+    0xca, 0x49, 0x52, 0xc1, 0xc8, 0x20, 0xa0, 0x0b, 0x04, 0x5f, 0x93, 0xa1, 0x10, 0xf2, 0xb7, 0x99, 0xd9, 0x39, 0xf8,
+    0xda, 0x4f, 0xde, 0x05, 0x2e, 0x57, 0x73, 0xdb, 0x96, 0x41, 0x53, 0x58, 0x4f, 0x50, 0x05, 0x5c, 0xbe, 0xbe, 0x3b,
+    0xc1, 0x03, 0xe0, 0xde, 0x6b, 0x63, 0x48, 0x45, 0x43, 0x5d, 0xa9, 0x59, 0x42, 0x79, 0xfa, 0xba, 0xa8, 0xca, 0x4a,
+    0x74, 0x27, 0xeb, 0xca, 0xca, 0x98, 0x95, 0x24, 0x2f, 0x8a, 0x9c, 0x56, 0xe1, 0xfd, 0xb5, 0xf4, 0x4b, 0x25, 0x5c,
+    0x36, 0xbd, 0xed, 0xa7, 0x73, 0x22, 0xb1, 0x43, 0xa8, 0x5f, 0xef, 0x8a, 0x7d, 0x54, 0x60, 0xc2, 0xb9, 0x36, 0x42,
+    0xf1, 0xe7, 0x6d, 0x42, 0x11, 0x67, 0xe6, 0xc8, 0x2b, 0x81, 0xd8, 0xbe, 0x87, 0x40, 0x34, 0x6e, 0x76, 0x2b, 0x13,
+    0x41, 0x1d, 0xa9, 0xc9, 0xc4, 0xfa, 0x96, 0x92, 0x0c, 0x33, 0xb3, 0x1b, 0xbd, 0xce, 0x6a, 0xc5, 0x06, 0x2d, 0x70,
+    0x23, 0xf9, 0x3e, 0xfc, 0x6c, 0xeb, 0x9f, 0x0e, 0x27, 0xd6, 0x6e, 0xe0, 0x80, 0x95, 0x26, 0x0b, 0x0a, 0x21, 0xc1,
+    0x39, 0x50, 0x49, 0x59, 0x8a, 0xa6, 0x0d, 0x05, 0x19, 0x02, 0x27, 0xac, 0x0c, 0x33, 0x01, 0xc4, 0x4a, 0x56, 0x18,
+    0x03, 0x32, 0xd8, 0x9a, 0xfb, 0x67, 0xcd, 0xcb, 0x4f, 0x6b, 0xa2, 0x35, 0xb9, 0xa2, 0xd5, 0x87, 0x5a, 0xbe, 0x81,
+    0x81, 0xc0, 0xe8, 0x87, 0x7b, 0xca, 0x04, 0xad, 0x44, 0x39, 0x72, 0xe5, 0x10, 0x6e, 0x81, 0x13, 0x6d, 0xef, 0x83,
+    0x8e, 0xf0, 0x6e, 0x91, 0x26, 0x98, 0x3b, 0x74, 0xfd, 0x92, 0xc8, 0x1a, 0x2b, 0x99, 0x12, 0x63, 0x29, 0xe1, 0x58,
+    0x91, 0xa9, 0x24, 0xd9, 0xa0, 0x35, 0x04, 0x05, 0xb4, 0x9b, 0x1e, 0x67, 0x95, 0x09, 0x9c, 0x36, 0x1a, 0x28, 0xb6,
+    0xb3, 0x4e, 0x07, 0xac, 0x91, 0x0e, 0x31, 0xc5, 0xa9, 0x36, 0x4c, 0xce, 0x0e, 0x0e, 0x82, 0xb8, 0x9a, 0x77, 0x90,
+    0x0e, 0x11, 0xe6, 0xab, 0x55, 0xa0, 0xc0, 0x8a, 0xd1, 0x6a, 0x15, 0xbb, 0x60, 0xa9, 0x6a, 0xe8, 0x36, 0xef, 0x4b,
+    0x32, 0x57, 0x02, 0x70, 0x0e, 0x10, 0x36, 0x48, 0x10, 0x1b, 0xf7, 0x5e, 0x0c, 0xee, 0xa8, 0x46, 0x36, 0x48, 0x1b,
+    0xed, 0xa1, 0xc3, 0xb8, 0x06, 0xe9, 0x90, 0xc4, 0x05, 0x3f, 0x38, 0xd8, 0xcb, 0x8d, 0x88, 0xfc, 0x09, 0x44, 0xd9,
+    0x4f, 0x4a, 0xb2, 0xe8, 0x01, 0xdd, 0xdd, 0x58, 0x77, 0x06, 0x94, 0x14, 0x65, 0xb6, 0xd5, 0xb6, 0xab, 0x65, 0x41,
+    0x94, 0x8d, 0xb0, 0x09, 0x06, 0xf7, 0xc1, 0xb2, 0x2f, 0xc9, 0xfc, 0x95, 0x2c, 0x73, 0xac, 0x7f, 0xde, 0x9a, 0x59,
+    0x1d, 0x86, 0x61, 0x2c, 0x26, 0x2a, 0x96, 0x61, 0xc3, 0xb0, 0x8a, 0xf8, 0x8f, 0x0c, 0x98, 0xce, 0xc4, 0x83, 0x72,
+    0xae, 0x21, 0xd1, 0xe0, 0x5b, 0xd5, 0xc6, 0xde, 0x25, 0xf9, 0x69, 0xab, 0x97, 0x41, 0x43, 0xf2, 0xfc, 0xb7, 0x42,
+    0xf2, 0xd0, 0x40, 0xa2, 0xc9, 0x63, 0x0d, 0x67, 0x3b, 0x70, 0xf1, 0x93, 0x5c, 0xc3, 0xd9, 0x6e, 0xdc, 0x5a, 0x4c,
+    0xfd, 0xb2, 0x0b, 0x3e, 0x87, 0x37, 0x68, 0x40, 0xab, 0x02, 0x07, 0xca, 0x47, 0xeb, 0xba, 0x97, 0x66, 0xa5, 0x20,
+    0x4c, 0x25, 0x09, 0x58, 0xfd, 0x00, 0x54, 0xda, 0xa8, 0x63, 0xf8, 0xb2, 0x68, 0x8e, 0x1c, 0x97, 0x40, 0x3d, 0x75,
+    0x05, 0xc8, 0xc9, 0x78, 0xdb, 0xe7, 0x07, 0x07, 0x60, 0x1b, 0x80, 0x12, 0x17, 0x8e, 0xe2, 0xb9, 0x5c, 0x08, 0x50,
+    0xa5, 0x72, 0xfb, 0x1b, 0x8a, 0xe1, 0x16, 0x88, 0x2a, 0x83, 0x1f, 0x50, 0x30, 0x8f, 0xf3, 0x9c, 0x5d, 0xe9, 0x32,
+    0xf3, 0x1b, 0x73, 0x62, 0x49, 0x39, 0xd7, 0x3a, 0x61, 0x86, 0xba, 0x99, 0xa1, 0xd3, 0x3a, 0xda, 0x5e, 0x5c, 0xd1,
+    0x4c, 0xbe, 0x62, 0xb9, 0xa4, 0x19, 0x2c, 0xbf, 0xa2, 0x38, 0x58, 0x51, 0x8e, 0xe0, 0xc0, 0xd6, 0x7a, 0xc5, 0x49,
+    0x72, 0x67, 0x17, 0x59, 0xd7, 0x81, 0xa6, 0x71, 0x96, 0xa4, 0x7a, 0x12, 0x37, 0x9f, 0xd1, 0xe6, 0x70, 0x96, 0x2d,
+    0xdd, 0x7c, 0x9a, 0x4a, 0xd9, 0x50, 0xdc, 0x3d, 0x60, 0xc4, 0x4a, 0x02, 0x2b, 0x3d, 0xef, 0xd4, 0x5a, 0x20, 0xe2,
+    0xbd, 0x63, 0x13, 0xdc, 0x95, 0x60, 0xe9, 0x70, 0xd4, 0xb0, 0x0e, 0xa7, 0xa5, 0x9b, 0x2f, 0xb7, 0x5e, 0x69, 0xdb,
+    0x26, 0x1c, 0x14, 0x9d, 0x3c, 0xde, 0x6d, 0x59, 0xbd, 0xb6, 0x92, 0xc3, 0x4a, 0x0b, 0x76, 0x5f, 0xc6, 0x8c, 0x96,
+    0x96, 0xbc, 0x90, 0x3d, 0x8a, 0xfb, 0x92, 0x3c, 0x87, 0x3b, 0x43, 0x2f, 0xe5, 0x2c, 0x5d, 0xbb, 0x1a, 0xd3, 0xdd,
+    0x2f, 0xb5, 0xff, 0x7d, 0x19, 0xbc, 0xc4, 0xef, 0x21, 0xb0, 0xfb, 0x55, 0xd5, 0x7c, 0x33, 0xa0, 0xfb, 0x55, 0x85,
+    0xa0, 0xaf, 0xa2, 0x8d, 0x76, 0x4e, 0x20, 0xb7, 0x13, 0x3e, 0x0d, 0x5b, 0xbe, 0xd5, 0x96, 0x7e, 0xd6, 0x61, 0x24,
+    0x9d, 0x69, 0xa9, 0xce, 0x03, 0xae, 0xf2, 0xd4, 0x20, 0x5f, 0xae, 0x6e, 0x21, 0x51, 0x93, 0x61, 0xa8, 0x75, 0xf8,
+    0x5d, 0xdb, 0x63, 0x64, 0x4c, 0xa6, 0xed, 0x8c, 0xaf, 0x63, 0x21, 0xf7, 0xe1, 0x94, 0xf1, 0x8d, 0x7b, 0x78, 0x53,
+    0x02, 0x1e, 0xb4, 0xfb, 0x4d, 0xe1, 0x18, 0xdb, 0xb9, 0xbe, 0x07, 0xe4, 0x8e, 0x4f, 0xb8, 0xd5, 0xdd, 0xea, 0x56,
+    0xc6, 0xd7, 0x60, 0xff, 0x23, 0x3c, 0xb5, 0x97, 0xe3, 0xa8, 0xe1, 0xc0, 0x34, 0x5a, 0x16, 0xa5, 0x53, 0x80, 0x6b,
+    0xe5, 0x4d, 0x20, 0xcc, 0x0b, 0x15, 0xe0, 0xfe, 0x01, 0x7f, 0x63, 0x58, 0xe2, 0xb8, 0xe4, 0x38, 0x27, 0xf7, 0xe5,
+    0x88, 0x1a, 0xfc, 0x32, 0x7e, 0x0f, 0x74, 0xac, 0x28, 0xb4, 0xb0, 0x54, 0xf4, 0x9c, 0x9b, 0x85, 0xec, 0x4c, 0x4b,
+    0xc5, 0xb4, 0x4c, 0xa9, 0x51, 0xd3, 0x6c, 0xc9, 0xe3, 0xb4, 0x56, 0xb6, 0x2c, 0x4f, 0x55, 0x6d, 0x5e, 0xb4, 0x03,
+    0x8b, 0x55, 0x68, 0x71, 0xb5, 0x0a, 0xea, 0xa8, 0x26, 0xcc, 0x89, 0x64, 0x20, 0xcc, 0x9c, 0x8c, 0x8a, 0x9a, 0x66,
+    0xad, 0xfb, 0x04, 0x68, 0x3d, 0xa1, 0xc8, 0xea, 0xe6, 0x35, 0x38, 0x5c, 0x17, 0x82, 0xee, 0xee, 0xfa, 0x14, 0xb0,
+    0x5e, 0x5d, 0x39, 0x91, 0x83, 0xa1, 0x9f, 0xcb, 0x54, 0xd9, 0x2a, 0xa7, 0x75, 0x0b, 0x7e, 0xd1, 0x1d, 0xc9, 0xb2,
+    0x06, 0x75, 0x9b, 0xf5, 0x4e, 0xb2, 0xd1, 0x73, 0xbe, 0x2b, 0xd9, 0xa8, 0xa6, 0xed, 0xee, 0xb5, 0xd0, 0xdd, 0x69,
+    0xa9, 0x7a, 0xae, 0xed, 0x4d, 0x7e, 0xc3, 0x74, 0x6d, 0xa0, 0x4d, 0x8d, 0x66, 0xcb, 0x55, 0xce, 0x8a, 0x62, 0x5c,
+    0x5e, 0x26, 0x50, 0xb9, 0x3b, 0x63, 0x4d, 0xff, 0xc6, 0x6a, 0x54, 0xd7, 0x71, 0x83, 0x1f, 0xc8, 0x24, 0xe5, 0x97,
+    0x71, 0xfa, 0x1e, 0xe6, 0xab, 0x2a, 0x5f, 0xde, 0x26, 0x22, 0x96, 0xd4, 0x70, 0x97, 0x0a, 0x86, 0x1f, 0x1c, 0x18,
+    0x7e, 0xd0, 0x7c, 0xba, 0xea, 0x8f, 0x97, 0xaf, 0xca, 0x01, 0xa2, 0x71, 0x61, 0x59, 0xc6, 0xb9, 0xdc, 0x3e, 0xc7,
+    0x3a, 0x0b, 0x3b, 0x2f, 0x59, 0xd8, 0xb9, 0x0c, 0xd6, 0x87, 0x0a, 0x82, 0x6f, 0xb6, 0x8f, 0xb2, 0xc9, 0xd9, 0xbe,
+    0xa9, 0x0e, 0xfe, 0x37, 0xd1, 0x9d, 0x7d, 0x1c, 0x2e, 0x77, 0x14, 0x1e, 0xa9, 0x74, 0x15, 0x0d, 0xf2, 0x3b, 0x48,
+    0x3b, 0x90, 0xa4, 0xe7, 0xdc, 0x39, 0xa8, 0xe4, 0x94, 0x4d, 0x04, 0x0a, 0x46, 0x8b, 0x5c, 0xf2, 0x99, 0x19, 0x33,
+    0x37, 0xd7, 0x8c, 0x54, 0x25, 0xb8, 0xa2, 0x55, 0xb4, 0x3d, 0xaa, 0x5f, 0xe4, 0x5a, 0x7e, 0x64, 0x59, 0x12, 0xe5,
+    0xd8, 0x48, 0x91, 0x3c, 0xca, 0x0a, 0x62, 0x93, 0x8d, 0x37, 0xeb, 0xf0, 0x98, 0x65, 0x2c, 0x9f, 0x52, 0x11, 0x70,
+    0xb4, 0xdc, 0x35, 0x19, 0x87, 0x80, 0x8c, 0x9e, 0x0c, 0x7f, 0x5b, 0x5d, 0xf8, 0x0b, 0x61, 0x34, 0xf0, 0x03, 0xcd,
+    0xa8, 0x9c, 0xf2, 0x04, 0x12, 0x53, 0xc2, 0xa4, 0xbc, 0xd1, 0x74, 0x70, 0xb0, 0x17, 0xf8, 0xca, 0x2d, 0x01, 0x57,
+    0xbf, 0xdd, 0x1a, 0xd4, 0x5f, 0xc2, 0xf5, 0x9c, 0x6a, 0x6a, 0x8a, 0x96, 0x74, 0xfd, 0x26, 0x8b, 0x0c, 0x3f, 0xd2,
+    0x5b, 0x2c, 0x50, 0x51, 0x44, 0x1a, 0x6a, 0x7f, 0xcc, 0x68, 0x9a, 0xf8, 0xf8, 0x23, 0xbd, 0x8d, 0xca, 0xdb, 0xe2,
+    0xea, 0x72, 0xb3, 0xda, 0x40, 0x9f, 0x5f, 0x67, 0x3e, 0xae, 0x26, 0x89, 0x96, 0x05, 0xe6, 0x82, 0x4d, 0x80, 0x38,
+    0xff, 0x46, 0x6f, 0x23, 0x3d, 0x1e, 0x73, 0x2e, 0xeb, 0xa1, 0xa5, 0x45, 0x7d, 0xe8, 0x14, 0xbb, 0xdb, 0x60, 0x0c,
+    0x8a, 0x81, 0xea, 0x3b, 0x24, 0xb5, 0x76, 0x95, 0x79, 0x88, 0x50, 0x71, 0xdf, 0xa5, 0xe0, 0x2f, 0x5c, 0xd1, 0x26,
+    0x6b, 0xa9, 0xaf, 0x6b, 0x9d, 0x28, 0x74, 0xa8, 0x72, 0x3d, 0xce, 0x03, 0x61, 0x4f, 0x9d, 0xb9, 0x83, 0xe0, 0x38,
+    0xc2, 0xbe, 0x90, 0x66, 0xd0, 0xe8, 0x5b, 0x9d, 0x12, 0x52, 0x45, 0x92, 0x5e, 0x57, 0xfd, 0xbc, 0xf3, 0x00, 0xf0,
+    0x0e, 0x29, 0x2d, 0xb1, 0xba, 0x8e, 0x59, 0xd8, 0x74, 0xd1, 0xef, 0x24, 0x09, 0x96, 0x76, 0x09, 0x91, 0x70, 0xb1,
+    0x28, 0x0b, 0xa0, 0x42, 0x43, 0x5f, 0x3a, 0x03, 0x90, 0x8d, 0x03, 0xb6, 0x21, 0x35, 0x33, 0x25, 0x35, 0x43, 0x07,
+    0xe3, 0x3b, 0xa4, 0x24, 0x55, 0xc8, 0x50, 0x4a, 0xa4, 0x12, 0x7a, 0x66, 0x73, 0x0d, 0x09, 0xb9, 0x1b, 0x5a, 0x5e,
+    0x9f, 0xd3, 0x7b, 0x9e, 0xd5, 0xc0, 0x0a, 0xd4, 0x38, 0xa8, 0x88, 0x60, 0x49, 0x54, 0x37, 0x28, 0xac, 0x3b, 0x47,
+    0xd8, 0xfc, 0xd6, 0x80, 0x87, 0x76, 0x59, 0xc4, 0xa2, 0x24, 0x98, 0xa2, 0xa5, 0x08, 0xa6, 0x38, 0x83, 0x7c, 0x44,
+    0x5e, 0x94, 0xf0, 0x53, 0x77, 0x37, 0x6a, 0xd9, 0xca, 0xdb, 0xaf, 0xf8, 0x81, 0x32, 0x2f, 0x21, 0x47, 0x13, 0x0b,
+    0xcb, 0x53, 0x44, 0xa0, 0xee, 0xda, 0x39, 0xdb, 0xf6, 0x95, 0x49, 0xd1, 0x31, 0x80, 0x7d, 0x27, 0x83, 0xa5, 0xb3,
+    0x0a, 0xf7, 0x2e, 0xb7, 0xb9, 0xf2, 0x67, 0x82, 0x7d, 0x55, 0x12, 0x69, 0x90, 0x93, 0x35, 0x89, 0x73, 0x77, 0xae,
+    0xe5, 0xcf, 0x0b, 0x2a, 0x6e, 0xcf, 0x28, 0xe4, 0x3a, 0x73, 0xb8, 0xeb, 0x5b, 0x6d, 0x43, 0x95, 0xa7, 0xde, 0xcf,
+    0x94, 0xb2, 0x52, 0xd4, 0x2f, 0x01, 0xae, 0x5f, 0x11, 0x2c, 0x54, 0xb4, 0xd1, 0x71, 0xc4, 0xe8, 0xd3, 0x42, 0x77,
+    0x5e, 0x9e, 0xa4, 0x5d, 0x06, 0xfe, 0xb5, 0x0a, 0xd3, 0x26, 0x58, 0x80, 0xb9, 0x7b, 0x21, 0x75, 0x90, 0x0f, 0xd7,
+    0xbd, 0x32, 0x50, 0x04, 0xe1, 0xbb, 0x6c, 0xf7, 0x52, 0xb7, 0x65, 0xcd, 0xee, 0x5e, 0x6a, 0x2d, 0xe8, 0xa7, 0x52,
+    0x7e, 0xb0, 0x99, 0xa7, 0xbc, 0xbc, 0xcc, 0x8a, 0x02, 0x15, 0x00, 0xde, 0xf7, 0xdd, 0x20, 0xf8, 0xde, 0x24, 0x0d,
+    0x86, 0x10, 0x8b, 0x3d, 0x4b, 0xb9, 0x65, 0xe2, 0xd5, 0xfc, 0xdf, 0x6f, 0xcc, 0xff, 0xbd, 0x73, 0xe5, 0x14, 0x4c,
+    0xa3, 0x49, 0x46, 0x13, 0xcb, 0x3a, 0x91, 0x26, 0x40, 0xa5, 0xb7, 0xe5, 0x92, 0x7c, 0xbc, 0x88, 0x40, 0xe3, 0x5a,
+    0x8e, 0x79, 0x26, 0x9b, 0xe3, 0x78, 0xc6, 0xd2, 0xdb, 0x68, 0xc1, 0x9a, 0x33, 0x9e, 0xf1, 0x7c, 0x1e, 0x8f, 0x28,
+    0xce, 0x6f, 0x73, 0x49, 0x67, 0xcd, 0x05, 0xc3, 0x2f, 0x69, 0x7a, 0x45, 0x25, 0x1b, 0xc5, 0xd8, 0x3f, 0x11, 0x2c,
+    0x4e, 0xbd, 0x37, 0xb1, 0x10, 0xfc, 0xda, 0xc7, 0xef, 0xf8, 0x25, 0x97, 0x1c, 0xbf, 0xbd, 0xb9, 0x9d, 0xd0, 0x0c,
+    0x7f, 0xb8, 0x5c, 0x64, 0x72, 0x81, 0xf3, 0x38, 0xcb, 0x9b, 0x39, 0x15, 0x6c, 0xdc, 0x1d, 0xf1, 0x94, 0x8b, 0x26,
+    0xa4, 0x6c, 0xcf, 0x68, 0x94, 0xb2, 0xc9, 0x54, 0x7a, 0x49, 0x2c, 0x3e, 0x76, 0x9b, 0xcd, 0xb9, 0x60, 0xb3, 0x58,
+    0xdc, 0x36, 0x55, 0x8b, 0xe8, 0xb3, 0xd6, 0x51, 0xfc, 0xf9, 0xf8, 0x61, 0x57, 0x8a, 0x38, 0xcb, 0x19, 0x6c, 0x53,
+    0x14, 0xa7, 0xa9, 0x77, 0xf4, 0xa8, 0x35, 0xcb, 0xf7, 0x74, 0x20, 0x2f, 0xce, 0x64, 0x71, 0x81, 0x3f, 0x02, 0xdc,
+    0xe1, 0xa5, 0xcc, 0xf0, 0xe5, 0x42, 0x4a, 0x9e, 0x2d, 0x47, 0x0b, 0x91, 0x73, 0x11, 0xcd, 0x39, 0xcb, 0x24, 0x15,
+    0xdd, 0x4b, 0x2e, 0x12, 0x2a, 0x9a, 0x22, 0x4e, 0xd8, 0x22, 0x8f, 0x1e, 0xce, 0x6f, 0xba, 0xa0, 0x59, 0x4c, 0x04,
+    0x5f, 0x64, 0x89, 0x99, 0x8b, 0x65, 0x53, 0x2a, 0x98, 0x74, 0x2b, 0xd4, 0x2b, 0x4c, 0xa2, 0x94, 0x65, 0x34, 0x16,
+    0xcd, 0x09, 0x74, 0x06, 0xb3, 0xa8, 0x95, 0xd0, 0x09, 0x16, 0x93, 0xcb, 0x38, 0x68, 0x77, 0x9e, 0x60, 0xfb, 0x37,
+    0x7c, 0x84, 0xbc, 0xd6, 0xf6, 0xe2, 0x76, 0xab, 0xf5, 0x27, 0xd4, 0x5d, 0x9b, 0x45, 0x01, 0x14, 0xb5, 0xe7, 0x37,
+    0x5e, 0xce, 0x21, 0xa7, 0x6d, 0x5b, 0xcf, 0xee, 0x3c, 0x4e, 0x20, 0x21, 0x38, 0xea, 0xcc, 0x6f, 0x0a, 0x58, 0x5d,
+    0xa4, 0x93, 0x4c, 0xcd, 0x22, 0xcd, 0xd3, 0xf2, 0xb7, 0x42, 0xfc, 0x74, 0x3b, 0xc4, 0x1d, 0x0b, 0x71, 0x85, 0xf5,
+    0x66, 0xb2, 0x10, 0x2a, 0xb6, 0x1a, 0xb5, 0x73, 0x0d, 0xc8, 0x94, 0x5f, 0x51, 0x61, 0xe1, 0x50, 0x0f, 0xbf, 0x19,
+    0x8c, 0xce, 0x76, 0x30, 0x9e, 0x7e, 0x0a, 0x0c, 0x91, 0x25, 0xcb, 0xfa, 0xbe, 0xb6, 0x05, 0x9d, 0x75, 0xa7, 0x14,
+    0xe8, 0x29, 0xea, 0xc0, 0xef, 0x6b, 0x96, 0xc8, 0xa9, 0xfe, 0xa9, 0xc8, 0xf9, 0x5a, 0xd7, 0x3d, 0x6a, 0xb5, 0xf4,
+    0x73, 0xce, 0x7e, 0xa1, 0x51, 0x3b, 0x84, 0x06, 0xc5, 0x05, 0xfe, 0x5b, 0x79, 0x99, 0xb7, 0xce, 0x3d, 0xf1, 0x0f,
+    0xee, 0x2d, 0x5f, 0x27, 0x49, 0xb1, 0xba, 0x11, 0x8d, 0x85, 0x95, 0x95, 0x5a, 0xf8, 0x80, 0xdb, 0x4e, 0x9d, 0x27,
+    0xc2, 0x7a, 0xe5, 0x2d, 0x4e, 0xd6, 0xff, 0x41, 0xe7, 0x5d, 0x44, 0x10, 0xe9, 0x70, 0x92, 0x0d, 0x79, 0x37, 0xeb,
+    0x91, 0x56, 0x37, 0x6b, 0x36, 0x51, 0xc0, 0x89, 0x18, 0x64, 0x26, 0x3d, 0x2f, 0x60, 0x7d, 0xae, 0x8c, 0xed, 0x1c,
+    0x45, 0x1c, 0xae, 0x9a, 0xae, 0x56, 0x55, 0x18, 0x80, 0xa9, 0xeb, 0x1a, 0x7f, 0x93, 0xa6, 0x01, 0xce, 0x1d, 0x4e,
+    0x9e, 0xd9, 0x17, 0xbb, 0x08, 0xcb, 0x2b, 0x52, 0x3e, 0x52, 0x98, 0x0b, 0xe7, 0xb1, 0x9c, 0x82, 0x97, 0xa2, 0x14,
+    0x3f, 0x55, 0x12, 0x93, 0x7f, 0xe8, 0xa3, 0xbe, 0x28, 0x33, 0xdc, 0x20, 0x93, 0x4f, 0x14, 0x30, 0xca, 0x37, 0x92,
+    0xc0, 0x88, 0xf8, 0x17, 0xa2, 0x6d, 0x3a, 0x6b, 0xd1, 0x8d, 0xef, 0x6b, 0xd1, 0xd1, 0x4c, 0x32, 0x95, 0xbb, 0x6d,
+    0x23, 0x0e, 0xd3, 0x38, 0x3f, 0x1f, 0xe9, 0xbb, 0x92, 0x79, 0x75, 0x33, 0x20, 0x56, 0xd0, 0x6b, 0x23, 0x8d, 0x0a,
+    0x65, 0x8f, 0x7e, 0x2f, 0x77, 0xda, 0x27, 0xe2, 0x2e, 0xfb, 0xa4, 0x5c, 0x78, 0xce, 0x17, 0x62, 0x04, 0xe1, 0x48,
+    0x23, 0xf5, 0x36, 0x1d, 0x37, 0xbe, 0x52, 0x31, 0x7c, 0x2c, 0x9d, 0x4c, 0x50, 0x89, 0x99, 0xfb, 0x52, 0x09, 0xaa,
+    0x42, 0x5e, 0xfa, 0xbe, 0x86, 0x11, 0x71, 0x76, 0x49, 0x20, 0xb3, 0x13, 0x95, 0xd4, 0x18, 0x64, 0xa4, 0x97, 0x85,
+    0x8b, 0x8c, 0xfd, 0xbc, 0xa0, 0xe7, 0x0c, 0x74, 0x4d, 0x16, 0xb2, 0x44, 0xc5, 0x9a, 0x40, 0xf6, 0x35, 0xdb, 0x10,
+    0xbc, 0x60, 0x89, 0xde, 0x98, 0x4c, 0x55, 0x9a, 0xdc, 0x26, 0xbf, 0xe9, 0x83, 0xbf, 0x18, 0xb4, 0x03, 0x86, 0x13,
+    0x3e, 0x8b, 0x59, 0x16, 0x29, 0x97, 0x6f, 0x39, 0x58, 0x04, 0xad, 0x31, 0x4b, 0xa2, 0xcc, 0x6c, 0x4f, 0x1b, 0x85,
+    0x3f, 0x71, 0x96, 0xa9, 0xae, 0x45, 0x97, 0x2b, 0x84, 0x6a, 0xf4, 0x11, 0x8b, 0xe0, 0x13, 0x2d, 0xd7, 0x38, 0xc2,
+    0x6e, 0x75, 0x79, 0xed, 0xbc, 0xb6, 0x03, 0xad, 0xb5, 0x8d, 0xd2, 0x46, 0x00, 0x5f, 0x2f, 0xcd, 0xb9, 0x90, 0x41,
+    0x30, 0xc5, 0x29, 0x22, 0xbd, 0xa9, 0x72, 0x76, 0x1d, 0xa7, 0xea, 0xbf, 0x7e, 0xb3, 0x1d, 0xb5, 0x4b, 0xf3, 0xbd,
+    0x76, 0x1b, 0x58, 0x27, 0x47, 0x99, 0x1b, 0xa5, 0x6a, 0x19, 0xe5, 0x6f, 0xbd, 0xd4, 0xea, 0xb9, 0x5c, 0x2e, 0x36,
+    0xc7, 0x4d, 0x8b, 0xaa, 0xa0, 0x06, 0x84, 0x0a, 0x16, 0xed, 0x98, 0x0a, 0x15, 0xd5, 0xba, 0x4b, 0x55, 0xf2, 0x42,
+    0x8b, 0xe8, 0xf3, 0xfd, 0xa5, 0x30, 0x33, 0x16, 0x17, 0xcc, 0x3a, 0x99, 0xea, 0x24, 0x57, 0x18, 0x8c, 0x38, 0x7a,
+    0xe8, 0xb6, 0x66, 0x1a, 0x96, 0x5b, 0x22, 0xb6, 0xd2, 0x6d, 0xa8, 0x1f, 0xa9, 0x20, 0x55, 0xb8, 0x6b, 0x63, 0x00,
+    0xc8, 0xd5, 0xdb, 0x06, 0x18, 0x98, 0xad, 0xb9, 0xb4, 0x4b, 0x00, 0x6d, 0x6c, 0x4c, 0xe1, 0x22, 0xcd, 0xc5, 0xfe,
+    0xf2, 0x1b, 0x59, 0x1c, 0x3a, 0x4d, 0xd5, 0x6f, 0x96, 0xc0, 0xff, 0x20, 0x01, 0x97, 0x5a, 0x29, 0x8d, 0xfc, 0xaf,
+    0xdf, 0x9e, 0xbd, 0xf7, 0xf1, 0x25, 0x4f, 0x6e, 0x23, 0x5f, 0x8a, 0x05, 0xf5, 0x0b, 0x14, 0xca, 0x29, 0xcd, 0xca,
+    0x97, 0xf1, 0xf0, 0x94, 0x86, 0x29, 0x9f, 0xe8, 0x4b, 0x99, 0xeb, 0x46, 0xf2, 0xe8, 0xe2, 0x58, 0xbd, 0x64, 0xaa,
+    0x77, 0x2c, 0xf5, 0xeb, 0xbd, 0xa4, 0x80, 0x9f, 0x3d, 0x08, 0xa1, 0x1c, 0x1f, 0xca, 0xa9, 0x7a, 0x38, 0x83, 0x03,
+    0xa3, 0x9e, 0xf6, 0x97, 0x1b, 0xc4, 0xd4, 0x87, 0x21, 0xa6, 0x3d, 0xbd, 0x84, 0x5c, 0xb5, 0xba, 0x88, 0x46, 0x17,
+    0x17, 0xc5, 0xf1, 0x21, 0x8c, 0x75, 0x68, 0xc7, 0x05, 0x08, 0x6d, 0xff, 0x92, 0xc0, 0xe0, 0x65, 0x43, 0x82, 0xf4,
+    0x60, 0x08, 0x98, 0x37, 0xe9, 0xc1, 0x22, 0x81, 0xc0, 0xa0, 0x77, 0x52, 0x96, 0xa8, 0x13, 0xab, 0x8b, 0x76, 0x41,
+    0xa0, 0x1b, 0x56, 0x74, 0xaf, 0xbd, 0xa9, 0xd5, 0xfe, 0x5a, 0x90, 0x12, 0x17, 0xba, 0x0b, 0x04, 0xff, 0x2b, 0xc8,
+    0x8e, 0x0f, 0x35, 0x1e, 0x2e, 0xdc, 0x57, 0x9b, 0xe8, 0xd7, 0x0e, 0x94, 0xd8, 0x1a, 0xe4, 0x12, 0x7f, 0x94, 0xf8,
+    0xe3, 0x85, 0x6a, 0x6a, 0x85, 0x11, 0x68, 0x49, 0x20, 0xb4, 0x5b, 0x56, 0xeb, 0x18, 0xf1, 0x34, 0x8d, 0xe7, 0x39,
+    0x8d, 0xec, 0x0f, 0x23, 0x97, 0x40, 0xbc, 0x6d, 0x2a, 0x02, 0x26, 0xbd, 0xe6, 0x14, 0xd4, 0x85, 0x4d, 0x2d, 0xe5,
+    0x2a, 0x16, 0x41, 0xb3, 0x39, 0x6a, 0x5e, 0x4e, 0x50, 0x21, 0xa7, 0x4b, 0x57, 0xaa, 0x3d, 0x6e, 0xb5, 0xba, 0x90,
+    0x0b, 0xd9, 0x8c, 0x53, 0x36, 0xc9, 0xa2, 0x94, 0x8e, 0x65, 0x21, 0xe1, 0x96, 0xda, 0xd2, 0xaa, 0x11, 0x61, 0xe7,
+    0x91, 0xa0, 0x33, 0x2f, 0x84, 0x7f, 0xef, 0x9e, 0xb8, 0x90, 0x49, 0x94, 0xc9, 0x69, 0x53, 0x65, 0xdd, 0xc2, 0x9d,
+    0x01, 0x39, 0xad, 0x3d, 0x2f, 0x9d, 0x89, 0x46, 0x14, 0x54, 0xac, 0x42, 0x0a, 0x4f, 0x4e, 0xb1, 0x14, 0x6e, 0xbb,
+    0x0c, 0x2d, 0x37, 0x56, 0xb0, 0x29, 0xe9, 0x8f, 0x50, 0x91, 0x2b, 0xc5, 0x78, 0xb3, 0xb1, 0x55, 0x97, 0xea, 0x4f,
+    0x1b, 0xe8, 0x73, 0x14, 0xbb, 0x42, 0x3b, 0x96, 0x97, 0xba, 0xc7, 0x7d, 0x90, 0x59, 0x53, 0x39, 0xb1, 0xdb, 0x03,
+    0x15, 0x2c, 0x9b, 0x2f, 0xe4, 0x40, 0x39, 0xb5, 0x05, 0x5c, 0x90, 0x18, 0x62, 0xa7, 0x04, 0x70, 0x30, 0x5c, 0x6a,
+    0x60, 0x46, 0x71, 0x3a, 0x0a, 0x00, 0x22, 0xaf, 0xe9, 0x3d, 0x15, 0x74, 0x86, 0xba, 0x33, 0x96, 0x35, 0x75, 0xdd,
+    0x23, 0x47, 0x2d, 0x09, 0x9f, 0xc0, 0x53, 0x11, 0xaa, 0xd1, 0xb0, 0xca, 0x5d, 0xdd, 0x82, 0xcb, 0x8b, 0x61, 0x51,
+    0x74, 0x85, 0x0c, 0x06, 0xaf, 0x03, 0x34, 0xc4, 0xbf, 0x38, 0x2f, 0x67, 0xf1, 0xed, 0x51, 0xf1, 0x71, 0x07, 0xed,
+    0x68, 0xe2, 0x9e, 0x05, 0xd5, 0xec, 0x17, 0x02, 0x0d, 0xdf, 0x05, 0x3e, 0xcd, 0xe7, 0x4d, 0xcd, 0xbb, 0x9a, 0x8a,
+    0x64, 0x7d, 0xe8, 0x8a, 0x8c, 0xa7, 0xf6, 0x7b, 0xb9, 0x54, 0x6c, 0xc9, 0x5c, 0xd2, 0xd0, 0xce, 0x84, 0x61, 0x79,
+    0xa9, 0xc7, 0x3c, 0xbb, 0xd7, 0x78, 0x50, 0x8d, 0x9f, 0x5c, 0x9c, 0xd4, 0x79, 0x1c, 0xf0, 0xa5, 0xf2, 0x05, 0x76,
+    0x71, 0x9a, 0xc2, 0x84, 0x17, 0x56, 0x7d, 0x71, 0x5f, 0xfa, 0x31, 0x90, 0xc3, 0x00, 0x15, 0xe6, 0x9c, 0x3e, 0x53,
+    0x2a, 0xa5, 0xf3, 0xd6, 0xbc, 0x3d, 0x69, 0x83, 0x45, 0x5a, 0xfa, 0x32, 0x08, 0x77, 0xd7, 0xf2, 0xa2, 0xbb, 0x15,
+    0xef, 0xd2, 0x0a, 0xa9, 0xa7, 0x16, 0x44, 0x7c, 0x91, 0x25, 0xbe, 0xf7, 0x97, 0x51, 0xca, 0x46, 0x1f, 0x89, 0xbf,
+    0xbf, 0x0c, 0xd0, 0xe6, 0xb5, 0x47, 0xc5, 0x15, 0x2c, 0xc3, 0x46, 0x75, 0x47, 0x7a, 0x16, 0x3a, 0xbc, 0x58, 0xbf,
+    0x15, 0xc7, 0xef, 0xed, 0x2f, 0x81, 0xf1, 0xe8, 0x79, 0x7a, 0x17, 0xc5, 0x79, 0xf5, 0xae, 0xab, 0x0a, 0x0a, 0x40,
+    0xb3, 0x2e, 0xf7, 0x14, 0x51, 0x11, 0xff, 0x93, 0x94, 0xe6, 0x7b, 0x9a, 0xa9, 0x01, 0x9c, 0xd2, 0xf0, 0x37, 0xdf,
+    0xfb, 0x4b, 0x59, 0x46, 0x4b, 0x8f, 0x86, 0x4a, 0xc9, 0x20, 0x3e, 0xcc, 0x05, 0x66, 0x6c, 0x98, 0x50, 0x19, 0xb3,
+    0x54, 0x77, 0xe9, 0x5a, 0x03, 0x7c, 0x6d, 0x45, 0xab, 0x55, 0x5e, 0x5f, 0x0b, 0xab, 0x63, 0x50, 0xad, 0xec, 0xf8,
+    0xb0, 0x82, 0x5b, 0xad, 0x4c, 0x9d, 0x49, 0x37, 0x34, 0x58, 0xad, 0x50, 0xd7, 0x79, 0x7f, 0x19, 0xa9, 0x6b, 0x43,
+    0x00, 0x20, 0x37, 0x00, 0x42, 0xd0, 0x5a, 0x5f, 0x8b, 0x09, 0x52, 0xc2, 0x43, 0x19, 0x8b, 0x09, 0x95, 0x6b, 0x88,
+    0x4d, 0x75, 0x8e, 0x6a, 0xd7, 0x06, 0xa8, 0x37, 0xa0, 0x8d, 0xeb, 0xd0, 0x5e, 0x00, 0xd2, 0xfb, 0xfb, 0x4b, 0x56,
+    0x90, 0xfd, 0x25, 0xcd, 0x46, 0x3c, 0xa1, 0x1f, 0xde, 0x7d, 0x09, 0x97, 0x1c, 0x79, 0x06, 0x86, 0xc5, 0x14, 0x81,
+    0xe0, 0x54, 0x9b, 0xa3, 0x45, 0x08, 0x57, 0x22, 0x44, 0x73, 0x02, 0x4f, 0xcd, 0xa5, 0x40, 0x2c, 0x7c, 0xaf, 0xaf,
+    0x21, 0xa7, 0x89, 0x86, 0x99, 0x64, 0xaa, 0x17, 0x2f, 0x8e, 0x0f, 0x75, 0x6b, 0x2d, 0x02, 0x74, 0x23, 0x40, 0x82,
+    0x3a, 0xa7, 0x15, 0x0e, 0x20, 0xaf, 0xd9, 0xc5, 0x43, 0xc2, 0xae, 0x4a, 0x62, 0x53, 0x17, 0xa8, 0x7a, 0xc7, 0x69,
+    0x7c, 0x49, 0xd3, 0xde, 0xfe, 0x32, 0x5b, 0xad, 0x5a, 0xc5, 0xf1, 0xa1, 0x7e, 0xf4, 0x8e, 0x15, 0xdf, 0xd0, 0x2f,
+    0xbc, 0x54, 0x5b, 0x0c, 0xb7, 0x12, 0x21, 0xdb, 0xd3, 0xa6, 0x39, 0x45, 0x66, 0x80, 0xc2, 0xf7, 0x54, 0x82, 0x85,
+    0x6a, 0x54, 0x2a, 0x44, 0x85, 0xef, 0xb1, 0x64, 0xb3, 0x2c, 0x97, 0x74, 0x0e, 0xa5, 0xd3, 0xd5, 0xaa, 0x5d, 0xf8,
+    0xde, 0x8c, 0x65, 0xf0, 0x94, 0xad, 0x56, 0xea, 0xc2, 0xdf, 0x8c, 0x65, 0x41, 0x0b, 0xc8, 0xd6, 0xf7, 0x66, 0xf1,
+    0x8d, 0x5a, 0xb0, 0xad, 0x89, 0x6f, 0x82, 0xb6, 0xa9, 0x0a, 0x4b, 0xfc, 0xe4, 0x40, 0x71, 0xd5, 0x8e, 0xa6, 0x66,
+    0x47, 0x13, 0xbc, 0xd0, 0x57, 0x99, 0x48, 0x90, 0x90, 0x74, 0xfb, 0x8e, 0x26, 0x76, 0x47, 0x17, 0x3b, 0x76, 0x74,
+    0x71, 0xc7, 0x8e, 0xc6, 0x66, 0xf7, 0xbc, 0x12, 0x77, 0x7c, 0xb5, 0x6a, 0xb7, 0x2a, 0xec, 0x1d, 0x1f, 0x26, 0xec,
+    0x0a, 0x76, 0x03, 0xd4, 0x3c, 0xc9, 0x66, 0x74, 0x3b, 0x51, 0xd6, 0x51, 0x4c, 0x7f, 0x15, 0x26, 0x2b, 0x2c, 0x64,
+    0x75, 0x2c, 0xb8, 0x74, 0x5d, 0xc6, 0xdc, 0xfe, 0x48, 0xca, 0x66, 0x80, 0x87, 0x1c, 0xf0, 0x30, 0x35, 0x78, 0xb8,
+    0x28, 0xce, 0x41, 0x24, 0xa8, 0xe5, 0xdc, 0x8b, 0xf4, 0xa0, 0xb5, 0xdf, 0xdb, 0x4d, 0x62, 0x10, 0x0d, 0xbf, 0xe6,
+    0x22, 0xf1, 0x23, 0xdd, 0xf4, 0x57, 0x61, 0x66, 0xc6, 0x32, 0x93, 0x5b, 0xb5, 0x93, 0xb4, 0xaa, 0x7a, 0x97, 0xc0,
+    0x3a, 0x8f, 0x1e, 0xe9, 0x16, 0xf3, 0x58, 0x4a, 0x2a, 0x32, 0x43, 0xa8, 0xbe, 0xff, 0xff, 0x05, 0xd1, 0x6d, 0x61,
+    0x23, 0xb1, 0x65, 0x23, 0x96, 0xde, 0x8c, 0x7e, 0x6e, 0x58, 0xbc, 0x96, 0x46, 0x7b, 0x95, 0xc2, 0x7a, 0x8b, 0x5c,
+    0x1b, 0x41, 0x17, 0x81, 0xc9, 0xb2, 0x98, 0xd1, 0xe4, 0x5c, 0xf1, 0xe3, 0xfe, 0xe8, 0xc2, 0xe8, 0xa7, 0x6b, 0xd2,
+    0xad, 0xea, 0x80, 0xfd, 0x1f, 0x17, 0x9d, 0x27, 0x0f, 0x4f, 0x7d, 0xac, 0x59, 0x3a, 0x1f, 0x8f, 0x7d, 0x54, 0x78,
+    0xf7, 0xeb, 0xd6, 0x7e, 0xf8, 0xe3, 0xe2, 0x8b, 0x17, 0xad, 0x2f, 0xca, 0xce, 0x99, 0x8f, 0x8a, 0x0b, 0x13, 0xce,
+    0xb7, 0x92, 0xc9, 0x81, 0xd7, 0xae, 0x68, 0x1c, 0x67, 0xbb, 0x97, 0x33, 0x70, 0x97, 0x93, 0xcf, 0x29, 0x4d, 0xb0,
+    0xef, 0xf9, 0x78, 0xa3, 0xf4, 0x3c, 0xa5, 0x57, 0xd4, 0xbe, 0x68, 0x70, 0xcb, 0x64, 0x5b, 0x7a, 0x8c, 0xf8, 0x22,
+    0x93, 0x26, 0xaf, 0xc1, 0x70, 0x56, 0x67, 0x49, 0x17, 0x6a, 0x0d, 0xae, 0x49, 0x70, 0xab, 0xc5, 0x5a, 0x5d, 0x58,
+    0x15, 0x17, 0xd8, 0x77, 0x00, 0xd8, 0x09, 0x59, 0x7f, 0x47, 0x79, 0xd4, 0xc2, 0xad, 0x5d, 0xb0, 0xe1, 0x36, 0x8a,
+    0x7c, 0x7f, 0x68, 0xf1, 0xa4, 0x5c, 0x93, 0xb5, 0xf7, 0x43, 0xec, 0xc4, 0xd7, 0x27, 0x31, 0x70, 0x29, 0x60, 0xb0,
+    0x8c, 0xe6, 0xf9, 0x4e, 0x04, 0x94, 0x9b, 0x88, 0xfd, 0xaa, 0xb5, 0xbf, 0x63, 0x14, 0xdc, 0xc2, 0x70, 0xc2, 0x14,
+    0xc0, 0x65, 0x80, 0xd4, 0xb4, 0xa2, 0xe3, 0x31, 0x1d, 0x95, 0x9e, 0x5d, 0x08, 0x75, 0x8d, 0x59, 0x2a, 0x21, 0xe2,
+    0xa3, 0x42, 0x31, 0xfe, 0x1b, 0x9e, 0x51, 0x1f, 0xd9, 0xe4, 0x4d, 0x03, 0xbf, 0x11, 0xf7, 0xdb, 0xe1, 0xd1, 0x23,
+    0xd6, 0x61, 0x31, 0xb3, 0xac, 0x56, 0xd6, 0xab, 0x53, 0x2b, 0xaf, 0x23, 0x92, 0x2b, 0xb7, 0xcd, 0xae, 0x03, 0x74,
+    0xbf, 0x63, 0xb2, 0x6c, 0x7f, 0xf1, 0xa8, 0xdd, 0x2a, 0x7c, 0xec, 0xc3, 0x70, 0xf7, 0x3d, 0x25, 0xaa, 0xd7, 0x11,
+    0xf4, 0x5a, 0x64, 0xbf, 0xa6, 0x5f, 0xa7, 0xfd, 0x79, 0xdb, 0xc7, 0xfa, 0xbd, 0x01, 0xa8, 0x28, 0x99, 0xc1, 0x08,
+    0x7c, 0x9d, 0xbf, 0x7b, 0x29, 0xf5, 0xc1, 0xef, 0x07, 0xcf, 0xe3, 0x76, 0xcb, 0xc7, 0x7e, 0x2e, 0xf9, 0xfc, 0x57,
+    0x2c, 0xe1, 0xc8, 0xc7, 0xfe, 0x28, 0xe5, 0x39, 0x75, 0xd7, 0xa0, 0xb5, 0xd7, 0xdf, 0xbf, 0x08, 0x0d, 0xd1, 0x5c,
+    0xd0, 0x3c, 0xf7, 0xdc, 0xf1, 0x0d, 0x29, 0x7d, 0x82, 0x61, 0x6e, 0xa5, 0xb8, 0x9c, 0x4a, 0x85, 0x17, 0x7d, 0xa5,
+    0xdf, 0xa5, 0x2a, 0x5d, 0xb6, 0x41, 0x6c, 0x4a, 0x04, 0x94, 0x8c, 0x4d, 0x2b, 0x53, 0x9f, 0x9c, 0x79, 0xcb, 0xd1,
+    0xd3, 0x13, 0xeb, 0x10, 0xf0, 0xe6, 0x04, 0xb5, 0x92, 0x19, 0xcb, 0xce, 0xb7, 0x94, 0xc6, 0x37, 0x5b, 0x4a, 0x41,
+    0x43, 0x2b, 0xa1, 0x33, 0x6f, 0x9b, 0xf9, 0x34, 0xd6, 0x2b, 0x3d, 0xc7, 0x05, 0x31, 0x51, 0x6e, 0xca, 0x4f, 0x40,
+    0xea, 0x6c, 0x83, 0x1a, 0xe1, 0xb7, 0x4f, 0x07, 0x25, 0xbf, 0x6a, 0x3a, 0x7a, 0xf3, 0xe9, 0x3d, 0x77, 0x14, 0x9b,
+    0xdf, 0x81, 0x7d, 0x73, 0x73, 0x7c, 0x1d, 0xfd, 0x5b, 0x8a, 0x8d, 0xee, 0x51, 0x6e, 0xc1, 0x28, 0x65, 0xb3, 0x6a,
+    0x17, 0x36, 0xc1, 0x54, 0x4a, 0x07, 0xa4, 0x0f, 0xb9, 0x83, 0x68, 0xed, 0xe3, 0x1c, 0x2e, 0x45, 0xc2, 0x9b, 0x27,
+    0x16, 0x82, 0x9e, 0xa7, 0xfc, 0x7a, 0xfd, 0x4d, 0x5a, 0xbb, 0x1b, 0x4f, 0xd9, 0x64, 0xea, 0xdc, 0x74, 0xa2, 0xa4,
+    0x44, 0xfd, 0x9d, 0x13, 0x14, 0xff, 0xfa, 0x2f, 0x61, 0xf8, 0xaf, 0xff, 0xf2, 0xc9, 0xa6, 0x30, 0x7c, 0x71, 0x81,
+    0x65, 0x35, 0xec, 0x6e, 0x02, 0xdf, 0x3e, 0x53, 0x1d, 0xe7, 0xdb, 0xdb, 0x6c, 0x6c, 0x02, 0xd4, 0x6f, 0x6c, 0xc1,
+    0x46, 0xa1, 0x3e, 0x00, 0xde, 0x6f, 0x01, 0x0c, 0xd6, 0xf5, 0x49, 0xc8, 0xa0, 0xd1, 0xef, 0x02, 0xed, 0x02, 0x45,
+    0xf7, 0xda, 0x91, 0xdf, 0x8e, 0xe1, 0x4f, 0xad, 0xe1, 0x77, 0x82, 0x6f, 0x3c, 0x02, 0xa3, 0x8b, 0x8b, 0x32, 0xa5,
+    0xcd, 0xed, 0x0a, 0x57, 0xe6, 0xfb, 0x1b, 0x25, 0x46, 0xf6, 0x47, 0x2d, 0xd4, 0x53, 0x17, 0xf2, 0xc8, 0xe8, 0xe2,
+    0x35, 0xbc, 0x27, 0xe7, 0xf8, 0x52, 0x58, 0x97, 0xea, 0x1d, 0xfc, 0x19, 0x86, 0xa8, 0xaf, 0x4a, 0x0d, 0xba, 0xc1,
+    0x9c, 0xa1, 0x14, 0x34, 0x7e, 0x00, 0x13, 0x8f, 0x2e, 0x8c, 0x7d, 0x77, 0xaa, 0x1d, 0x1f, 0xd1, 0x3a, 0x69, 0x1b,
+    0x87, 0x48, 0x0d, 0xe9, 0xd8, 0x7b, 0xaf, 0xf0, 0xa5, 0x1a, 0xd3, 0xca, 0x9e, 0x56, 0xce, 0x25, 0x50, 0xe5, 0x2f,
+    0x0a, 0x15, 0x18, 0xff, 0xeb, 0xae, 0xd8, 0xdd, 0xdf, 0x3f, 0x1d, 0xbb, 0xe3, 0xf7, 0x8a, 0xdd, 0xfd, 0xfd, 0x0f,
+    0x8f, 0xdd, 0xfd, 0xd5, 0x8d, 0xdd, 0xc1, 0x26, 0x7e, 0x79, 0xaf, 0xf8, 0x9a, 0x8d, 0x7d, 0xf0, 0xeb, 0x9c, 0xb4,
+    0x8d, 0x26, 0x9b, 0xf2, 0x09, 0x04, 0xd7, 0xfe, 0xfd, 0x63, 0x65, 0x29, 0x9f, 0xb8, 0x91, 0x32, 0x78, 0x4f, 0x2a,
+    0x84, 0xc6, 0xba, 0x36, 0xa6, 0x65, 0xa2, 0x53, 0xad, 0xf2, 0x0e, 0x48, 0xf3, 0xa1, 0x7d, 0x67, 0x81, 0x1f, 0x95,
+    0xef, 0x1d, 0x6a, 0xe1, 0x8e, 0x8d, 0x5f, 0x45, 0x2a, 0xf4, 0x55, 0x76, 0xec, 0x34, 0xec, 0x05, 0x07, 0x77, 0x84,
+    0xae, 0x7d, 0xaf, 0x8a, 0xbe, 0xef, 0xbe, 0xf4, 0x7f, 0xbc, 0x69, 0x3f, 0x1b, 0xb4, 0xbb, 0x47, 0xed, 0x99, 0x1f,
+    0xf9, 0x20, 0xa5, 0x54, 0x41, 0xab, 0x7b, 0x74, 0x04, 0x05, 0xd7, 0x4e, 0x41, 0x07, 0x0a, 0x98, 0x53, 0xf0, 0x08,
+    0x0a, 0x46, 0x4e, 0xc1, 0x63, 0x28, 0x48, 0x9c, 0x82, 0x27, 0x50, 0x70, 0xe5, 0x17, 0x03, 0x56, 0x82, 0xfb, 0x04,
+    0x0d, 0xb1, 0x36, 0x1e, 0x6c, 0xd9, 0x13, 0xdc, 0x86, 0xa0, 0x59, 0x3c, 0x51, 0xb9, 0x3e, 0xe0, 0x82, 0x8b, 0x38,
+    0xbe, 0x9e, 0xd2, 0x2c, 0x82, 0xb0, 0xe5, 0x73, 0x25, 0x63, 0x42, 0xc9, 0xdf, 0xb3, 0x19, 0xb5, 0x5f, 0xa8, 0xb0,
+    0x78, 0xf0, 0x7c, 0x34, 0x68, 0x0d, 0x8b, 0x6e, 0xb9, 0x73, 0x3a, 0xda, 0x66, 0xf2, 0x3e, 0xf4, 0x5e, 0x56, 0x75,
+    0x7a, 0xba, 0x66, 0xb9, 0xe7, 0x3b, 0xa2, 0x36, 0x8e, 0x3b, 0x60, 0x9c, 0xf2, 0xeb, 0xe6, 0x8d, 0xdf, 0xdb, 0x1e,
+    0xc9, 0x01, 0x88, 0xca, 0x48, 0x8e, 0x5a, 0x53, 0xf9, 0xf4, 0x3e, 0x9e, 0x94, 0xbf, 0x5f, 0xd3, 0x3c, 0x8f, 0x27,
+    0xa6, 0xe5, 0xee, 0xc8, 0x8d, 0x02, 0xd1, 0x8d, 0xda, 0x58, 0x20, 0x20, 0xfa, 0x02, 0x9b, 0x05, 0xe6, 0xb4, 0x09,
+    0xc6, 0x00, 0x76, 0xea, 0x71, 0x1c, 0x35, 0x7d, 0xbd, 0x48, 0xc6, 0x93, 0xaa, 0xe0, 0x78, 0x2e, 0xa8, 0x2a, 0xd5,
+    0x18, 0x2e, 0x8e, 0x0f, 0xa1, 0x40, 0x57, 0xef, 0x88, 0xd7, 0x58, 0xdb, 0x7d, 0x77, 0xd4, 0xc6, 0xb3, 0xf1, 0x1a,
+    0x37, 0xc3, 0xa5, 0x4c, 0x6f, 0xd9, 0x8c, 0x12, 0x7c, 0xd6, 0x1e, 0xc1, 0x1f, 0x13, 0x83, 0xf8, 0x6c, 0x3c, 0x1e,
+    0xdf, 0x19, 0xbf, 0xf9, 0x2c, 0x19, 0xd3, 0x0e, 0x7d, 0xd4, 0x85, 0xec, 0x87, 0xa6, 0xf1, 0xfa, 0xb7, 0x0b, 0x85,
+    0xbb, 0xe5, 0xfd, 0x1a, 0x43, 0x80, 0x40, 0x4e, 0x97, 0xf7, 0x8f, 0xe5, 0x14, 0x73, 0x41, 0x97, 0xb3, 0x58, 0x4c,
+    0x58, 0x16, 0xb5, 0x8a, 0xf0, 0xca, 0x04, 0x3f, 0x3e, 0x7b, 0xfa, 0xf4, 0x69, 0x11, 0x26, 0xf6, 0xa9, 0x95, 0x24,
+    0x45, 0x38, 0x5a, 0x96, 0xcb, 0x68, 0xb5, 0xc6, 0xe3, 0x22, 0x64, 0xb6, 0xe0, 0xa8, 0x33, 0x4a, 0x8e, 0x3a, 0x45,
+    0x78, 0xed, 0xb4, 0x28, 0x42, 0x6a, 0x9e, 0x04, 0x4d, 0x6a, 0x29, 0x14, 0x4f, 0x5a, 0xad, 0x22, 0xd4, 0x84, 0xb6,
+    0x04, 0x8b, 0x48, 0xff, 0x8c, 0xe2, 0x85, 0xe4, 0xc0, 0x92, 0xbb, 0x5c, 0x06, 0x83, 0x73, 0xf3, 0x7a, 0x0a, 0xfd,
+    0x29, 0x87, 0x02, 0x0d, 0xf1, 0x97, 0x6e, 0x98, 0x02, 0x88, 0x59, 0x85, 0x27, 0xb8, 0x8d, 0x62, 0xd4, 0xaa, 0x81,
+    0xb2, 0x54, 0xf5, 0x97, 0x84, 0x57, 0xd1, 0x0b, 0xe0, 0x3f, 0xd0, 0x52, 0xbf, 0x47, 0x4d, 0xd2, 0x1d, 0x5c, 0x9f,
+    0xd2, 0x4f, 0x72, 0xfd, 0xdb, 0xfb, 0x30, 0x7d, 0x4a, 0xff, 0x68, 0xa6, 0x6f, 0x5e, 0x36, 0xaa, 0x99, 0xbe, 0x66,
+    0x6b, 0x33, 0x49, 0xfc, 0xd1, 0x94, 0x8e, 0x3e, 0x5e, 0xf2, 0x9b, 0x26, 0x1c, 0x09, 0xe1, 0x2b, 0x7e, 0xba, 0xff,
+    0x5b, 0xd3, 0x2d, 0xec, 0x60, 0xce, 0x97, 0x20, 0x94, 0xd8, 0x7c, 0x9b, 0x11, 0xff, 0xad, 0x35, 0xab, 0x74, 0xc9,
+    0x78, 0x4c, 0xfc, 0xb7, 0xe3, 0xb1, 0x6f, 0x2f, 0xd9, 0xc5, 0x92, 0xaa, 0x56, 0x6f, 0x6a, 0x25, 0xaa, 0xd5, 0x17,
+    0x5f, 0xb8, 0x65, 0x6e, 0x81, 0x09, 0x72, 0xb8, 0x01, 0x0d, 0x53, 0x93, 0xb0, 0x1c, 0x8e, 0x1a, 0x7c, 0xa0, 0xa2,
+    0xfe, 0x96, 0x3f, 0x51, 0x7b, 0x21, 0x73, 0x09, 0xf0, 0x96, 0xb7, 0x48, 0xaf, 0xdf, 0x30, 0x9f, 0x50, 0x9b, 0xf0,
+    0xf6, 0xec, 0xf6, 0xcb, 0x24, 0x98, 0x49, 0x54, 0xb0, 0xfc, 0x6d, 0xb6, 0x76, 0x7b, 0x44, 0xc3, 0x48, 0x88, 0xbb,
+    0xac, 0x42, 0xf2, 0xc9, 0x24, 0x85, 0x4f, 0x84, 0x2c, 0x6b, 0x6f, 0x1e, 0xd5, 0xdd, 0xfb, 0xb5, 0xf5, 0x46, 0x6e,
+    0x47, 0xf3, 0x9e, 0x4e, 0xf5, 0xc5, 0x22, 0x9d, 0x75, 0x7c, 0x65, 0x3e, 0x5d, 0xa3, 0x2c, 0xb2, 0xa5, 0xe1, 0xff,
+    0x4b, 0x9d, 0xab, 0x2a, 0x21, 0x4f, 0x43, 0x0f, 0x9c, 0x14, 0x85, 0xc9, 0xf2, 0x4f, 0x58, 0x3e, 0x87, 0x37, 0x62,
+    0xea, 0x9e, 0xf4, 0x53, 0x2c, 0x3c, 0xbf, 0x76, 0x22, 0x09, 0xb5, 0xed, 0x2a, 0x6c, 0x28, 0x41, 0xfb, 0x6a, 0x67,
+    0xb2, 0xf0, 0x8d, 0xcb, 0xd7, 0x22, 0xd1, 0xf7, 0x34, 0x3e, 0x75, 0x8c, 0xc3, 0x59, 0x21, 0xf8, 0x5d, 0xcb, 0x0d,
+    0xb1, 0x55, 0xb6, 0xa0, 0x70, 0x23, 0x65, 0xaa, 0x46, 0x63, 0x4b, 0xf9, 0xe5, 0xf3, 0x79, 0x9c, 0x69, 0x36, 0x4a,
+    0x7c, 0xcd, 0x0f, 0xf6, 0x97, 0xd5, 0xce, 0x17, 0xbe, 0x05, 0x5b, 0x13, 0x6f, 0xef, 0xf8, 0x10, 0x3a, 0xf4, 0xbc,
+    0x1a, 0xe8, 0xd9, 0x86, 0x3b, 0xff, 0x13, 0x81, 0xf5, 0x8b, 0x30, 0xbf, 0xc6, 0x61, 0x7e, 0xed, 0xfd, 0x79, 0xd9,
+    0xbc, 0xa6, 0x97, 0x1f, 0x99, 0x6c, 0xca, 0x78, 0xde, 0x04, 0x85, 0x5f, 0xf9, 0xe5, 0x0c, 0x7b, 0x56, 0xe9, 0x61,
+    0xfa, 0x8e, 0x7c, 0x77, 0x91, 0x43, 0xfc, 0x5d, 0xa9, 0xad, 0x51, 0xc6, 0x33, 0xda, 0xad, 0xa7, 0x01, 0xba, 0xe1,
+    0x5c, 0x8b, 0xad, 0xe1, 0x92, 0x43, 0xbc, 0x5e, 0xde, 0x46, 0x2d, 0xc3, 0xd6, 0x5b, 0x36, 0x56, 0xdb, 0xda, 0xda,
+    0x3e, 0x32, 0xc8, 0x6d, 0x28, 0xe9, 0x25, 0x36, 0x63, 0xd6, 0xbb, 0x62, 0xce, 0x9f, 0x4a, 0x8a, 0x03, 0x6f, 0x9e,
+    0xfd, 0xeb, 0x64, 0x13, 0xae, 0x17, 0xab, 0xa4, 0xb8, 0xfb, 0x40, 0x16, 0xc5, 0x63, 0x49, 0x05, 0xbe, 0x4f, 0xcb,
+    0x4b, 0x75, 0x7f, 0x65, 0x09, 0x62, 0x26, 0x6a, 0x3f, 0x9d, 0xdf, 0xdc, 0x7f, 0xf8, 0xbb, 0x97, 0x5f, 0x18, 0x1c,
+    0xd9, 0xf7, 0xb9, 0xf8, 0x7e, 0x17, 0x0e, 0x42, 0x1a, 0xdf, 0x46, 0x2c, 0x53, 0x32, 0xef, 0x12, 0x5c, 0x72, 0xdd,
+    0x39, 0x37, 0xd9, 0x9d, 0x82, 0xa6, 0xea, 0xe3, 0x6d, 0x66, 0x2b, 0x8e, 0x1e, 0xcf, 0x6f, 0xec, 0x6e, 0xb4, 0xd7,
+    0xb2, 0x36, 0xff, 0xd0, 0xe4, 0xcc, 0xdd, 0xd9, 0xa0, 0xf5, 0x04, 0xc3, 0x47, 0xf3, 0x9b, 0xae, 0x16, 0xb4, 0x4d,
+    0xa1, 0xa1, 0x6a, 0xcd, 0x6f, 0xdc, 0xf4, 0xd4, 0x6a, 0x20, 0x2f, 0x3c, 0xca, 0x3d, 0x1a, 0xe7, 0xb4, 0x0b, 0x6f,
+    0xac, 0x66, 0xa3, 0x38, 0x35, 0xc2, 0x7c, 0xc6, 0x92, 0x24, 0xa5, 0x5d, 0x2b, 0xaf, 0xbd, 0xf6, 0x63, 0xc8, 0xee,
+    0x74, 0xb7, 0xac, 0xbe, 0x2b, 0x0e, 0xf2, 0x4a, 0x3c, 0xc5, 0x97, 0x39, 0x4f, 0xe1, 0x73, 0x11, 0x5b, 0xd1, 0x69,
+    0xd2, 0x1e, 0x5b, 0x15, 0xf2, 0xd4, 0xef, 0xfa, 0x5a, 0x1e, 0xb5, 0xfe, 0xd4, 0x55, 0x1b, 0xde, 0xea, 0x4a, 0x3e,
+    0x8f, 0x9a, 0x47, 0xf5, 0x85, 0x40, 0x55, 0xb9, 0x04, 0xbc, 0x65, 0x59, 0x18, 0xa4, 0x95, 0xe6, 0xd3, 0x5e, 0xd8,
+    0x36, 0x65, 0x6a, 0x00, 0x78, 0xb5, 0x72, 0x59, 0x54, 0xd4, 0x17, 0xf3, 0xef, 0x73, 0x5a, 0x3e, 0xdf, 0x7e, 0x5a,
+    0x3e, 0xb7, 0xa7, 0xe5, 0x6e, 0x8a, 0xfd, 0x6c, 0xdc, 0x86, 0x3f, 0xdd, 0x6a, 0x41, 0x51, 0xcb, 0x3b, 0x9a, 0xdf,
+    0x78, 0xa0, 0xa7, 0x35, 0x3b, 0xf3, 0x1b, 0x9d, 0x9c, 0x0b, 0x61, 0x83, 0x16, 0xa4, 0xab, 0xe2, 0x96, 0x07, 0x85,
+    0xf0, 0xb7, 0x55, 0xab, 0x6a, 0x3f, 0x84, 0x3a, 0xe8, 0xf5, 0x68, 0xb3, 0xae, 0x73, 0xf7, 0xa1, 0x8d, 0x32, 0x2e,
+    0x83, 0xc8, 0x72, 0x63, 0x14, 0xca, 0xf8, 0xf2, 0x92, 0x26, 0xd1, 0x98, 0x8f, 0x16, 0xf9, 0x3f, 0x1b, 0xf8, 0x0d,
+    0x12, 0xef, 0x3c, 0xd2, 0x6b, 0xe3, 0xd8, 0xae, 0x3a, 0x55, 0xd8, 0x8e, 0xb0, 0x2c, 0xf7, 0x29, 0xca, 0x47, 0x71,
+    0x4a, 0x83, 0x4e, 0xf8, 0x70, 0xcb, 0x21, 0xf8, 0x0f, 0xd9, 0x9b, 0xad, 0x8b, 0xf9, 0xbd, 0xc8, 0xb8, 0x13, 0x09,
+    0xbf, 0x0a, 0x07, 0xee, 0x1e, 0xb6, 0x9e, 0x6e, 0x07, 0x77, 0x60, 0x67, 0x1a, 0x5a, 0xa1, 0x60, 0xe4, 0x4e, 0x42,
+    0xc7, 0xf1, 0x22, 0x95, 0x77, 0x8f, 0xba, 0x8b, 0x32, 0x36, 0x46, 0xbd, 0x83, 0xa1, 0x57, 0x6d, 0xef, 0xc9, 0xa5,
+    0x3f, 0xfb, 0xfc, 0x21, 0xfc, 0xd1, 0x99, 0x46, 0xb7, 0x95, 0xae, 0xae, 0x6d, 0x55, 0xd0, 0xd5, 0xf7, 0x6b, 0xca,
+    0xb8, 0x16, 0xe1, 0x4a, 0x1f, 0xbf, 0x6f, 0x6b, 0xd0, 0x2a, 0xef, 0xd5, 0xdc, 0x68, 0x59, 0xbf, 0xaa, 0xf5, 0xaf,
+    0x1b, 0xfc, 0x9e, 0x6d, 0x47, 0x5a, 0x73, 0xad, 0xb7, 0x35, 0x5f, 0xaf, 0xdb, 0x68, 0x6c, 0x31, 0xae, 0xda, 0xef,
+    0x93, 0xdb, 0xd2, 0x44, 0xd1, 0x81, 0x40, 0xb0, 0x52, 0xf6, 0xb5, 0x95, 0xc2, 0x28, 0x79, 0x00, 0xef, 0x8e, 0xf5,
+    0x6e, 0x66, 0x69, 0x96, 0x13, 0x7f, 0x2a, 0xe5, 0x3c, 0xd2, 0x9f, 0x3b, 0xbd, 0x3e, 0x0a, 0xb9, 0x98, 0x1c, 0x76,
+    0x5a, 0xad, 0x16, 0xbc, 0xf3, 0xd3, 0xf7, 0xae, 0x18, 0xbd, 0x7e, 0xc6, 0x6f, 0x88, 0xff, 0xc4, 0x7b, 0xea, 0x3d,
+    0x39, 0xf2, 0x1e, 0x3d, 0xf6, 0x3d, 0xc5, 0xce, 0x89, 0xff, 0xe4, 0xc8, 0xf7, 0x34, 0x3b, 0x27, 0xfe, 0xa3, 0xc7,
+    0x7e, 0xef, 0x78, 0x62, 0x55, 0x32, 0xb8, 0x34, 0xa8, 0xf5, 0x9d, 0x5c, 0x0a, 0xfe, 0x91, 0xd6, 0x0f, 0xae, 0x2e,
+    0x33, 0xb9, 0x68, 0x1d, 0xfb, 0x08, 0xa7, 0x77, 0x14, 0xcf, 0x23, 0x45, 0x14, 0x6e, 0x21, 0xb8, 0x65, 0x74, 0xa9,
+    0x9a, 0x02, 0xd4, 0xcc, 0x4b, 0xbf, 0x77, 0x0c, 0x79, 0xe3, 0x5e, 0x42, 0xfc, 0xd7, 0x9d, 0x27, 0x5e, 0xfb, 0xf1,
+    0x55, 0xf3, 0xe1, 0xa8, 0xd5, 0x6c, 0x7b, 0xed, 0x66, 0x27, 0x7c, 0xe2, 0x75, 0xf4, 0xbf, 0x5e, 0xcb, 0x3b, 0xf2,
+    0xda, 0xe1, 0x13, 0xef, 0xc8, 0xeb, 0x84, 0x4f, 0xae, 0x1e, 0xea, 0x7c, 0x82, 0xd8, 0x3f, 0xec, 0x1d, 0xc3, 0xa7,
+    0x2b, 0x6f, 0x88, 0xff, 0xb9, 0xaf, 0x3f, 0x10, 0xeb, 0x7f, 0xe6, 0x96, 0xb6, 0x9f, 0x6e, 0x2d, 0xee, 0x3c, 0xd9,
+    0x5a, 0x7c, 0xf4, 0x78, 0x6b, 0xf1, 0xc3, 0x47, 0xf5, 0xe2, 0xc3, 0x89, 0xae, 0x2a, 0x4f, 0x39, 0xf1, 0x67, 0xb1,
+    0x14, 0xec, 0x26, 0x68, 0x7b, 0x2d, 0xaf, 0xe5, 0x35, 0xe1, 0xbf, 0x27, 0x1d, 0x54, 0xf6, 0xba, 0x84, 0x5e, 0xe5,
+    0x2a, 0x9f, 0x3c, 0xf5, 0xda, 0x8f, 0x5f, 0x76, 0x1e, 0x8f, 0xa0, 0x9d, 0x5a, 0x68, 0xdb, 0x6b, 0x5f, 0x1d, 0x3d,
+    0x1d, 0xb5, 0x3c, 0xe8, 0xd8, 0x86, 0x3f, 0xd3, 0x47, 0x9d, 0x91, 0x7e, 0x68, 0x41, 0xfd, 0xb7, 0xed, 0x27, 0x79,
+    0xab, 0xd9, 0x86, 0x3f, 0xbf, 0x94, 0x1a, 0x31, 0xe8, 0xe3, 0xee, 0xb8, 0x0f, 0x5b, 0xde, 0xd1, 0xd3, 0x69, 0x27,
+    0xfc, 0xfc, 0xea, 0x49, 0xf8, 0x74, 0xda, 0x7e, 0xf2, 0xad, 0x7e, 0x4a, 0x9b, 0x9d, 0xf0, 0x73, 0xf8, 0xfb, 0xed,
+    0x51, 0x6b, 0xda, 0x6c, 0x87, 0x4f, 0xaf, 0x8e, 0xc2, 0xa3, 0xb4, 0xf9, 0x38, 0x7c, 0x0a, 0x7f, 0xab, 0xe1, 0xa6,
+    0x7c, 0x46, 0x7d, 0x0f, 0xf6, 0x7b, 0xcd, 0xdc, 0x72, 0xe7, 0xe8, 0x3c, 0xf4, 0x1e, 0x3d, 0x7c, 0xf9, 0xf4, 0xaa,
+    0xf9, 0x70, 0xda, 0xee, 0x5c, 0x35, 0x77, 0xfe, 0xfc, 0x16, 0x10, 0x6f, 0x06, 0x8e, 0x29, 0x5c, 0xe0, 0xb1, 0x88,
+    0x53, 0xef, 0x9f, 0x7d, 0x80, 0xf3, 0x5d, 0xe6, 0xb5, 0xf8, 0xb4, 0x79, 0x9d, 0xd1, 0xfb, 0xd8, 0xd7, 0xe2, 0x0f,
+    0xb7, 0xaf, 0x73, 0xba, 0xe6, 0x54, 0xbd, 0x95, 0x1b, 0x66, 0xf4, 0xba, 0xed, 0xf5, 0x4e, 0x06, 0x03, 0x06, 0xdf,
+    0x39, 0x2a, 0xba, 0xb7, 0xf0, 0x8a, 0x6b, 0xd7, 0xdb, 0xc0, 0xe1, 0x20, 0xdf, 0x4a, 0x7d, 0x92, 0xf9, 0x2e, 0x84,
+    0xa4, 0x9f, 0x46, 0xc8, 0xb7, 0xf7, 0xc1, 0x47, 0xfa, 0x87, 0xe3, 0x83, 0xbb, 0xf8, 0xa8, 0xf9, 0x79, 0x95, 0x3d,
+    0xab, 0xec, 0xd1, 0x33, 0xf5, 0x1c, 0xc0, 0x1d, 0x8f, 0x86, 0x7f, 0x48, 0xa1, 0x28, 0xf7, 0x75, 0x5c, 0xe1, 0xcd,
+    0xaf, 0x71, 0x49, 0xeb, 0x0b, 0x5d, 0xc4, 0x37, 0xc6, 0xff, 0x1c, 0xbe, 0x65, 0x60, 0x1f, 0xae, 0xf4, 0x15, 0x63,
+    0xe2, 0x77, 0xc2, 0x56, 0xd8, 0x2a, 0x1d, 0x07, 0x70, 0x89, 0x8f, 0x2c, 0xb9, 0x8c, 0xe1, 0x73, 0x9a, 0x29, 0x9f,
+    0xa8, 0x0f, 0x6f, 0xc2, 0xeb, 0xce, 0xd5, 0x27, 0x50, 0xf5, 0x9b, 0xe6, 0x23, 0xdf, 0x37, 0x57, 0xff, 0xe1, 0x92,
+    0xd8, 0x37, 0x70, 0x91, 0xce, 0x7a, 0xac, 0x67, 0x60, 0x53, 0xbf, 0xa6, 0x09, 0x8b, 0x03, 0x3f, 0x98, 0x0b, 0x3a,
+    0xa6, 0x22, 0x6f, 0xd6, 0x6e, 0x97, 0xa9, 0x8b, 0x65, 0xc8, 0xb7, 0x1f, 0x6e, 0x14, 0xf0, 0xfa, 0x5e, 0x32, 0x30,
+    0x5e, 0x2d, 0xdf, 0xa8, 0xf9, 0x7e, 0x81, 0x6d, 0x89, 0x00, 0x8e, 0x5e, 0xa9, 0x06, 0xbe, 0xd6, 0x0d, 0xda, 0x61,
+    0xe7, 0x11, 0xd2, 0xbc, 0x04, 0x5e, 0x8b, 0xfa, 0x7d, 0xd0, 0x3c, 0x6a, 0xfd, 0x09, 0x39, 0xdd, 0xca, 0x81, 0x86,
+    0xc6, 0xa9, 0x23, 0xaa, 0x0f, 0xde, 0xd6, 0xaf, 0xfe, 0xf9, 0x9a, 0x22, 0x3e, 0xd3, 0x6b, 0x87, 0x17, 0xac, 0x9a,
+    0xf8, 0xa1, 0xbe, 0xc0, 0x3e, 0x66, 0x93, 0xc0, 0xfd, 0x9c, 0xa9, 0x7e, 0xed, 0xaa, 0xfa, 0x0a, 0x32, 0x2a, 0xaa,
+    0x26, 0x02, 0x2d, 0x95, 0x2f, 0x9e, 0x65, 0x9e, 0x58, 0xad, 0x02, 0x01, 0x8e, 0x58, 0xe2, 0xe0, 0x14, 0x9e, 0x51,
+    0x0d, 0xc9, 0x02, 0x97, 0x00, 0x29, 0x04, 0x13, 0xa1, 0xff, 0xaf, 0x8a, 0xed, 0x0f, 0xe3, 0x5e, 0x09, 0xd3, 0x38,
+    0x9b, 0x00, 0x15, 0xc6, 0xd9, 0x64, 0xc3, 0x79, 0xa3, 0xc3, 0x09, 0x6b, 0xa5, 0xd5, 0x50, 0x95, 0x93, 0x26, 0x7f,
+    0x76, 0xfb, 0xde, 0xbc, 0x9f, 0xc9, 0x07, 0x1f, 0xa8, 0xf2, 0x7d, 0x57, 0xef, 0x92, 0x6d, 0x90, 0x07, 0xfa, 0x03,
+    0xe1, 0x2a, 0x21, 0x0d, 0xa4, 0x1f, 0x5c, 0xea, 0xf3, 0x8c, 0xcd, 0x43, 0x7c, 0x2d, 0xfb, 0x12, 0x7a, 0xc5, 0x46,
+    0x46, 0x84, 0x61, 0xcf, 0x5c, 0x6c, 0x6e, 0xaa, 0xad, 0x21, 0x6d, 0xac, 0xad, 0xfe, 0x51, 0xac, 0x32, 0x8c, 0x49,
+    0xc6, 0xfd, 0xde, 0x83, 0xf2, 0xeb, 0x8c, 0xbb, 0x36, 0x01, 0xbe, 0x5a, 0x3e, 0x10, 0x34, 0xfd, 0x67, 0xf2, 0x00,
+    0xbe, 0x5b, 0xfe, 0x60, 0x08, 0x9f, 0xcc, 0x0e, 0x95, 0x28, 0x78, 0x50, 0x7d, 0xbe, 0x1c, 0xf8, 0x60, 0xe3, 0x66,
+    0x96, 0xe2, 0xfb, 0x8a, 0x6f, 0x23, 0xaa, 0x3b, 0x8f, 0x2a, 0x51, 0xdd, 0x79, 0xe4, 0x4a, 0xcf, 0xb6, 0xd7, 0xee,
+    0x84, 0x8f, 0x1c, 0x01, 0x70, 0xd5, 0x84, 0xff, 0x6b, 0x22, 0xe0, 0x61, 0xf8, 0xa8, 0x94, 0x01, 0xaf, 0xda, 0x9d,
+    0xf0, 0x48, 0x8b, 0x9b, 0x4e, 0xf8, 0xe8, 0x07, 0xc5, 0xa0, 0x35, 0x73, 0xae, 0x1f, 0x88, 0x2d, 0xa1, 0x1a, 0x9d,
+    0x54, 0xe7, 0xe3, 0xa0, 0xfc, 0x06, 0x9c, 0x39, 0x9f, 0xc6, 0x25, 0xf4, 0x3c, 0x16, 0xf0, 0x21, 0x8e, 0xfa, 0xd9,
+    0xad, 0xd5, 0xe1, 0x1a, 0xbf, 0xd8, 0x32, 0x05, 0x9c, 0x70, 0x1f, 0xbb, 0x37, 0x83, 0xe1, 0x5a, 0xad, 0x7a, 0x6d,
+    0xb1, 0x7d, 0x7b, 0xdb, 0x6e, 0xd2, 0xd6, 0x0d, 0xed, 0x1b, 0xe2, 0x14, 0xb3, 0x60, 0xea, 0x15, 0xf1, 0x6a, 0x92,
+    0x2f, 0x93, 0x62, 0x7d, 0x7e, 0xc8, 0xed, 0x13, 0xdc, 0xb9, 0x1c, 0x4d, 0xab, 0x04, 0xf4, 0x84, 0xc1, 0x75, 0xf6,
+    0xa2, 0xb0, 0xa0, 0xd7, 0x9c, 0x81, 0x15, 0x96, 0x14, 0xbf, 0xa0, 0x79, 0xdf, 0x87, 0x22, 0x3f, 0xf2, 0x95, 0x23,
+    0xc9, 0x2f, 0x3f, 0x46, 0x52, 0x12, 0x76, 0x55, 0x80, 0xd5, 0x25, 0x12, 0x38, 0xb5, 0x80, 0x1f, 0x1f, 0x1d, 0x1c,
+    0xec, 0x3c, 0x2f, 0x4a, 0x1b, 0x83, 0xb5, 0x56, 0x1f, 0x31, 0x70, 0x59, 0x91, 0xef, 0x22, 0xba, 0x1c, 0x57, 0xa1,
+    0x10, 0x19, 0x3c, 0x5d, 0xd2, 0x58, 0x86, 0x71, 0xa6, 0x53, 0x14, 0x1c, 0x86, 0x85, 0xdb, 0xf4, 0x08, 0x15, 0x5c,
+    0xc6, 0xce, 0x57, 0x4a, 0xcd, 0x39, 0xe7, 0x32, 0xb6, 0x57, 0xfd, 0x32, 0x59, 0xcb, 0x85, 0x9f, 0x76, 0x7a, 0x6f,
+    0xdf, 0x9f, 0x78, 0xfa, 0x78, 0x1e, 0x1f, 0x4e, 0x3b, 0xbd, 0x63, 0x65, 0x99, 0xeb, 0x8b, 0x42, 0x44, 0x5f, 0x14,
+    0xf2, 0xcc, 0xa5, 0x31, 0x88, 0xd7, 0x14, 0x87, 0x7a, 0xd9, 0xbe, 0x47, 0xb3, 0x91, 0xf6, 0x29, 0xce, 0x16, 0xa9,
+    0x64, 0xf0, 0x0a, 0xde, 0x43, 0xe8, 0xda, 0x84, 0x0d, 0x2b, 0x13, 0x4d, 0xad, 0x86, 0x23, 0x33, 0xeb, 0x81, 0x1c,
+    0xb3, 0x94, 0xda, 0xd4, 0x52, 0x33, 0x54, 0x99, 0xf9, 0xbc, 0xd9, 0x3a, 0x5f, 0x5c, 0xce, 0x98, 0xf4, 0x6d, 0x7e,
+    0xf6, 0x07, 0xd3, 0xe1, 0x58, 0x4d, 0xd5, 0xbb, 0x28, 0x8c, 0x8b, 0xd4, 0x7e, 0x6e, 0x64, 0xed, 0x03, 0xef, 0x7a,
+    0xf5, 0x46, 0x42, 0xc0, 0x8d, 0x9f, 0xe9, 0x51, 0xaf, 0x74, 0x4a, 0xba, 0x75, 0xc5, 0xf1, 0xe1, 0xf4, 0xa8, 0x77,
+    0x11, 0xcd, 0xcd, 0x78, 0xaf, 0xf8, 0xc6, 0xc7, 0xe2, 0x4b, 0x8e, 0xd9, 0x57, 0xa9, 0xed, 0xfa, 0x0e, 0xa5, 0x01,
+    0x78, 0xc4, 0x53, 0xbf, 0x77, 0x6c, 0x94, 0x01, 0x4f, 0x05, 0x5d, 0xfd, 0x47, 0x2d, 0x9b, 0x2d, 0x9f, 0x72, 0xa5,
+    0x2d, 0xe9, 0x2e, 0xce, 0x24, 0x35, 0xbf, 0xee, 0xb4, 0xdd, 0x3b, 0x8e, 0x8d, 0x9a, 0x09, 0xcc, 0x23, 0x8f, 0x0e,
+    0xa1, 0x33, 0xe8, 0x72, 0x21, 0xe3, 0x87, 0xd7, 0xf4, 0xb2, 0x19, 0xcf, 0x59, 0xe5, 0x44, 0x05, 0xa5, 0xa3, 0x9c,
+    0x92, 0x57, 0x33, 0xc1, 0xcf, 0x78, 0x6d, 0x91, 0x8a, 0x85, 0x17, 0xc6, 0x43, 0xab, 0x74, 0x75, 0x1a, 0x4b, 0xdf,
+    0xd3, 0x1c, 0xde, 0x7a, 0x72, 0x8d, 0xec, 0x2d, 0xfc, 0xde, 0xbf, 0xfd, 0x8f, 0xff, 0x65, 0x9c, 0xb3, 0xc7, 0x87,
+    0xd3, 0xb6, 0x1d, 0x6b, 0x0d, 0xd1, 0xc5, 0x31, 0x5c, 0x30, 0xab, 0xa2, 0x89, 0xf4, 0xa6, 0x39, 0x11, 0x2c, 0x69,
+    0x4e, 0xe3, 0x74, 0xec, 0xf7, 0x76, 0x23, 0xc8, 0xbd, 0x59, 0x62, 0xa0, 0xae, 0x17, 0x01, 0x09, 0xfe, 0xa6, 0xbb,
+    0x11, 0x36, 0xc5, 0x5e, 0x9d, 0x56, 0xf7, 0xa6, 0x44, 0x75, 0xa0, 0x6a, 0xb7, 0x25, 0x84, 0xf9, 0x2a, 0x91, 0x61,
+    0x6a, 0xa2, 0x76, 0x49, 0xa2, 0xf0, 0xbd, 0x32, 0x1a, 0xf2, 0x7f, 0xff, 0xe7, 0x7f, 0xf9, 0x6f, 0xf6, 0x11, 0x82,
+    0x1c, 0xff, 0xf6, 0xdf, 0xff, 0xf3, 0xff, 0xf9, 0xdf, 0xff, 0x15, 0x12, 0xeb, 0x4d, 0x20, 0x44, 0xf1, 0x09, 0xaf,
+    0x8a, 0x82, 0x68, 0x86, 0xe1, 0x41, 0x32, 0xda, 0x8c, 0xe5, 0x92, 0x8d, 0xea, 0xd7, 0x26, 0xce, 0xd4, 0x84, 0xea,
+    0xb0, 0x19, 0xe8, 0xd4, 0xa1, 0x2d, 0x2a, 0x1a, 0xa9, 0xa1, 0x5c, 0xd1, 0x62, 0x71, 0x7c, 0x08, 0xf8, 0xbe, 0xdf,
+    0x4d, 0xb3, 0xb0, 0xdc, 0x8e, 0xa5, 0x75, 0xfd, 0x41, 0x49, 0x51, 0x95, 0x7b, 0xe0, 0x94, 0x5f, 0xc2, 0x63, 0xd4,
+    0x71, 0x8a, 0xd5, 0xee, 0xd5, 0xfa, 0x74, 0x7f, 0x5a, 0xe4, 0x92, 0x8d, 0x01, 0xe5, 0xda, 0xc1, 0xa8, 0xe2, 0x9f,
+    0x4d, 0x50, 0xff, 0xd2, 0xdb, 0x42, 0x8d, 0xa2, 0x6d, 0xc6, 0x87, 0x4f, 0xff, 0x54, 0xfc, 0x65, 0x06, 0x4a, 0x96,
+    0x17, 0xcc, 0xe2, 0x1b, 0x63, 0x49, 0x3e, 0x6e, 0xb5, 0xe6, 0x37, 0x68, 0x59, 0xcd, 0x80, 0x77, 0x4d, 0xa6, 0x9c,
+    0x92, 0xee, 0x80, 0x2a, 0x70, 0x5a, 0xfa, 0x3f, 0x5b, 0x1e, 0x38, 0x51, 0xbd, 0x56, 0x51, 0xfc, 0x79, 0xa9, 0x5c,
+    0x70, 0xec, 0x17, 0x08, 0x70, 0x1a, 0x6f, 0xe5, 0x25, 0x77, 0x17, 0xb7, 0x74, 0x7a, 0x75, 0x74, 0xaf, 0x69, 0x7b,
+    0xf3, 0x02, 0x95, 0x1b, 0xa0, 0x75, 0x43, 0xab, 0x0f, 0x21, 0x58, 0x3a, 0x6d, 0xe3, 0x69, 0x67, 0x59, 0x0e, 0x2f,
+    0x25, 0x9f, 0xb9, 0x11, 0x59, 0x1a, 0xd3, 0x11, 0x1d, 0x5b, 0x2f, 0xaf, 0xa9, 0xd7, 0xd1, 0xd6, 0x62, 0x7a, 0xb4,
+    0x65, 0x2e, 0x03, 0x92, 0x8a, 0xc4, 0x7a, 0xad, 0xe2, 0x33, 0x38, 0x81, 0xcb, 0x71, 0xca, 0x63, 0x19, 0x29, 0x82,
+    0xed, 0xba, 0x71, 0xdd, 0x18, 0xd8, 0x0c, 0x5f, 0x3a, 0xf0, 0x74, 0x75, 0x53, 0xf0, 0xb7, 0xd6, 0xaf, 0xb9, 0x15,
+    0xa1, 0xea, 0xee, 0x0e, 0xa5, 0xdd, 0x35, 0xdf, 0x9a, 0x70, 0xe9, 0x9b, 0x9a, 0x9f, 0xc3, 0xc8, 0x98, 0x0e, 0xda,
+    0x5e, 0xaf, 0x45, 0xb5, 0xae, 0xfd, 0x4a, 0x06, 0xbe, 0x02, 0xd3, 0x5f, 0x6f, 0xa5, 0x0a, 0xa1, 0xd5, 0x1b, 0xf2,
+    0x6d, 0x69, 0x05, 0xc5, 0xf3, 0xb9, 0x6a, 0x88, 0xba, 0xc7, 0x87, 0x5a, 0x79, 0x05, 0xee, 0xa1, 0x72, 0x01, 0x74,
+    0xe8, 0xdd, 0x34, 0x32, 0x47, 0x41, 0xff, 0x32, 0x41, 0x79, 0xf8, 0x5c, 0x55, 0xef, 0xff, 0x01, 0xb9, 0x37, 0x65,
+    0xfc, 0x3f, 0x86, 0x00, 0x00};
 
 }  // namespace web_server
 }  // namespace esphome
+
 #endif
 #endif
diff --git a/esphome/components/web_server/server_index_v3.h b/esphome/components/web_server/server_index_v3.h
index 49de0cfab6..a7ad3ab543 100644
--- a/esphome/components/web_server/server_index_v3.h
+++ b/esphome/components/web_server/server_index_v3.h
@@ -1,10 +1,12 @@
 #pragma once
 // Generated from https://github.com/esphome/esphome-webserver
+
 #ifdef USE_WEBSERVER_LOCAL
 #if USE_WEBSERVER_VERSION == 3
-#include "esphome/core/hal.h"
-namespace esphome {
 
+#include "esphome/core/hal.h"
+
+namespace esphome {
 namespace web_server {
 
 const uint8_t INDEX_GZ[] PROGMEM = {
@@ -3629,367 +3631,368 @@ const uint8_t INDEX_GZ[] PROGMEM = {
     0x46, 0x5a, 0xa5, 0xf5, 0x21, 0x2e, 0x2e, 0xb9, 0x89, 0xa8, 0x62, 0xde, 0x56, 0x7a, 0x54, 0x88, 0x37, 0x2c, 0x80,
     0x9e, 0xd2, 0xd3, 0x9a, 0xff, 0x6c, 0x94, 0x54, 0x45, 0xfe, 0x13, 0xbf, 0x03, 0xe6, 0xaa, 0xac, 0xe4, 0x0a, 0x58,
     0xea, 0xf8, 0x52, 0x8b, 0x48, 0x68, 0xc8, 0xbf, 0xac, 0xba, 0xed, 0x96, 0x8f, 0x70, 0x49, 0x02, 0x5f, 0x36, 0xaa,
-    0xe4, 0xe5, 0x65, 0xce, 0xc3, 0xc0, 0xc4, 0xf8, 0x08, 0xa8, 0xad, 0x66, 0xf6, 0x7f, 0x8a, 0x3b, 0xda, 0xe5, 0xb6,
-    0x6d, 0xe4, 0xff, 0x7b, 0x0a, 0x86, 0xc9, 0xa5, 0x62, 0x42, 0xd2, 0xa4, 0x64, 0xd9, 0x8e, 0x64, 0xd9, 0x6d, 0x93,
-    0x74, 0xce, 0x1d, 0xb7, 0xe9, 0x24, 0xbe, 0xcc, 0x5d, 0x5d, 0x8f, 0x45, 0x51, 0x90, 0xc4, 0x0b, 0x45, 0x6a, 0x48,
-    0xca, 0x96, 0xab, 0xf2, 0x9e, 0xa5, 0xcf, 0x72, 0x4f, 0x76, 0xb3, 0xbb, 0x00, 0x08, 0x7e, 0xe8, 0xc3, 0x4d, 0x7a,
-    0x37, 0x3d, 0x5f, 0x44, 0x10, 0x00, 0x81, 0x05, 0xb0, 0xbb, 0xd8, 0xcf, 0x27, 0x8e, 0x08, 0xac, 0x69, 0xe4, 0x9b,
-    0x8e, 0x96, 0x98, 0x31, 0x93, 0x91, 0xe7, 0x88, 0xc1, 0x44, 0x11, 0xea, 0x1d, 0x6a, 0x21, 0xf8, 0xba, 0x14, 0x47,
-    0xd7, 0x1a, 0xc7, 0xcb, 0x51, 0xc8, 0x2c, 0xdc, 0xee, 0xf0, 0xc9, 0xf5, 0x68, 0x39, 0x1a, 0x41, 0x32, 0x95, 0x27,
-    0x8e, 0x09, 0xe1, 0x61, 0xe2, 0x14, 0xaf, 0x6d, 0xb9, 0xd1, 0x87, 0x49, 0xd9, 0x59, 0x75, 0xf8, 0x60, 0xd2, 0x01,
-    0x12, 0x19, 0xfa, 0x40, 0x06, 0x57, 0xb4, 0x86, 0x53, 0x3b, 0xd0, 0x3f, 0xc0, 0xee, 0x4b, 0xf5, 0x7e, 0xd3, 0xd1,
-    0x1f, 0x5c, 0xeb, 0x1f, 0x10, 0xc6, 0x98, 0x64, 0xf8, 0x35, 0xed, 0x5e, 0xdd, 0xd4, 0x49, 0x37, 0xbd, 0xc4, 0x74,
-    0x03, 0x20, 0x9b, 0x7d, 0x13, 0x78, 0xd3, 0x28, 0x4e, 0xb3, 0xc0, 0xd7, 0x6f, 0xfa, 0x17, 0x41, 0xeb, 0x7a, 0x9e,
-    0xb5, 0x8c, 0x1b, 0xd3, 0xcf, 0xd4, 0x4c, 0x25, 0x02, 0x61, 0x62, 0xa2, 0x92, 0x4d, 0x95, 0xd4, 0x13, 0xb4, 0xb5,
-    0xa2, 0x40, 0xcd, 0x58, 0xc9, 0xcf, 0x06, 0x50, 0xaf, 0x92, 0xf6, 0x04, 0xf3, 0x37, 0xe9, 0xd8, 0xd2, 0xe8, 0xd3,
-    0x85, 0xe2, 0xf5, 0x72, 0x8d, 0xa4, 0x3c, 0x2b, 0xa8, 0x25, 0x86, 0xea, 0x15, 0xfe, 0x2d, 0xf4, 0xfc, 0x44, 0xb5,
-    0xcd, 0x2c, 0xd1, 0xdd, 0xe1, 0x37, 0x65, 0xbe, 0x00, 0xe8, 0x37, 0x18, 0x46, 0x44, 0x71, 0xa6, 0x41, 0xfc, 0x19,
-    0xf8, 0xe2, 0xb0, 0x6a, 0xcb, 0xc5, 0x7b, 0x6d, 0x19, 0x39, 0x47, 0x06, 0xdf, 0x22, 0xf1, 0x6b, 0xf1, 0x28, 0x64,
-    0xa5, 0x40, 0x13, 0xc4, 0xd3, 0x47, 0xb0, 0x80, 0x59, 0x7c, 0x19, 0xdf, 0x57, 0xd5, 0x15, 0xaf, 0x87, 0xbb, 0x69,
-    0x2f, 0x12, 0x40, 0xd8, 0x6f, 0x22, 0xf9, 0x5e, 0x8b, 0xe7, 0x0f, 0x15, 0x8c, 0x4e, 0xe5, 0x4c, 0xa1, 0x7d, 0x86,
-    0xe0, 0x61, 0x32, 0x30, 0xe7, 0x42, 0x5a, 0x00, 0x28, 0x89, 0x93, 0xe9, 0x61, 0x7e, 0x2b, 0x32, 0x1c, 0x8b, 0xfc,
-    0xc2, 0x0a, 0x71, 0x06, 0xec, 0x1a, 0x2d, 0x96, 0x19, 0x46, 0xc4, 0x85, 0x01, 0xb0, 0x5c, 0xd7, 0x30, 0xc2, 0x26,
-    0x60, 0xe9, 0x82, 0x4d, 0xcc, 0x75, 0x2d, 0x18, 0xd7, 0xcb, 0x88, 0xe7, 0x05, 0xdc, 0x85, 0xe8, 0x1d, 0xc5, 0x49,
-    0xf0, 0x98, 0xf0, 0x59, 0xf8, 0x66, 0x11, 0x4d, 0xbe, 0xe5, 0xa3, 0xda, 0xa5, 0x01, 0x31, 0xf8, 0x84, 0xf8, 0xfa,
-    0xad, 0xb0, 0x71, 0xae, 0x10, 0x24, 0xb3, 0x34, 0xcb, 0xe1, 0xb3, 0x75, 0x94, 0x9f, 0x3f, 0x5b, 0xa7, 0xf9, 0xe0,
-    0xd9, 0xda, 0x03, 0x46, 0x2e, 0xd7, 0x61, 0x9e, 0x85, 0x3b, 0x4d, 0x31, 0x3b, 0xd8, 0x53, 0x54, 0xae, 0xa1, 0x3e,
-    0x7d, 0xc0, 0xb5, 0xe6, 0x8b, 0x24, 0x98, 0x7b, 0xc9, 0x03, 0x29, 0xd9, 0x4d, 0x55, 0x13, 0x6f, 0xe8, 0x1a, 0xa1,
-    0x75, 0x9a, 0x2e, 0x61, 0x78, 0x5d, 0xfb, 0x5a, 0x96, 0x31, 0x3e, 0x39, 0xa9, 0x69, 0x84, 0x6f, 0xdd, 0xea, 0x2f,
-    0x99, 0x3d, 0x66, 0x99, 0x17, 0x84, 0xd4, 0xa4, 0x2f, 0x52, 0xc8, 0xd7, 0x66, 0x93, 0x96, 0x67, 0x13, 0x95, 0x77,
-    0x0b, 0x4e, 0x86, 0x10, 0x3e, 0x8d, 0x1b, 0x67, 0x86, 0xa9, 0xa5, 0x9a, 0xd7, 0x8f, 0xde, 0xfd, 0x4f, 0xa1, 0xcf,
-    0x00, 0xfa, 0x11, 0x40, 0x9f, 0x45, 0x7e, 0x3c, 0x66, 0x7f, 0x7f, 0x7f, 0x21, 0x73, 0x59, 0x81, 0x58, 0x66, 0xc8,
-    0xb7, 0x61, 0x8a, 0xdc, 0x42, 0x82, 0x9c, 0x02, 0x65, 0x9d, 0x2a, 0x76, 0x4c, 0x92, 0xeb, 0xda, 0x39, 0x8d, 0x9d,
-    0x8d, 0x69, 0xd4, 0x83, 0x18, 0x5b, 0x25, 0xf9, 0xe9, 0x01, 0xd5, 0x26, 0xda, 0x46, 0x95, 0x00, 0x0c, 0x09, 0xcc,
-    0xb0, 0x80, 0x02, 0xa4, 0xdd, 0x1c, 0xb8, 0xc5, 0xf5, 0xc1, 0x9e, 0xa3, 0xf0, 0xdb, 0x3d, 0x2f, 0x33, 0x26, 0xd8,
-    0x4a, 0x3f, 0x3b, 0xc5, 0x44, 0x5a, 0x40, 0x9d, 0x21, 0xf4, 0xc6, 0xe9, 0x01, 0x3d, 0x6a, 0x95, 0xfd, 0x5f, 0x74,
-    0x22, 0x2e, 0x72, 0x3d, 0xde, 0xc1, 0xa3, 0x0e, 0x06, 0xe4, 0x6d, 0x87, 0x52, 0x2f, 0xd7, 0xb5, 0x39, 0x67, 0x84,
-    0x78, 0x8c, 0x1f, 0x08, 0x00, 0xe0, 0xc0, 0x49, 0xd5, 0xb5, 0xb9, 0xb7, 0xc2, 0x99, 0x8b, 0x37, 0xde, 0xaa, 0xe5,
-    0xf2, 0x57, 0xb6, 0x04, 0x54, 0x5a, 0x3e, 0x5a, 0x3e, 0x5f, 0x5c, 0xb0, 0xee, 0x17, 0x42, 0xdb, 0xd6, 0x0c, 0xb5,
-    0xa6, 0x0d, 0x8b, 0x3b, 0x13, 0x8b, 0x3b, 0xde, 0xb0, 0xb8, 0xe3, 0x2d, 0x8b, 0x1b, 0xf2, 0x85, 0xd4, 0x24, 0xe8,
-    0x12, 0xf4, 0xd8, 0x92, 0xc0, 0xe3, 0x6c, 0x45, 0x8f, 0x9f, 0x33, 0x84, 0x93, 0x95, 0x86, 0x60, 0xb1, 0xb4, 0x01,
-    0x56, 0x4d, 0x70, 0x51, 0x00, 0xa1, 0xa2, 0x94, 0xb4, 0x74, 0xe8, 0xc4, 0xb4, 0x21, 0x2f, 0x66, 0x2b, 0xac, 0x4e,
-    0x17, 0x36, 0x29, 0xe5, 0xfc, 0x6e, 0xcd, 0x36, 0x4c, 0x74, 0xb6, 0x65, 0xa2, 0x7e, 0xe9, 0xe4, 0xf2, 0x59, 0xd3,
-    0x19, 0x54, 0xe7, 0x04, 0x5b, 0x10, 0x8c, 0x38, 0x71, 0xc7, 0x94, 0xb7, 0xe1, 0x66, 0x84, 0xaa, 0x6c, 0xa8, 0x85,
-    0x97, 0xa6, 0xf7, 0x71, 0x02, 0x5a, 0x10, 0xe8, 0xe6, 0x71, 0x3b, 0x6a, 0x1e, 0x44, 0x3c, 0xc0, 0xca, 0xc6, 0xbd,
-    0x54, 0xbc, 0x57, 0x77, 0x54, 0xbb, 0xdb, 0xa5, 0x1a, 0x0b, 0x2f, 0xcb, 0x58, 0x82, 0x30, 0xf7, 0x20, 0x12, 0x77,
-    0x0d, 0xd8, 0xff, 0x97, 0x4d, 0xd6, 0x80, 0x41, 0x42, 0xa3, 0xc0, 0xe9, 0x88, 0x9f, 0x17, 0xc0, 0x47, 0x25, 0x82,
-    0xe8, 0x2a, 0xb1, 0xda, 0x12, 0x09, 0xf7, 0x1f, 0xf1, 0xb0, 0xb6, 0x12, 0xc5, 0x9b, 0xc8, 0x3d, 0x32, 0xec, 0x85,
-    0x37, 0xfe, 0x00, 0xba, 0xb6, 0x56, 0xdb, 0x04, 0xbb, 0x59, 0x35, 0x32, 0x5b, 0x42, 0x8c, 0x9d, 0x5f, 0xa0, 0x48,
-    0xc4, 0x91, 0xdc, 0x2a, 0x09, 0x1c, 0x1a, 0x3d, 0x6b, 0x72, 0xb3, 0x6e, 0xe7, 0x07, 0xd3, 0xc0, 0xa8, 0xe1, 0x4c,
-    0x40, 0x6c, 0xe1, 0xe0, 0x4c, 0xde, 0xaf, 0x42, 0xd3, 0x3d, 0x32, 0x40, 0x18, 0x7b, 0x0d, 0x29, 0x46, 0x1d, 0x71,
-    0x79, 0x1d, 0x26, 0x40, 0xa2, 0xae, 0x9d, 0x9b, 0xfc, 0xf9, 0x14, 0x7f, 0xb9, 0x37, 0xf9, 0xf3, 0x11, 0xfe, 0x6a,
-    0xdf, 0x60, 0x32, 0xb9, 0x86, 0x4b, 0xbb, 0x32, 0x67, 0xfd, 0xac, 0xb4, 0x9d, 0xc8, 0x24, 0xec, 0xf1, 0x04, 0xfa,
-    0xe9, 0xb3, 0x75, 0x0a, 0x4e, 0x90, 0xea, 0x1c, 0x22, 0x3b, 0x31, 0xf2, 0xc6, 0xf2, 0xe9, 0x86, 0xf2, 0x91, 0xf1,
-    0x3f, 0xa6, 0xf2, 0xb8, 0x4b, 0xe2, 0x82, 0xa2, 0x94, 0x45, 0x0e, 0xb7, 0xa3, 0x20, 0xf2, 0x92, 0x87, 0x5b, 0xba,
-    0x4a, 0xb4, 0x04, 0x9f, 0x2e, 0x45, 0x29, 0xc4, 0x4a, 0x96, 0x35, 0x50, 0x99, 0x22, 0x73, 0x7d, 0xe0, 0x64, 0x7e,
-    0xf0, 0x8f, 0x44, 0x61, 0xd1, 0x4a, 0x97, 0x4d, 0xbe, 0x20, 0xa5, 0x0f, 0xdd, 0x3e, 0x5b, 0xb7, 0x58, 0xbd, 0x9b,
-    0xca, 0x6c, 0x2b, 0x3c, 0x20, 0x2c, 0x0f, 0x5e, 0x5c, 0xe7, 0xe3, 0xa0, 0x87, 0x2a, 0xa6, 0x51, 0xbc, 0xb2, 0x9e,
-    0xad, 0xb3, 0x73, 0x7d, 0xee, 0x25, 0x9f, 0xd8, 0xd8, 0xf2, 0x83, 0xc4, 0x0f, 0x99, 0xde, 0xd3, 0x47, 0xa1, 0x17,
-    0x7d, 0xe2, 0x8f, 0x56, 0xbc, 0xcc, 0x50, 0x69, 0xbc, 0xf3, 0x9e, 0x2b, 0x60, 0x42, 0xe2, 0x39, 0x64, 0x4c, 0x1b,
-    0xa0, 0xa0, 0xbd, 0x96, 0xc2, 0xad, 0x82, 0x29, 0x2c, 0x6a, 0x99, 0x60, 0xf3, 0x08, 0x7a, 0x6c, 0x70, 0x22, 0x35,
-    0x75, 0x5c, 0x2f, 0xdd, 0x54, 0xa7, 0x4a, 0x82, 0x49, 0x99, 0x05, 0xf1, 0x16, 0x7b, 0xf8, 0xe3, 0x9f, 0xa3, 0xfc,
-    0xd4, 0xfb, 0x7f, 0x8e, 0x73, 0x78, 0x9b, 0x3f, 0xa8, 0x36, 0xf6, 0xd2, 0x74, 0x39, 0x67, 0x63, 0xd2, 0x97, 0x9d,
-    0x17, 0x43, 0x29, 0x33, 0xf2, 0xea, 0x70, 0x7e, 0x59, 0xb6, 0x8f, 0x0f, 0x5f, 0x83, 0x1e, 0x1f, 0x38, 0xba, 0x78,
-    0x32, 0xd1, 0x8b, 0x2b, 0xf5, 0x8e, 0x66, 0xee, 0xe1, 0x2f, 0xcb, 0xef, 0xde, 0x3a, 0xdf, 0xc9, 0xc6, 0x91, 0x6e,
-    0xe4, 0x43, 0xa1, 0x94, 0xe4, 0x8c, 0xa9, 0x32, 0x5e, 0x31, 0xa3, 0x89, 0x17, 0x6d, 0x9e, 0xce, 0x75, 0x69, 0x97,
-    0x2d, 0x18, 0x1b, 0x83, 0xbd, 0xaa, 0x59, 0x2b, 0xbd, 0x0d, 0xd9, 0x1d, 0x93, 0x0a, 0xcf, 0xfa, 0xc7, 0x1a, 0x5a,
-    0x60, 0x44, 0x36, 0xae, 0x48, 0xe5, 0x6c, 0x95, 0x32, 0xa5, 0x21, 0xce, 0x81, 0xcf, 0x5c, 0xdd, 0xe5, 0x95, 0x5d,
-    0x3d, 0x34, 0x75, 0x65, 0x00, 0x1b, 0x47, 0x76, 0xbe, 0xa1, 0xbc, 0x87, 0xe9, 0x98, 0x9b, 0xc7, 0x66, 0xba, 0x46,
-    0x0f, 0x22, 0x58, 0x73, 0x38, 0x85, 0xb0, 0xf9, 0x5b, 0x85, 0xf4, 0x61, 0x13, 0xc4, 0x9a, 0x64, 0x52, 0xba, 0x90,
-    0xf1, 0x34, 0x2e, 0x84, 0x56, 0x9e, 0xe6, 0x08, 0x73, 0x9a, 0x46, 0x2c, 0x4d, 0x37, 0x42, 0x47, 0xae, 0xb0, 0xa9,
-    0x17, 0xb5, 0xcb, 0x93, 0x2f, 0xca, 0x4d, 0xc7, 0x04, 0x0a, 0x8c, 0xb3, 0xa9, 0x7e, 0x0b, 0xd1, 0xf9, 0xed, 0x9c,
-    0x9b, 0x6c, 0x24, 0xd3, 0x91, 0xce, 0xd5, 0xe9, 0x9b, 0xde, 0xdf, 0xeb, 0x7c, 0x50, 0x25, 0xb2, 0xd8, 0x38, 0xb4,
-    0x56, 0x09, 0xd5, 0xd5, 0x44, 0x31, 0xd8, 0x81, 0x18, 0x53, 0x05, 0x9f, 0xb1, 0xc9, 0x84, 0xf9, 0x59, 0x6a, 0x08,
-    0xc1, 0x8c, 0x0c, 0xa0, 0x0a, 0x8e, 0x33, 0x4f, 0x06, 0xfa, 0x8f, 0xe0, 0x46, 0x2e, 0xe2, 0x0c, 0xf1, 0x01, 0x89,
-    0x1b, 0x4a, 0x33, 0x98, 0xa8, 0xc7, 0x32, 0x88, 0xf8, 0x57, 0x20, 0x3f, 0x76, 0x43, 0x39, 0x0e, 0x8d, 0xe3, 0xfb,
-    0x62, 0x13, 0xc4, 0xd2, 0xb0, 0x63, 0x3b, 0xb6, 0xd9, 0x76, 0x56, 0xd7, 0xee, 0x77, 0x5d, 0xd7, 0xc9, 0x75, 0x13,
-    0xdc, 0x97, 0x3e, 0xed, 0x7b, 0xc2, 0xb1, 0x55, 0x07, 0x5a, 0x2d, 0xa3, 0xc7, 0xb4, 0x6b, 0xbb, 0xaf, 0x5c, 0xdd,
-    0x24, 0xab, 0x31, 0x05, 0x91, 0xf9, 0xf1, 0x1d, 0x4b, 0x3e, 0x7b, 0x2a, 0xe5, 0xce, 0xf7, 0x1b, 0xcf, 0x91, 0xeb,
-    0x00, 0xc6, 0xcd, 0xe2, 0xc5, 0x23, 0xa6, 0xd0, 0xd1, 0x4d, 0xdd, 0x0f, 0xe3, 0x94, 0xa9, 0x73, 0x20, 0x01, 0xc3,
-    0x67, 0x4e, 0xe2, 0xa7, 0xf7, 0x6f, 0x3f, 0x7c, 0xd0, 0x4d, 0x4c, 0x86, 0x99, 0xaa, 0xbd, 0xf3, 0x0d, 0xb5, 0x03,
-    0xd5, 0x37, 0xee, 0x3b, 0x22, 0x27, 0x74, 0x85, 0x2c, 0xef, 0x39, 0x2a, 0xab, 0x6d, 0x39, 0x4e, 0x66, 0xf8, 0x97,
-    0xe9, 0xde, 0xb7, 0xd7, 0xbc, 0x1a, 0x70, 0xc3, 0x76, 0x5a, 0x56, 0x2a, 0x99, 0x07, 0xd1, 0x6d, 0x43, 0xa9, 0xb7,
-    0x6a, 0x28, 0x85, 0x8b, 0x53, 0x0d, 0x57, 0x2d, 0xe3, 0xb9, 0x42, 0x8a, 0x21, 0x97, 0xf1, 0x2e, 0x70, 0x29, 0xd7,
-    0x97, 0xcf, 0x18, 0x34, 0x0f, 0x66, 0x5e, 0x1d, 0x75, 0x43, 0x31, 0xbf, 0x73, 0x48, 0xd8, 0xfa, 0x21, 0xd8, 0xbc,
-    0x31, 0x55, 0xe3, 0x55, 0x66, 0xd3, 0xa4, 0xc5, 0xaa, 0xd2, 0x09, 0xb1, 0x93, 0xb7, 0x19, 0x9b, 0x2f, 0x58, 0xe2,
-    0x65, 0xcb, 0x84, 0xdd, 0x86, 0xf1, 0xfd, 0x93, 0xc2, 0xa2, 0x7c, 0x47, 0xe5, 0x59, 0x30, 0x9d, 0xc9, 0xda, 0xe7,
-    0x2d, 0x36, 0x90, 0x0b, 0xb8, 0xf5, 0x03, 0xf9, 0x7f, 0x7e, 0xb7, 0xed, 0xff, 0xfc, 0xbe, 0xb3, 0x2a, 0x74, 0x9f,
-    0x0f, 0xcd, 0x6c, 0xb0, 0xc7, 0xbe, 0x68, 0xfe, 0x52, 0x19, 0xe6, 0xcd, 0x75, 0x6a, 0x8b, 0x00, 0xef, 0x6b, 0x4b,
-    0x50, 0x2b, 0x2c, 0xef, 0x9b, 0x47, 0x0d, 0x0c, 0xe6, 0xb5, 0x73, 0x64, 0x50, 0xe9, 0xb3, 0x86, 0x36, 0x34, 0x7a,
-    0x7b, 0xad, 0xc8, 0x1f, 0x87, 0xf0, 0xae, 0x39, 0x7c, 0xe6, 0xf0, 0xb9, 0x14, 0xf0, 0xf5, 0x70, 0x28, 0xd3, 0xab,
-    0xa9, 0x4d, 0xc1, 0xca, 0xfd, 0xbc, 0x56, 0xc2, 0x89, 0x67, 0xcf, 0x31, 0xc8, 0xfd, 0x7c, 0xf0, 0x7a, 0x88, 0xf6,
-    0x58, 0xa7, 0xa3, 0xa4, 0x60, 0x56, 0x36, 0xa2, 0x36, 0xb2, 0xa7, 0xae, 0x75, 0x5a, 0xc3, 0x6b, 0x50, 0x8a, 0x39,
-    0xb7, 0xf2, 0xa1, 0x61, 0xbe, 0x1e, 0x72, 0x31, 0x0e, 0x37, 0x01, 0xed, 0x55, 0xb7, 0x36, 0x17, 0x82, 0x96, 0x80,
-    0x6e, 0x6a, 0xa4, 0x5b, 0xc1, 0xca, 0xac, 0x90, 0x9a, 0xa1, 0xf0, 0x1c, 0x6e, 0xf0, 0xc3, 0x1c, 0x53, 0x7e, 0xbc,
-    0xdb, 0x64, 0x26, 0xf5, 0xd3, 0x6e, 0x33, 0xa9, 0xab, 0xbd, 0xcc, 0xa4, 0x7e, 0xfa, 0xe2, 0x66, 0x52, 0xef, 0x54,
-    0x33, 0x29, 0x58, 0xc4, 0xb7, 0x6c, 0x2f, 0xdb, 0x25, 0x61, 0x11, 0x11, 0xdf, 0xa7, 0x03, 0x97, 0xf3, 0xaf, 0xa9,
-    0x3f, 0x63, 0x70, 0x27, 0xe7, 0xab, 0x12, 0xc6, 0x53, 0xb0, 0x63, 0xfa, 0xf3, 0x2d, 0x8e, 0xc2, 0x78, 0xaa, 0xda,
-    0x1b, 0x45, 0x3c, 0xe8, 0x69, 0x11, 0xc8, 0x88, 0x6c, 0x7c, 0x1c, 0x53, 0x84, 0x3d, 0xb2, 0x0e, 0x0d, 0x25, 0xb1,
-    0xb3, 0x34, 0xe0, 0x6a, 0x0b, 0x2b, 0xa0, 0x1e, 0x1a, 0x10, 0xc9, 0x86, 0xed, 0x97, 0x22, 0xbc, 0x83, 0xda, 0x83,
-    0x34, 0x94, 0xa5, 0x50, 0x09, 0x6b, 0xfd, 0x97, 0x95, 0xfb, 0xed, 0xb5, 0xdb, 0xef, 0xb8, 0xe0, 0x9f, 0x0c, 0x37,
-    0x3a, 0x2c, 0x70, 0xfa, 0x9d, 0x0e, 0x14, 0xdc, 0x2b, 0x05, 0x6d, 0x28, 0x08, 0x94, 0x82, 0x2e, 0x14, 0xf8, 0x4a,
-    0xc1, 0x11, 0x14, 0x8c, 0x95, 0x82, 0x63, 0x28, 0xb8, 0xd3, 0xf3, 0xeb, 0x48, 0x0e, 0xf7, 0xd8, 0xb8, 0x31, 0xe9,
-    0x06, 0x21, 0xca, 0x8e, 0x4d, 0x17, 0x0c, 0x87, 0xbc, 0x69, 0x2f, 0x36, 0x49, 0x98, 0xd7, 0x4b, 0xcc, 0xfb, 0x19,
-    0xa3, 0x58, 0xc9, 0x6f, 0x90, 0xe6, 0xd8, 0x59, 0x0c, 0xa6, 0xc3, 0x22, 0x06, 0x81, 0x80, 0x83, 0xa6, 0x1b, 0x20,
-    0xa0, 0xe9, 0xcb, 0x95, 0x13, 0x71, 0x1c, 0x94, 0xb5, 0x2c, 0xde, 0xd1, 0xe7, 0x2c, 0xb9, 0x05, 0x0a, 0x6b, 0x8e,
-    0x96, 0x2a, 0x04, 0xfc, 0x12, 0x3a, 0xfd, 0x37, 0x6c, 0xb4, 0x9c, 0x6a, 0x97, 0xf1, 0x74, 0xa7, 0x7a, 0x5e, 0x7d,
-    0x05, 0xa3, 0xd4, 0x49, 0xd9, 0x61, 0x89, 0x6d, 0xc9, 0xbf, 0x45, 0x8f, 0x79, 0xb9, 0x7e, 0x06, 0x63, 0xd3, 0x32,
-    0x32, 0x0e, 0x81, 0xef, 0x00, 0x8c, 0x14, 0xfd, 0xf8, 0x25, 0xc0, 0x59, 0x79, 0xbe, 0xf2, 0x94, 0xf1, 0x9c, 0xfd,
-    0xc0, 0xd2, 0xd4, 0x9b, 0x8a, 0xfa, 0xf5, 0x71, 0x82, 0x41, 0x8c, 0xbc, 0x7f, 0x21, 0x00, 0x41, 0x72, 0x16, 0xd4,
-    0xec, 0x1e, 0x92, 0xf8, 0x5e, 0x03, 0xcb, 0x1a, 0xd8, 0x50, 0x85, 0x0d, 0x40, 0x60, 0xc3, 0x12, 0x96, 0xb5, 0xf5,
-    0x70, 0xf8, 0xef, 0x58, 0x58, 0x2d, 0xcc, 0xbc, 0x69, 0xb5, 0x88, 0xf6, 0x41, 0xae, 0x8e, 0x4d, 0x2a, 0xcb, 0x4b,
-    0x85, 0x9f, 0xa3, 0xfd, 0x0d, 0xe3, 0xe9, 0x9f, 0xaa, 0xfa, 0xdd, 0xa2, 0xb2, 0xff, 0x10, 0x99, 0x41, 0x36, 0xb4,
-    0x11, 0xc6, 0x9a, 0x0d, 0x20, 0xec, 0x45, 0xd9, 0xcc, 0x42, 0xef, 0xaa, 0x56, 0x3b, 0x32, 0x4c, 0x1b, 0xd7, 0x76,
-    0x5d, 0xf5, 0x29, 0xed, 0x25, 0xd3, 0x91, 0xd7, 0x72, 0xdb, 0xc7, 0xa6, 0xf8, 0xb3, 0x9d, 0xae, 0x91, 0x63, 0x0f,
-    0xda, 0x38, 0xb8, 0x5b, 0x4f, 0xe2, 0x28, 0xb3, 0x26, 0xde, 0x3c, 0x08, 0x1f, 0x7a, 0xf3, 0x38, 0x8a, 0xd3, 0x85,
-    0xe7, 0xb3, 0x3e, 0x79, 0xd0, 0x81, 0x2b, 0x69, 0x1f, 0xa3, 0x15, 0x70, 0x87, 0x39, 0xd7, 0x6e, 0x27, 0x6c, 0x4e,
-    0xad, 0x65, 0x30, 0x82, 0x49, 0xc8, 0x56, 0x39, 0xff, 0x7c, 0xa9, 0x32, 0x55, 0xc5, 0x2d, 0x47, 0x2d, 0x80, 0x23,
-    0xe5, 0x91, 0x0e, 0x20, 0xbe, 0x4f, 0x7f, 0xe1, 0x8d, 0x31, 0x38, 0x9f, 0xdd, 0xee, 0x26, 0x6c, 0xae, 0xd9, 0xdd,
-    0x8d, 0x9d, 0x27, 0xf1, 0xfd, 0x19, 0x8c, 0x16, 0x1b, 0x5b, 0x29, 0x0b, 0x27, 0xf8, 0xc6, 0x42, 0xe7, 0x0a, 0xd1,
-    0x8f, 0x85, 0x17, 0x71, 0xe8, 0x8d, 0xcd, 0xfb, 0xf0, 0xba, 0xd7, 0xd6, 0x9c, 0xfe, 0x3c, 0x88, 0x2c, 0x9a, 0xce,
-    0xb1, 0xb3, 0x50, 0xfa, 0x52, 0xe1, 0x67, 0xac, 0xb1, 0xba, 0xab, 0x39, 0x7d, 0xb8, 0xac, 0x4d, 0xc2, 0xf8, 0xbe,
-    0x37, 0x0b, 0xc6, 0x63, 0x16, 0xf5, 0x71, 0xcc, 0xb2, 0x90, 0x85, 0x61, 0xb0, 0x48, 0x83, 0xb4, 0x3f, 0xf7, 0x56,
-    0xbc, 0xd7, 0xc3, 0x4d, 0xbd, 0x76, 0x78, 0xaf, 0x9d, 0xbd, 0x7b, 0x55, 0xba, 0x01, 0x47, 0x0e, 0xea, 0x87, 0x0f,
-    0xad, 0xab, 0x39, 0x95, 0x79, 0xee, 0xdd, 0xeb, 0x22, 0x61, 0xeb, 0xb9, 0x97, 0x4c, 0x83, 0xa8, 0xe7, 0xe4, 0xf6,
-    0xdd, 0x9a, 0x36, 0xc6, 0xd3, 0x93, 0x93, 0x93, 0xdc, 0x1e, 0x8b, 0x27, 0x67, 0x3c, 0xce, 0x6d, 0x5f, 0x3c, 0x4d,
-    0x26, 0x8e, 0x33, 0x99, 0xe4, 0x76, 0x20, 0x0a, 0x3a, 0x6d, 0x7f, 0xdc, 0x69, 0xe7, 0xf6, 0xbd, 0x52, 0x23, 0xb7,
-    0x19, 0x7f, 0x4a, 0xd8, 0xb8, 0x8f, 0x1b, 0xe9, 0x9e, 0x96, 0xfe, 0xd8, 0x71, 0x72, 0xc4, 0x00, 0xd7, 0x25, 0xdc,
-    0x84, 0x82, 0x9d, 0x9b, 0xf5, 0xde, 0x35, 0xb5, 0xe2, 0x73, 0xbe, 0xdf, 0x58, 0x6f, 0xec, 0x25, 0x9f, 0x6e, 0x34,
-    0x65, 0x16, 0x9e, 0x47, 0xd5, 0xd6, 0x02, 0x0c, 0xd6, 0xaa, 0x07, 0x51, 0xab, 0xfa, 0xa3, 0x38, 0x81, 0x33, 0x9b,
-    0x78, 0xe3, 0x60, 0x99, 0xf6, 0xdc, 0xf6, 0x62, 0x25, 0x8a, 0xf8, 0x5e, 0x2f, 0x0a, 0xf0, 0xec, 0xf5, 0xd2, 0x38,
-    0x0c, 0xc6, 0xa2, 0x68, 0xd3, 0x59, 0x72, 0xdb, 0x46, 0x1f, 0x7d, 0xb6, 0x03, 0x8c, 0x3c, 0xe0, 0x85, 0xa1, 0x66,
-    0x77, 0x52, 0x8d, 0x79, 0x29, 0xca, 0x73, 0x35, 0x27, 0x25, 0xb8, 0xa0, 0x7f, 0xb6, 0x7b, 0xb8, 0x58, 0xc9, 0x3d,
-    0xef, 0x1e, 0x2d, 0x56, 0xf9, 0xd7, 0x73, 0x36, 0x0e, 0x3c, 0xad, 0x55, 0xec, 0x26, 0xd7, 0x01, 0x99, 0xaf, 0xb1,
-    0xde, 0xb0, 0x4d, 0xc5, 0xb1, 0x80, 0xe8, 0x7e, 0x4f, 0x82, 0xf9, 0x22, 0x4e, 0x32, 0x2f, 0xca, 0xf2, 0x7c, 0x78,
-    0x93, 0xe7, 0xfd, 0xab, 0xa0, 0x75, 0xfd, 0xcf, 0x16, 0xd1, 0x69, 0xd2, 0x91, 0xe4, 0xc6, 0x8d, 0xf9, 0x96, 0xa9,
-    0xf6, 0x18, 0x40, 0xc6, 0xd0, 0x16, 0x43, 0xad, 0x4c, 0x54, 0xb2, 0x5e, 0x99, 0x80, 0x2c, 0xab, 0x93, 0x7d, 0x47,
-    0xb9, 0x0a, 0x52, 0x20, 0xa8, 0xf0, 0x96, 0x0d, 0xae, 0x14, 0xdb, 0x0e, 0x60, 0x56, 0xb0, 0x32, 0x99, 0xd6, 0x3f,
-    0xdb, 0xc4, 0x33, 0x7e, 0xb3, 0x9b, 0x67, 0xfc, 0x39, 0xdb, 0x87, 0x67, 0xfc, 0xe6, 0x8b, 0xf3, 0x8c, 0xcf, 0xea,
-    0xa6, 0xf5, 0x17, 0xf1, 0x40, 0x97, 0x12, 0x7d, 0x20, 0x4d, 0x09, 0x05, 0xad, 0xb9, 0xf8, 0xc3, 0x96, 0xf0, 0xa2,
-    0x37, 0x4a, 0xc3, 0x46, 0x94, 0x1b, 0x84, 0xaf, 0xef, 0xa2, 0xc1, 0x3f, 0x12, 0xf5, 0x79, 0x32, 0x19, 0xbc, 0x89,
-    0x95, 0x02, 0xf9, 0xc4, 0x4d, 0x1d, 0x4a, 0x01, 0x06, 0xe8, 0x8d, 0xb0, 0x70, 0xc4, 0x14, 0x0c, 0xe0, 0x9f, 0x4c,
-    0x16, 0xbd, 0x63, 0x69, 0xd9, 0xd5, 0x2f, 0x0f, 0xa1, 0x25, 0xcd, 0x29, 0x85, 0x17, 0x4a, 0x4d, 0x94, 0x38, 0x65,
-    0x19, 0x77, 0x1b, 0xfd, 0xf6, 0xe1, 0x62, 0xdc, 0xba, 0x88, 0x8d, 0x3c, 0x48, 0xdf, 0x55, 0x7d, 0x40, 0xb8, 0xae,
-    0x65, 0xa0, 0x4e, 0x27, 0xe7, 0xd6, 0x59, 0x6a, 0x8e, 0x65, 0x78, 0x4d, 0xcd, 0xcf, 0x4b, 0x33, 0xed, 0xa9, 0x0d,
-    0x79, 0xae, 0xa7, 0x1a, 0x31, 0xe6, 0x06, 0xf8, 0x6b, 0xce, 0x01, 0x62, 0xfa, 0x2a, 0x74, 0x9d, 0x1d, 0x53, 0xf3,
-    0x60, 0x9c, 0xe7, 0x46, 0x5f, 0x00, 0x42, 0x21, 0xb4, 0x6c, 0x17, 0x13, 0x97, 0xde, 0x4b, 0x0b, 0x02, 0xae, 0x91,
-    0x23, 0x75, 0xdb, 0x05, 0xa8, 0xaf, 0xb9, 0x72, 0x8e, 0xc3, 0x4c, 0xd7, 0x08, 0x7c, 0x64, 0xd6, 0xa0, 0x4c, 0x08,
-    0xd4, 0xfa, 0x12, 0xfe, 0xe2, 0x95, 0x28, 0xa8, 0xdb, 0x47, 0x12, 0x70, 0x50, 0xff, 0x0e, 0x8e, 0xee, 0x44, 0xfe,
-    0xb9, 0x0e, 0xb0, 0xc7, 0xeb, 0xe0, 0x43, 0xae, 0x4b, 0xde, 0x0f, 0xb7, 0xdf, 0xd9, 0xe9, 0x01, 0x34, 0x38, 0xab,
-    0xa8, 0xe9, 0x77, 0x58, 0xff, 0x01, 0x2b, 0x91, 0xde, 0x9b, 0x76, 0x7a, 0xaf, 0xbd, 0x58, 0x8b, 0x20, 0x11, 0x99,
-    0xb7, 0xb0, 0xe0, 0x8a, 0x8f, 0xb8, 0x97, 0x63, 0x3c, 0x25, 0x1e, 0x45, 0x7f, 0x99, 0x02, 0x6e, 0xc4, 0x8b, 0x2a,
-    0xe2, 0x9f, 0xbe, 0xbf, 0x4c, 0xd2, 0x38, 0xe9, 0x2d, 0xe2, 0x20, 0xca, 0x58, 0x92, 0x23, 0xa8, 0xae, 0x11, 0x3e,
-    0x02, 0x3c, 0x37, 0xeb, 0x78, 0xe1, 0xf9, 0x41, 0xf6, 0xd0, 0x73, 0x38, 0x4b, 0xe1, 0xf4, 0x39, 0x77, 0xe0, 0x34,
-    0xd6, 0xef, 0x71, 0x68, 0xbe, 0x44, 0xc6, 0x2f, 0xa9, 0xb3, 0x33, 0xea, 0x36, 0xef, 0x2b, 0x6f, 0x29, 0x4c, 0x06,
-    0xb0, 0x1f, 0x5e, 0x62, 0x4d, 0x01, 0xcb, 0xc3, 0x52, 0x3b, 0x63, 0x36, 0x35, 0x11, 0x6b, 0x83, 0x5c, 0x5e, 0xfc,
-    0xd9, 0x5d, 0x43, 0x73, 0x9a, 0x8b, 0x81, 0xe3, 0x31, 0xf6, 0x19, 0x59, 0xcf, 0x83, 0xa4, 0x52, 0xe6, 0x3e, 0x35,
-    0x47, 0x6c, 0x12, 0x27, 0x8c, 0x42, 0xaa, 0xba, 0x27, 0x8b, 0xd5, 0xfe, 0xdd, 0x6f, 0x9f, 0x7e, 0x73, 0x3f, 0x51,
-    0x9c, 0xb5, 0x44, 0x67, 0xc6, 0x8e, 0xde, 0xea, 0xf4, 0x0c, 0x58, 0x43, 0x82, 0xbc, 0x4f, 0xd1, 0xab, 0x7a, 0xba,
-    0xde, 0x6f, 0x8c, 0x5c, 0xb5, 0x88, 0x39, 0xcd, 0x4b, 0x58, 0xe8, 0x65, 0xc1, 0x9d, 0xe0, 0x19, 0x3b, 0x47, 0x8b,
-    0x95, 0x58, 0x63, 0x24, 0x78, 0x8f, 0x58, 0xa4, 0xca, 0x50, 0xc4, 0x22, 0x55, 0x8b, 0x71, 0x91, 0xfa, 0xb5, 0xd9,
-    0x88, 0x60, 0x0e, 0x15, 0x4a, 0xdf, 0x5d, 0xac, 0x54, 0x12, 0x5d, 0x34, 0x93, 0x94, 0xba, 0x1a, 0x85, 0x6b, 0x1e,
-    0x8c, 0xc7, 0x21, 0xcb, 0x4b, 0x0b, 0x5d, 0x5e, 0x4b, 0x05, 0x38, 0x12, 0x0e, 0xde, 0x28, 0x8d, 0xc3, 0x65, 0xc6,
-    0x9a, 0xc1, 0x45, 0xc0, 0x69, 0x3b, 0x05, 0x70, 0xf0, 0x77, 0x79, 0xac, 0x5d, 0x60, 0xb7, 0x61, 0x9b, 0x38, 0x7d,
-    0x08, 0xba, 0x6b, 0x75, 0xca, 0x43, 0x87, 0x57, 0x72, 0xd0, 0x66, 0xc3, 0x44, 0x4c, 0x20, 0x4b, 0x84, 0xbd, 0x35,
-    0xdb, 0xe5, 0x65, 0x32, 0xf0, 0xa8, 0x2c, 0xca, 0xcb, 0x93, 0xf9, 0x73, 0xce, 0xd8, 0xab, 0xe6, 0x33, 0xf6, 0x4a,
-    0x9c, 0xb1, 0xed, 0x3b, 0xf3, 0xe9, 0xc4, 0x85, 0xff, 0xfa, 0xc5, 0x84, 0x7a, 0x8e, 0xd6, 0x59, 0xac, 0x34, 0x77,
-    0xb1, 0xd2, 0xac, 0xf6, 0x62, 0xa5, 0x61, 0xd7, 0x68, 0x7f, 0x61, 0xda, 0x6d, 0xc3, 0x74, 0x34, 0x28, 0x84, 0x3f,
-    0xa7, 0xf4, 0xca, 0x3d, 0x84, 0x77, 0xd0, 0xaa, 0x5b, 0x7f, 0xd7, 0xde, 0x7e, 0xd4, 0xe9, 0x2c, 0x09, 0xa4, 0x6d,
-    0xd8, 0x99, 0x37, 0x1a, 0xb1, 0x71, 0x6f, 0x12, 0xfb, 0xcb, 0xf4, 0xdf, 0x7c, 0xfc, 0x1c, 0x88, 0x5b, 0x11, 0x41,
-    0xa5, 0x1f, 0xd1, 0x14, 0x14, 0x25, 0x77, 0x4c, 0xf4, 0xb0, 0x96, 0xeb, 0xd4, 0xa3, 0x08, 0xc1, 0x6d, 0xfb, 0xb0,
-    0x61, 0x93, 0x37, 0x03, 0xfa, 0x4f, 0x5b, 0xa5, 0xcd, 0x28, 0xe6, 0x33, 0xc0, 0xb2, 0x15, 0x1c, 0x8f, 0x87, 0x06,
-    0x5f, 0x4d, 0xe7, 0xa4, 0x79, 0xb8, 0xd7, 0xe2, 0x4b, 0x37, 0x82, 0xa8, 0x70, 0xba, 0xc5, 0x9d, 0x3e, 0xb6, 0xf7,
-    0xba, 0x69, 0x8f, 0xd4, 0x7a, 0xdd, 0x42, 0x10, 0x8a, 0xba, 0x7b, 0x62, 0xf9, 0xa7, 0xaf, 0x0e, 0xe1, 0x3f, 0xe2,
-    0xea, 0x7f, 0xce, 0x9a, 0x18, 0xf5, 0x8b, 0xb2, 0x95, 0x35, 0xb1, 0x4a, 0xc8, 0x88, 0xef, 0x5f, 0x7f, 0x32, 0x79,
-    0x5c, 0x83, 0xbd, 0x6b, 0x93, 0xe9, 0x52, 0xb5, 0xf6, 0xb7, 0x71, 0x0c, 0xd9, 0x2b, 0xeb, 0xd5, 0x05, 0x78, 0xc8,
-    0x90, 0x3c, 0x1b, 0x40, 0x23, 0x71, 0x8f, 0x20, 0x2d, 0xbe, 0x8e, 0x6d, 0xe8, 0x2a, 0xf1, 0x76, 0xd3, 0x55, 0xe2,
-    0xcd, 0xee, 0xab, 0xc4, 0xf7, 0x7b, 0x5d, 0x25, 0xde, 0x7c, 0xf1, 0xab, 0xc4, 0xdb, 0xfa, 0x55, 0xe2, 0x2a, 0x16,
-    0xd6, 0xaa, 0xe6, 0xc5, 0x92, 0xff, 0xfc, 0x48, 0x4a, 0xb9, 0xcb, 0x78, 0xd0, 0x75, 0x28, 0xea, 0xef, 0xd5, 0x1f,
-    0xbe, 0x58, 0xe0, 0x46, 0x7c, 0x8f, 0xe6, 0x5b, 0xc5, 0xd5, 0x82, 0x63, 0x76, 0xfc, 0x8e, 0x52, 0x1c, 0xc6, 0xd1,
-    0xf4, 0x27, 0x50, 0xca, 0x82, 0x38, 0x30, 0x51, 0x5e, 0x04, 0xe9, 0x4f, 0xf1, 0x62, 0xb9, 0xb8, 0x80, 0xbe, 0x3e,
-    0x06, 0x69, 0x30, 0x0a, 0x99, 0x74, 0xc6, 0x25, 0x73, 0x33, 0x2e, 0x13, 0x07, 0xfb, 0x4e, 0xf1, 0xd3, 0x5b, 0x89,
-    0x9f, 0x68, 0x01, 0xca, 0x7f, 0x93, 0x1d, 0x9b, 0xde, 0x7c, 0x11, 0x11, 0x4a, 0x40, 0x65, 0xd0, 0x8f, 0xbf, 0x8c,
-    0x5c, 0xc5, 0x46, 0xc3, 0x2c, 0x85, 0xbd, 0xc3, 0xc6, 0x7e, 0x58, 0xed, 0x52, 0xb3, 0x34, 0x4c, 0x19, 0x85, 0xaa,
-    0x2e, 0x86, 0x9f, 0xc7, 0xcb, 0x94, 0x8d, 0xe3, 0xfb, 0x48, 0x37, 0x23, 0x69, 0xc0, 0x0f, 0x1a, 0x4e, 0xd9, 0x06,
-    0xf3, 0x27, 0x7e, 0x40, 0x46, 0x39, 0x4e, 0x5a, 0x3a, 0xa4, 0xef, 0x5c, 0x2e, 0x2c, 0x52, 0x35, 0x5b, 0x38, 0x45,
-    0x5d, 0x26, 0xfa, 0x79, 0xd2, 0x6a, 0xc5, 0x83, 0xc7, 0xb5, 0x14, 0xa6, 0x1a, 0xb1, 0xcd, 0xa5, 0xc2, 0x69, 0x2b,
-    0x12, 0xc2, 0x45, 0x11, 0x0a, 0xa2, 0x61, 0xe1, 0xf8, 0x1b, 0x72, 0x0b, 0x2d, 0xde, 0x42, 0x20, 0x8d, 0x7c, 0xc9,
-    0xd7, 0x83, 0x07, 0x46, 0xa0, 0xc7, 0xd7, 0x0a, 0x18, 0xdf, 0xdd, 0xb1, 0x24, 0xf4, 0x1e, 0x5a, 0x46, 0x1e, 0x47,
-    0x3f, 0x00, 0x00, 0xde, 0xc4, 0xf7, 0x91, 0x5a, 0x01, 0xf3, 0x95, 0x34, 0xec, 0xa5, 0xc6, 0x10, 0x1e, 0xe0, 0x14,
-    0xa2, 0x8c, 0x00, 0x32, 0xc5, 0x4e, 0xd9, 0x3f, 0x4c, 0xfa, 0xf7, 0x9f, 0x46, 0x6e, 0x5e, 0xc6, 0xf2, 0x43, 0x7f,
-    0x5f, 0xec, 0xf1, 0x99, 0xe7, 0xcf, 0x9f, 0x6c, 0x9e, 0x76, 0x39, 0x43, 0x79, 0x43, 0x6b, 0x63, 0xe3, 0x29, 0x80,
-    0x51, 0x5c, 0xc5, 0x4b, 0x7f, 0x86, 0x86, 0xa5, 0x5f, 0x6e, 0xbe, 0x19, 0xf4, 0x89, 0x89, 0x3a, 0xe5, 0xd4, 0x2b,
-    0x45, 0x05, 0x14, 0xf0, 0xfb, 0x6f, 0x21, 0x06, 0xe5, 0xff, 0x11, 0x0c, 0xf5, 0x5d, 0xc3, 0x6f, 0xf1, 0xc1, 0xe3,
-    0x36, 0x6f, 0x1f, 0xf2, 0x49, 0xf2, 0xe8, 0x0e, 0x42, 0xb9, 0xd6, 0x8c, 0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0x48, 0x6a,
-    0x9b, 0x82, 0xc4, 0x89, 0xaf, 0x30, 0x9b, 0xae, 0xe9, 0xdc, 0xac, 0xdf, 0x64, 0x1c, 0x5b, 0x55, 0x90, 0x0c, 0x37,
-    0x79, 0x60, 0x88, 0xbe, 0xaa, 0xef, 0xe6, 0x41, 0x64, 0x62, 0x20, 0xf4, 0xfa, 0x1b, 0x6f, 0x05, 0xa1, 0x80, 0x01,
-    0xb9, 0x55, 0x5f, 0x41, 0xa1, 0xa9, 0xfa, 0xa4, 0x41, 0xb6, 0x23, 0xbd, 0x11, 0x12, 0x42, 0x8b, 0x37, 0xfc, 0x8b,
-    0xa6, 0x69, 0x9a, 0xbc, 0x46, 0x68, 0xf2, 0x1e, 0x81, 0xe5, 0x78, 0x1d, 0x00, 0x6d, 0x49, 0xbe, 0x58, 0x51, 0x09,
-    0xdc, 0x0c, 0x50, 0x27, 0x2b, 0x0a, 0x78, 0xb4, 0xbb, 0xae, 0x23, 0x0a, 0xc4, 0x85, 0x1e, 0x22, 0x95, 0x79, 0x09,
-    0x04, 0xc5, 0xed, 0x69, 0x78, 0x61, 0xc7, 0xb7, 0x5c, 0x12, 0xac, 0x39, 0xf4, 0x38, 0xec, 0xb3, 0xe6, 0xb0, 0x68,
-    0x91, 0x82, 0x05, 0x41, 0xeb, 0x50, 0x89, 0x72, 0x6c, 0xb2, 0x06, 0xdc, 0x88, 0xf7, 0xa2, 0x55, 0x36, 0x67, 0xd1,
-    0x52, 0xc7, 0xb4, 0x48, 0x18, 0xa6, 0x0e, 0xea, 0xbc, 0x21, 0x66, 0x0b, 0xb0, 0x4d, 0x73, 0xcb, 0x19, 0xd1, 0xc2,
-    0x94, 0xa3, 0x54, 0xcf, 0xf4, 0xb9, 0x62, 0x33, 0xe5, 0xb8, 0xad, 0x4a, 0x21, 0xf8, 0x92, 0xc6, 0x55, 0x27, 0x29,
-    0xb2, 0x3c, 0x86, 0x3e, 0x28, 0x40, 0x04, 0x17, 0x17, 0x09, 0xb0, 0xb7, 0xbc, 0xea, 0xa2, 0x49, 0x8d, 0x8c, 0x57,
-    0x11, 0x14, 0x25, 0x46, 0xbd, 0x1b, 0x3e, 0x4e, 0x88, 0xcd, 0xb3, 0xb1, 0x1f, 0xbf, 0xd6, 0xcf, 0x86, 0x49, 0x7f,
-    0x62, 0x0f, 0x44, 0x48, 0x08, 0x54, 0x9f, 0xd8, 0x03, 0xd8, 0xfe, 0xbd, 0x05, 0x69, 0x8a, 0xbe, 0x05, 0x5d, 0x9b,
-    0x10, 0xed, 0xde, 0x87, 0x78, 0x4d, 0x5b, 0x0e, 0x90, 0x93, 0x6f, 0xc1, 0xe2, 0x08, 0x62, 0x48, 0x6c, 0x2c, 0x0e,
-    0x31, 0x37, 0xa9, 0x6f, 0x35, 0xc2, 0xd8, 0x6a, 0x38, 0x1a, 0xc6, 0x0b, 0xd7, 0x71, 0x0e, 0x6a, 0xf5, 0x41, 0x90,
-    0xdd, 0x54, 0xdb, 0x30, 0xb3, 0x81, 0xeb, 0x58, 0xc1, 0x0b, 0xbb, 0xdd, 0xaf, 0xd1, 0x68, 0x25, 0x9c, 0xe2, 0x10,
-    0xc5, 0x5f, 0x67, 0xcf, 0xd6, 0xad, 0xda, 0x81, 0x34, 0xaa, 0x26, 0xea, 0x38, 0xb6, 0x9c, 0xcb, 0xbf, 0x86, 0x75,
-    0xd2, 0x4f, 0xc1, 0x1c, 0x29, 0xb5, 0xc7, 0x10, 0x02, 0x02, 0xb7, 0xe0, 0x18, 0xfd, 0x55, 0x7b, 0xa9, 0xb5, 0xe8,
-    0xf8, 0x18, 0xc6, 0x50, 0x66, 0x8c, 0x16, 0x1e, 0x5c, 0x6a, 0x07, 0x95, 0x2f, 0xa6, 0x55, 0x0c, 0xc7, 0x43, 0x8f,
-    0xb2, 0x42, 0xa3, 0xb7, 0x95, 0x5b, 0xc0, 0xfe, 0x37, 0x90, 0x4f, 0x7b, 0x04, 0x3e, 0xff, 0x50, 0x03, 0xc2, 0x87,
-    0xef, 0xec, 0x70, 0xb9, 0x28, 0x77, 0x57, 0x26, 0x92, 0xfb, 0x77, 0x86, 0x44, 0x07, 0x75, 0x68, 0xb2, 0xbf, 0x66,
-    0x72, 0xf7, 0xc8, 0x2e, 0x59, 0x34, 0x2e, 0x77, 0x58, 0xa1, 0x5f, 0xfb, 0x77, 0x57, 0xc2, 0x28, 0x10, 0x57, 0x3f,
-    0x6e, 0xc0, 0x28, 0x79, 0x1c, 0xe1, 0xe6, 0xa7, 0xe3, 0x16, 0xec, 0xc5, 0xc5, 0x60, 0x03, 0x0a, 0x8a, 0x25, 0x9b,
-    0x29, 0x42, 0x71, 0x08, 0xde, 0x8c, 0x2e, 0xb7, 0x2d, 0xc1, 0x88, 0x6e, 0xdc, 0x89, 0x99, 0xb0, 0x29, 0x2c, 0xda,
-    0x04, 0x3c, 0x1c, 0xe3, 0xbe, 0x52, 0xeb, 0x60, 0xb7, 0xd4, 0x3a, 0xdb, 0x25, 0xb5, 0x26, 0xef, 0xa5, 0xfb, 0xc4,
-    0x5b, 0x28, 0xfe, 0x6f, 0x82, 0x39, 0x57, 0xdd, 0xe0, 0x4a, 0xa2, 0x6e, 0x74, 0x76, 0x12, 0xad, 0x6a, 0xbd, 0x91,
-    0x95, 0x20, 0x8a, 0xbf, 0x95, 0x0b, 0x8a, 0x50, 0xa8, 0xab, 0xb2, 0xf1, 0xab, 0x42, 0x36, 0x4e, 0xb7, 0x9a, 0xc2,
-    0x71, 0x45, 0x70, 0xff, 0x8a, 0x4b, 0x98, 0xbc, 0x1d, 0x14, 0xae, 0x61, 0xc5, 0x48, 0x15, 0x6f, 0xa7, 0xe2, 0xa2,
-    0xa1, 0xb8, 0xd0, 0x89, 0x5b, 0x46, 0xd9, 0x93, 0xae, 0x5c, 0xb5, 0x70, 0xa9, 0x2b, 0xca, 0x41, 0xea, 0x8e, 0x43,
-    0x96, 0xc5, 0xea, 0xb6, 0x29, 0xbb, 0xbb, 0xa8, 0xaf, 0x95, 0x4d, 0x22, 0xfd, 0x52, 0x08, 0xc0, 0x42, 0x4c, 0x5f,
-    0xd1, 0x6b, 0x4b, 0x1b, 0x08, 0x1c, 0x64, 0x83, 0x13, 0xdd, 0x6e, 0xe9, 0x3c, 0xa5, 0x0c, 0x28, 0xb4, 0xf0, 0xaa,
-    0x0c, 0x02, 0xe1, 0x7b, 0xb3, 0x6e, 0xa0, 0xf2, 0x48, 0xe4, 0x39, 0x7d, 0x07, 0xf1, 0xa2, 0xe6, 0xa8, 0x8a, 0x7c,
-    0x3c, 0x99, 0x16, 0x99, 0xe7, 0x62, 0xd5, 0x7a, 0xa7, 0x24, 0xc4, 0x59, 0x73, 0x4f, 0x94, 0xb2, 0x8c, 0x9e, 0xd7,
-    0xe8, 0x89, 0xef, 0xf2, 0xad, 0x93, 0x2c, 0x23, 0x0c, 0xef, 0x6e, 0x65, 0x89, 0xe7, 0x7f, 0x52, 0x86, 0x2c, 0xe4,
-    0x9c, 0x20, 0x03, 0x2e, 0x6b, 0x0a, 0xfa, 0x1e, 0x46, 0x43, 0x64, 0x3d, 0xbb, 0x9d, 0x2a, 0xd2, 0x97, 0xde, 0x53,
-    0xa7, 0xe3, 0xbd, 0x9a, 0x1c, 0x56, 0x84, 0xa2, 0xed, 0x6e, 0x59, 0x64, 0xbe, 0x61, 0x1c, 0xd9, 0x6c, 0x39, 0x1f,
-    0xad, 0x55, 0xd9, 0xaa, 0x22, 0x72, 0xad, 0x8b, 0x59, 0xd5, 0xcf, 0x4e, 0x26, 0x93, 0xb2, 0xa0, 0xd1, 0xd1, 0x0e,
-    0x51, 0x58, 0xf8, 0xd4, 0x71, 0x9c, 0xea, 0xd8, 0xb7, 0x83, 0xdd, 0x42, 0xb9, 0xed, 0x49, 0xe3, 0x88, 0x11, 0xb6,
-    0xbb, 0xe0, 0x57, 0x07, 0x47, 0x6e, 0x17, 0x27, 0xbb, 0x64, 0x16, 0xd1, 0x27, 0x63, 0x88, 0x20, 0x63, 0xf3, 0xb4,
-    0xe7, 0x33, 0xd4, 0xc1, 0xd8, 0xca, 0x81, 0x46, 0xc3, 0x01, 0x6b, 0x0a, 0xa6, 0x22, 0xae, 0xd8, 0x15, 0x8e, 0x86,
-    0xf2, 0xf0, 0x9a, 0xf0, 0x5e, 0x7c, 0x04, 0x0f, 0xca, 0xba, 0x2e, 0xd3, 0xc6, 0x69, 0x75, 0x9d, 0xbf, 0x96, 0xea,
-    0x69, 0x40, 0x00, 0xd7, 0x42, 0xa1, 0x4d, 0xf2, 0x59, 0xfc, 0x7f, 0x29, 0xff, 0x7f, 0xb5, 0x58, 0x95, 0xed, 0x47,
-    0x4e, 0x40, 0xa2, 0x5d, 0x9c, 0x16, 0x1a, 0x75, 0xd3, 0x1e, 0x90, 0x56, 0x06, 0x13, 0x55, 0x81, 0x0e, 0x4a, 0xfa,
-    0x52, 0x0e, 0x8c, 0x06, 0xf1, 0x3b, 0x72, 0xcc, 0xb0, 0xc4, 0x85, 0x08, 0xb1, 0xc8, 0xe0, 0x06, 0x73, 0x30, 0x5f,
-    0x9e, 0xa0, 0xfe, 0xa0, 0xb4, 0x27, 0x40, 0x1b, 0x5f, 0x9b, 0xdb, 0x5e, 0xe2, 0xfe, 0xaa, 0x5e, 0x4b, 0x74, 0x0c,
-    0x20, 0x73, 0xe1, 0x10, 0xa2, 0x21, 0x81, 0x56, 0xd9, 0xdc, 0x34, 0x4a, 0xf9, 0x56, 0xd5, 0xb3, 0x89, 0x81, 0x61,
-    0x77, 0xcd, 0x55, 0xa8, 0x6f, 0xa1, 0x2d, 0x80, 0xc9, 0xf2, 0xed, 0x87, 0xcf, 0x16, 0x2c, 0xb1, 0xba, 0x1f, 0x5d,
-    0x5c, 0x72, 0xdc, 0xbf, 0x16, 0xd2, 0xce, 0x94, 0xce, 0x3f, 0xca, 0x17, 0xbf, 0x6f, 0x14, 0xe8, 0x5d, 0x95, 0x24,
-    0x74, 0xdc, 0x5a, 0xbc, 0x6d, 0xec, 0x55, 0x7b, 0x1e, 0x44, 0xfb, 0xd7, 0xf5, 0x56, 0x7b, 0xd7, 0x05, 0x82, 0xb1,
-    0x77, 0x65, 0xa0, 0x38, 0x64, 0xb9, 0x90, 0x0d, 0xbe, 0x57, 0x04, 0x8a, 0xaa, 0x93, 0xaf, 0x8e, 0xad, 0x88, 0xcb,
-    0xbf, 0x5a, 0x02, 0xf3, 0xb9, 0x57, 0x8e, 0x03, 0x4d, 0xa4, 0x29, 0xd3, 0x8f, 0xb5, 0x13, 0xed, 0xb8, 0xa3, 0x1d,
-    0x39, 0x3a, 0xdd, 0xc2, 0x06, 0x7a, 0xb7, 0x5d, 0x78, 0xef, 0x1d, 0x3a, 0xfa, 0xd9, 0xe9, 0x54, 0x10, 0x89, 0x49,
-    0x10, 0x86, 0x84, 0x2a, 0xd2, 0x2c, 0x89, 0x3f, 0xb1, 0xb2, 0x9a, 0x85, 0xca, 0xb8, 0x11, 0x48, 0x5b, 0x3c, 0xc2,
-    0xd9, 0xf1, 0xbd, 0x45, 0x0f, 0xcf, 0x86, 0x5a, 0x08, 0x06, 0x9c, 0x54, 0x8a, 0x9f, 0x00, 0x1a, 0x3c, 0xd2, 0xcf,
-    0x4e, 0x21, 0x8a, 0x9f, 0x36, 0x1e, 0xe8, 0x3f, 0xb4, 0x8f, 0x35, 0xb7, 0x7b, 0x67, 0x75, 0x7c, 0xc7, 0x72, 0xed,
-    0x43, 0xcd, 0xb1, 0x8f, 0xac, 0xb6, 0x7d, 0xac, 0xb5, 0xed, 0x2e, 0xfc, 0xeb, 0xbb, 0xf6, 0x2b, 0xcd, 0x81, 0x27,
-    0xcd, 0xb5, 0x3b, 0xf8, 0x6f, 0xdb, 0x3e, 0xbe, 0xeb, 0x10, 0xa5, 0xf7, 0x74, 0x31, 0xe4, 0xca, 0x28, 0xc0, 0x09,
-    0x44, 0x3f, 0x38, 0x3b, 0x5d, 0xa6, 0x4c, 0x5b, 0x0d, 0xf4, 0x57, 0xba, 0x36, 0x4b, 0xd8, 0x64, 0xa0, 0x3f, 0xf5,
-    0x94, 0x52, 0xf7, 0xa4, 0xb1, 0xb8, 0x7d, 0xdc, 0x58, 0xdc, 0x39, 0x6a, 0x2c, 0x3e, 0xec, 0x96, 0x8b, 0x0f, 0xa6,
-    0xf4, 0x4a, 0x49, 0xa2, 0x37, 0xf7, 0xb2, 0x24, 0x58, 0xb5, 0x5c, 0x0d, 0xd0, 0xb5, 0x05, 0xff, 0x1c, 0xb7, 0x0d,
-    0xd9, 0x6a, 0x04, 0xad, 0x24, 0x34, 0x8e, 0x4f, 0x34, 0xf7, 0xe8, 0x6f, 0xed, 0x23, 0x1f, 0xea, 0x41, 0xca, 0x47,
-    0xf8, 0xbb, 0xeb, 0x9c, 0xf8, 0x8e, 0x06, 0x0d, 0x5d, 0xf8, 0x6f, 0xd6, 0x6d, 0xfb, 0xf4, 0xe0, 0xc0, 0xfb, 0x8f,
-    0xee, 0x71, 0xea, 0x58, 0x2e, 0xfc, 0xf7, 0xab, 0x54, 0xb9, 0x83, 0xc2, 0x5f, 0xed, 0xf7, 0xd0, 0xd1, 0x3a, 0x27,
-    0xb3, 0xb6, 0xfd, 0xea, 0xee, 0xd8, 0x3e, 0x99, 0xb9, 0xc7, 0x1f, 0xe9, 0x29, 0xb4, 0xda, 0xf6, 0x2b, 0xf8, 0xfb,
-    0xd8, 0x71, 0x66, 0x96, 0x6b, 0x9f, 0xdc, 0x75, 0xec, 0x4e, 0x68, 0x1d, 0xd9, 0x27, 0xf0, 0xf7, 0x2b, 0x80, 0x17,
-    0xe0, 0xca, 0x73, 0x74, 0x6a, 0xb0, 0x31, 0x2a, 0xf6, 0x1b, 0xea, 0x47, 0xda, 0x87, 0x5a, 0xf7, 0xf0, 0x6f, 0x27,
-    0x77, 0xd6, 0xe1, 0xcc, 0x6d, 0xdf, 0x59, 0x1b, 0x7f, 0x7e, 0x04, 0xc8, 0x6f, 0x5f, 0x38, 0x00, 0x23, 0x26, 0xe5,
-    0xf8, 0xcb, 0xd0, 0xbc, 0xdc, 0x24, 0x46, 0x7f, 0xbf, 0x5b, 0x8c, 0xfe, 0xdd, 0x72, 0x1f, 0x31, 0xfa, 0xfb, 0x2f,
-    0x2e, 0x46, 0xbf, 0xac, 0x5a, 0x71, 0xbf, 0xaf, 0x06, 0x0f, 0xff, 0x79, 0x5d, 0x65, 0x92, 0x03, 0xaf, 0x75, 0x7d,
-    0xb5, 0xbc, 0x81, 0xb8, 0x3a, 0xef, 0xe3, 0xc1, 0x77, 0xcb, 0x92, 0x89, 0x52, 0x0c, 0x18, 0xe0, 0x7d, 0x4c, 0x18,
-    0xe0, 0xd7, 0xe5, 0x00, 0xec, 0x22, 0x38, 0xd5, 0x0c, 0xc6, 0xd6, 0xcc, 0x0b, 0x27, 0x92, 0xe2, 0x42, 0x49, 0x1f,
-    0x8b, 0xc1, 0x66, 0x1e, 0x88, 0x09, 0x28, 0x6b, 0x96, 0xf3, 0x28, 0xed, 0x1d, 0x39, 0x80, 0xe6, 0xdb, 0x93, 0x24,
-    0xaf, 0x34, 0xb6, 0x45, 0x24, 0xa2, 0x5b, 0x6e, 0xd3, 0xbf, 0xf1, 0x3d, 0x9a, 0xac, 0x35, 0xf7, 0xee, 0xd6, 0xfb,
-    0xd5, 0xc0, 0x16, 0x44, 0x98, 0xf4, 0x01, 0xb3, 0xd1, 0xf4, 0xbe, 0x6c, 0x38, 0x56, 0x31, 0x15, 0xdc, 0x3c, 0x52,
-    0x18, 0x49, 0xb5, 0xbd, 0x5b, 0x36, 0x3c, 0xdb, 0x35, 0xcd, 0x86, 0xcf, 0x97, 0x9a, 0x6f, 0xb1, 0x7a, 0x93, 0x1d,
-    0x57, 0x41, 0x55, 0x49, 0x7d, 0xd5, 0x08, 0x90, 0x82, 0xf7, 0x2c, 0x4c, 0xe3, 0x0a, 0xc6, 0xc7, 0xd1, 0x90, 0x1a,
-    0x3b, 0xca, 0xbb, 0x52, 0x9f, 0xaa, 0x39, 0xdd, 0x8b, 0x35, 0xf2, 0x83, 0xc1, 0xaf, 0xc0, 0xd8, 0x70, 0x7a, 0x3c,
-    0x8a, 0x55, 0x38, 0xaf, 0x95, 0x7e, 0x89, 0xd5, 0xce, 0x67, 0xee, 0xba, 0xce, 0xda, 0x6c, 0x34, 0xa4, 0x75, 0xd9,
-    0x5c, 0xd0, 0x68, 0xfc, 0x3c, 0x99, 0xad, 0xe6, 0x64, 0x5a, 0x8c, 0x96, 0xb9, 0xdb, 0x3a, 0x13, 0xf5, 0x9e, 0xc2,
-    0x26, 0x36, 0xf9, 0x83, 0xea, 0x25, 0xbe, 0x9e, 0x40, 0x9a, 0xe2, 0x1e, 0x32, 0x11, 0x0a, 0x07, 0xd5, 0x46, 0x1b,
-    0xdb, 0xfe, 0x16, 0xf3, 0x0f, 0xb5, 0x63, 0xde, 0x09, 0xda, 0xea, 0x6e, 0xb3, 0x18, 0x91, 0xae, 0x0d, 0xeb, 0x92,
-    0x02, 0xd5, 0xed, 0x1e, 0x9b, 0xee, 0x91, 0x69, 0x1f, 0x77, 0x8d, 0x5c, 0x1c, 0x38, 0xb5, 0xcb, 0x12, 0x40, 0xc0,
-    0x64, 0x57, 0x0e, 0x33, 0x88, 0x82, 0x2c, 0xf0, 0xc2, 0x1c, 0x50, 0x7d, 0x99, 0xe7, 0xfd, 0xd7, 0x32, 0xcd, 0x60,
-    0x8e, 0x82, 0x25, 0x43, 0x73, 0x65, 0x6b, 0xc4, 0xb2, 0x7b, 0xc6, 0xa2, 0x0d, 0xaa, 0xdc, 0xaa, 0xf5, 0xf3, 0x9f,
-    0x67, 0x0b, 0x9a, 0x93, 0x9d, 0xc5, 0x28, 0x8b, 0xf8, 0xfe, 0x10, 0xa6, 0xba, 0xf9, 0xd0, 0xfc, 0x71, 0x13, 0xc2,
-    0xfd, 0xd7, 0x6e, 0x84, 0x9b, 0xb1, 0x7d, 0x10, 0xee, 0xbf, 0xbe, 0x38, 0xc2, 0xfd, 0x51, 0x45, 0xb8, 0x25, 0x4f,
-    0x95, 0x42, 0x26, 0xfa, 0x01, 0x9f, 0x5b, 0x10, 0x75, 0xf7, 0xa5, 0x7e, 0x40, 0xec, 0xa5, 0xae, 0x64, 0x43, 0xfd,
-    0x58, 0x4a, 0xef, 0x82, 0x57, 0x76, 0x0c, 0x3f, 0x4a, 0xa9, 0x24, 0x20, 0x53, 0xa8, 0xcc, 0x79, 0x0d, 0x7d, 0x5e,
-    0x44, 0x59, 0x68, 0xbf, 0xe7, 0xd7, 0x12, 0x50, 0x41, 0x7c, 0x17, 0x27, 0x73, 0x0f, 0x43, 0xaf, 0xe9, 0x98, 0x16,
-    0x0e, 0x1e, 0x1c, 0xf0, 0x8e, 0xf2, 0xe3, 0x68, 0x2c, 0xe5, 0xe8, 0x6c, 0x70, 0x4d, 0xfc, 0xa0, 0xfe, 0xc0, 0xbc,
-    0x44, 0x37, 0xe9, 0x35, 0x2c, 0xee, 0x8b, 0x8e, 0xf3, 0xa2, 0x7d, 0xf8, 0xe2, 0xc8, 0x81, 0xff, 0xb9, 0xac, 0x93,
-    0x9b, 0xbc, 0xe2, 0x3c, 0x8e, 0x20, 0x33, 0x85, 0xa8, 0xb9, 0xa9, 0xda, 0x3d, 0x63, 0x9f, 0x8a, 0x5a, 0xc7, 0xcd,
-    0x95, 0xc6, 0xde, 0x43, 0x51, 0xa7, 0xb1, 0xc6, 0x2c, 0x5e, 0x2a, 0xc3, 0x6a, 0x18, 0x4d, 0x10, 0x2d, 0x41, 0x32,
-    0xa4, 0xd4, 0x50, 0x5f, 0xf3, 0xe9, 0x16, 0xf3, 0x62, 0x9d, 0xfc, 0xa6, 0x48, 0x7f, 0x23, 0xd2, 0x70, 0xec, 0x84,
-    0x20, 0x17, 0xaa, 0x3b, 0x18, 0x3c, 0x1b, 0x13, 0xc0, 0x68, 0x90, 0x7c, 0xae, 0xc8, 0x71, 0x8e, 0x0b, 0x94, 0x25,
-    0xcb, 0xc8, 0xa7, 0x34, 0xe6, 0xde, 0x28, 0x6d, 0x05, 0x07, 0x10, 0x97, 0x13, 0x3f, 0x6c, 0xe0, 0xaa, 0x79, 0x67,
-    0x4e, 0x91, 0x2b, 0x20, 0x15, 0xab, 0xe2, 0xbd, 0xc8, 0xcc, 0x84, 0x32, 0x8c, 0xe2, 0xd2, 0x5a, 0x03, 0xef, 0x85,
-    0x6c, 0xf8, 0x22, 0x33, 0x21, 0xcb, 0x27, 0x2c, 0xf7, 0xf3, 0xe7, 0x54, 0x0b, 0xf2, 0xee, 0xd1, 0xb4, 0xce, 0x7d,
-    0x99, 0xab, 0x4b, 0xd7, 0xbc, 0x69, 0xac, 0x63, 0xae, 0xae, 0x9e, 0x6f, 0xc6, 0x2f, 0x5f, 0x9e, 0x0d, 0x5c, 0x83,
-    0x67, 0x8d, 0x2c, 0xa5, 0x38, 0xba, 0xdc, 0x4f, 0x35, 0x6e, 0x34, 0x3a, 0x6d, 0x2d, 0x82, 0x68, 0x2a, 0x34, 0xd3,
-    0x12, 0x7b, 0x41, 0xca, 0x01, 0x52, 0x81, 0x79, 0x42, 0x45, 0x2d, 0xea, 0xdc, 0xb1, 0x04, 0x32, 0x5e, 0x0e, 0xf4,
-    0x8e, 0xed, 0xd8, 0x8e, 0x2e, 0x1b, 0x4e, 0x82, 0xe9, 0x60, 0x1d, 0x67, 0x1e, 0x24, 0x6f, 0x09, 0xe3, 0x29, 0x78,
-    0x7e, 0x64, 0x41, 0x16, 0x42, 0x26, 0x10, 0x70, 0x01, 0x99, 0xd3, 0xad, 0x31, 0xe7, 0xf6, 0xb8, 0x5e, 0xf2, 0x09,
-    0xb3, 0xc1, 0x09, 0xa7, 0x2f, 0x8c, 0x3f, 0xf3, 0x03, 0x10, 0xc3, 0x96, 0xde, 0x82, 0x5c, 0x84, 0x2c, 0x49, 0x2d,
-    0xd5, 0xbe, 0xbd, 0xa7, 0x41, 0x1b, 0xc8, 0x13, 0x8e, 0x1d, 0x4c, 0x12, 0x6f, 0x0e, 0x41, 0xb3, 0xd7, 0xb9, 0xc9,
-    0x31, 0xad, 0xce, 0x51, 0xad, 0xe6, 0xbe, 0x3a, 0x32, 0xb5, 0xb6, 0x6b, 0x6a, 0x0e, 0xa0, 0x5b, 0x3d, 0x37, 0xd7,
-    0xf9, 0x4d, 0x7f, 0x97, 0x8a, 0x8e, 0xf0, 0xcb, 0x53, 0x9a, 0x07, 0x29, 0xe7, 0xb8, 0xf0, 0x33, 0xa3, 0xd0, 0x81,
-    0x2d, 0x25, 0x9c, 0x75, 0x40, 0x62, 0xfa, 0x2b, 0xb6, 0xca, 0x0c, 0xcc, 0x94, 0xc1, 0xab, 0x04, 0xc6, 0x1a, 0x5d,
-    0xd3, 0x82, 0x48, 0x0b, 0x7e, 0xfb, 0xad, 0x15, 0x80, 0xf9, 0xfd, 0x40, 0x81, 0x0f, 0x3c, 0x1b, 0x25, 0x80, 0x05,
-    0x85, 0x62, 0x09, 0x81, 0x05, 0xbe, 0x31, 0xf0, 0x6f, 0x51, 0x2c, 0x7e, 0x70, 0xc5, 0x9e, 0x1d, 0x7a, 0xd1, 0x14,
-    0x50, 0x9a, 0x17, 0x4d, 0x6b, 0x06, 0x04, 0xe4, 0x5d, 0x57, 0x29, 0x2d, 0xba, 0x2a, 0x94, 0xfb, 0xe9, 0xb7, 0x0f,
-    0x57, 0x94, 0x09, 0x08, 0xb2, 0x4e, 0x7b, 0x63, 0x74, 0x05, 0x2b, 0x74, 0x0f, 0x2f, 0x07, 0x5f, 0x9d, 0xce, 0x59,
-    0xe6, 0x91, 0xe0, 0x12, 0xae, 0x78, 0xc0, 0x0e, 0x68, 0xbe, 0xc8, 0xe2, 0x49, 0x17, 0xbc, 0x31, 0xbb, 0x0b, 0x7c,
-    0x7e, 0x4f, 0x33, 0x35, 0x4e, 0xa7, 0x2c, 0xb4, 0x51, 0x1a, 0xb8, 0x26, 0x99, 0xc8, 0xfa, 0x1e, 0x06, 0x18, 0x1c,
-    0x44, 0xb1, 0x7e, 0xf6, 0x95, 0xf4, 0x26, 0xda, 0xb4, 0x08, 0x90, 0x8e, 0xef, 0x3a, 0x61, 0xe1, 0xbf, 0x07, 0x5f,
-    0x01, 0xe1, 0xfe, 0xea, 0x46, 0x37, 0xfa, 0x99, 0x8d, 0xf7, 0x98, 0xaf, 0x1a, 0xd2, 0xd2, 0xe1, 0x1d, 0x95, 0x5f,
-    0x36, 0x3b, 0xca, 0x65, 0x13, 0x7e, 0xef, 0xbe, 0xba, 0x9e, 0x9d, 0x22, 0x41, 0x3b, 0x83, 0xdb, 0xc5, 0xba, 0x74,
-    0xe7, 0x74, 0xfb, 0x78, 0x41, 0x1d, 0x85, 0x9e, 0xff, 0x49, 0xdc, 0x50, 0xd5, 0x87, 0x7d, 0xee, 0xa2, 0x92, 0xb3,
-    0x6b, 0xdc, 0xcb, 0xb8, 0x95, 0xd7, 0xf8, 0x65, 0xfc, 0xd4, 0xfd, 0x2c, 0xc8, 0xe4, 0x65, 0x18, 0x1f, 0x72, 0xd0,
-    0xe6, 0xe0, 0xf8, 0x8a, 0xeb, 0x0f, 0x5c, 0x50, 0xdd, 0x93, 0xbf, 0x75, 0xef, 0x5c, 0x67, 0xd6, 0x76, 0x6d, 0xb8,
-    0xe6, 0xcc, 0x3a, 0xf6, 0x71, 0x68, 0x75, 0xec, 0x63, 0xf8, 0xfb, 0x08, 0x57, 0x2f, 0xab, 0x6d, 0x1f, 0x7e, 0x74,
-    0xdb, 0xa1, 0x75, 0x62, 0x1f, 0xc3, 0xdf, 0x25, 0xb5, 0xfa, 0x19, 0x2f, 0x3d, 0x70, 0xe1, 0xf9, 0xaa, 0x84, 0x05,
-    0x94, 0xdf, 0x52, 0x8b, 0x60, 0x96, 0xc8, 0x5b, 0x83, 0x26, 0x02, 0x50, 0x86, 0x6e, 0x8a, 0x80, 0x80, 0x51, 0xbf,
-    0x05, 0x79, 0xb2, 0x31, 0xc2, 0xbb, 0x30, 0xc8, 0x88, 0x8a, 0x9c, 0xef, 0x9b, 0x8f, 0x11, 0x6f, 0xd3, 0x1c, 0x6a,
-    0x5b, 0xa4, 0x0e, 0x22, 0xd5, 0xc5, 0xdf, 0x17, 0x18, 0x45, 0x47, 0x04, 0x07, 0x57, 0xb0, 0x52, 0x91, 0xbe, 0x2e,
-    0xdf, 0x3d, 0x70, 0xf4, 0x1b, 0x65, 0x32, 0x7d, 0xca, 0x17, 0xed, 0x9b, 0xab, 0x33, 0x64, 0xef, 0x7f, 0xb4, 0x1f,
-    0xcc, 0x1a, 0x4a, 0xfd, 0x88, 0x38, 0x9e, 0xe3, 0x20, 0x91, 0xc3, 0x53, 0x50, 0xb4, 0xdb, 0x1c, 0xa3, 0xdc, 0x80,
-    0x3c, 0x13, 0x17, 0xc0, 0x25, 0xdf, 0x79, 0xa1, 0x62, 0x7a, 0xa1, 0xb4, 0x7c, 0x22, 0x31, 0xff, 0xf3, 0xe7, 0xc5,
-    0xe0, 0xac, 0xca, 0xb8, 0x4f, 0xdd, 0x2e, 0x90, 0xdd, 0x2e, 0xeb, 0x6c, 0xb5, 0x02, 0xda, 0x1d, 0x08, 0xb6, 0x08,
-    0x1d, 0x29, 0x34, 0xfd, 0x42, 0xc7, 0xb8, 0xd1, 0x14, 0xa9, 0xa6, 0x61, 0x84, 0x10, 0xba, 0x95, 0xab, 0x8e, 0x6e,
-    0xf4, 0x23, 0xa1, 0x30, 0x8b, 0xb6, 0x04, 0xbf, 0xe5, 0x77, 0x31, 0x1d, 0x40, 0xb3, 0x65, 0x1e, 0x3b, 0x5c, 0x1a,
-    0xff, 0xdf, 0x93, 0x40, 0xf7, 0x22, 0xd0, 0xf0, 0x55, 0x4e, 0x6b, 0xc9, 0xdd, 0x44, 0xd2, 0x55, 0x22, 0xa8, 0x2c,
-    0x3d, 0xd7, 0xa1, 0x08, 0x12, 0x10, 0x61, 0xce, 0x31, 0x69, 0xde, 0x24, 0xa9, 0x45, 0x51, 0x60, 0x06, 0x10, 0xfd,
-    0xb9, 0x25, 0x5c, 0x9d, 0x8c, 0xe7, 0xcf, 0x37, 0x12, 0x21, 0x52, 0x27, 0xab, 0xa9, 0x17, 0x75, 0x15, 0xbf, 0xe9,
-    0x2a, 0x8a, 0x91, 0xfd, 0x22, 0xd6, 0x10, 0x56, 0x59, 0xb4, 0xf7, 0xf0, 0xe7, 0x88, 0x79, 0x99, 0xcd, 0xf5, 0x20,
-    0x2d, 0x85, 0xb8, 0x9b, 0x2e, 0xeb, 0x80, 0x3d, 0x16, 0x0f, 0xb6, 0xc5, 0x23, 0xcb, 0x3d, 0x5b, 0x7f, 0x5c, 0x72,
-    0x3f, 0x64, 0xe8, 0xe3, 0x37, 0xa7, 0x08, 0x9e, 0xf2, 0x2e, 0xf3, 0x28, 0xc2, 0x86, 0x4a, 0x72, 0xe3, 0xcc, 0x13,
-    0x89, 0x3e, 0x80, 0x2f, 0xef, 0x37, 0x2a, 0x0c, 0x15, 0x5f, 0xe5, 0xb3, 0x77, 0x57, 0xdf, 0x68, 0x7c, 0xff, 0x93,
-    0x7e, 0x0b, 0x2f, 0x32, 0x14, 0xef, 0x7e, 0x40, 0xf1, 0xee, 0x35, 0x9e, 0xe7, 0x01, 0xa2, 0xc6, 0xe7, 0x07, 0x04,
-    0x41, 0x5d, 0x63, 0x91, 0x4f, 0x5a, 0xbf, 0xf9, 0x32, 0xcc, 0x82, 0x85, 0x97, 0x64, 0x07, 0xd0, 0xd4, 0x02, 0x24,
-    0xa7, 0x6f, 0xf2, 0x60, 0x26, 0xc5, 0xa1, 0x10, 0xaa, 0x65, 0x91, 0xd0, 0x1c, 0x4e, 0x82, 0x50, 0x2a, 0x0e, 0xc5,
-    0x07, 0x3c, 0xdf, 0x67, 0x8b, 0x6c, 0xa0, 0x7b, 0x0b, 0xc8, 0x7b, 0x80, 0x91, 0x8c, 0x0f, 0x62, 0x3f, 0x63, 0x99,
-    0x95, 0x66, 0x09, 0xf3, 0xe6, 0xba, 0x0c, 0xeb, 0x59, 0xef, 0x2f, 0x5d, 0x8e, 0xe6, 0x41, 0x26, 0x23, 0xe3, 0xd1,
-    0x04, 0x41, 0x85, 0x07, 0x43, 0x3c, 0x1b, 0xe6, 0x1c, 0x84, 0x97, 0xf1, 0xb4, 0xb2, 0xa3, 0x0a, 0xce, 0xe5, 0x1c,
-    0xa3, 0xae, 0xf2, 0x58, 0xf7, 0x63, 0xf4, 0xc8, 0xb9, 0xe5, 0x5e, 0xd7, 0x32, 0x80, 0x9f, 0x7e, 0x76, 0xca, 0xaf,
-    0xb7, 0x1a, 0x06, 0x0a, 0xd0, 0xbb, 0x0e, 0xc4, 0x95, 0xdd, 0xe4, 0x8f, 0x7d, 0xc0, 0x2b, 0x03, 0x69, 0xa2, 0x9e,
-    0x31, 0xc2, 0x37, 0x8d, 0xe5, 0x0a, 0x18, 0xa1, 0x92, 0x8a, 0x77, 0xe6, 0x9e, 0x49, 0x07, 0x20, 0x1c, 0x15, 0xf2,
-    0x4a, 0xbf, 0xfd, 0xf6, 0x7a, 0xf8, 0x9f, 0xdf, 0x21, 0x0c, 0xf9, 0xcc, 0x15, 0x5e, 0xd0, 0xd7, 0x6a, 0x2d, 0xce,
-    0x7d, 0x9a, 0x43, 0x54, 0xef, 0xb3, 0xb1, 0x08, 0x0b, 0x22, 0xb6, 0x56, 0x3e, 0xbc, 0x11, 0xa1, 0x9e, 0x20, 0xd5,
-    0x80, 0x21, 0x7c, 0xb5, 0x87, 0xb0, 0xbc, 0x43, 0x11, 0x22, 0x40, 0xfb, 0x65, 0xf5, 0xed, 0x31, 0xa4, 0xcd, 0xad,
-    0x65, 0x00, 0x50, 0x06, 0x88, 0x7b, 0xe8, 0xec, 0xd4, 0xe3, 0xc2, 0x57, 0x60, 0x3f, 0xd2, 0xde, 0x01, 0x4c, 0x73,
-    0x16, 0xcf, 0x99, 0x1d, 0xc4, 0x07, 0xf7, 0x6c, 0x64, 0x79, 0x8b, 0x80, 0xe4, 0xcb, 0x28, 0x77, 0xd3, 0x88, 0xf3,
-    0x93, 0x0a, 0x5a, 0xe2, 0xaf, 0xf3, 0x02, 0x94, 0x71, 0x01, 0x28, 0xf8, 0xe9, 0x9d, 0x95, 0xa3, 0xf5, 0xd9, 0x22,
-    0x36, 0x7c, 0x19, 0xcb, 0x9f, 0x53, 0xd0, 0x3d, 0x11, 0x5f, 0xaf, 0x78, 0xb0, 0xe2, 0xc9, 0x44, 0x8d, 0xb0, 0x67,
-    0x97, 0xbf, 0x2f, 0xa1, 0x52, 0xec, 0xd9, 0x78, 0x41, 0x5f, 0xaa, 0x7f, 0x42, 0xfe, 0x84, 0xf4, 0xb5, 0x3c, 0x18,
-    0x23, 0x9c, 0xe7, 0x5a, 0xa4, 0x3e, 0x09, 0x92, 0xa7, 0x54, 0x89, 0x23, 0x8a, 0x6a, 0x0c, 0xe8, 0x0d, 0xac, 0xc9,
-    0x93, 0xc1, 0x80, 0xf0, 0x58, 0x15, 0x9d, 0x01, 0x94, 0x1a, 0xe2, 0xe4, 0xc3, 0x64, 0x33, 0x68, 0x68, 0x91, 0x07,
-    0x17, 0x36, 0xaa, 0x4e, 0xa7, 0x3e, 0xc6, 0x03, 0x4f, 0xec, 0xaf, 0xd2, 0x0e, 0x84, 0x9d, 0xc5, 0x17, 0x16, 0x10,
-    0xb8, 0xe8, 0xa7, 0x82, 0xc7, 0xb5, 0xaf, 0x09, 0x65, 0x5b, 0xa1, 0xf7, 0x10, 0x2b, 0x9a, 0x75, 0xee, 0x64, 0x7f,
-    0x89, 0xa5, 0x57, 0xc2, 0xb9, 0xad, 0x76, 0x92, 0x64, 0xac, 0xf1, 0xfa, 0x69, 0x52, 0x83, 0x83, 0xef, 0x3a, 0x4c,
-    0x6a, 0xdd, 0xf2, 0x64, 0x10, 0x3b, 0xe6, 0xc5, 0x41, 0x2b, 0xbd, 0xc4, 0x73, 0x9f, 0x9f, 0x1e, 0xc0, 0xfc, 0x20,
-    0x30, 0x40, 0x89, 0x33, 0x0a, 0x0c, 0x88, 0x3e, 0xe0, 0xa5, 0x64, 0x1d, 0x70, 0x31, 0x16, 0x4c, 0x1d, 0xde, 0x1c,
-    0x65, 0x28, 0xd0, 0x52, 0x95, 0x3a, 0xb3, 0xe2, 0x34, 0x73, 0x79, 0xbb, 0x63, 0xf3, 0xff, 0xba, 0xc4, 0xc0, 0xfc,
-    0x79, 0x3f, 0x63, 0xc2, 0xef, 0xf6, 0x32, 0xdb, 0xe0, 0x9a, 0xbb, 0xa9, 0x0a, 0x31, 0xac, 0x5b, 0x2a, 0x14, 0xfb,
-    0x78, 0x5b, 0xad, 0x82, 0x35, 0x92, 0xd5, 0x16, 0x5e, 0x4b, 0x7f, 0x8a, 0x3b, 0xbe, 0x56, 0x1b, 0x4b, 0xa1, 0xde,
-    0x65, 0x36, 0x80, 0xaa, 0x42, 0xd8, 0xee, 0x2d, 0x16, 0x54, 0xd9, 0xe8, 0x9f, 0x1e, 0xd0, 0xbd, 0xf3, 0x8c, 0x76,
-    0xd8, 0xd9, 0x29, 0x58, 0x17, 0xd2, 0xa2, 0x7b, 0x8b, 0x05, 0x5f, 0x52, 0xfa, 0x45, 0x6f, 0x0e, 0x66, 0xd9, 0x3c,
-    0x3c, 0xfb, 0x2f, 0x85, 0x07, 0xd6, 0xc5, 0xa2, 0x59, 0x03, 0x00};
+    0xe4, 0xe5, 0x65, 0xce, 0xc3, 0xc0, 0xc4, 0xf8, 0x08, 0xa8, 0xad, 0x66, 0xf6, 0x7f, 0x9a, 0x7b, 0xfa, 0xe5, 0xb6,
+    0x6d, 0xe4, 0xff, 0xbf, 0xa7, 0x60, 0x98, 0x5c, 0x2a, 0x26, 0x24, 0x4d, 0x4a, 0x96, 0xed, 0x48, 0x96, 0xdd, 0x36,
+    0x49, 0xe7, 0xdc, 0x71, 0x9b, 0x4e, 0xe2, 0xcb, 0xdc, 0xd5, 0xf5, 0x58, 0x14, 0x05, 0x49, 0xbc, 0x50, 0xa4, 0x86,
+    0xa4, 0x6c, 0xb9, 0x2a, 0xef, 0x59, 0xfa, 0x2c, 0xf7, 0x64, 0xbf, 0xd9, 0x5d, 0x00, 0x04, 0x3f, 0xf4, 0xe1, 0x26,
+    0xbd, 0xfb, 0x4d, 0xcf, 0x17, 0x11, 0x04, 0x40, 0x60, 0x01, 0x2c, 0xf6, 0x7b, 0x9f, 0x38, 0x22, 0xb0, 0xa6, 0x91,
+    0x6f, 0x3a, 0x5a, 0x62, 0xc6, 0x4c, 0x46, 0x9e, 0x23, 0x02, 0x13, 0x45, 0xa8, 0x77, 0xa8, 0x85, 0xe0, 0xeb, 0x52,
+    0x1c, 0x5d, 0x6b, 0x1c, 0x2f, 0x47, 0x21, 0xb3, 0x70, 0xbb, 0xc3, 0x27, 0xd7, 0xa3, 0xe5, 0x68, 0x04, 0xc9, 0x54,
+    0x9e, 0x38, 0x26, 0x84, 0x87, 0x89, 0x53, 0x64, 0xdb, 0x72, 0xa3, 0x0f, 0x93, 0xb2, 0xb3, 0xea, 0xf0, 0xc1, 0xa4,
+    0x03, 0x24, 0x32, 0xf4, 0x81, 0x0c, 0x58, 0xb4, 0x86, 0x53, 0x3b, 0xd0, 0x3f, 0xc0, 0xee, 0x4b, 0xf5, 0x7e, 0xd3,
+    0xd1, 0x1f, 0x5c, 0xeb, 0x1f, 0x10, 0xc6, 0x98, 0x64, 0xf8, 0x35, 0xed, 0x5e, 0xdd, 0xd4, 0x49, 0x37, 0xbd, 0xc4,
+    0x74, 0x03, 0x20, 0x9b, 0x7d, 0x13, 0x78, 0xd3, 0x28, 0x4e, 0xb3, 0xc0, 0xd7, 0x6f, 0xfa, 0x17, 0x41, 0xeb, 0x7a,
+    0x9e, 0xb5, 0x8c, 0x1b, 0xd3, 0xcf, 0xd4, 0x4c, 0x25, 0x02, 0x61, 0x62, 0xa2, 0x92, 0x4d, 0x95, 0xd4, 0x13, 0xb4,
+    0xb5, 0xa2, 0x40, 0xcd, 0x58, 0xc9, 0xcf, 0x06, 0x50, 0xaf, 0x92, 0xf6, 0x04, 0xf3, 0x37, 0xe9, 0xd8, 0xd2, 0xe8,
+    0x13, 0x43, 0xf1, 0x7a, 0xb9, 0xc6, 0xab, 0x3c, 0x2b, 0x6e, 0x4b, 0x0c, 0xd5, 0x2b, 0xfc, 0x5b, 0xe8, 0xf9, 0x89,
+    0x6a, 0x9b, 0x59, 0xba, 0x77, 0x87, 0xdf, 0x94, 0xe9, 0x02, 0xb8, 0xbf, 0xc1, 0x30, 0x22, 0x8a, 0x33, 0x0d, 0xe2,
+    0xcf, 0xc0, 0x17, 0x87, 0x55, 0x5b, 0x2e, 0xde, 0x6b, 0xcb, 0xc8, 0x39, 0x32, 0xf8, 0x16, 0x2f, 0xbf, 0x16, 0x8f,
+    0x42, 0x56, 0x0a, 0x34, 0x41, 0x34, 0x7d, 0x04, 0x0b, 0x98, 0xc5, 0x97, 0xf1, 0x7d, 0x55, 0x5d, 0xf1, 0x7a, 0xb8,
+    0xfb, 0xee, 0xc5, 0x0b, 0x10, 0xf6, 0x9b, 0x48, 0xbe, 0xd7, 0xe2, 0xf9, 0x43, 0x05, 0xa1, 0x53, 0x39, 0x53, 0x68,
+    0x9f, 0x21, 0x68, 0x98, 0x0c, 0xcc, 0xb9, 0xf0, 0x2e, 0x00, 0x94, 0xc4, 0xaf, 0xe9, 0x61, 0x7e, 0x2b, 0x32, 0x1c,
+    0x8b, 0xfc, 0xc2, 0xca, 0xe5, 0x0c, 0xd8, 0x35, 0x5a, 0x2c, 0x33, 0x8c, 0x88, 0x0b, 0x03, 0x60, 0xb9, 0xae, 0x61,
+    0x84, 0x4d, 0xc0, 0xd2, 0x05, 0x99, 0x98, 0xeb, 0x5a, 0x30, 0xae, 0x97, 0x71, 0xa2, 0x17, 0x90, 0x17, 0xe2, 0x77,
+    0x94, 0x27, 0xc1, 0x63, 0xc2, 0xa7, 0xe1, 0x9b, 0x45, 0x38, 0xf9, 0x96, 0x8f, 0x7a, 0x97, 0x06, 0xcc, 0xe0, 0x53,
+    0x3f, 0xfd, 0x56, 0xd8, 0x38, 0x59, 0x88, 0x92, 0x59, 0x9a, 0xe6, 0xf0, 0xd9, 0x3a, 0xca, 0xcf, 0x9f, 0xad, 0xd3,
+    0x7c, 0xf0, 0x6c, 0xed, 0x01, 0x25, 0x97, 0xeb, 0x30, 0xd1, 0xc2, 0x9f, 0xa6, 0x98, 0x1e, 0x6c, 0x2a, 0x2a, 0xd7,
+    0x50, 0xa1, 0x3e, 0xe0, 0x6a, 0xf3, 0x45, 0x12, 0xcc, 0xbd, 0xe4, 0x81, 0xb4, 0xec, 0xa6, 0xaa, 0x8a, 0x37, 0x74,
+    0x8d, 0xf0, 0x3a, 0xcd, 0x97, 0x50, 0xbc, 0xae, 0x7d, 0x2d, 0xcb, 0x18, 0x9f, 0x9c, 0x54, 0x35, 0xc2, 0xb7, 0x6e,
+    0xf5, 0x97, 0xcc, 0x1e, 0xb3, 0xcc, 0x0b, 0x42, 0x6a, 0xd2, 0x17, 0x39, 0xe4, 0x6b, 0xb3, 0x49, 0xcb, 0xb3, 0x89,
+    0xca, 0xdb, 0x05, 0x27, 0x43, 0x18, 0x9f, 0xc6, 0x8d, 0x33, 0xc3, 0xdc, 0x52, 0xcd, 0x0b, 0x48, 0xef, 0xfe, 0xab,
+    0xd0, 0x67, 0x00, 0xfd, 0x08, 0xa0, 0xcf, 0x22, 0x3f, 0x1e, 0xb3, 0xbf, 0xbf, 0xbf, 0x90, 0xc9, 0xac, 0x40, 0x2e,
+    0x33, 0xe4, 0xfb, 0x30, 0x45, 0x72, 0x21, 0x41, 0x52, 0x81, 0xd2, 0x4e, 0x69, 0x72, 0xc7, 0x24, 0xb9, 0xae, 0x9d,
+    0xd3, 0xd8, 0xd9, 0x98, 0x46, 0x3d, 0x88, 0xb1, 0x55, 0x92, 0x9f, 0x1e, 0x50, 0x6d, 0xba, 0xdc, 0xa8, 0x12, 0x80,
+    0x21, 0x81, 0x19, 0x16, 0x50, 0x80, 0xbc, 0x9b, 0x03, 0xb7, 0xe0, 0x1f, 0xec, 0x39, 0x4a, 0xbf, 0xdd, 0xf3, 0x32,
+    0x65, 0x82, 0xad, 0xf4, 0xb3, 0x53, 0xcc, 0xa4, 0x05, 0xd7, 0x33, 0xc4, 0xde, 0x38, 0x3d, 0xa0, 0x47, 0xad, 0x72,
+    0x00, 0x8a, 0x4e, 0x04, 0x27, 0xd7, 0xe3, 0x1d, 0x3c, 0xea, 0x64, 0x40, 0xe2, 0x76, 0x28, 0xf5, 0x72, 0x5d, 0x9b,
+    0x73, 0x4a, 0x88, 0x07, 0xf9, 0x81, 0x08, 0x00, 0x0e, 0x1c, 0x55, 0x5d, 0x9b, 0x7b, 0x2b, 0x9c, 0xb9, 0x78, 0xe3,
+    0xad, 0x5a, 0x2e, 0x7f, 0x55, 0x1c, 0xad, 0xb4, 0x7c, 0xb4, 0x7c, 0xbe, 0xb8, 0x60, 0xde, 0x2f, 0xa4, 0xb6, 0xad,
+    0x19, 0xaa, 0x4d, 0x1b, 0x16, 0x77, 0x26, 0x16, 0x77, 0xbc, 0x61, 0x71, 0xc7, 0x5b, 0x16, 0x37, 0xe4, 0x0b, 0xa9,
+    0x49, 0xd0, 0x25, 0xe8, 0xb2, 0x25, 0x81, 0xc7, 0xe9, 0x8a, 0x1e, 0x3f, 0x67, 0x08, 0x27, 0x2b, 0x0d, 0xc1, 0x64,
+    0x69, 0x03, 0xac, 0x9a, 0xe0, 0xa2, 0x00, 0xa2, 0x3e, 0x71, 0x79, 0xea, 0xc4, 0xbc, 0x21, 0x33, 0x66, 0x2b, 0xac,
+    0xce, 0x17, 0x76, 0x29, 0x65, 0xfd, 0x6e, 0xcd, 0x36, 0xcc, 0x74, 0xb6, 0x65, 0xa6, 0x7e, 0xe9, 0xe8, 0xf2, 0x69,
+    0xd3, 0x21, 0x54, 0x27, 0x05, 0x7b, 0x10, 0xcc, 0x38, 0x71, 0xcb, 0x94, 0xf7, 0xe1, 0x66, 0x94, 0xaa, 0xec, 0xa8,
+    0x85, 0x97, 0xa6, 0xf7, 0x71, 0x02, 0x7a, 0x10, 0xe8, 0xe6, 0x71, 0x5b, 0x6a, 0x1e, 0x44, 0x3c, 0xc4, 0xca, 0xc6,
+    0xcd, 0x54, 0xbc, 0x57, 0xb7, 0x54, 0xbb, 0xdb, 0xa5, 0x1a, 0x0b, 0x2f, 0xcb, 0x58, 0x82, 0x40, 0xf7, 0x20, 0x16,
+    0x77, 0xae, 0x6b, 0xff, 0x0f, 0x76, 0x59, 0x03, 0x0a, 0x09, 0x8d, 0x02, 0xa9, 0x23, 0x82, 0x5e, 0x00, 0x25, 0x95,
+    0x88, 0x6b, 0x57, 0x89, 0xd6, 0x96, 0x48, 0xb8, 0xff, 0x88, 0xa7, 0xb5, 0x95, 0x28, 0xfe, 0x44, 0xee, 0x91, 0x61,
+    0x2f, 0xbc, 0xf1, 0x07, 0xd0, 0xb6, 0xb5, 0xda, 0x26, 0x58, 0xce, 0xaa, 0xb1, 0xd9, 0x12, 0x22, 0xed, 0xfc, 0x02,
+    0x47, 0x22, 0x92, 0xe4, 0x76, 0x49, 0xe0, 0xd2, 0xe8, 0x59, 0x93, 0x9b, 0x75, 0x3b, 0x3f, 0x98, 0x06, 0x46, 0x0d,
+    0x69, 0x02, 0x66, 0x0b, 0x07, 0x67, 0x92, 0xc3, 0x0a, 0x4d, 0xf7, 0xc8, 0x00, 0x71, 0xec, 0x35, 0x24, 0x19, 0x75,
+    0x04, 0xfb, 0x3a, 0x4c, 0xe0, 0x8e, 0xba, 0x76, 0x6e, 0xf2, 0xe7, 0x53, 0xfc, 0xe5, 0xde, 0xe4, 0xcf, 0x47, 0xf8,
+    0xab, 0x7d, 0x83, 0xe9, 0xe4, 0x1a, 0xd8, 0x76, 0x65, 0xce, 0xfa, 0x59, 0x69, 0x3b, 0x91, 0x51, 0xd8, 0x23, 0x76,
+    0x0d, 0x5f, 0xe0, 0xa7, 0xcf, 0xd6, 0x29, 0xb8, 0x41, 0xaa, 0x73, 0x88, 0xec, 0xc4, 0xc8, 0x1b, 0xcb, 0xa7, 0x1b,
+    0xca, 0x47, 0xc6, 0x7f, 0xf9, 0x9a, 0xc7, 0x5d, 0x12, 0x17, 0x57, 0x4a, 0x59, 0xe8, 0x70, 0x3b, 0x0a, 0x22, 0x2f,
+    0x79, 0xb8, 0x25, 0x66, 0xa2, 0x25, 0x28, 0x75, 0x29, 0x4c, 0x21, 0x62, 0xb2, 0xac, 0x83, 0xca, 0x14, 0xa9, 0xeb,
+    0x03, 0xbf, 0xe7, 0x07, 0xff, 0x48, 0x14, 0x22, 0xad, 0xc4, 0x6e, 0xf2, 0x05, 0x29, 0x7d, 0xe8, 0xf6, 0xd9, 0xba,
+    0xc5, 0xea, 0xdd, 0x54, 0x66, 0x5b, 0xa1, 0x02, 0x61, 0x79, 0x90, 0x75, 0x9d, 0x8f, 0x83, 0x1e, 0x2a, 0x99, 0x46,
+    0xf1, 0xca, 0x7a, 0xb6, 0xce, 0xce, 0xf5, 0xb9, 0x97, 0x7c, 0x62, 0x63, 0xcb, 0x0f, 0x12, 0x3f, 0x64, 0x7a, 0x4f,
+    0x1f, 0x85, 0x5e, 0xf4, 0x89, 0x3f, 0x5a, 0xf1, 0x32, 0x43, 0xb5, 0xf1, 0x4e, 0x4e, 0x57, 0xc0, 0x84, 0x04, 0x74,
+    0x48, 0x9a, 0x36, 0x40, 0x41, 0x7b, 0x2d, 0xc5, 0x5b, 0x05, 0x59, 0x58, 0xd4, 0x32, 0xc1, 0xea, 0x11, 0x34, 0xd9,
+    0xe0, 0x46, 0x6a, 0xea, 0xb8, 0x5e, 0xba, 0xa9, 0x4e, 0x95, 0x44, 0x93, 0x32, 0x0f, 0xe2, 0x2d, 0xf6, 0xf0, 0xc7,
+    0x3f, 0x47, 0x19, 0xaa, 0xf7, 0xff, 0x1c, 0x27, 0xf1, 0x36, 0x7f, 0x50, 0x6d, 0xec, 0xa5, 0xe9, 0x72, 0xce, 0xc6,
+    0xa4, 0x31, 0x3b, 0x2f, 0x86, 0x52, 0x26, 0xe5, 0xd5, 0xe1, 0xfc, 0xb2, 0x6c, 0x1f, 0x1f, 0xbe, 0x06, 0x4d, 0x3e,
+    0x90, 0x74, 0xf1, 0x64, 0xa2, 0x17, 0x4c, 0xf5, 0x8e, 0x66, 0xee, 0xe1, 0x2f, 0xcb, 0xef, 0xde, 0x3a, 0xdf, 0xc9,
+    0xc6, 0x91, 0x6e, 0xe4, 0x43, 0xa1, 0x96, 0xe4, 0x94, 0xa9, 0x32, 0x5e, 0x31, 0xa3, 0x89, 0x17, 0x6d, 0x9e, 0xce,
+    0x75, 0x69, 0x97, 0x2d, 0x18, 0x1b, 0x83, 0xc5, 0xaa, 0x59, 0x2b, 0xbd, 0x0d, 0xd9, 0x1d, 0x93, 0x2a, 0xcf, 0xfa,
+    0xc7, 0x1a, 0x5a, 0x60, 0x4c, 0x36, 0xae, 0x4a, 0xe5, 0x74, 0x95, 0x32, 0xa5, 0x21, 0xce, 0x81, 0xcf, 0x5c, 0xdd,
+    0xe5, 0x95, 0x5d, 0x3d, 0x34, 0x75, 0x65, 0x00, 0x1b, 0x47, 0x76, 0xbe, 0xa1, 0xbc, 0x87, 0x09, 0x99, 0x9b, 0xc7,
+    0x66, 0xba, 0x46, 0x0f, 0x62, 0x58, 0x73, 0x38, 0x85, 0xb0, 0xf9, 0x5b, 0x85, 0xfc, 0x61, 0x13, 0xc4, 0x9a, 0xa4,
+    0x52, 0x3a, 0x89, 0x3b, 0x84, 0x15, 0x20, 0x9a, 0xc3, 0x0a, 0xc1, 0x4f, 0xe3, 0xda, 0x68, 0xe5, 0x99, 0x8f, 0x30,
+    0xd1, 0x69, 0xc4, 0xd2, 0x74, 0x23, 0xc0, 0xe4, 0xa2, 0x9b, 0x7a, 0x51, 0xbb, 0x0c, 0x8f, 0xa2, 0xdc, 0x74, 0x4c,
+    0xb8, 0x94, 0x71, 0x82, 0xd5, 0x6f, 0x21, 0x86, 0xbf, 0x9d, 0x73, 0x3b, 0x8e, 0x64, 0x3a, 0xd2, 0xb9, 0x8e, 0x7d,
+    0xd3, 0xfb, 0x7b, 0x9d, 0x0f, 0xaa, 0x74, 0x53, 0x36, 0x0e, 0xad, 0x55, 0xc2, 0x7e, 0x35, 0xf9, 0x0c, 0x76, 0x20,
+    0xc6, 0x54, 0x41, 0x71, 0x6c, 0x32, 0x61, 0x7e, 0x96, 0x1a, 0x42, 0x5a, 0x23, 0xa3, 0xaa, 0x82, 0x37, 0xcd, 0x93,
+    0x81, 0xfe, 0x23, 0xf8, 0x96, 0x8b, 0xe0, 0x43, 0x7c, 0x40, 0x82, 0x6b, 0x69, 0x06, 0x13, 0xf5, 0x58, 0x06, 0x11,
+    0xff, 0x0a, 0x24, 0xcd, 0x6e, 0x28, 0xc7, 0xa1, 0xf1, 0x2b, 0xa0, 0xd8, 0x17, 0xb1, 0xb4, 0xf6, 0xd8, 0x8e, 0x80,
+    0xb6, 0x1d, 0xdf, 0xb5, 0xfb, 0x5d, 0xd7, 0x75, 0x72, 0xdd, 0x04, 0x9f, 0xa6, 0x4f, 0xfb, 0x1e, 0x7a, 0x6c, 0xd5,
+    0x81, 0x56, 0xcb, 0xe8, 0x31, 0xed, 0xda, 0xee, 0x2b, 0x57, 0x37, 0xc9, 0x94, 0x4c, 0xc1, 0x6d, 0x7e, 0x7c, 0xc7,
+    0x92, 0xcf, 0x9e, 0x4a, 0xb9, 0xf3, 0xfd, 0xc6, 0x73, 0xe4, 0x3a, 0x80, 0x84, 0xb3, 0x78, 0xf1, 0x88, 0x29, 0x74,
+    0x74, 0x53, 0xf7, 0xc3, 0x38, 0x65, 0xea, 0x1c, 0x48, 0xea, 0xf0, 0x99, 0x93, 0xf8, 0xe9, 0xfd, 0xdb, 0x0f, 0x1f,
+    0x74, 0x13, 0x33, 0x64, 0xa6, 0x6a, 0xef, 0x7c, 0x43, 0xed, 0xc0, 0xfe, 0x8d, 0xfb, 0x8e, 0x6e, 0x18, 0x62, 0x2b,
+    0xcb, 0x7b, 0x8e, 0xca, 0x6a, 0x5b, 0x8e, 0xdf, 0x3c, 0xfc, 0xcb, 0xc4, 0x0b, 0xee, 0x35, 0xaf, 0x06, 0xdc, 0xb0,
+    0xfd, 0x7a, 0x2b, 0x95, 0xcc, 0x83, 0xe8, 0xb6, 0xa1, 0xd4, 0x5b, 0x35, 0x94, 0x02, 0x33, 0x55, 0xc3, 0x55, 0xcb,
+    0x78, 0xae, 0xdc, 0xce, 0x90, 0xe0, 0x78, 0x17, 0xb8, 0x14, 0x8e, 0xe6, 0x33, 0x06, 0xcd, 0x23, 0x9c, 0x57, 0x47,
+    0xdd, 0x50, 0xcc, 0xd9, 0x10, 0x09, 0x5b, 0x3f, 0x04, 0x43, 0x38, 0xa6, 0xaa, 0xc1, 0xca, 0x94, 0x9b, 0x34, 0x63,
+    0x55, 0x3a, 0x21, 0x0a, 0xf3, 0x36, 0x63, 0xf3, 0x05, 0x4b, 0xbc, 0x6c, 0x99, 0xb0, 0xdb, 0x30, 0xbe, 0x7f, 0x52,
+    0x98, 0x99, 0xef, 0xa8, 0x3c, 0x0b, 0xa6, 0x33, 0x59, 0xfb, 0xbc, 0xc5, 0x06, 0x72, 0x01, 0xb7, 0x7e, 0x20, 0xff,
+    0xcf, 0xef, 0xb6, 0xfd, 0x9f, 0xdf, 0x77, 0x56, 0x85, 0xee, 0xf3, 0xa1, 0x99, 0x0d, 0xf6, 0xd8, 0x17, 0xcd, 0x5f,
+    0x2a, 0xc3, 0xbc, 0xb9, 0x4e, 0x6d, 0x11, 0xe0, 0x7d, 0x6d, 0x09, 0x6a, 0x85, 0xe5, 0x7d, 0xf3, 0xa8, 0x81, 0xc1,
+    0xbc, 0x76, 0x8e, 0x0c, 0x2a, 0x7d, 0xd6, 0xd0, 0x86, 0x46, 0x6f, 0xaf, 0x15, 0xf9, 0xe3, 0x10, 0xde, 0x35, 0x87,
+    0xcf, 0x1c, 0x3e, 0x97, 0x0c, 0xbe, 0x1e, 0x0e, 0x65, 0xce, 0x35, 0xb5, 0x29, 0x98, 0xbe, 0x9f, 0xd7, 0x4a, 0xf8,
+    0xe5, 0xd9, 0x73, 0x0c, 0xf2, 0x49, 0x1f, 0xbc, 0x1e, 0xa2, 0x91, 0xd6, 0xe9, 0x28, 0x29, 0x88, 0x95, 0x8d, 0xa8,
+    0x8d, 0x8c, 0xac, 0x6b, 0x9d, 0xd6, 0xf0, 0x1a, 0x94, 0x62, 0x22, 0xae, 0x7c, 0x68, 0x98, 0xaf, 0x87, 0x5c, 0xb4,
+    0xc3, 0xed, 0x42, 0x7b, 0xd5, 0xad, 0xcd, 0x05, 0xa3, 0x25, 0xa0, 0x9b, 0x1a, 0x29, 0x5c, 0xb0, 0x32, 0x2b, 0x24,
+    0x69, 0x28, 0x51, 0x07, 0xa6, 0x7e, 0x98, 0x63, 0x1e, 0x90, 0x77, 0x9b, 0x6c, 0xa7, 0x7e, 0xda, 0x6d, 0x3b, 0x75,
+    0xb5, 0x97, 0xed, 0xd4, 0x4f, 0x5f, 0xdc, 0x76, 0xea, 0x9d, 0x6a, 0x3b, 0x05, 0x8b, 0xf8, 0x96, 0xed, 0x65, 0xd0,
+    0x24, 0xcc, 0x24, 0xe2, 0xfb, 0x74, 0xe0, 0x72, 0x92, 0x36, 0xf5, 0x67, 0x0c, 0xd8, 0x74, 0xbe, 0x2a, 0x61, 0x3c,
+    0x05, 0xe3, 0xa6, 0x3f, 0xdf, 0x0c, 0x29, 0x8c, 0xa7, 0xaa, 0x11, 0x52, 0xc4, 0x23, 0xa1, 0x16, 0xd1, 0x8d, 0xc8,
+    0xf0, 0xc7, 0x31, 0x45, 0x2c, 0x24, 0xeb, 0xd0, 0x50, 0xb2, 0x3d, 0x4b, 0xab, 0xae, 0xb6, 0x30, 0x0d, 0xea, 0xa1,
+    0x55, 0x91, 0x6c, 0xd8, 0x7e, 0x29, 0x62, 0x3e, 0xa8, 0x3d, 0x48, 0xeb, 0x59, 0x8a, 0x9f, 0xb0, 0xd6, 0x7f, 0x59,
+    0xb9, 0xdf, 0x5e, 0xbb, 0xfd, 0x8e, 0x0b, 0x4e, 0xcb, 0xc0, 0xe4, 0x61, 0x81, 0xd3, 0xef, 0x74, 0xa0, 0xe0, 0x5e,
+    0x29, 0x68, 0x43, 0x41, 0xa0, 0x14, 0x74, 0xa1, 0xc0, 0x57, 0x0a, 0x8e, 0xa0, 0x60, 0xac, 0x14, 0x1c, 0x43, 0xc1,
+    0x9d, 0x9e, 0x5f, 0x47, 0x72, 0xb8, 0xc7, 0xc6, 0x8d, 0x49, 0x4c, 0x85, 0x28, 0x3b, 0x36, 0x5d, 0xb0, 0x26, 0xf2,
+    0xa6, 0xbd, 0xd8, 0x24, 0xf9, 0x5e, 0x2f, 0x31, 0xef, 0x67, 0x8c, 0x02, 0x28, 0xbf, 0xc1, 0x3b, 0xc7, 0xce, 0x62,
+    0xb0, 0x27, 0x16, 0x81, 0x09, 0x04, 0x1c, 0x34, 0xdd, 0x00, 0x99, 0x4d, 0x5f, 0xae, 0x9c, 0x08, 0xee, 0xa0, 0xac,
+    0x65, 0xf1, 0x8e, 0x3e, 0x67, 0xc9, 0x2d, 0x50, 0x98, 0x78, 0xb4, 0x54, 0xb9, 0xe0, 0x97, 0x50, 0xf4, 0xbf, 0x61,
+    0xa3, 0xe5, 0x54, 0xbb, 0x8c, 0xa7, 0x3b, 0x75, 0xf6, 0xea, 0x2b, 0x18, 0xa5, 0x4e, 0x0a, 0x10, 0x4b, 0x6c, 0x4b,
+    0xfe, 0x2d, 0x7a, 0xcc, 0xcb, 0xf5, 0x33, 0x18, 0x9b, 0x96, 0x91, 0xc5, 0x08, 0x7c, 0x07, 0x60, 0xa4, 0x28, 0xcd,
+    0x2f, 0x01, 0xce, 0xca, 0xf3, 0x95, 0xa7, 0x8c, 0xe7, 0xec, 0x07, 0x96, 0xa6, 0xde, 0x54, 0xd4, 0xaf, 0x8f, 0x13,
+    0xac, 0x64, 0x24, 0xff, 0x85, 0x00, 0x04, 0x61, 0x5a, 0x50, 0x33, 0x86, 0x48, 0xe2, 0x7b, 0x0d, 0xcc, 0x6d, 0x60,
+    0x43, 0x15, 0x86, 0x01, 0x81, 0x0d, 0x4b, 0x58, 0x56, 0xe1, 0xc3, 0xe1, 0xbf, 0x63, 0x61, 0xb5, 0x30, 0xf3, 0xa6,
+    0xd5, 0x22, 0xda, 0x07, 0xb9, 0x3a, 0x36, 0xa9, 0x41, 0x2f, 0x15, 0x7e, 0x8e, 0x4a, 0x38, 0x8c, 0xa7, 0x7f, 0xaa,
+    0x3e, 0x78, 0x8b, 0x1e, 0xff, 0x43, 0x64, 0x06, 0xd9, 0xd0, 0x46, 0x18, 0x6b, 0x36, 0x80, 0xb0, 0x17, 0x65, 0x33,
+    0x0b, 0x5d, 0xae, 0x5a, 0xed, 0xc8, 0x30, 0x6d, 0x5c, 0xdb, 0x75, 0xd5, 0xd1, 0xb4, 0x97, 0x4c, 0x47, 0x5e, 0xcb,
+    0x6d, 0x1f, 0x9b, 0xe2, 0xcf, 0x76, 0xba, 0x46, 0x8e, 0x3d, 0x68, 0xe3, 0xe0, 0x6e, 0x3d, 0x89, 0xa3, 0xcc, 0x9a,
+    0x78, 0xf3, 0x20, 0x7c, 0xe8, 0xcd, 0xe3, 0x28, 0x4e, 0x17, 0x9e, 0xcf, 0xfa, 0x05, 0x43, 0xdd, 0xc7, 0x10, 0x06,
+    0xdc, 0x8b, 0xce, 0xb5, 0xdb, 0x09, 0x9b, 0x53, 0x6b, 0x19, 0xa1, 0x60, 0x12, 0xb2, 0x55, 0xce, 0x3f, 0x5f, 0xaa,
+    0x4c, 0x55, 0x71, 0xcb, 0x51, 0x0b, 0xa0, 0x48, 0x79, 0xf8, 0x03, 0x08, 0xfa, 0xd3, 0x5f, 0x78, 0x63, 0x8c, 0xd8,
+    0x67, 0xb7, 0xbb, 0x09, 0x9b, 0x6b, 0x76, 0x77, 0x63, 0xe7, 0x49, 0x7c, 0x7f, 0x06, 0xa3, 0xc5, 0xc6, 0x56, 0xca,
+    0xc2, 0x09, 0xbe, 0xb1, 0xd0, 0xe3, 0x42, 0xf4, 0x63, 0x21, 0x23, 0x0e, 0xbd, 0xb1, 0x79, 0x1f, 0x5e, 0xf7, 0xda,
+    0x9a, 0xd3, 0x9f, 0x07, 0x91, 0x45, 0xd3, 0x39, 0x76, 0x16, 0x4a, 0x5f, 0x2a, 0xfc, 0x8c, 0x35, 0x56, 0x77, 0x35,
+    0xa7, 0x0f, 0xcc, 0xda, 0x24, 0x8c, 0xef, 0x7b, 0xb3, 0x60, 0x3c, 0x66, 0x51, 0x1f, 0xc7, 0x2c, 0x0b, 0x59, 0x18,
+    0x06, 0x8b, 0x34, 0x48, 0xfb, 0x73, 0x6f, 0xc5, 0x7b, 0x3d, 0xdc, 0xd4, 0x6b, 0x87, 0xf7, 0xda, 0xd9, 0xbb, 0x57,
+    0xa5, 0x1b, 0xf0, 0xee, 0xa0, 0x7e, 0xf8, 0xd0, 0xba, 0x9a, 0x53, 0x99, 0xe7, 0xde, 0xbd, 0x2e, 0x12, 0xb6, 0x9e,
+    0x7b, 0xc9, 0x34, 0x88, 0x7a, 0x4e, 0x6e, 0xdf, 0xad, 0x69, 0x63, 0x3c, 0x3d, 0x39, 0x39, 0xc9, 0xed, 0xb1, 0x78,
+    0x72, 0xc6, 0xe3, 0xdc, 0xf6, 0xc5, 0xd3, 0x64, 0xe2, 0x38, 0x93, 0x49, 0x6e, 0x07, 0xa2, 0xa0, 0xd3, 0xf6, 0xc7,
+    0x9d, 0x76, 0x6e, 0xdf, 0x2b, 0x35, 0x72, 0x9b, 0xf1, 0xa7, 0x84, 0x8d, 0xfb, 0xb8, 0x91, 0xee, 0x69, 0xe9, 0x8f,
+    0x1d, 0x27, 0x47, 0x0c, 0x70, 0x5d, 0xc2, 0x4d, 0x28, 0xeb, 0xb9, 0x59, 0xef, 0x5d, 0x53, 0x2b, 0x3e, 0xe7, 0xfb,
+    0x8d, 0xf5, 0xc6, 0x5e, 0xf2, 0xe9, 0x46, 0x53, 0x66, 0xe1, 0x79, 0x54, 0x6d, 0x2d, 0xc0, 0x60, 0xad, 0x7a, 0x10,
+    0xca, 0xaa, 0x3f, 0x8a, 0x13, 0x38, 0xb3, 0x89, 0x37, 0x0e, 0x96, 0x69, 0xcf, 0x6d, 0x2f, 0x56, 0xa2, 0x88, 0xef,
+    0xf5, 0xa2, 0x00, 0xcf, 0x5e, 0x2f, 0x8d, 0xc3, 0x60, 0x2c, 0x8a, 0x36, 0x9d, 0x25, 0xb7, 0x6d, 0xf4, 0xd1, 0x91,
+    0x3b, 0xc0, 0x70, 0x04, 0x5e, 0x18, 0x6a, 0x76, 0x27, 0xd5, 0x98, 0x97, 0xa2, 0x88, 0x57, 0x73, 0x52, 0x82, 0x0b,
+    0x3a, 0x6d, 0xbb, 0x87, 0x8b, 0x95, 0xdc, 0xf3, 0xee, 0xd1, 0x62, 0x95, 0x7f, 0x3d, 0x67, 0xe3, 0xc0, 0xd3, 0x5a,
+    0xc5, 0x6e, 0x72, 0x1d, 0x10, 0x03, 0x1b, 0xeb, 0x0d, 0xdb, 0x54, 0x1c, 0x0b, 0x08, 0xf9, 0xf7, 0x24, 0x98, 0x2f,
+    0xe2, 0x24, 0xf3, 0xa2, 0x2c, 0xcf, 0x87, 0x37, 0x79, 0xde, 0xbf, 0x0a, 0x5a, 0xd7, 0xff, 0x6c, 0xd1, 0x3d, 0x4d,
+    0x6a, 0x93, 0xdc, 0xb8, 0x31, 0xdf, 0x32, 0xd5, 0x48, 0x03, 0xae, 0x31, 0x34, 0xd0, 0x50, 0x2b, 0xd3, 0x2d, 0x59,
+    0xaf, 0x4c, 0x40, 0x96, 0xd5, 0xc9, 0xe8, 0xa3, 0x5c, 0x05, 0x6f, 0x20, 0xa8, 0xf0, 0x96, 0x0d, 0xae, 0x14, 0x83,
+    0x0f, 0x20, 0x56, 0xb0, 0x32, 0xd9, 0xdb, 0x3f, 0xdb, 0x44, 0x33, 0x7e, 0xb3, 0x9b, 0x66, 0xfc, 0x39, 0xdb, 0x87,
+    0x66, 0xfc, 0xe6, 0x8b, 0xd3, 0x8c, 0xcf, 0xea, 0xf6, 0xf6, 0x17, 0xf1, 0x40, 0x97, 0x42, 0x7e, 0xb8, 0x9a, 0x12,
+    0x8a, 0x64, 0x73, 0xf1, 0x87, 0xcd, 0xe3, 0x45, 0x6f, 0x94, 0x9b, 0x8d, 0x6e, 0x6e, 0x90, 0xc7, 0xbe, 0x8b, 0x06,
+    0xff, 0x48, 0xd4, 0xe7, 0xc9, 0x64, 0xf0, 0x26, 0x56, 0x0a, 0xe4, 0x13, 0x37, 0x7f, 0x28, 0x45, 0x1d, 0xa0, 0x37,
+    0xc2, 0xec, 0x11, 0xf3, 0x32, 0x80, 0xd3, 0x32, 0x99, 0xf9, 0x8e, 0xa5, 0xb9, 0x57, 0xbf, 0x3c, 0x84, 0x96, 0xb4,
+    0xb1, 0x14, 0xae, 0x29, 0x35, 0x51, 0xe2, 0x94, 0x65, 0xdc, 0x97, 0xf4, 0xdb, 0x87, 0x8b, 0x71, 0xeb, 0x22, 0x36,
+    0xf2, 0x20, 0x7d, 0x57, 0x75, 0x0c, 0xe1, 0xea, 0x97, 0x81, 0x3a, 0x9d, 0x9c, 0x9b, 0x6c, 0xa9, 0x89, 0x97, 0xe1,
+    0x35, 0x35, 0x3f, 0x2f, 0xcd, 0xb4, 0xa7, 0x36, 0xe4, 0x09, 0xa0, 0x6a, 0x97, 0x31, 0xb7, 0xca, 0x5f, 0x73, 0x0a,
+    0x10, 0x73, 0x5a, 0xa1, 0x3f, 0xed, 0x98, 0x9a, 0x07, 0xe3, 0x3c, 0x37, 0xfa, 0x02, 0x10, 0xca, 0x45, 0xcb, 0x76,
+    0x11, 0x71, 0xe9, 0xbd, 0xb4, 0x2a, 0xe0, 0x4a, 0x3a, 0xd2, 0xc0, 0x5d, 0x80, 0x4a, 0x9b, 0xeb, 0xeb, 0x38, 0xcc,
+    0x74, 0x8d, 0xc0, 0x47, 0xa6, 0x0e, 0xca, 0x84, 0x40, 0xe3, 0x2d, 0xe1, 0x2f, 0x5e, 0x89, 0x82, 0xba, 0xd1, 0x24,
+    0x01, 0x07, 0x75, 0xf2, 0xe0, 0xfd, 0x2e, 0xe4, 0xda, 0x84, 0x76, 0x78, 0x1d, 0x7c, 0xc8, 0x75, 0x49, 0xfb, 0xe1,
+    0xf6, 0x3b, 0x3b, 0x3d, 0x80, 0x06, 0x67, 0x15, 0xd5, 0xfd, 0x0e, 0x93, 0x40, 0x20, 0x25, 0xd2, 0x7b, 0xd3, 0x4e,
+    0xef, 0xb5, 0x17, 0x6b, 0x11, 0x39, 0x22, 0xf3, 0x16, 0x16, 0xb0, 0xf8, 0x88, 0x7b, 0x39, 0xc6, 0x53, 0x82, 0x54,
+    0xf4, 0x97, 0x29, 0xe0, 0x46, 0x64, 0x54, 0x11, 0xff, 0xf4, 0xfd, 0x65, 0x92, 0xc6, 0x49, 0x6f, 0x11, 0x07, 0x51,
+    0xc6, 0x92, 0x1c, 0x41, 0x75, 0x8d, 0xf0, 0x11, 0xe0, 0xb9, 0x59, 0xc7, 0x0b, 0xcf, 0x0f, 0xb2, 0x87, 0x9e, 0xc3,
+    0x49, 0x0a, 0xa7, 0xcf, 0xa9, 0x03, 0xa7, 0xb1, 0x7e, 0x8f, 0x43, 0xf3, 0x25, 0x12, 0x7e, 0x49, 0x9d, 0x9c, 0x51,
+    0xb7, 0x79, 0x5f, 0x79, 0x4b, 0xb1, 0x33, 0x80, 0xfc, 0xf0, 0x12, 0x6b, 0x0a, 0x58, 0x1e, 0x96, 0xda, 0x19, 0xb3,
+    0xa9, 0x89, 0x58, 0x1b, 0xe4, 0xf2, 0xe2, 0xcf, 0xee, 0x1a, 0x9a, 0xd3, 0x5c, 0x0c, 0x14, 0x8f, 0xb1, 0xcf, 0xc8,
+    0x7a, 0x1e, 0x64, 0x9a, 0x32, 0xf7, 0xa9, 0x39, 0x62, 0x93, 0x38, 0x61, 0x14, 0x67, 0xd5, 0x3d, 0x59, 0xac, 0xf6,
+    0xef, 0x7e, 0xfb, 0xf4, 0x9b, 0xfb, 0x89, 0xe2, 0xac, 0x25, 0x3a, 0x33, 0x76, 0xf4, 0x56, 0xbf, 0xcf, 0x80, 0x34,
+    0x24, 0xc8, 0xfb, 0x14, 0xd2, 0xaa, 0xa7, 0xeb, 0xfd, 0xc6, 0x70, 0x56, 0x8b, 0x98, 0xdf, 0x79, 0x09, 0x0b, 0xbd,
+    0x2c, 0xb8, 0x13, 0x34, 0x63, 0xe7, 0x68, 0xb1, 0x12, 0x6b, 0x8c, 0x17, 0xde, 0x23, 0x16, 0xa9, 0x32, 0x14, 0xb1,
+    0x48, 0xd5, 0x62, 0x5c, 0xa4, 0x7e, 0x6d, 0x36, 0x22, 0xc2, 0x43, 0xe5, 0xa6, 0xef, 0x2e, 0x56, 0xea, 0x15, 0x5d,
+    0x34, 0x93, 0x37, 0x75, 0x35, 0x34, 0xd7, 0x3c, 0x18, 0x8f, 0x43, 0x96, 0x97, 0x16, 0xba, 0xbc, 0x96, 0x0a, 0x70,
+    0x24, 0x1c, 0xbc, 0x51, 0x1a, 0x87, 0xcb, 0x8c, 0x35, 0x83, 0x8b, 0x80, 0xd3, 0x76, 0x0a, 0xe0, 0xe0, 0xef, 0xf2,
+    0x58, 0xbb, 0x40, 0x6e, 0xc3, 0x36, 0x71, 0xfa, 0x10, 0x89, 0xd7, 0xea, 0x94, 0x87, 0x0e, 0xaf, 0xe4, 0xa0, 0xcd,
+    0x86, 0x89, 0x98, 0x70, 0x2d, 0x11, 0xf6, 0xd6, 0x6c, 0x97, 0x97, 0xc9, 0x68, 0xa4, 0xb2, 0x28, 0x2f, 0x4f, 0xe6,
+    0xcf, 0x39, 0x63, 0xaf, 0x9a, 0xcf, 0xd8, 0x2b, 0x71, 0xc6, 0xb6, 0xef, 0xcc, 0xa7, 0x13, 0x17, 0xfe, 0xeb, 0x17,
+    0x13, 0xea, 0x39, 0x5a, 0x67, 0xb1, 0xd2, 0xdc, 0xc5, 0x4a, 0xb3, 0xda, 0x8b, 0x95, 0x86, 0x5d, 0xa3, 0x49, 0x86,
+    0x69, 0xb7, 0x0d, 0xd3, 0xd1, 0xa0, 0x10, 0xfe, 0x9c, 0xd2, 0x2b, 0xf7, 0x10, 0xde, 0x41, 0xab, 0x6e, 0xfd, 0x5d,
+    0x7b, 0xfb, 0x51, 0xa7, 0xb3, 0x24, 0x90, 0xb6, 0x61, 0x67, 0xde, 0x68, 0xc4, 0xc6, 0xbd, 0x49, 0xec, 0x2f, 0xd3,
+    0x7f, 0xf3, 0xf1, 0x73, 0x20, 0x6e, 0x45, 0x04, 0x95, 0x7e, 0x44, 0x53, 0x50, 0x94, 0xdc, 0x31, 0xd1, 0xc3, 0x5a,
+    0xae, 0x53, 0x8f, 0xc2, 0x06, 0xb7, 0xed, 0xc3, 0x86, 0x4d, 0xde, 0x0c, 0xe8, 0x3f, 0x6d, 0x95, 0x36, 0xa3, 0x98,
+    0xcf, 0x00, 0xcb, 0x56, 0x70, 0x3c, 0x1e, 0x1a, 0x7c, 0x35, 0x9d, 0x93, 0xe6, 0xe1, 0x5e, 0x8b, 0x2f, 0xdd, 0x88,
+    0x4b, 0x85, 0xdf, 0x5b, 0xdc, 0x13, 0x64, 0x7b, 0xaf, 0x9b, 0xf6, 0x48, 0xad, 0xd7, 0x2d, 0x17, 0x42, 0x51, 0x77,
+    0x4f, 0x2c, 0xff, 0xf4, 0xd5, 0x21, 0xfc, 0x47, 0x54, 0xfd, 0xcf, 0x59, 0x13, 0xa1, 0x7e, 0x51, 0x36, 0xbd, 0x26,
+    0x52, 0x09, 0x09, 0xf1, 0xfd, 0xeb, 0x4f, 0x26, 0x8f, 0x6b, 0xb0, 0x77, 0x6d, 0xb2, 0x66, 0xaa, 0xd6, 0xfe, 0x36,
+    0x8e, 0x21, 0xa5, 0x65, 0xbd, 0xba, 0x00, 0x0f, 0x59, 0x97, 0x67, 0x03, 0x68, 0x24, 0xf8, 0x08, 0xd2, 0xe2, 0xeb,
+    0xd8, 0x86, 0x58, 0x89, 0xb7, 0x9b, 0x58, 0x89, 0x37, 0xbb, 0x59, 0x89, 0xef, 0xf7, 0x62, 0x25, 0xde, 0x7c, 0x71,
+    0x56, 0xe2, 0x6d, 0x9d, 0x95, 0xb8, 0x8a, 0x85, 0x05, 0xab, 0x79, 0xb1, 0xe4, 0x3f, 0x3f, 0x92, 0x52, 0xee, 0x32,
+    0x1e, 0x74, 0x1d, 0x0a, 0x05, 0x7c, 0xf5, 0x87, 0x19, 0x0b, 0xdc, 0x88, 0xef, 0xd1, 0xa2, 0xab, 0x60, 0x2d, 0x38,
+    0x66, 0xc7, 0xef, 0x28, 0xc5, 0x61, 0x1c, 0x4d, 0x7f, 0x02, 0xa5, 0x2c, 0x88, 0x03, 0x13, 0xe5, 0x45, 0x90, 0xfe,
+    0x14, 0x2f, 0x96, 0x8b, 0x0b, 0xe8, 0xeb, 0x63, 0x90, 0x06, 0xa3, 0x90, 0x49, 0x0f, 0x5d, 0xb2, 0x40, 0xe3, 0x32,
+    0x71, 0xb0, 0xf9, 0x14, 0x3f, 0xbd, 0x95, 0xf8, 0x89, 0x56, 0xa1, 0xfc, 0x37, 0x99, 0xb6, 0xe9, 0xcd, 0x8c, 0x88,
+    0x50, 0x02, 0x2a, 0x83, 0x7e, 0x3c, 0x33, 0x72, 0x15, 0x1b, 0x0d, 0xb3, 0x14, 0xf6, 0x0e, 0x1b, 0xfb, 0x61, 0x35,
+    0xa6, 0x66, 0x69, 0x98, 0x32, 0x34, 0x55, 0x5d, 0x0c, 0x3f, 0x8f, 0x97, 0x29, 0x1b, 0xc7, 0xf7, 0x91, 0x6e, 0x46,
+    0xd2, 0xaa, 0x1f, 0x34, 0x9c, 0xb2, 0x0d, 0x26, 0x55, 0xfc, 0x80, 0x84, 0x72, 0x9c, 0xb4, 0x74, 0xc8, 0xe9, 0xb9,
+    0x5c, 0x58, 0xa4, 0x6a, 0xb6, 0x70, 0x8a, 0xba, 0xcc, 0xfe, 0xf3, 0xa4, 0xd5, 0x8a, 0x07, 0x8f, 0x6b, 0x29, 0x4c,
+    0x35, 0x62, 0x9b, 0x4b, 0x85, 0xd3, 0x56, 0x24, 0x84, 0x8b, 0x22, 0x3e, 0x44, 0xc3, 0xc2, 0xf1, 0x37, 0xe4, 0x2b,
+    0x5a, 0xbc, 0x85, 0xe8, 0x1a, 0xf9, 0x92, 0xaf, 0x07, 0x8f, 0x96, 0x40, 0x8f, 0xaf, 0x15, 0x30, 0xbe, 0xbb, 0x63,
+    0x49, 0xe8, 0x3d, 0xb4, 0x8c, 0x3c, 0x8e, 0x7e, 0x00, 0x00, 0xbc, 0x89, 0xef, 0x23, 0xb5, 0x02, 0x26, 0x31, 0x69,
+    0xd8, 0x4b, 0x8d, 0x71, 0x3d, 0xc0, 0x53, 0x44, 0x19, 0x01, 0xa4, 0x8f, 0x9d, 0xb2, 0x7f, 0x98, 0xf4, 0xef, 0x3f,
+    0x8d, 0xdc, 0xbc, 0x8c, 0xe5, 0x87, 0xfe, 0xbe, 0xd8, 0xe3, 0x33, 0xcf, 0x9f, 0x3f, 0xd9, 0x3c, 0xed, 0x72, 0xda,
+    0xf2, 0x86, 0xd6, 0xc6, 0xc6, 0x53, 0x00, 0xa3, 0xb8, 0x8a, 0x97, 0xfe, 0x0c, 0x6d, 0x4d, 0xbf, 0xdc, 0x7c, 0x33,
+    0xe8, 0x13, 0xb3, 0x77, 0xca, 0xa9, 0x57, 0x8a, 0x0a, 0x28, 0xe0, 0xf7, 0xdf, 0x42, 0x60, 0xca, 0xff, 0x21, 0x18,
+    0xea, 0xbb, 0x86, 0x73, 0xf1, 0xc1, 0xe3, 0x36, 0x6f, 0x1f, 0x92, 0x4c, 0xf2, 0x90, 0x0f, 0x42, 0xb9, 0xd6, 0x8c,
+    0x64, 0xf2, 0x2a, 0xd0, 0xd4, 0xf0, 0x6a, 0x9b, 0x22, 0xc7, 0x89, 0xaf, 0x30, 0x9b, 0xd8, 0x74, 0x6e, 0xea, 0x6f,
+    0x32, 0x8e, 0xad, 0x2a, 0x48, 0x86, 0x9b, 0x3c, 0x30, 0x44, 0x5f, 0xd5, 0x77, 0xf3, 0x20, 0x32, 0x31, 0x3a, 0x7a,
+    0xfd, 0x8d, 0xb7, 0x82, 0xf8, 0xc0, 0x80, 0xdc, 0xaa, 0xaf, 0xa0, 0xd0, 0x54, 0x1d, 0xd5, 0x20, 0x05, 0x92, 0xde,
+    0x08, 0x09, 0xa1, 0xc5, 0x1b, 0xfe, 0x45, 0xd3, 0x34, 0x4d, 0xb2, 0x11, 0x9a, 0xe4, 0x23, 0xb0, 0x1c, 0xd9, 0x01,
+    0xd0, 0x96, 0xe4, 0x8b, 0x15, 0x95, 0x00, 0x67, 0x80, 0x3a, 0x59, 0x51, 0xc0, 0x43, 0xe0, 0x75, 0x1d, 0x51, 0x20,
+    0x18, 0x7a, 0x08, 0x5f, 0xe6, 0x25, 0x10, 0x29, 0xb7, 0xa7, 0x21, 0xc3, 0x8e, 0x6f, 0xb9, 0x24, 0x58, 0x73, 0xe8,
+    0x71, 0xd8, 0x67, 0xcd, 0xb1, 0xd2, 0x22, 0x05, 0x0b, 0x82, 0xd6, 0xa1, 0x12, 0xfa, 0xd8, 0x64, 0x0d, 0xb8, 0x11,
+    0xf9, 0xa2, 0x55, 0x36, 0x67, 0xd1, 0x52, 0xc7, 0x5c, 0x49, 0x18, 0xbb, 0x0e, 0xea, 0xbc, 0x21, 0x62, 0x0b, 0xb0,
+    0x4d, 0x73, 0xcb, 0x19, 0xdd, 0x85, 0x29, 0x47, 0xa9, 0x9e, 0xe9, 0x73, 0xc5, 0x66, 0xca, 0x71, 0x5b, 0xf5, 0x86,
+    0xe0, 0x4b, 0x1a, 0x57, 0x3d, 0xa7, 0xc8, 0x18, 0x19, 0xfa, 0xa0, 0xa8, 0x11, 0x5c, 0x5c, 0x24, 0xc0, 0xde, 0xf2,
+    0xaa, 0x8b, 0x26, 0x35, 0x32, 0x5e, 0x45, 0x50, 0x94, 0x18, 0xf5, 0x6e, 0xf8, 0x38, 0x21, 0x60, 0xcf, 0xc6, 0x7e,
+    0xfc, 0x5a, 0x3f, 0x1b, 0x26, 0xfd, 0x89, 0x3d, 0xd0, 0x45, 0x42, 0xa0, 0xfa, 0xc4, 0x1e, 0xc0, 0xf6, 0xef, 0x2d,
+    0x48, 0x53, 0xf4, 0x2d, 0xe8, 0xda, 0x84, 0x10, 0xf8, 0x3e, 0x04, 0x71, 0xda, 0x72, 0x80, 0x9c, 0x7c, 0x0b, 0x16,
+    0x47, 0x10, 0x43, 0xb6, 0x63, 0x71, 0x88, 0xb9, 0x95, 0x7d, 0xab, 0x11, 0xc6, 0x56, 0xc3, 0xd1, 0x30, 0x5e, 0xb8,
+    0x8e, 0x73, 0x50, 0xab, 0x0f, 0x82, 0xec, 0xa6, 0xda, 0x86, 0x99, 0x0d, 0x5c, 0xc7, 0x0a, 0x5e, 0xd8, 0xed, 0x7e,
+    0xed, 0x8e, 0x56, 0x62, 0x2c, 0x0e, 0x51, 0xfc, 0x75, 0xf6, 0x6c, 0xdd, 0xaa, 0x1d, 0x48, 0xa3, 0x6a, 0xb5, 0x8e,
+    0x63, 0xcb, 0xb9, 0xfc, 0x6b, 0x58, 0xbf, 0xfa, 0x29, 0xc2, 0x23, 0xe5, 0xfb, 0x18, 0x42, 0x94, 0xe0, 0x16, 0x1c,
+    0xa3, 0xbf, 0x6a, 0x2f, 0xb5, 0x16, 0x1d, 0x1f, 0xc3, 0x18, 0xca, 0x34, 0xd2, 0xc2, 0xab, 0x4b, 0xed, 0xa0, 0xf2,
+    0xc5, 0xb4, 0x8a, 0xe1, 0x78, 0x3c, 0x52, 0x56, 0x68, 0xf4, 0xb6, 0x52, 0x0b, 0xd8, 0xff, 0x86, 0xeb, 0xd3, 0x1e,
+    0x41, 0x20, 0x00, 0xa8, 0x01, 0x31, 0xc5, 0x77, 0x76, 0xb8, 0x5c, 0x94, 0xbb, 0x2b, 0x5f, 0x92, 0xfb, 0x77, 0x86,
+    0x97, 0x0e, 0xea, 0xd0, 0x64, 0x7f, 0xcd, 0xd7, 0xdd, 0x23, 0xbb, 0x64, 0xd1, 0xb8, 0xdc, 0x61, 0xe5, 0xfe, 0xda,
+    0xbf, 0xbb, 0x12, 0x46, 0x81, 0x60, 0xfb, 0x71, 0x03, 0x46, 0xc9, 0xe3, 0x08, 0x37, 0x3f, 0x1d, 0xb7, 0x60, 0x2f,
+    0x2a, 0x06, 0x1b, 0x50, 0xa4, 0x2c, 0xd9, 0x4c, 0x11, 0x8a, 0x43, 0x44, 0x67, 0xf4, 0xc3, 0x6d, 0x09, 0x42, 0x74,
+    0xe3, 0x4e, 0xcc, 0x84, 0x4d, 0x61, 0xd1, 0x26, 0xe0, 0x31, 0x1a, 0xf7, 0x95, 0x5a, 0x07, 0xbb, 0xa5, 0xd6, 0xd9,
+    0x2e, 0xa9, 0x35, 0x39, 0x34, 0xdd, 0x27, 0xde, 0x42, 0xf1, 0x89, 0x13, 0xc4, 0xb9, 0xea, 0x1a, 0x57, 0x12, 0x75,
+    0xa3, 0xff, 0x93, 0x68, 0x55, 0xeb, 0x8d, 0xac, 0x04, 0x51, 0xfc, 0xad, 0x30, 0x28, 0x42, 0xa1, 0xae, 0xca, 0xc6,
+    0xaf, 0x0a, 0xd9, 0x38, 0x71, 0x35, 0x85, 0x2f, 0x8b, 0xa0, 0xfe, 0x15, 0x37, 0x31, 0xc9, 0x1d, 0x14, 0xee, 0x62,
+    0xc5, 0x48, 0x15, 0x07, 0xa8, 0x82, 0xd1, 0x50, 0xdc, 0xea, 0x04, 0x97, 0x51, 0xf6, 0xae, 0x2b, 0x57, 0x2d, 0xbc,
+    0xcd, 0x8a, 0x72, 0x90, 0xba, 0xe3, 0x90, 0x65, 0xb1, 0xba, 0x6d, 0xca, 0x1e, 0x30, 0xea, 0x6b, 0x65, 0x93, 0x48,
+    0x57, 0x15, 0x02, 0xb0, 0x10, 0xd3, 0x57, 0xf4, 0xda, 0xd2, 0x06, 0x02, 0x07, 0xd9, 0xe0, 0x58, 0xb7, 0x5b, 0x3a,
+    0x4f, 0x79, 0x04, 0x0a, 0x2d, 0xbc, 0x2a, 0x83, 0x40, 0xf8, 0xde, 0xac, 0x1b, 0x6e, 0x79, 0xbc, 0xe4, 0xf9, 0xfd,
+    0x0e, 0xe2, 0x45, 0xcd, 0x51, 0x15, 0xf9, 0x78, 0x32, 0x2d, 0x32, 0xcf, 0xc5, 0xaa, 0xf5, 0x4e, 0x49, 0x88, 0xb3,
+    0xe6, 0xce, 0x29, 0x65, 0x19, 0x3d, 0xaf, 0xd1, 0x13, 0xdf, 0xe5, 0x5b, 0x27, 0x59, 0x46, 0x18, 0xf3, 0xdd, 0xca,
+    0x12, 0xcf, 0xff, 0xa4, 0x0c, 0x59, 0xc8, 0x39, 0x41, 0x06, 0x5c, 0xd6, 0x14, 0xf4, 0x3d, 0x0c, 0x91, 0xc8, 0x7a,
+    0x76, 0x3b, 0x55, 0xa4, 0x2f, 0xbd, 0xa7, 0x4e, 0xc7, 0x7b, 0x35, 0x39, 0xac, 0x08, 0x45, 0xdb, 0xdd, 0xb2, 0xc8,
+    0x7c, 0xc3, 0x38, 0xb2, 0xd9, 0x72, 0x3e, 0x5a, 0xab, 0xb2, 0x55, 0x45, 0xe4, 0x5a, 0x17, 0xb3, 0xaa, 0x9f, 0x9d,
+    0x4c, 0x26, 0x65, 0x41, 0xa3, 0xa3, 0x1d, 0xa2, 0xb0, 0xf0, 0xa9, 0xe3, 0x38, 0xd5, 0xb1, 0x6f, 0x07, 0xbb, 0x85,
+    0x72, 0xdb, 0x93, 0xc6, 0x11, 0x23, 0x6c, 0x77, 0xc1, 0xaf, 0x0e, 0x8e, 0xdc, 0x2e, 0x4e, 0x76, 0xc9, 0x2c, 0xa2,
+    0x4f, 0xc6, 0x10, 0x41, 0xc6, 0xe6, 0x69, 0xcf, 0x67, 0xa8, 0x83, 0xb1, 0x95, 0x03, 0x8d, 0x86, 0x03, 0xd6, 0x14,
+    0x4c, 0x45, 0x5c, 0xb1, 0x2b, 0x1c, 0x0d, 0xe5, 0xe1, 0x35, 0xe1, 0xbd, 0xf8, 0x08, 0x1e, 0x94, 0x75, 0x5d, 0xa6,
+    0x8d, 0xd3, 0xea, 0x3a, 0x7f, 0x2d, 0xd5, 0xd3, 0xe0, 0x02, 0x5c, 0x0b, 0x85, 0x36, 0xc9, 0x67, 0xf1, 0xff, 0xa5,
+    0xfc, 0xff, 0xd5, 0x62, 0x55, 0xb6, 0x1f, 0x39, 0x01, 0x89, 0x76, 0x71, 0x5a, 0x68, 0xd4, 0x4d, 0x7b, 0x40, 0x5a,
+    0x19, 0x4c, 0x54, 0x05, 0x3a, 0x28, 0xe9, 0x4b, 0x89, 0x31, 0x1a, 0xc4, 0xef, 0x48, 0x31, 0xc3, 0x12, 0x17, 0x22,
+    0xc4, 0x22, 0xad, 0x1b, 0xcc, 0xc1, 0x7c, 0x79, 0x82, 0xfa, 0x83, 0xd2, 0x9e, 0x00, 0x6d, 0x7c, 0x6d, 0x6e, 0x7b,
+    0x89, 0xfb, 0xab, 0x7a, 0x2d, 0xd1, 0x31, 0x80, 0xcc, 0x85, 0x43, 0x88, 0x86, 0x04, 0x5a, 0x65, 0x73, 0xd3, 0x28,
+    0xe5, 0x5b, 0x55, 0xcf, 0x26, 0x06, 0x86, 0xdd, 0x35, 0x57, 0xa1, 0xbe, 0x85, 0xb6, 0x00, 0x26, 0xcb, 0xb7, 0x1f,
+    0x3e, 0x5b, 0xb0, 0xc4, 0xea, 0x7e, 0x74, 0x71, 0xc9, 0x71, 0xff, 0x5a, 0x78, 0x77, 0xa6, 0x74, 0xfe, 0x51, 0xbe,
+    0xf8, 0x7d, 0xa3, 0x40, 0xef, 0xaa, 0x24, 0xa1, 0xe3, 0xd6, 0xe2, 0x6d, 0x63, 0xaf, 0xda, 0xf3, 0x20, 0xda, 0xbf,
+    0xae, 0xb7, 0xda, 0xbb, 0x2e, 0x5c, 0x18, 0x7b, 0x57, 0x86, 0x1b, 0x87, 0x2c, 0x17, 0xb2, 0xc1, 0xf7, 0x8a, 0x40,
+    0x51, 0xf5, 0xfb, 0xd5, 0xb1, 0x15, 0x51, 0xf9, 0x57, 0x4b, 0x20, 0x3e, 0xf7, 0x4a, 0x7c, 0xa0, 0x89, 0xdc, 0x65,
+    0xfa, 0xb1, 0x76, 0xa2, 0x1d, 0x77, 0xb4, 0x23, 0x47, 0x27, 0x2e, 0x6c, 0xa0, 0x77, 0xdb, 0x85, 0x43, 0xdf, 0xa1,
+    0xa3, 0x9f, 0x9d, 0x4e, 0xc5, 0x25, 0x31, 0x09, 0xc2, 0x90, 0x50, 0x45, 0x9a, 0x25, 0xf1, 0x27, 0x56, 0x56, 0xb3,
+    0x50, 0x19, 0x37, 0x02, 0x69, 0x8b, 0x47, 0x38, 0x3b, 0xbe, 0xb7, 0xe8, 0xe1, 0xd9, 0x50, 0x0b, 0xc1, 0x80, 0x93,
+    0x4a, 0xf1, 0x13, 0x70, 0x07, 0x8f, 0xf4, 0xb3, 0x53, 0x08, 0xed, 0xa7, 0x8d, 0x07, 0xfa, 0x0f, 0xed, 0x63, 0xcd,
+    0xed, 0xde, 0x59, 0x1d, 0xdf, 0xb1, 0x5c, 0xfb, 0x50, 0x73, 0xec, 0x23, 0xab, 0x6d, 0x1f, 0x6b, 0x6d, 0xbb, 0x0b,
+    0xff, 0xfa, 0xae, 0xfd, 0x4a, 0x73, 0xe0, 0x49, 0x73, 0xed, 0x0e, 0xfe, 0xdb, 0xb6, 0x8f, 0xef, 0x3a, 0x74, 0xd3,
+    0x7b, 0xd2, 0xad, 0xaa, 0x32, 0x0a, 0x70, 0x02, 0xd1, 0x0f, 0xce, 0x4e, 0x97, 0x29, 0xd3, 0x56, 0x03, 0xfd, 0x95,
+    0xae, 0xcd, 0x12, 0x36, 0x19, 0xe8, 0x4f, 0x3d, 0xa5, 0xd4, 0x3d, 0x69, 0x2c, 0x6e, 0x1f, 0x37, 0x16, 0x77, 0x8e,
+    0x1a, 0x8b, 0x0f, 0xbb, 0xe5, 0xe2, 0x83, 0x29, 0xbd, 0x52, 0x32, 0xeb, 0xcd, 0xbd, 0x2c, 0x09, 0x56, 0x2d, 0x57,
+    0x03, 0x74, 0x6d, 0xc1, 0x3f, 0xc7, 0x6d, 0x43, 0xb6, 0x1a, 0x41, 0x2b, 0x09, 0x8d, 0xe3, 0x13, 0xcd, 0x3d, 0xfa,
+    0x5b, 0xfb, 0xc8, 0x87, 0x7a, 0x90, 0x07, 0x12, 0xfe, 0xee, 0x3a, 0x27, 0xbe, 0xa3, 0x41, 0x43, 0x17, 0xfe, 0x9b,
+    0x75, 0xdb, 0x3e, 0x3d, 0x38, 0xf0, 0xfe, 0xa3, 0x7b, 0x9c, 0x3a, 0x96, 0x0b, 0xff, 0xfd, 0x2a, 0x55, 0xee, 0xa0,
+    0xf0, 0x57, 0xfb, 0x3d, 0x74, 0xb4, 0xce, 0xc9, 0xac, 0x6d, 0xbf, 0xba, 0x3b, 0xb6, 0x4f, 0x66, 0xee, 0xf1, 0x47,
+    0x7a, 0x0a, 0xad, 0xb6, 0xfd, 0x0a, 0xfe, 0x3e, 0x76, 0x9c, 0x99, 0xe5, 0xda, 0x27, 0x77, 0x1d, 0xbb, 0x13, 0x5a,
+    0x47, 0xf6, 0x09, 0xfc, 0xfd, 0x0a, 0xe0, 0x05, 0xb8, 0xf2, 0xc4, 0x9d, 0x1a, 0x6c, 0x8c, 0x8a, 0xfd, 0x86, 0xfa,
+    0x91, 0xf6, 0xa1, 0xd6, 0x3d, 0xfc, 0xdb, 0xc9, 0x9d, 0x75, 0x38, 0x73, 0xdb, 0x77, 0xd6, 0xc6, 0x9f, 0x1f, 0x01,
+    0xf2, 0xdb, 0x17, 0x0e, 0xc0, 0x88, 0x99, 0x3a, 0xfe, 0x32, 0x34, 0x2f, 0x37, 0x89, 0xd1, 0xdf, 0xef, 0x16, 0xa3,
+    0x7f, 0xb7, 0xdc, 0x47, 0x8c, 0xfe, 0xfe, 0x8b, 0x8b, 0xd1, 0x2f, 0xab, 0x56, 0xdc, 0xef, 0xab, 0x11, 0xc5, 0x7f,
+    0x5e, 0x57, 0x89, 0xe4, 0xc0, 0x6b, 0x5d, 0x5f, 0x2d, 0x6f, 0x20, 0xd8, 0xce, 0xfb, 0x78, 0xf0, 0xdd, 0xb2, 0x64,
+    0xa2, 0x14, 0x03, 0x06, 0x78, 0x1f, 0x13, 0x06, 0xf8, 0x75, 0x39, 0x00, 0xbb, 0x08, 0x7e, 0x6b, 0x06, 0x63, 0x6b,
+    0xe6, 0x85, 0x13, 0x79, 0xe3, 0x42, 0x49, 0x1f, 0x8b, 0xc1, 0x66, 0x1e, 0x2e, 0x13, 0x50, 0xd6, 0x2c, 0xe7, 0x51,
+    0xda, 0x3b, 0x72, 0x00, 0xcd, 0xb7, 0x27, 0x49, 0x5e, 0x69, 0x6c, 0x8b, 0xf0, 0x44, 0xb7, 0xdc, 0xa6, 0x7f, 0xe3,
+    0x7b, 0x34, 0x59, 0x6b, 0xee, 0xdd, 0xad, 0xf7, 0xab, 0x81, 0x2d, 0x88, 0x30, 0xe9, 0x03, 0x62, 0xa3, 0xe9, 0x7d,
+    0xd9, 0x70, 0xac, 0x62, 0x2a, 0xb8, 0x79, 0xa4, 0x30, 0x92, 0x6a, 0x7b, 0xb7, 0x6c, 0x78, 0xb6, 0x6b, 0x9a, 0x0d,
+    0x9f, 0x2f, 0x35, 0xdf, 0x62, 0xf5, 0x26, 0x3b, 0xae, 0x82, 0xaa, 0x92, 0x0f, 0xab, 0x11, 0x20, 0x05, 0xed, 0x59,
+    0x98, 0xc6, 0x15, 0x84, 0x8f, 0xa3, 0xe1, 0x6d, 0xec, 0x28, 0xef, 0x4a, 0x7d, 0xaa, 0xe6, 0x74, 0x2f, 0xd6, 0x48,
+    0x0f, 0x06, 0xbf, 0x02, 0x61, 0xc3, 0xef, 0xe3, 0x51, 0xac, 0xc2, 0x79, 0xad, 0xf4, 0x4b, 0xa4, 0x76, 0x3e, 0x73,
+    0xd7, 0x75, 0xd2, 0x66, 0xa3, 0x21, 0xad, 0xcb, 0xe6, 0xe2, 0x8e, 0xc6, 0xcf, 0x93, 0xd9, 0x6a, 0x4e, 0xa6, 0xc5,
+    0x68, 0x99, 0xbb, 0xad, 0x33, 0x51, 0xef, 0x29, 0x6c, 0x62, 0x93, 0x3f, 0xa8, 0x8e, 0xe3, 0xeb, 0x09, 0xe4, 0x2e,
+    0xee, 0x21, 0x11, 0xa1, 0x50, 0x50, 0x6d, 0xb4, 0xb1, 0xed, 0x6f, 0x31, 0xff, 0x50, 0x3b, 0xe6, 0x9d, 0xa0, 0xad,
+    0xee, 0x36, 0x8b, 0x11, 0xe9, 0xda, 0xb0, 0x2e, 0x29, 0x50, 0xdd, 0xee, 0xb1, 0xe9, 0x1e, 0x99, 0xf6, 0x71, 0xd7,
+    0xc8, 0xc5, 0x81, 0x53, 0xbb, 0x2c, 0x01, 0x04, 0x4c, 0x76, 0xe5, 0x30, 0x83, 0x28, 0xc8, 0x02, 0x2f, 0xcc, 0x01,
+    0xd5, 0x97, 0x69, 0xde, 0x7f, 0x2d, 0xd3, 0x0c, 0xe6, 0x28, 0x48, 0x32, 0x34, 0x57, 0xb6, 0x46, 0x2c, 0xbb, 0x67,
+    0x2c, 0xda, 0xa0, 0xca, 0xad, 0x5a, 0x3f, 0xff, 0x79, 0xb6, 0xa0, 0x39, 0xd9, 0x59, 0x8c, 0xb2, 0x88, 0xef, 0x0f,
+    0x61, 0xaa, 0x9b, 0x0f, 0xcd, 0x1f, 0x37, 0x21, 0xdc, 0x7f, 0xed, 0x46, 0xb8, 0x19, 0xdb, 0x07, 0xe1, 0xfe, 0xeb,
+    0x8b, 0x23, 0xdc, 0x1f, 0x55, 0x84, 0x5b, 0xf2, 0x54, 0x29, 0x64, 0xa2, 0x1f, 0xf0, 0xb9, 0x05, 0xa1, 0x78, 0x5f,
+    0xea, 0x07, 0x44, 0x5e, 0xea, 0x4a, 0x8a, 0xd4, 0x8f, 0xa5, 0x9c, 0x2f, 0xc8, 0xb2, 0x63, 0x4c, 0x52, 0xca, 0x2f,
+    0x01, 0xe9, 0x43, 0x65, 0x22, 0x6c, 0xe8, 0xf3, 0x22, 0xca, 0x42, 0xfb, 0x3d, 0x67, 0x4b, 0x40, 0x05, 0xf1, 0x5d,
+    0x9c, 0xcc, 0x3d, 0x8c, 0xc7, 0xa6, 0x63, 0xae, 0x38, 0x78, 0x70, 0xc0, 0x3b, 0xca, 0x8f, 0xa3, 0xb1, 0x94, 0xa3,
+    0xb3, 0xc1, 0x35, 0xd1, 0x83, 0xfa, 0x03, 0xf3, 0x12, 0xdd, 0xa4, 0xd7, 0xb0, 0xb8, 0x2f, 0x3a, 0xce, 0x8b, 0xf6,
+    0xe1, 0x8b, 0x23, 0x07, 0xfe, 0xe7, 0xb2, 0x4e, 0x6e, 0xf2, 0x8a, 0xf3, 0x38, 0x82, 0x74, 0x15, 0xa2, 0xe6, 0xa6,
+    0x6a, 0xf7, 0x8c, 0x7d, 0x2a, 0x6a, 0x1d, 0x37, 0x57, 0x1a, 0x7b, 0x0f, 0x45, 0x9d, 0xc6, 0x1a, 0xb3, 0x78, 0xa9,
+    0x0c, 0xab, 0x61, 0x34, 0x41, 0xb4, 0x04, 0xc9, 0x90, 0x52, 0x43, 0x7d, 0xcd, 0xa7, 0x5b, 0xcc, 0x8b, 0x75, 0xf2,
+    0x9b, 0x22, 0x27, 0x8e, 0xc8, 0xcd, 0xb1, 0x13, 0x82, 0x5c, 0xa8, 0xee, 0x60, 0x44, 0x6d, 0xcc, 0x0a, 0xa3, 0x41,
+    0x46, 0xba, 0x22, 0xf1, 0x39, 0x2e, 0x50, 0x96, 0x2c, 0x23, 0x9f, 0x72, 0x9b, 0x7b, 0xa3, 0xb4, 0x15, 0x1c, 0x40,
+    0xb0, 0x4e, 0xfc, 0xb0, 0x81, 0xab, 0xe6, 0x9d, 0x39, 0x45, 0x02, 0x81, 0x54, 0xac, 0x8a, 0xf7, 0x22, 0x33, 0x13,
+    0x4a, 0x3b, 0x8a, 0x4b, 0x6b, 0x0d, 0xbc, 0x17, 0xb2, 0xe1, 0x8b, 0xcc, 0x84, 0xd4, 0x9f, 0xb0, 0xdc, 0xcf, 0x9f,
+    0x53, 0x2d, 0x48, 0xc6, 0x47, 0xd3, 0x3a, 0xf7, 0x65, 0x02, 0x2f, 0x5d, 0xf3, 0xa6, 0xb1, 0x8e, 0x09, 0xbc, 0x7a,
+    0xbe, 0x19, 0xbf, 0x7c, 0x79, 0x36, 0x70, 0x0d, 0x9e, 0x4a, 0xb2, 0x94, 0xf7, 0xe8, 0x72, 0x3f, 0xd5, 0xb8, 0xd1,
+    0xe8, 0xb4, 0xb5, 0x08, 0xa2, 0xa9, 0xd0, 0x4c, 0x4b, 0xec, 0x05, 0x79, 0x08, 0x48, 0x05, 0xe6, 0x09, 0x15, 0xb5,
+    0xa8, 0x73, 0xc7, 0x12, 0x48, 0x83, 0x39, 0xd0, 0x3b, 0xb6, 0x63, 0x3b, 0xba, 0x6c, 0x38, 0x09, 0xa6, 0x83, 0x75,
+    0x9c, 0x79, 0x90, 0xd1, 0x25, 0x8c, 0xa7, 0xe0, 0xf9, 0x91, 0x05, 0x59, 0x08, 0xe9, 0x41, 0xc0, 0x05, 0x64, 0x4e,
+    0x5c, 0x63, 0xce, 0xed, 0x71, 0xbd, 0xe4, 0x13, 0xa6, 0x88, 0x13, 0x4e, 0x5f, 0x18, 0x92, 0xe6, 0x07, 0xb8, 0x0c,
+    0x5b, 0x7a, 0x0b, 0x12, 0x14, 0xb2, 0x24, 0xb5, 0x54, 0xfb, 0xf6, 0x9e, 0x06, 0x6d, 0x20, 0x79, 0x38, 0x76, 0x30,
+    0x49, 0xbc, 0x39, 0x44, 0xd2, 0x5e, 0xe7, 0x26, 0xc7, 0xb4, 0x3a, 0x47, 0xb5, 0x9a, 0xfb, 0xea, 0xc8, 0xd4, 0xda,
+    0xae, 0xa9, 0x39, 0x80, 0x6e, 0xf5, 0xdc, 0x5c, 0xe7, 0x37, 0xfd, 0x5d, 0x2a, 0x3a, 0xc2, 0x2f, 0x4f, 0x69, 0x1e,
+    0xa4, 0x9c, 0xe3, 0xc2, 0xcf, 0x8c, 0xe2, 0x09, 0xb6, 0x94, 0x18, 0xd7, 0x01, 0x89, 0xe9, 0xaf, 0xd8, 0x2a, 0x33,
+    0x30, 0x7d, 0x06, 0xaf, 0x12, 0x18, 0x6b, 0x74, 0x4d, 0x0b, 0x22, 0x2d, 0xf8, 0xed, 0xb7, 0x56, 0x00, 0xe6, 0xf7,
+    0x03, 0x05, 0x3e, 0xf0, 0x6c, 0x94, 0x00, 0x16, 0x14, 0x8a, 0x25, 0x04, 0x16, 0xf8, 0xc6, 0xc0, 0xbf, 0x45, 0xb1,
+    0xf8, 0xc1, 0x15, 0x7b, 0x76, 0xe8, 0x45, 0x53, 0x40, 0x69, 0x5e, 0x34, 0xad, 0x19, 0x10, 0x90, 0x77, 0x5d, 0xa5,
+    0xb4, 0xe8, 0xaa, 0x50, 0xee, 0xa7, 0xdf, 0x3e, 0x5c, 0x51, 0x7a, 0x20, 0x48, 0x45, 0xed, 0x8d, 0xd1, 0x15, 0xac,
+    0xd0, 0x3d, 0xbc, 0x1c, 0x7c, 0x75, 0x3a, 0x67, 0x99, 0x47, 0x82, 0x4b, 0x60, 0xf1, 0x80, 0x1c, 0xd0, 0x7c, 0x91,
+    0xda, 0x93, 0x18, 0xbc, 0x31, 0xbb, 0x0b, 0x7c, 0xce, 0xa7, 0x99, 0x1a, 0xbf, 0xa7, 0x2c, 0xb4, 0x51, 0x1a, 0xb8,
+    0x26, 0x99, 0xc8, 0xfa, 0x1e, 0x46, 0x1d, 0x1c, 0x44, 0xb1, 0x7e, 0xf6, 0x95, 0xf4, 0x26, 0xda, 0xb4, 0x08, 0x90,
+    0xa3, 0xef, 0x3a, 0x61, 0xe1, 0xbf, 0x07, 0x5f, 0xc1, 0xc5, 0xfd, 0xd5, 0x8d, 0x6e, 0xf4, 0x33, 0x1b, 0xf9, 0x98,
+    0xaf, 0x1a, 0x72, 0xd5, 0x21, 0x8f, 0xca, 0x99, 0xcd, 0x8e, 0xc2, 0x6c, 0xc2, 0xef, 0xdd, 0xac, 0xeb, 0xd9, 0x29,
+    0x5e, 0x68, 0x67, 0xc0, 0x5d, 0xac, 0x4b, 0x3c, 0xa7, 0xdb, 0x47, 0x06, 0x75, 0x14, 0x7a, 0xfe, 0x27, 0xc1, 0xa1,
+    0xaa, 0x0f, 0xfb, 0xf0, 0xa2, 0x92, 0xb2, 0x6b, 0xdc, 0xcb, 0xb8, 0x95, 0xd7, 0xf8, 0x65, 0xfc, 0xd4, 0xfd, 0x2c,
+    0xc8, 0x24, 0x33, 0x8c, 0x0f, 0x39, 0x68, 0x73, 0x70, 0x7c, 0x05, 0xfb, 0x03, 0x0c, 0xaa, 0x7b, 0xf2, 0xb7, 0xee,
+    0x9d, 0xeb, 0xcc, 0xda, 0xae, 0x0d, 0x6c, 0xce, 0xac, 0x63, 0x1f, 0x87, 0x56, 0xc7, 0x3e, 0x86, 0xbf, 0x8f, 0xc0,
+    0x7a, 0x59, 0x6d, 0xfb, 0xf0, 0xa3, 0xdb, 0x0e, 0xad, 0x13, 0xfb, 0x18, 0xfe, 0x2e, 0xa9, 0xd5, 0xcf, 0xc8, 0xf4,
+    0x00, 0xc3, 0xf3, 0x55, 0x09, 0x0b, 0x28, 0xbf, 0xa5, 0x16, 0xc1, 0x2c, 0x5d, 0x6f, 0x0d, 0x9a, 0x08, 0x40, 0x19,
+    0xba, 0x29, 0x82, 0x04, 0x46, 0xfd, 0x16, 0x24, 0xcf, 0xc6, 0xb0, 0xef, 0xc2, 0x20, 0x23, 0x2a, 0x12, 0xc1, 0x6f,
+    0x3e, 0x46, 0xbc, 0x4d, 0x73, 0xfc, 0x6d, 0x91, 0x4f, 0x88, 0x54, 0x17, 0x7f, 0x5f, 0x60, 0x60, 0x1d, 0x11, 0x31,
+    0x5c, 0xc1, 0x4a, 0x45, 0x4e, 0xbb, 0x7c, 0xf7, 0xc0, 0xd1, 0x6f, 0x94, 0xc9, 0x9c, 0x2a, 0x5f, 0xb4, 0x6f, 0xae,
+    0xce, 0x90, 0xbd, 0xff, 0xd1, 0x7e, 0x30, 0x95, 0x28, 0xf5, 0x23, 0x82, 0x7b, 0x8e, 0x83, 0x44, 0x0e, 0x4f, 0x41,
+    0xd1, 0x6e, 0x73, 0xe0, 0x72, 0x03, 0x92, 0x4f, 0x5c, 0x00, 0x95, 0x7c, 0xe7, 0x85, 0x8a, 0xe9, 0x85, 0xd2, 0xf2,
+    0x89, 0xc4, 0xfc, 0xcf, 0x9f, 0x17, 0x83, 0xb3, 0x2a, 0xe3, 0x3e, 0x75, 0xbb, 0x70, 0xed, 0x76, 0x59, 0x67, 0xab,
+    0x15, 0xd0, 0xee, 0xe8, 0xb0, 0x45, 0x38, 0x49, 0xa1, 0xe9, 0x17, 0x3a, 0xc6, 0x8d, 0xa6, 0x48, 0x35, 0x0d, 0x23,
+    0xc4, 0xd5, 0xad, 0xb0, 0x3a, 0xba, 0xd1, 0x8f, 0x84, 0xc2, 0x2c, 0xda, 0x12, 0x11, 0x97, 0xf3, 0x62, 0x3a, 0x80,
+    0x66, 0xcb, 0x3c, 0x76, 0xb8, 0x34, 0xfe, 0xaf, 0x27, 0x81, 0xee, 0x45, 0xa0, 0xe1, 0xab, 0x9c, 0xd6, 0x92, 0xbb,
+    0x89, 0xbc, 0x57, 0xe9, 0x42, 0x65, 0xe9, 0xb9, 0x0e, 0x45, 0x90, 0x95, 0x08, 0x13, 0x91, 0x49, 0xf3, 0x26, 0x79,
+    0x5b, 0x14, 0x05, 0x66, 0x00, 0x21, 0xa1, 0x5b, 0xc2, 0xd5, 0xc9, 0x78, 0xfe, 0x7c, 0xe3, 0x25, 0x44, 0xea, 0x64,
+    0x35, 0x1f, 0xa3, 0xae, 0xe2, 0x37, 0x5d, 0x45, 0x31, 0xb2, 0x5f, 0xc4, 0x1a, 0xc2, 0x2a, 0x8b, 0xf6, 0x1e, 0xfe,
+    0x1c, 0x31, 0x2f, 0xb3, 0xb9, 0x1e, 0xa4, 0xa5, 0x5c, 0xee, 0xa6, 0xcb, 0x3a, 0x60, 0x8f, 0xc5, 0xe3, 0x6f, 0xf1,
+    0x60, 0x73, 0xcf, 0xd6, 0x1f, 0x97, 0xdc, 0x0f, 0x19, 0xfa, 0xf8, 0xcd, 0x29, 0x82, 0xa7, 0xbc, 0xcb, 0x3c, 0x8a,
+    0xb0, 0xa1, 0x5e, 0xb9, 0x71, 0xe6, 0x89, 0xec, 0x1f, 0x40, 0x97, 0xf7, 0x1b, 0x15, 0x86, 0x8a, 0xaf, 0xf2, 0xd9,
+    0xbb, 0xab, 0x6f, 0x34, 0xbe, 0xff, 0x49, 0xbf, 0x85, 0x8c, 0x0c, 0x05, 0xc1, 0x1f, 0x50, 0x10, 0x7c, 0x8d, 0x27,
+    0x7f, 0x80, 0x50, 0xf2, 0xf9, 0x01, 0x41, 0x50, 0xd7, 0x58, 0xe4, 0x93, 0xd6, 0x6f, 0xbe, 0x0c, 0xb3, 0x60, 0xe1,
+    0x25, 0xd9, 0x01, 0x34, 0xb5, 0x00, 0xc9, 0xe9, 0x9b, 0x3c, 0x98, 0x49, 0x71, 0x28, 0x84, 0x6a, 0x59, 0x24, 0x34,
+    0x87, 0x93, 0x20, 0x94, 0x8a, 0x43, 0xf1, 0x01, 0xcf, 0xf7, 0xd9, 0x22, 0x1b, 0xe8, 0xde, 0x02, 0x92, 0x21, 0x60,
+    0x78, 0xe3, 0x83, 0xd8, 0xcf, 0x58, 0x66, 0xa5, 0x59, 0xc2, 0xbc, 0xb9, 0x2e, 0x43, 0x7d, 0xd6, 0xfb, 0x4b, 0x97,
+    0xa3, 0x79, 0x90, 0xc9, 0x60, 0x79, 0x34, 0x41, 0x50, 0xe1, 0xc1, 0x10, 0xcf, 0x86, 0x39, 0x07, 0xe1, 0x65, 0x3c,
+    0xad, 0xec, 0xa8, 0x82, 0x72, 0x39, 0xc7, 0x48, 0xac, 0x3c, 0x00, 0xfe, 0x18, 0x3d, 0x72, 0x6e, 0xb9, 0xd7, 0xb5,
+    0x8c, 0xe9, 0xa7, 0x9f, 0x9d, 0x72, 0xf6, 0x56, 0xc3, 0x40, 0x01, 0x7a, 0xd7, 0x81, 0x58, 0xb3, 0x9b, 0xfc, 0xb1,
+    0x0f, 0x78, 0x65, 0xb8, 0x9a, 0xa8, 0x67, 0x0c, 0xfb, 0x4d, 0x63, 0xb9, 0x02, 0x42, 0xa8, 0xa4, 0xe2, 0x9d, 0xb9,
+    0x67, 0xd2, 0x01, 0x08, 0x47, 0x85, 0xb4, 0xd2, 0x6f, 0xbf, 0xbd, 0x1e, 0xfe, 0xe7, 0x77, 0x88, 0x4d, 0x3e, 0x73,
+    0x85, 0x17, 0xf4, 0xb5, 0x5a, 0x8b, 0x53, 0x9f, 0xe6, 0x10, 0xd5, 0xfb, 0x6c, 0x2c, 0xc2, 0x82, 0x88, 0xad, 0x95,
+    0x0f, 0x6f, 0x44, 0xa8, 0x27, 0xc8, 0x3f, 0x60, 0x08, 0x5f, 0xed, 0x21, 0x2c, 0xef, 0x50, 0x84, 0x08, 0xd0, 0x7e,
+    0x59, 0x7d, 0x7b, 0x0c, 0xb9, 0x74, 0x6b, 0x69, 0x01, 0x94, 0x01, 0xe2, 0x1e, 0x3a, 0x3b, 0xf5, 0xb8, 0xf0, 0x15,
+    0xc8, 0x8f, 0xb4, 0x77, 0x00, 0xd3, 0x9c, 0xc5, 0x73, 0x66, 0x07, 0xf1, 0xc1, 0x3d, 0x1b, 0x59, 0xde, 0x22, 0x20,
+    0xf9, 0x32, 0xca, 0xdd, 0x34, 0xa2, 0xfc, 0xa4, 0x82, 0x96, 0xe8, 0xeb, 0xbc, 0x00, 0x65, 0x5c, 0x00, 0x0a, 0x7e,
+    0x7a, 0x67, 0xe5, 0x00, 0x7e, 0xb6, 0x08, 0x18, 0x5f, 0xc6, 0xf2, 0xe7, 0x14, 0x87, 0x4f, 0x84, 0xdc, 0x2b, 0x1e,
+    0xac, 0x78, 0x32, 0x51, 0x83, 0xee, 0xd9, 0xe5, 0xef, 0x4b, 0xa8, 0x14, 0x7b, 0x36, 0x5e, 0xd0, 0x97, 0xea, 0x9f,
+    0x90, 0x3f, 0x21, 0xa7, 0x2d, 0x8f, 0xcf, 0x08, 0xe7, 0xb9, 0x16, 0xbc, 0x4f, 0x82, 0xe4, 0x29, 0x55, 0xe2, 0x88,
+    0xa2, 0x1a, 0x18, 0x7a, 0x03, 0x69, 0xf2, 0x64, 0x30, 0x20, 0x3c, 0x56, 0x45, 0x67, 0x00, 0xa5, 0x86, 0xe0, 0xf9,
+    0x30, 0xd9, 0x0c, 0x1a, 0x5a, 0xe4, 0xc1, 0x85, 0x8d, 0xaa, 0xd3, 0xa9, 0x8f, 0xf1, 0xc0, 0x13, 0xfb, 0xab, 0xb4,
+    0x03, 0x61, 0x67, 0xf1, 0x85, 0x05, 0x04, 0x2e, 0xfa, 0xa9, 0xe0, 0x71, 0xed, 0x6b, 0x42, 0xd9, 0x56, 0xe8, 0x3d,
+    0xc4, 0x8a, 0x66, 0x9d, 0x3b, 0xd9, 0x5f, 0x62, 0xe9, 0x95, 0x70, 0x6e, 0xab, 0x9d, 0x24, 0x19, 0x80, 0xbc, 0x7e,
+    0x9a, 0xd4, 0x88, 0xe1, 0xbb, 0x0e, 0x93, 0x5a, 0xb7, 0x3c, 0x19, 0xc4, 0x8e, 0x79, 0x71, 0xd0, 0x4a, 0x2f, 0xf1,
+    0xdc, 0xe7, 0xa7, 0x07, 0x30, 0x3f, 0x08, 0x0c, 0x50, 0xa2, 0x8c, 0x02, 0x03, 0xa2, 0x0f, 0x78, 0x29, 0x59, 0x07,
+    0x5c, 0x8c, 0x05, 0x51, 0x87, 0x9c, 0xa3, 0x8c, 0x0e, 0x5a, 0xaa, 0x52, 0x27, 0x56, 0x9c, 0x66, 0x2a, 0x6f, 0x77,
+    0xc0, 0xfe, 0x5f, 0x97, 0x18, 0xad, 0x3f, 0xef, 0x67, 0x4c, 0xf8, 0xdd, 0x5e, 0x66, 0x1b, 0x5c, 0x73, 0x37, 0x55,
+    0x21, 0x82, 0x75, 0x4b, 0x85, 0x62, 0x1f, 0x6f, 0xab, 0x55, 0x90, 0x46, 0xb2, 0xda, 0xc2, 0x6b, 0xe9, 0x4f, 0x71,
+    0xc7, 0xd7, 0x6a, 0x63, 0x29, 0xd4, 0xbb, 0xcc, 0x06, 0x50, 0x55, 0x08, 0xdb, 0xbd, 0xc5, 0x82, 0x2a, 0x1b, 0xfd,
+    0xd3, 0x03, 0xe2, 0x3b, 0xcf, 0x68, 0x87, 0x9d, 0x9d, 0x82, 0x75, 0x21, 0x2d, 0xba, 0xb7, 0x58, 0xf0, 0x25, 0xa5,
+    0x5f, 0xf4, 0xe6, 0x60, 0x96, 0xcd, 0xc3, 0xb3, 0xff, 0x03, 0x30, 0x11, 0x13, 0xf1, 0xb7, 0x59, 0x03, 0x00};
 
 }  // namespace web_server
 }  // namespace esphome
+
 #endif
 #endif

From 05fbb260eea1d0f873e095aa10efdcdd8eb1e0dd Mon Sep 17 00:00:00 2001
From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com>
Date: Tue, 30 Apr 2024 00:09:35 +0200
Subject: [PATCH 71/81] [nextion] Exit reparse before update TFT (#6589)

---
 esphome/components/nextion/nextion.h                  |  6 +++++-
 esphome/components/nextion/nextion_upload_arduino.cpp | 11 ++++++++++-
 esphome/components/nextion/nextion_upload_idf.cpp     | 11 ++++++++++-
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/esphome/components/nextion/nextion.h b/esphome/components/nextion/nextion.h
index a8f0ea8ba9..833db675fc 100644
--- a/esphome/components/nextion/nextion.h
+++ b/esphome/components/nextion/nextion.h
@@ -993,9 +993,13 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
 
   /**
    * Upload the tft file and soft reset Nextion
+   * @param exit_reparse If true, the function exits reparse mode before uploading the TFT file. This parameter
+   * defaults to true, ensuring that the display is ready to receive and apply the new TFT file without needing
+   * to manually reset or reconfigure. Exiting reparse mode is recommended for most upload scenarios to ensure
+   * the display properly processes the uploaded file command.
    * @return bool True: Transfer completed successfuly, False: Transfer failed.
    */
-  bool upload_tft();
+  bool upload_tft(bool exit_reparse = true);
 
   void dump_config() override;
 
diff --git a/esphome/components/nextion/nextion_upload_arduino.cpp b/esphome/components/nextion/nextion_upload_arduino.cpp
index e3d0903d09..4f8df67006 100644
--- a/esphome/components/nextion/nextion_upload_arduino.cpp
+++ b/esphome/components/nextion/nextion_upload_arduino.cpp
@@ -141,8 +141,9 @@ int Nextion::upload_by_chunks_(HTTPClient *http, int range_start) {
   return range_end + 1;
 }
 
-bool Nextion::upload_tft() {
+bool Nextion::upload_tft(bool exit_reparse) {
   ESP_LOGD(TAG, "Nextion TFT upload requested");
+  ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
   ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
 
   if (this->is_updating_) {
@@ -157,6 +158,14 @@ bool Nextion::upload_tft() {
 
   this->is_updating_ = true;
 
+  if (exit_reparse) {
+    ESP_LOGD(TAG, "Exiting Nextion reparse mode");
+    if (!this->set_protocol_reparse_mode(false)) {
+      ESP_LOGW(TAG, "Failed to request Nextion to exit reparse mode");
+      return false;
+    }
+  }
+
   HTTPClient http;
   http.setTimeout(15000);  // Yes 15 seconds.... Helps 8266s along
   bool begin_status = false;
diff --git a/esphome/components/nextion/nextion_upload_idf.cpp b/esphome/components/nextion/nextion_upload_idf.cpp
index 14b1b6cfaf..d08f970551 100644
--- a/esphome/components/nextion/nextion_upload_idf.cpp
+++ b/esphome/components/nextion/nextion_upload_idf.cpp
@@ -160,8 +160,9 @@ int Nextion::upload_range(const std::string &url, int range_start) {
   return range_end + 1;
 }
 
-bool Nextion::upload_tft() {
+bool Nextion::upload_tft(bool exit_reparse) {
   ESP_LOGD(TAG, "Nextion TFT upload requested");
+  ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
   ESP_LOGD(TAG, "url: %s", this->tft_url_.c_str());
 
   if (this->is_updating_) {
@@ -176,6 +177,14 @@ bool Nextion::upload_tft() {
 
   this->is_updating_ = true;
 
+  if (exit_reparse) {
+    ESP_LOGD(TAG, "Exiting Nextion reparse mode");
+    if (!this->set_protocol_reparse_mode(false)) {
+      ESP_LOGW(TAG, "Failed to request Nextion to exit reparse mode");
+      return false;
+    }
+  }
+
   // Define the configuration for the HTTP client
   ESP_LOGV(TAG, "Establishing connection to HTTP server");
   ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());

From 74fd52e05fdc6f63ef64ada77f8a7b8d63de8c45 Mon Sep 17 00:00:00 2001
From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com>
Date: Tue, 30 Apr 2024 11:29:57 +0200
Subject: [PATCH 72/81] [nextion] Set alternative TFT update baud rate (#6587)

---
 esphome/components/nextion/nextion.h          | 16 +++++++++--
 .../nextion/nextion_upload_arduino.cpp        | 27 +++++++++++++++++--
 .../components/nextion/nextion_upload_idf.cpp | 27 +++++++++++++++++--
 3 files changed, 64 insertions(+), 6 deletions(-)

diff --git a/esphome/components/nextion/nextion.h b/esphome/components/nextion/nextion.h
index 833db675fc..b6a6204cd4 100644
--- a/esphome/components/nextion/nextion.h
+++ b/esphome/components/nextion/nextion.h
@@ -992,14 +992,26 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
 #endif
 
   /**
-   * Upload the tft file and soft reset Nextion
+   * @brief Uploads the TFT file to the Nextion display.
+   *
+   * This function initiates the upload of a TFT file to the Nextion display. Users can specify a target baud rate for
+   * the transfer. If the provided baud rate is not supported by Nextion, the function defaults to using the current
+   * baud rate set for the display. If no baud rate is specified (or if 0 is passed), the current baud rate is used.
+   *
+   * Supported baud rates are: 2400, 4800, 9600, 19200, 31250, 38400, 57600, 115200, 230400, 250000, 256000, 512000
+   * and 921600. Selecting a baud rate supported by both the Nextion display and the host hardware is essential for
+   * ensuring a successful upload process.
+   *
+   * @param baud_rate The desired baud rate for the TFT file transfer, specified as an unsigned 32-bit integer.
+   * If the specified baud rate is not supported, or if 0 is passed, the function will use the current baud rate.
+   * The default value is 0, which implies using the current baud rate.
    * @param exit_reparse If true, the function exits reparse mode before uploading the TFT file. This parameter
    * defaults to true, ensuring that the display is ready to receive and apply the new TFT file without needing
    * to manually reset or reconfigure. Exiting reparse mode is recommended for most upload scenarios to ensure
    * the display properly processes the uploaded file command.
    * @return bool True: Transfer completed successfuly, False: Transfer failed.
    */
-  bool upload_tft(bool exit_reparse = true);
+  bool upload_tft(uint32_t baud_rate = 0, bool exit_reparse = true);
 
   void dump_config() override;
 
diff --git a/esphome/components/nextion/nextion_upload_arduino.cpp b/esphome/components/nextion/nextion_upload_arduino.cpp
index 4f8df67006..6e7c8b9563 100644
--- a/esphome/components/nextion/nextion_upload_arduino.cpp
+++ b/esphome/components/nextion/nextion_upload_arduino.cpp
@@ -141,7 +141,7 @@ int Nextion::upload_by_chunks_(HTTPClient *http, int range_start) {
   return range_end + 1;
 }
 
-bool Nextion::upload_tft(bool exit_reparse) {
+bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   ESP_LOGD(TAG, "Nextion TFT upload requested");
   ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
   ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
@@ -166,6 +166,15 @@ bool Nextion::upload_tft(bool exit_reparse) {
     }
   }
 
+  // Check if baud rate is supported
+  this->original_baud_rate_ = this->parent_->get_baud_rate();
+  static const std::vector<uint32_t> SUPPORTED_BAUD_RATES = {2400,   4800,   9600,   19200,  31250,  38400, 57600,
+                                                             115200, 230400, 250000, 256000, 512000, 921600};
+  if (std::find(SUPPORTED_BAUD_RATES.begin(), SUPPORTED_BAUD_RATES.end(), baud_rate) == SUPPORTED_BAUD_RATES.end()) {
+    baud_rate = this->original_baud_rate_;
+  }
+  ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate);
+
   HTTPClient http;
   http.setTimeout(15000);  // Yes 15 seconds.... Helps 8266s along
   bool begin_status = false;
@@ -244,7 +253,7 @@ bool Nextion::upload_tft(bool exit_reparse) {
   // Tells the Nextion the content length of the tft file and baud rate it will be sent at
   // Once the Nextion accepts the command it will wait until the file is successfully uploaded
   // If it fails for any reason a power cycle of the display will be needed
-  sprintf(command, "whmi-wris %d,%d,1", this->content_length_, this->parent_->get_baud_rate());
+  sprintf(command, "whmi-wris %d,%d,1", this->content_length_, baud_rate);
 
   // Clear serial receive buffer
   uint8_t d;
@@ -254,6 +263,12 @@ bool Nextion::upload_tft(bool exit_reparse) {
 
   this->send_command_(command);
 
+  if (baud_rate != this->original_baud_rate_) {
+    ESP_LOGD(TAG, "Changing baud rate from %" PRIu32 " to %" PRIu32 " bps", this->original_baud_rate_, baud_rate);
+    this->parent_->set_baud_rate(baud_rate);
+    this->parent_->load_settings();
+  }
+
   App.feed_wdt();
 
   std::string response;
@@ -335,6 +350,14 @@ bool Nextion::upload_tft(bool exit_reparse) {
 
 bool Nextion::upload_end_(bool successful) {
   this->is_updating_ = false;
+
+  uint32_t baud_rate = this->parent_->get_baud_rate();
+  if (baud_rate != this->original_baud_rate_) {
+    ESP_LOGD(TAG, "Changing baud rate back from %" PRIu32 " to %" PRIu32 " bps", baud_rate, this->original_baud_rate_);
+    this->parent_->set_baud_rate(this->original_baud_rate_);
+    this->parent_->load_settings();
+  }
+
   ESP_LOGD(TAG, "Restarting Nextion");
   this->soft_reset();
   if (successful) {
diff --git a/esphome/components/nextion/nextion_upload_idf.cpp b/esphome/components/nextion/nextion_upload_idf.cpp
index d08f970551..163b497d3b 100644
--- a/esphome/components/nextion/nextion_upload_idf.cpp
+++ b/esphome/components/nextion/nextion_upload_idf.cpp
@@ -160,7 +160,7 @@ int Nextion::upload_range(const std::string &url, int range_start) {
   return range_end + 1;
 }
 
-bool Nextion::upload_tft(bool exit_reparse) {
+bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   ESP_LOGD(TAG, "Nextion TFT upload requested");
   ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
   ESP_LOGD(TAG, "url: %s", this->tft_url_.c_str());
@@ -185,6 +185,15 @@ bool Nextion::upload_tft(bool exit_reparse) {
     }
   }
 
+  // Check if baud rate is supported
+  this->original_baud_rate_ = this->parent_->get_baud_rate();
+  static const std::vector<uint32_t> SUPPORTED_BAUD_RATES = {2400,   4800,   9600,   19200,  31250,  38400, 57600,
+                                                             115200, 230400, 250000, 256000, 512000, 921600};
+  if (std::find(SUPPORTED_BAUD_RATES.begin(), SUPPORTED_BAUD_RATES.end(), baud_rate) == SUPPORTED_BAUD_RATES.end()) {
+    baud_rate = this->original_baud_rate_;
+  }
+  ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate);
+
   // Define the configuration for the HTTP client
   ESP_LOGV(TAG, "Establishing connection to HTTP server");
   ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
@@ -254,7 +263,7 @@ bool Nextion::upload_tft(bool exit_reparse) {
   // Tells the Nextion the content length of the tft file and baud rate it will be sent at
   // Once the Nextion accepts the command it will wait until the file is successfully uploaded
   // If it fails for any reason a power cycle of the display will be needed
-  sprintf(command, "whmi-wris %d,%" PRIu32 ",1", this->content_length_, this->parent_->get_baud_rate());
+  sprintf(command, "whmi-wris %d,%" PRIu32 ",1", this->content_length_, baud_rate);
 
   // Clear serial receive buffer
   ESP_LOGV(TAG, "Clear serial receive buffer");
@@ -268,6 +277,12 @@ bool Nextion::upload_tft(bool exit_reparse) {
   ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
   this->send_command_(command);
 
+  if (baud_rate != this->original_baud_rate_) {
+    ESP_LOGD(TAG, "Changing baud rate from %" PRIu32 " to %" PRIu32 " bps", this->original_baud_rate_, baud_rate);
+    this->parent_->set_baud_rate(baud_rate);
+    this->parent_->load_settings();
+  }
+
   std::string response;
   ESP_LOGV(TAG, "Waiting for upgrade response");
   this->recv_ret_string_(response, 5000, true);  // This can take some time to return
@@ -308,6 +323,14 @@ bool Nextion::upload_tft(bool exit_reparse) {
 
 bool Nextion::upload_end(bool successful) {
   this->is_updating_ = false;
+
+  uint32_t baud_rate = this->parent_->get_baud_rate();
+  if (baud_rate != this->original_baud_rate_) {
+    ESP_LOGD(TAG, "Changing baud rate back from %" PRIu32 " to %" PRIu32 " bps", baud_rate, this->original_baud_rate_);
+    this->parent_->set_baud_rate(this->original_baud_rate_);
+    this->parent_->load_settings();
+  }
+
   ESP_LOGD(TAG, "Restarting Nextion");
   this->soft_reset();
   vTaskDelay(pdMS_TO_TICKS(1500));  // NOLINT

From 6fe328ef2bb9d50efe612d2176df8f562b8bd1a5 Mon Sep 17 00:00:00 2001
From: Anton Sergunov <setosha@gmail.com>
Date: Tue, 30 Apr 2024 16:35:41 +0600
Subject: [PATCH 73/81] [TM1637] Let turn off the display (#6656)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/tm1637/tm1637.cpp | 2 +-
 esphome/components/tm1637/tm1637.h   | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/esphome/components/tm1637/tm1637.cpp b/esphome/components/tm1637/tm1637.cpp
index 8d7630bd1d..2f2d4b707a 100644
--- a/esphome/components/tm1637/tm1637.cpp
+++ b/esphome/components/tm1637/tm1637.cpp
@@ -225,7 +225,7 @@ void TM1637Display::display() {
 
   // Write display CTRL CMND + brightness
   this->start_();
-  this->send_byte_(TM1637_CMD_CTRL + ((this->intensity_ & 0x7) | 0x08));
+  this->send_byte_(TM1637_CMD_CTRL + ((this->intensity_ & 0x7) | (this->on_ ? 0x08 : 0x00)));
   this->stop_();
 }
 bool TM1637Display::send_byte_(uint8_t b) {
diff --git a/esphome/components/tm1637/tm1637.h b/esphome/components/tm1637/tm1637.h
index aba0071b12..d44680c623 100644
--- a/esphome/components/tm1637/tm1637.h
+++ b/esphome/components/tm1637/tm1637.h
@@ -49,6 +49,7 @@ class TM1637Display : public PollingComponent {
   void set_intensity(uint8_t intensity) { this->intensity_ = intensity; }
   void set_inverted(bool inverted) { this->inverted_ = inverted; }
   void set_length(uint8_t length) { this->length_ = length; }
+  void set_on(bool on) { this->on_ = on; }
 
   void display();
 
@@ -76,6 +77,7 @@ class TM1637Display : public PollingComponent {
   uint8_t intensity_;
   uint8_t length_;
   bool inverted_;
+  bool on_{true};
   optional<tm1637_writer_t> writer_{};
   uint8_t buffer_[6] = {0};
 #ifdef USE_BINARY_SENSOR

From c299dff124937f4a2253956f72bac77f6c4c79ee Mon Sep 17 00:00:00 2001
From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com>
Date: Tue, 30 Apr 2024 23:43:49 +0200
Subject: [PATCH 74/81] [nextion] Use persistent http connection for TFT upload
 (Arduino) (#6582)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/nextion/nextion.h          |  40 +-
 .../nextion/nextion_upload_arduino.cpp        | 397 +++++++++---------
 2 files changed, 213 insertions(+), 224 deletions(-)

diff --git a/esphome/components/nextion/nextion.h b/esphome/components/nextion/nextion.h
index b6a6204cd4..7938af0ea5 100644
--- a/esphome/components/nextion/nextion.h
+++ b/esphome/components/nextion/nextion.h
@@ -976,6 +976,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * @return Whether the send was successful.
    */
   bool send_command(const char *command);
+
   /**
    * Manually send a raw formatted command to the display.
    * @param format The printf-style command format, like "vis %s,0"
@@ -989,7 +990,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * Set the tft file URL. https seems problematic with arduino..
    */
   void set_tft_url(const std::string &tft_url) { this->tft_url_ = tft_url; }
-#endif
 
   /**
    * @brief Uploads the TFT file to the Nextion display.
@@ -1013,6 +1013,8 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    */
   bool upload_tft(uint32_t baud_rate = 0, bool exit_reparse = true);
 
+#endif
+
   void dump_config() override;
 
   /**
@@ -1134,6 +1136,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
   void all_components_send_state_(bool force_update = false);
   uint64_t comok_sent_ = 0;
   bool remove_from_q_(bool report_empty = true);
+
   /**
    * @brief
    * Sends commands ignoring of the Nextion has been setup.
@@ -1175,20 +1178,16 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
   void check_pending_waveform_();
 
 #ifdef USE_NEXTION_TFT_UPLOAD
-  uint32_t content_length_ = 0;
-  int tft_size_ = 0;
-  uint32_t original_baud_rate_ = 0;
-  bool upload_first_chunk_sent_ = false;
-
-  std::string tft_url_;
-  uint8_t *transfer_buffer_{nullptr};
-  size_t transfer_buffer_size_;
-
 #ifdef USE_ESP8266
   WiFiClient *wifi_client_{nullptr};
   BearSSL::WiFiClientSecure *wifi_client_secure_{nullptr};
   WiFiClient *get_wifi_client_();
 #endif
+  std::string tft_url_;
+  uint32_t content_length_ = 0;
+  int tft_size_ = 0;
+  uint32_t original_baud_rate_ = 0;
+  bool upload_first_chunk_sent_ = false;
 
 #ifdef ARDUINO
   /**
@@ -1198,18 +1197,8 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * @param int range_start Position of next byte to transfer.
    * @return position of last byte transferred, -1 for failure.
    */
-  int upload_by_chunks_(HTTPClient *http, int range_start);
+  int upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start);
 
-  bool upload_with_range_(uint32_t range_start, uint32_t range_end);
-
-  /**
-   * start update tft file to nextion.
-   *
-   * @param const uint8_t *file_buf
-   * @param size_t buf_size
-   * @return true if success, false for failure.
-   */
-  bool upload_from_buffer_(const uint8_t *file_buf, size_t buf_size);
   /**
    * Ends the upload process, restart Nextion and, if successful,
    * restarts ESP
@@ -1217,6 +1206,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * @return bool True: Transfer completed successfuly, False: Transfer failed.
    */
   bool upload_end_(bool successful);
+
 #elif defined(USE_ESP_IDF)
   /**
    * will request 4096 bytes chunks from the web server
@@ -1226,6 +1216,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * @return position of last byte transferred, -1 for failure.
    */
   int upload_range(const std::string &url, int range_start);
+
   /**
    * Ends the upload process, restart Nextion and, if successful,
    * restarts ESP
@@ -1233,7 +1224,12 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * @return bool True: Transfer completed successfuly, False: Transfer failed.
    */
   bool upload_end(bool successful);
-#endif  // ARDUINO vs ESP-IDF
+#endif  // ARDUINO vs USE_ESP_IDF
+  /**
+   * Returns the ESP Free Heap memory. This is framework independent.
+   * @return Free Heap in bytes.
+   */
+  uint32_t get_free_heap_();
 
 #endif  // USE_NEXTION_TFT_UPLOAD
 
diff --git a/esphome/components/nextion/nextion_upload_arduino.cpp b/esphome/components/nextion/nextion_upload_arduino.cpp
index 6e7c8b9563..b199db91b7 100644
--- a/esphome/components/nextion/nextion_upload_arduino.cpp
+++ b/esphome/components/nextion/nextion_upload_arduino.cpp
@@ -1,13 +1,14 @@
 #include "nextion.h"
 
-#ifdef ARDUINO
 #ifdef USE_NEXTION_TFT_UPLOAD
+#ifdef ARDUINO
 
 #include "esphome/core/application.h"
 #include "esphome/core/defines.h"
 #include "esphome/core/util.h"
 #include "esphome/core/log.h"
 #include "esphome/components/network/util.h"
+#include <cinttypes>
 
 #ifdef USE_ESP32
 #include <esp_heap_caps.h>
@@ -20,124 +21,132 @@ static const char *const TAG = "nextion.upload.arduino";
 // Followed guide
 // https://unofficialnextion.com/t/nextion-upload-protocol-v1-2-the-fast-one/1044/2
 
-int Nextion::upload_by_chunks_(HTTPClient *http, int range_start) {
-  int range_end = 0;
+inline uint32_t Nextion::get_free_heap_() {
+#if defined(USE_ESP32)
+  return heap_caps_get_free_size(MALLOC_CAP_INTERNAL);
+#elif defined(USE_ESP8266)
+  return EspClass::getFreeHeap();
+#endif  // USE_ESP32 vs USE_ESP8266
+}
 
-  if (range_start == 0 && this->transfer_buffer_size_ > 16384) {  // Start small at the first run in case of a big skip
-    range_end = 16384 - 1;
-  } else {
-    range_end = range_start + this->transfer_buffer_size_ - 1;
+int Nextion::upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start) {
+  uint32_t range_size = this->tft_size_ - range_start;
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, this->get_free_heap_());
+  uint32_t range_end = ((upload_first_chunk_sent_ or this->tft_size_ < 4096) ? this->tft_size_ : 4096) - 1;
+  ESP_LOGD(TAG, "Range start: %" PRIu32, range_start);
+  if (range_size <= 0 or range_end <= range_start) {
+    ESP_LOGD(TAG, "Range end: %" PRIu32, range_end);
+    ESP_LOGD(TAG, "Range size: %" PRIu32, range_size);
+    ESP_LOGE(TAG, "Invalid range");
+    return -1;
   }
 
-  if (range_end > this->tft_size_)
-    range_end = this->tft_size_;
-
-#ifdef USE_ESP8266
-#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 7, 0)
-  http->setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
-#elif USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 6, 0)
-  http->setFollowRedirects(true);
-#endif
-#if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 6, 0)
-  http->setRedirectLimit(3);
-#endif
-#endif  // USE_ESP8266
-
-  char range_header[64];
-  sprintf(range_header, "bytes=%d-%d", range_start, range_end);
-
-  ESP_LOGD(TAG, "Requesting range: %s", range_header);
-
-  int tries = 1;
-  int code = 0;
-  bool begin_status = false;
-  while (tries <= 5) {
-#ifdef USE_ESP32
-    begin_status = http->begin(this->tft_url_.c_str());
-#endif
-#ifdef USE_ESP8266
-    begin_status = http->begin(*this->get_wifi_client_(), this->tft_url_.c_str());
-#endif
-
-    ++tries;
-    if (!begin_status) {
-      ESP_LOGD(TAG, "upload_by_chunks_: connection failed");
-      delay(500);  // NOLINT
-      continue;
-    }
-
-    http->addHeader("Range", range_header);
-
-    code = http->GET();
-    if (code == 200 || code == 206) {
-      break;
-    }
-    ESP_LOGW(TAG, "HTTP Request failed; URL: %s; Error: %s, retries(%d/5)", this->tft_url_.c_str(),
-             HTTPClient::errorToString(code).c_str(), tries);
-    http->end();
-    App.feed_wdt();
-    delay(500);  // NOLINT
+  char range_header[32];
+  sprintf(range_header, "bytes=%" PRIu32 "-%" PRIu32, range_start, range_end);
+  ESP_LOGV(TAG, "Requesting range: %s", range_header);
+  http_client.addHeader("Range", range_header);
+  int code = http_client.GET();
+  if (code != HTTP_CODE_OK and code != HTTP_CODE_PARTIAL_CONTENT) {
+    ESP_LOGW(TAG, "HTTP Request failed; Error: %s", HTTPClient::errorToString(code).c_str());
+    return -1;
   }
 
-  if (tries > 5) {
+  // Allocate the buffer dynamically
+  ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
+  uint8_t *buffer = allocator.allocate(4096);
+  if (!buffer) {
+    ESP_LOGE(TAG, "Failed to allocate upload buffer");
     return -1;
   }
 
   std::string recv_string;
-  size_t size = 0;
-  int fetched = 0;
-  int range = range_end - range_start;
-
-  while (fetched < range) {
-    size = http->getStreamPtr()->available();
-    if (!size) {
-      App.feed_wdt();
-      delay(0);
-      continue;
-    }
-    int c = http->getStreamPtr()->readBytes(
-        &this->transfer_buffer_[fetched], ((size > this->transfer_buffer_size_) ? this->transfer_buffer_size_ : size));
-    fetched += c;
-  }
-  http->end();
-  ESP_LOGN(TAG, "Fetched %d of %d bytes", fetched, this->content_length_);
-
-  // upload fetched segments to the display in 4KB chunks
-  int write_len;
-  for (int i = 0; i < range; i += 4096) {
+  while (true) {
     App.feed_wdt();
-    write_len = this->content_length_ < 4096 ? this->content_length_ : 4096;
-    this->write_array(&this->transfer_buffer_[i], write_len);
-    this->content_length_ -= write_len;
-    ESP_LOGD(TAG, "Uploaded %0.2f %%; %d bytes remaining",
-             100.0 * (this->tft_size_ - this->content_length_) / this->tft_size_, this->content_length_);
-
-    if (!this->upload_first_chunk_sent_) {
-      this->upload_first_chunk_sent_ = true;
-      delay(500);  // NOLINT
-    }
-
-    this->recv_ret_string_(recv_string, 4096, true);
-    if (recv_string[0] != 0x05) {  // 0x05 == "ok"
-      ESP_LOGD(TAG, "recv_string [%s]",
-               format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
-    }
-
-    // handle partial upload request
-    if (recv_string[0] == 0x08 && recv_string.size() == 5) {
-      uint32_t result = 0;
-      for (int j = 0; j < 4; ++j) {
-        result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
-      }
-      if (result > 0) {
-        ESP_LOGD(TAG, "Nextion reported new range %d", result);
-        this->content_length_ = this->tft_size_ - result;
-        return result;
+    const uint16_t buffer_size =
+        this->content_length_ < 4096 ? this->content_length_ : 4096;  // Limits buffer to the remaining data
+    ESP_LOGV(TAG, "Fetching %" PRIu16 " bytes from HTTP", buffer_size);
+    uint16_t read_len = 0;
+    int partial_read_len = 0;
+    const uint32_t start_time = millis();
+    while (read_len < buffer_size && millis() - start_time < 5000) {
+      if (http_client.getStreamPtr()->available() > 0) {
+        partial_read_len =
+            http_client.getStreamPtr()->readBytes(reinterpret_cast<char *>(buffer) + read_len, buffer_size - read_len);
+        read_len += partial_read_len;
+        if (partial_read_len > 0) {
+          App.feed_wdt();
+          delay(2);
+        }
       }
     }
-    recv_string.clear();
+    if (read_len != buffer_size) {
+      // Did not receive the full package within the timeout period
+      ESP_LOGE(TAG, "Failed to read full package, received only %" PRIu16 " of %" PRIu16 " bytes", read_len,
+               buffer_size);
+      // Deallocate buffer
+      allocator.deallocate(buffer, 4096);
+      buffer = nullptr;
+      return -1;
+    }
+    ESP_LOGV(TAG, "%d bytes fetched, writing it to UART", read_len);
+    if (read_len > 0) {
+      recv_string.clear();
+      this->write_array(buffer, buffer_size);
+      App.feed_wdt();
+      this->recv_ret_string_(recv_string, upload_first_chunk_sent_ ? 500 : 5000, true);
+      this->content_length_ -= read_len;
+      const float upload_percentage = 100.0f * (this->tft_size_ - this->content_length_) / this->tft_size_;
+#if defined(USE_ESP32) && defined(USE_PSRAM)
+      ESP_LOGD(
+          TAG,
+          "Uploaded %0.2f%%, remaining %" PRIu32 " bytes, free heap: %" PRIu32 " (DRAM) + %" PRIu32 " (PSRAM) bytes",
+          upload_percentage, this->content_length_, static_cast<uint32_t>(heap_caps_get_free_size(MALLOC_CAP_INTERNAL)),
+          static_cast<uint32_t>(heap_caps_get_free_size(MALLOC_CAP_SPIRAM)));
+#else
+      ESP_LOGD(TAG, "Uploaded %0.2f%%, remaining %" PRIu32 " bytes, free heap: %" PRIu32 " bytes", upload_percentage,
+               this->content_length_, this->get_free_heap_());
+#endif
+      upload_first_chunk_sent_ = true;
+      if (recv_string[0] == 0x08 && recv_string.size() == 5) {  // handle partial upload request
+        ESP_LOGD(TAG, "recv_string [%s]",
+                 format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
+        uint32_t result = 0;
+        for (int j = 0; j < 4; ++j) {
+          result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
+        }
+        if (result > 0) {
+          ESP_LOGI(TAG, "Nextion reported new range %" PRIu32, result);
+          this->content_length_ = this->tft_size_ - result;
+          range_start = result;
+        } else {
+          range_start = range_end + 1;
+        }
+        // Deallocate buffer
+        allocator.deallocate(buffer, 4096);
+        buffer = nullptr;
+        return range_end + 1;
+      } else if (recv_string[0] != 0x05 and recv_string[0] != 0x08) {  // 0x05 == "ok"
+        ESP_LOGE(TAG, "Invalid response from Nextion: [%s]",
+                 format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
+        // Deallocate buffer
+        allocator.deallocate(buffer, 4096);
+        buffer = nullptr;
+        return -1;
+      }
+
+      recv_string.clear();
+    } else if (read_len == 0) {
+      ESP_LOGV(TAG, "End of HTTP response reached");
+      break;  // Exit the loop if there is no more data to read
+    } else {
+      ESP_LOGE(TAG, "Failed to read from HTTP client, error code: %d", read_len);
+      break;  // Exit the loop on error
+    }
   }
-
+  range_start = range_end + 1;
+  // Deallocate buffer
+  allocator.deallocate(buffer, 4096);
+  buffer = nullptr;
   return range_end + 1;
 }
 
@@ -147,12 +156,12 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
 
   if (this->is_updating_) {
-    ESP_LOGD(TAG, "Currently updating");
+    ESP_LOGW(TAG, "Currently uploading");
     return false;
   }
 
   if (!network::is_connected()) {
-    ESP_LOGD(TAG, "network is not connected");
+    ESP_LOGE(TAG, "Network is not connected");
     return false;
   }
 
@@ -175,43 +184,42 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   }
   ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate);
 
-  HTTPClient http;
-  http.setTimeout(15000);  // Yes 15 seconds.... Helps 8266s along
+  // Define the configuration for the HTTP client
+  ESP_LOGV(TAG, "Initializing HTTP client");
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, this->get_free_heap_());
+  HTTPClient http_client;
+  http_client.setTimeout(15000);  // Yes 15 seconds.... Helps 8266s along
+
   bool begin_status = false;
 #ifdef USE_ESP32
-  begin_status = http.begin(this->tft_url_.c_str());
+  begin_status = http_client.begin(this->tft_url_.c_str());
 #endif
 #ifdef USE_ESP8266
 #if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 7, 0)
-  http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
+  http_client.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
 #elif USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 6, 0)
-  http.setFollowRedirects(true);
+  http_client.setFollowRedirects(true);
 #endif
 #if USE_ARDUINO_VERSION_CODE >= VERSION_CODE(2, 6, 0)
-  http.setRedirectLimit(3);
+  http_client.setRedirectLimit(3);
 #endif
-  begin_status = http.begin(*this->get_wifi_client_(), this->tft_url_.c_str());
-#endif
-
+  begin_status = http_client.begin(*this->get_wifi_client_(), this->tft_url_.c_str());
+#endif  // USE_ESP8266
   if (!begin_status) {
     this->is_updating_ = false;
     ESP_LOGD(TAG, "Connection failed");
-    ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
-    allocator.deallocate(this->transfer_buffer_, this->transfer_buffer_size_);
     return false;
   } else {
     ESP_LOGD(TAG, "Connected");
   }
-
-  http.addHeader("Range", "bytes=0-255");
+  http_client.addHeader("Range", "bytes=0-255");
   const char *header_names[] = {"Content-Range"};
-  http.collectHeaders(header_names, 1);
+  http_client.collectHeaders(header_names, 1);
   ESP_LOGD(TAG, "Requesting URL: %s", this->tft_url_.c_str());
-
-  http.setReuse(true);
+  http_client.setReuse(true);
   // try up to 5 times. DNS sometimes needs a second try or so
   int tries = 1;
-  int code = http.GET();
+  int code = http_client.GET();
   delay(100);  // NOLINT
 
   App.feed_wdt();
@@ -221,34 +229,41 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
 
     delay(250);  // NOLINT
     App.feed_wdt();
-    code = http.GET();
+    code = http_client.GET();
     ++tries;
   }
 
-  if ((code != 200 && code != 206) || tries > 5) {
+  if (code != 200 and code != 206) {
     return this->upload_end_(false);
   }
 
-  String content_range_string = http.header("Content-Range");
+  String content_range_string = http_client.header("Content-Range");
   content_range_string.remove(0, 12);
-  this->content_length_ = content_range_string.toInt();
-  this->tft_size_ = content_length_;
-  http.end();
+  this->tft_size_ = content_range_string.toInt();
 
-  if (this->content_length_ < 4096) {
-    ESP_LOGE(TAG, "Failed to get file size");
+  ESP_LOGD(TAG, "TFT file size: %zu bytes", this->tft_size_);
+  if (this->tft_size_ < 4096) {
+    ESP_LOGE(TAG, "File size check failed.");
+    ESP_LOGD(TAG, "Close HTTP connection");
+    http_client.end();
+    ESP_LOGV(TAG, "Connection closed");
     return this->upload_end_(false);
+  } else {
+    ESP_LOGV(TAG, "File size check passed. Proceeding...");
   }
+  this->content_length_ = this->tft_size_;
 
-  ESP_LOGD(TAG, "Updating Nextion %s...", this->device_model_.c_str());
-  // The Nextion will ignore the update command if it is sleeping
+  ESP_LOGD(TAG, "Uploading Nextion");
 
+  // The Nextion will ignore the upload command if it is sleeping
+  ESP_LOGV(TAG, "Wake-up Nextion");
+  this->ignore_is_setup_ = true;
   this->send_command_("sleep=0");
-  this->set_backlight_brightness(1.0);
+  this->send_command_("dim=100");
   delay(250);  // NOLINT
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, this->get_free_heap_());
 
   App.feed_wdt();
-
   char command[128];
   // Tells the Nextion the content length of the tft file and baud rate it will be sent at
   // Once the Nextion accepts the command it will wait until the file is successfully uploaded
@@ -256,11 +271,12 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   sprintf(command, "whmi-wris %d,%d,1", this->content_length_, baud_rate);
 
   // Clear serial receive buffer
-  uint8_t d;
-  while (this->available()) {
-    this->read_byte(&d);
-  };
+  ESP_LOGV(TAG, "Clear serial receive buffer");
+  this->reset_(false);
+  delay(250);  // NOLINT
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, this->get_free_heap_());
 
+  ESP_LOGV(TAG, "Send upload instruction: %s", command);
   this->send_command_(command);
 
   if (baud_rate != this->original_baud_rate_) {
@@ -272,84 +288,60 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   App.feed_wdt();
 
   std::string response;
-  ESP_LOGD(TAG, "Waiting for upgrade response");
-  this->recv_ret_string_(response, 2000, true);  // This can take some time to return
+  ESP_LOGV(TAG, "Waiting for upgrade response");
+  this->recv_ret_string_(response, 5000, true);  // This can take some time to return
 
   // The Nextion display will, if it's ready to accept data, send a 0x05 byte.
-  ESP_LOGD(TAG, "Upgrade response is [%s] - %zu bytes",
+  ESP_LOGD(TAG, "Upgrade response is [%s] - %zu byte(s)",
            format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str(),
            response.length());
-
-  for (size_t i = 0; i < response.length(); i++) {
-    ESP_LOGD(TAG, "Available %d : 0x%02X", i, response[i]);
-  }
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, this->get_free_heap_());
 
   if (response.find(0x05) != std::string::npos) {
-    ESP_LOGD(TAG, "preparation for tft update done");
+    ESP_LOGV(TAG, "Preparation for TFT upload done");
   } else {
-    ESP_LOGD(TAG, "preparation for tft update failed %d \"%s\"", response[0], response.c_str());
+    ESP_LOGE(TAG, "Preparation for TFT upload failed %d \"%s\"", response[0], response.c_str());
+    ESP_LOGD(TAG, "Close HTTP connection");
+    http_client.end();
+    ESP_LOGV(TAG, "Connection closed");
     return this->upload_end_(false);
   }
 
-  // Nextion wants 4096 bytes at a time. Make chunk_size a multiple of 4096
-#ifdef USE_ESP32
-  uint32_t chunk_size = 8192;
-  if (heap_caps_get_free_size(MALLOC_CAP_SPIRAM) > 0) {
-    chunk_size = this->content_length_;
-  } else {
-    if (ESP.getFreeHeap() > 81920) {  // Ensure some FreeHeap to other things and limit chunk size
-      chunk_size = ESP.getFreeHeap() - 65536;
-      chunk_size = int(chunk_size / 4096) * 4096;
-      chunk_size = chunk_size > 65536 ? 65536 : chunk_size;
-    } else if (ESP.getFreeHeap() < 32768) {
-      chunk_size = 4096;
-    }
-  }
-#else
-  // NOLINTNEXTLINE(readability-static-accessed-through-instance)
-  uint32_t chunk_size = ESP.getFreeHeap() < 16384 ? 4096 : 8192;
-#endif
+  ESP_LOGD(TAG, "Uploading TFT to Nextion:");
+  ESP_LOGD(TAG, "  URL: %s", this->tft_url_.c_str());
+  ESP_LOGD(TAG, "  File size: %d bytes", this->content_length_);
+  ESP_LOGD(TAG, "  Free heap: %" PRIu32, this->get_free_heap_());
 
-  if (this->transfer_buffer_ == nullptr) {
-    ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
-    // NOLINTNEXTLINE(readability-static-accessed-through-instance)
-    ESP_LOGD(TAG, "Allocating buffer size %d, Heap size is %u", chunk_size, ESP.getFreeHeap());
-    this->transfer_buffer_ = allocator.allocate(chunk_size);
-    if (this->transfer_buffer_ == nullptr) {  // Try a smaller size
-      ESP_LOGD(TAG, "Could not allocate buffer size: %d trying 4096 instead", chunk_size);
-      chunk_size = 4096;
-      ESP_LOGD(TAG, "Allocating %d buffer", chunk_size);
-      this->transfer_buffer_ = allocator.allocate(chunk_size);
+  // Proceed with the content download as before
 
-      if (!this->transfer_buffer_)
-        return this->upload_end_(false);
-    }
+  ESP_LOGV(TAG, "Starting transfer by chunks loop");
 
-    this->transfer_buffer_size_ = chunk_size;
-  }
-
-  // NOLINTNEXTLINE(readability-static-accessed-through-instance)
-  ESP_LOGD(TAG, "Updating tft from \"%s\" with a file size of %d using %zu chunksize, Heap Size %d",
-           this->tft_url_.c_str(), this->content_length_, this->transfer_buffer_size_, ESP.getFreeHeap());
-
-  int result = 0;
+  uint32_t position = 0;
   while (this->content_length_ > 0) {
-    result = this->upload_by_chunks_(&http, result);
-    if (result < 0) {
-      ESP_LOGD(TAG, "Error updating Nextion!");
+    int upload_result = upload_by_chunks_(http_client, position);
+    if (upload_result < 0) {
+      ESP_LOGE(TAG, "Error uploading TFT to Nextion!");
+      ESP_LOGD(TAG, "Close HTTP connection");
+      http_client.end();
+      ESP_LOGV(TAG, "Connection closed");
       return this->upload_end_(false);
     }
     App.feed_wdt();
-    // NOLINTNEXTLINE(readability-static-accessed-through-instance)
-    ESP_LOGD(TAG, "Heap Size %d, Bytes left %d", ESP.getFreeHeap(), this->content_length_);
+    ESP_LOGV(TAG, "Free heap: %" PRIu32 ", Bytes left: %" PRIu32, this->get_free_heap_(), this->content_length_);
   }
-  ESP_LOGD(TAG, "Successfully updated Nextion!");
 
-  return this->upload_end_(true);
+  ESP_LOGD(TAG, "Successfully uploaded TFT to Nextion!");
+
+  ESP_LOGD(TAG, "Close HTTP connection");
+  http_client.end();
+  ESP_LOGV(TAG, "Connection closed");
+  return upload_end_(true);
 }
 
 bool Nextion::upload_end_(bool successful) {
+  ESP_LOGD(TAG, "Nextion TFT upload finished: %s", YESNO(successful));
   this->is_updating_ = false;
+  this->ignore_is_setup_ = false;
 
   uint32_t baud_rate = this->parent_->get_baud_rate();
   if (baud_rate != this->original_baud_rate_) {
@@ -358,12 +350,12 @@ bool Nextion::upload_end_(bool successful) {
     this->parent_->load_settings();
   }
 
-  ESP_LOGD(TAG, "Restarting Nextion");
-  this->soft_reset();
   if (successful) {
+    ESP_LOGD(TAG, "Restarting ESPHome");
     delay(1500);  // NOLINT
-    ESP_LOGD(TAG, "Restarting esphome");
-    ESP.restart();  // NOLINT(readability-static-accessed-through-instance)
+    arch_restart();
+  } else {
+    ESP_LOGE(TAG, "Nextion TFT upload failed");
   }
   return successful;
 }
@@ -386,9 +378,10 @@ WiFiClient *Nextion::get_wifi_client_() {
   }
   return this->wifi_client_;
 }
-#endif
+#endif  // USE_ESP8266
+
 }  // namespace nextion
 }  // namespace esphome
 
-#endif  // USE_NEXTION_TFT_UPLOAD
 #endif  // ARDUINO
+#endif  // USE_NEXTION_TFT_UPLOAD

From c69cdec0521147ec3d1a594c9c5121cab9710c33 Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Tue, 30 Apr 2024 23:49:20 -0500
Subject: [PATCH 75/81] Extend MQTT tests (#6648)

---
 esphome/components/mqtt/__init__.py          |   7 +-
 tests/components/mqtt/common.yaml            | 428 +++++++++++++++++++
 tests/components/mqtt/test.bk72xx.yaml       |   2 +
 tests/components/mqtt/test.esp32-c3-idf.yaml |  18 +-
 tests/components/mqtt/test.esp32-c3.yaml     |  17 +-
 tests/components/mqtt/test.esp32-idf.yaml    |  18 +-
 tests/components/mqtt/test.esp32.yaml        |  17 +-
 tests/components/mqtt/test.esp8266.yaml      |  17 +-
 8 files changed, 446 insertions(+), 78 deletions(-)
 create mode 100644 tests/components/mqtt/common.yaml
 create mode 100644 tests/components/mqtt/test.bk72xx.yaml

diff --git a/esphome/components/mqtt/__init__.py b/esphome/components/mqtt/__init__.py
index 064362c619..31cbb2cf97 100644
--- a/esphome/components/mqtt/__init__.py
+++ b/esphome/components/mqtt/__init__.py
@@ -54,7 +54,12 @@ from esphome.components.esp32 import add_idf_sdkconfig_option
 
 DEPENDENCIES = ["network"]
 
-AUTO_LOAD = ["json"]
+
+def AUTO_LOAD():
+    if CORE.is_esp8266 or CORE.is_libretiny:
+        return ["async_tcp", "json"]
+    return ["json"]
+
 
 CONF_IDF_SEND_ASYNC = "idf_send_async"
 CONF_SKIP_CERT_CN_CHECK = "skip_cert_cn_check"
diff --git a/tests/components/mqtt/common.yaml b/tests/components/mqtt/common.yaml
new file mode 100644
index 0000000000..a2a751df63
--- /dev/null
+++ b/tests/components/mqtt/common.yaml
@@ -0,0 +1,428 @@
+wifi:
+  ssid: MySSID
+  password: password1
+
+time:
+  - platform: sntp
+
+mqtt:
+  broker: "192.168.178.84"
+  port: 1883
+  username: debug
+  password: debug
+  client_id: someclient
+  use_abbreviations: false
+  discovery: true
+  discovery_retain: false
+  discovery_prefix: discovery
+  discovery_unique_id_generator: legacy
+  topic_prefix: helloworld
+  log_topic:
+    topic: helloworld/hi
+    level: INFO
+  birth_message:
+  will_message:
+  shutdown_message:
+    topic: topic/to/send/to
+    payload: hi
+    qos: 2
+    retain: true
+  keepalive: 60s
+  reboot_timeout: 60s
+  on_message:
+    - topic: my/custom/topic
+      qos: 0
+      then:
+        - lambda: >-
+            ESP_LOGD("main", "Got message %s", x.c_str());
+    - topic: bedroom/ota_mode
+      then:
+        - logger.log: Got bedroom/ota_mode
+    - topic: livingroom/ota_mode
+      then:
+        - logger.log: Got livingroom/ota_mode
+  on_json_message:
+    topic: the/topic
+    then:
+      - if:
+          condition:
+            - wifi.connected:
+            - mqtt.connected:
+          then:
+            - logger.log: on_json_message
+  on_connect:
+    - mqtt.publish:
+        topic: some/topic
+        payload: Hello
+  on_disconnect:
+    - mqtt.publish:
+        topic: some/topic
+        payload: Good-bye
+
+binary_sensor:
+  - platform: template
+    id: some_binary_sensor
+    name: Garage Door Open
+    state_topic: some/topic/binary_sensor
+    qos: 2
+    lambda: |-
+      if (id(template_sens).state > 30) {
+        // Garage Door is open.
+        return true;
+      } else {
+        // Garage Door is closed.
+        return false;
+      }
+    on_state:
+      - mqtt.publish:
+          topic: some/topic/binary_sensor
+          payload: Hello
+          qos: 2
+          retain: true
+
+button:
+  - platform: template
+    name: "Template Button"
+    state_topic: some/topic/button
+    qos: 2
+    on_press:
+      - mqtt.publish:
+          topic: some/topic/button
+          payload: Hello
+          qos: 2
+          retain: true
+
+climate:
+  - platform: thermostat
+    name: Test Thermostat
+    sensor: template_sens
+    humidity_sensor: template_sens
+    action_state_topic: some/topicaction_state
+    current_temperature_state_topic: some/topiccurrent_temperature_state
+    current_humidity_state_topic: some/topiccurrent_humidity_state
+    fan_mode_state_topic: some/topicfan_mode_state
+    fan_mode_command_topic: some/topicfan_mode_command
+    mode_state_topic: some/topicmode_state
+    mode_command_topic: some/topicmode_command
+    preset_state_topic: some/topicpreset_state
+    preset_command_topic: some/topicpreset_command
+    swing_mode_state_topic: some/topicswing_mode_state
+    swing_mode_command_topic: some/topicswing_mode_command
+    target_temperature_state_topic: some/topictarget_temperature_state
+    target_temperature_command_topic: some/topictarget_temperature_command
+    target_temperature_high_state_topic: some/topictarget_temperature_high_state
+    target_temperature_high_command_topic: some/topictarget_temperature_high_command
+    target_temperature_low_state_topic: some/topictarget_temperature_low_state
+    target_temperature_low_command_topic: some/topictarget_temperature_low_command
+    target_humidity_state_topic: some/topictarget_humidity_state
+    target_humidity_command_topic: some/topictarget_humidity_command
+    preset:
+      - name: Default Preset
+        default_target_temperature_low: 18°C
+        default_target_temperature_high: 24°C
+      - name: Away
+        default_target_temperature_low: 16°C
+        default_target_temperature_high: 20°C
+    idle_action:
+      - logger.log: idle_action
+    cool_action:
+      - logger.log: cool_action
+    supplemental_cooling_action:
+      - logger.log: supplemental_cooling_action
+    heat_action:
+      - logger.log: heat_action
+    supplemental_heating_action:
+      - logger.log: supplemental_heating_action
+    dry_action:
+      - logger.log: dry_action
+    fan_only_action:
+      - logger.log: fan_only_action
+    auto_mode:
+      - logger.log: auto_mode
+    off_mode:
+      - logger.log: off_mode
+    heat_mode:
+      - logger.log: heat_mode
+    cool_mode:
+      - logger.log: cool_mode
+    dry_mode:
+      - logger.log: dry_mode
+    fan_only_mode:
+      - logger.log: fan_only_mode
+    fan_mode_auto_action:
+      - logger.log: fan_mode_auto_action
+    fan_mode_on_action:
+      - logger.log: fan_mode_on_action
+    fan_mode_off_action:
+      - logger.log: fan_mode_off_action
+    fan_mode_low_action:
+      - logger.log: fan_mode_low_action
+    fan_mode_medium_action:
+      - logger.log: fan_mode_medium_action
+    fan_mode_high_action:
+      - logger.log: fan_mode_high_action
+    fan_mode_middle_action:
+      - logger.log: fan_mode_middle_action
+    fan_mode_focus_action:
+      - logger.log: fan_mode_focus_action
+    fan_mode_diffuse_action:
+      - logger.log: fan_mode_diffuse_action
+    fan_mode_quiet_action:
+      - logger.log: fan_mode_quiet_action
+    swing_off_action:
+      - logger.log: swing_off_action
+    swing_horizontal_action:
+      - logger.log: swing_horizontal_action
+    swing_vertical_action:
+      - logger.log: swing_vertical_action
+    swing_both_action:
+      - logger.log: swing_both_action
+    startup_delay: true
+    supplemental_cooling_delta: 2.0
+    cool_deadband: 0.5
+    cool_overrun: 0.5
+    min_cooling_off_time: 300s
+    min_cooling_run_time: 300s
+    max_cooling_run_time: 600s
+    supplemental_heating_delta: 2.0
+    heat_deadband: 0.5
+    heat_overrun: 0.5
+    min_heating_off_time: 300s
+    min_heating_run_time: 300s
+    max_heating_run_time: 600s
+    min_fanning_off_time: 30s
+    min_fanning_run_time: 30s
+    min_fan_mode_switching_time: 15s
+    min_idle_time: 30s
+    set_point_minimum_differential: 0.5
+    fan_only_action_uses_fan_mode_timer: true
+    fan_only_cooling: true
+    fan_with_cooling: true
+    fan_with_heating: true
+
+cover:
+  - platform: template
+    name: Template Cover
+    state_topic: some/topic/cover
+    qos: 2
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return COVER_OPEN;
+      } else {
+        return COVER_CLOSED;
+      }
+    open_action:
+      - logger.log: open_action
+    close_action:
+      - logger.log: close_action
+    stop_action:
+      - logger.log: stop_action
+    optimistic: true
+
+datetime:
+  - platform: template
+    name: Date
+    id: test_date
+    type: date
+    state_topic: some/topic/date
+    qos: 2
+    set_action:
+      - logger.log: "set_value"
+    on_value:
+      - logger.log:
+          format: "Date: %04d-%02d-%02d"
+          args:
+            - x.year
+            - x.month
+            - x.day_of_month
+  - platform: template
+    name: Time
+    id: test_time
+    type: time
+    state_topic: some/topic/time
+    qos: 2
+    set_action:
+      - logger.log: "set_value"
+    on_value:
+      - logger.log:
+          format: "Time: %02d:%02d:%02d"
+          args:
+            - x.hour
+            - x.minute
+            - x.second
+  - platform: template
+    name: DateTime
+    id: test_datetime
+    type: datetime
+    state_topic: some/topic/datetime
+    qos: 2
+    set_action:
+      - logger.log: set_value
+    on_value:
+      - logger.log:
+          format: "DateTime: %04d-%02d-%02d %02d:%02d:%02d"
+          args:
+            - x.year
+            - x.month
+            - x.day_of_month
+            - x.hour
+            - x.minute
+            - x.second
+
+event:
+  - platform: template
+    name: Template Event
+    state_topic: some/topic/event
+    qos: 2
+    event_types:
+      - "custom_event_1"
+      - "custom_event_2"
+
+fan:
+  - platform: template
+    name: Template Fan
+    state_topic: some/topic/fan
+    qos: 2
+    on_state:
+      - logger.log: on_state
+    on_speed_set:
+      - logger.log: on_speed_set
+
+light:
+  - platform: binary
+    name: Desk Lamp
+    output: light_output
+    state_topic: some/topic/light
+    qos: 2
+
+output:
+  - id: light_output
+    platform: gpio
+    pin: 0
+
+lock:
+  - platform: template
+    name: "Template Lock"
+    state_topic: some/topic/lock
+    qos: 2
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return LOCK_STATE_LOCKED;
+      } else {
+        return LOCK_STATE_UNLOCKED;
+      }
+    lock_action:
+      - logger.log: lock_action
+    unlock_action:
+      - logger.log: unlock_action
+    open_action:
+      - logger.log: open_action
+
+number:
+  - platform: template
+    name: "Template number"
+    state_topic: some/topic/number
+    qos: 2
+    optimistic: true
+    min_value: 0
+    max_value: 100
+    step: 1
+
+select:
+  - platform: template
+    name: "Template select"
+    state_topic: some/topic/select
+    qos: 2
+    optimistic: true
+    options:
+      - one
+      - two
+      - three
+    initial_option: two
+
+sensor:
+  - platform: template
+    name: Template Sensor
+    id: template_sens
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return 42.0;
+      } else {
+        return 0.0;
+      }
+    update_interval: 60s
+    on_value:
+      - mqtt.publish:
+          topic: some/topic/sensor
+          payload: Hello
+          qos: 2
+          retain: true
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Sensor
+    topic: mqtt/topic
+    id: the_sensor
+    qos: 2
+    on_value:
+      - mqtt.publish_json:
+          topic: the/topic
+          payload: |-
+            root["key"] = id(template_sens).state;
+            root["greeting"] = "Hello World";
+
+switch:
+  - platform: template
+    name: Template Switch
+    state_topic: some/topic/switch
+    qos: 2
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return true;
+      } else {
+        return false;
+      }
+    turn_on_action:
+      - logger.log: turn_on_action
+    turn_off_action:
+      - logger.log: turn_off_action
+
+text_sensor:
+  - platform: template
+    name: Template Text Sensor
+    id: tts_text
+    state_topic: some/topic/text_sensor
+    qos: 2
+  - platform: mqtt_subscribe
+    name: MQTT Subscribe Text
+    topic: some/topic/text_sensor
+    qos: 2
+    on_value:
+      - text_sensor.template.publish:
+          id: tts_text
+          state: Hello World
+      - text_sensor.template.publish:
+          id: tts_text
+          state: |-
+            return "Hello World2";
+
+text:
+  - platform: template
+    name: Template Text
+    optimistic: true
+    min_length: 0
+    max_length: 100
+    mode: text
+    state_topic: some/topic/text
+    qos: 2
+
+valve:
+  - platform: template
+    name: Template Valve
+    state_topic: some/topic/valve
+    qos: 2
+    optimistic: true
+    lambda: |-
+      if (id(some_binary_sensor).state) {
+        return VALVE_OPEN;
+      } else {
+        return VALVE_CLOSED;
+      }
diff --git a/tests/components/mqtt/test.bk72xx.yaml b/tests/components/mqtt/test.bk72xx.yaml
new file mode 100644
index 0000000000..25cb37a0b4
--- /dev/null
+++ b/tests/components/mqtt/test.bk72xx.yaml
@@ -0,0 +1,2 @@
+packages:
+  common: !include common.yaml
diff --git a/tests/components/mqtt/test.esp32-c3-idf.yaml b/tests/components/mqtt/test.esp32-c3-idf.yaml
index 7702ed5610..25cb37a0b4 100644
--- a/tests/components/mqtt/test.esp32-c3-idf.yaml
+++ b/tests/components/mqtt/test.esp32-c3-idf.yaml
@@ -1,16 +1,2 @@
-wifi:
-  ssid: MySSID
-  password: password1
-
-mqtt:
-  broker: test.mosquitto.org
-  port: 1883
-  discovery: true
-  discovery_prefix: homeassistant
-  idf_send_async: false
-  log_topic:
-  on_message:
-    topic: testing/sensor/testing_sensor/state
-    qos: 0
-    then:
-      - logger.log: Mqtt Test
+packages:
+  common: !include common.yaml
diff --git a/tests/components/mqtt/test.esp32-c3.yaml b/tests/components/mqtt/test.esp32-c3.yaml
index 692d504d6d..25cb37a0b4 100644
--- a/tests/components/mqtt/test.esp32-c3.yaml
+++ b/tests/components/mqtt/test.esp32-c3.yaml
@@ -1,15 +1,2 @@
-wifi:
-  ssid: MySSID
-  password: password1
-
-mqtt:
-  broker: test.mosquitto.org
-  port: 1883
-  discovery: true
-  discovery_prefix: homeassistant
-  log_topic:
-  on_message:
-    topic: testing/sensor/testing_sensor/state
-    qos: 0
-    then:
-      - logger.log: Mqtt Test
+packages:
+  common: !include common.yaml
diff --git a/tests/components/mqtt/test.esp32-idf.yaml b/tests/components/mqtt/test.esp32-idf.yaml
index 7702ed5610..25cb37a0b4 100644
--- a/tests/components/mqtt/test.esp32-idf.yaml
+++ b/tests/components/mqtt/test.esp32-idf.yaml
@@ -1,16 +1,2 @@
-wifi:
-  ssid: MySSID
-  password: password1
-
-mqtt:
-  broker: test.mosquitto.org
-  port: 1883
-  discovery: true
-  discovery_prefix: homeassistant
-  idf_send_async: false
-  log_topic:
-  on_message:
-    topic: testing/sensor/testing_sensor/state
-    qos: 0
-    then:
-      - logger.log: Mqtt Test
+packages:
+  common: !include common.yaml
diff --git a/tests/components/mqtt/test.esp32.yaml b/tests/components/mqtt/test.esp32.yaml
index 692d504d6d..25cb37a0b4 100644
--- a/tests/components/mqtt/test.esp32.yaml
+++ b/tests/components/mqtt/test.esp32.yaml
@@ -1,15 +1,2 @@
-wifi:
-  ssid: MySSID
-  password: password1
-
-mqtt:
-  broker: test.mosquitto.org
-  port: 1883
-  discovery: true
-  discovery_prefix: homeassistant
-  log_topic:
-  on_message:
-    topic: testing/sensor/testing_sensor/state
-    qos: 0
-    then:
-      - logger.log: Mqtt Test
+packages:
+  common: !include common.yaml
diff --git a/tests/components/mqtt/test.esp8266.yaml b/tests/components/mqtt/test.esp8266.yaml
index 692d504d6d..25cb37a0b4 100644
--- a/tests/components/mqtt/test.esp8266.yaml
+++ b/tests/components/mqtt/test.esp8266.yaml
@@ -1,15 +1,2 @@
-wifi:
-  ssid: MySSID
-  password: password1
-
-mqtt:
-  broker: test.mosquitto.org
-  port: 1883
-  discovery: true
-  discovery_prefix: homeassistant
-  log_topic:
-  on_message:
-    topic: testing/sensor/testing_sensor/state
-    qos: 0
-    then:
-      - logger.log: Mqtt Test
+packages:
+  common: !include common.yaml

From 5ddad2647605b28da208029e7959aa12701904bd Mon Sep 17 00:00:00 2001
From: Keith Burzinski <kbx81x@gmail.com>
Date: Wed, 1 May 2024 14:17:11 -0500
Subject: [PATCH 76/81] Extend and consolidate `script` tests (#6663)

---
 tests/components/script/common.yaml           | 55 +++++++++++++++++++
 tests/components/script/test.bk72xx.yaml      |  1 +
 .../components/script/test.esp32-c3-idf.yaml  | 27 +--------
 tests/components/script/test.esp32-c3.yaml    | 27 +--------
 tests/components/script/test.esp32-idf.yaml   | 27 +--------
 tests/components/script/test.esp32.yaml       | 27 +--------
 tests/components/script/test.esp8266.yaml     | 27 +--------
 tests/components/script/test.rp2040.yaml      | 27 +--------
 8 files changed, 62 insertions(+), 156 deletions(-)
 create mode 100644 tests/components/script/common.yaml
 create mode 100644 tests/components/script/test.bk72xx.yaml

diff --git a/tests/components/script/common.yaml b/tests/components/script/common.yaml
new file mode 100644
index 0000000000..bfd5d0e7ff
--- /dev/null
+++ b/tests/components/script/common.yaml
@@ -0,0 +1,55 @@
+esphome:
+  on_boot:
+    then:
+      - script.execute: my_script
+      - script.execute:
+          id: my_script_with_params
+          prefix: "Test"
+          param2: 0
+          param3: true
+      - script.wait: my_script
+      - script.stop: my_script
+      - if:
+          condition:
+            - script.is_running: my_script
+          then:
+            - logger.log: my_script is running
+
+script:
+  - id: my_script
+    mode: single
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_queued
+    mode: queued
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_parallel
+    mode: parallel
+    max_runs: 2
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_restart
+    mode: restart
+    then:
+      - lambda: 'ESP_LOGD("main", "Hello World!");'
+  - id: my_script_with_params
+    parameters:
+      prefix: string
+      param2: uint8_t
+      param3: bool
+    then:
+      - lambda: 'ESP_LOGD(prefix.c_str(), "Hello World! %u %u", param2, param3);'
+      - if:
+          condition:
+            for:
+              time: !lambda "return param2;"
+              condition:
+                script.is_running: my_script
+          then:
+            - lambda: 'ESP_LOGD("main", "API has stayed connected for at least %u minutes", param2);'
+      - repeat:
+          count: 5
+          then:
+            - logger.log: looping!
diff --git a/tests/components/script/test.bk72xx.yaml b/tests/components/script/test.bk72xx.yaml
new file mode 100644
index 0000000000..dade44d145
--- /dev/null
+++ b/tests/components/script/test.bk72xx.yaml
@@ -0,0 +1 @@
+<<: !include common.yaml
diff --git a/tests/components/script/test.esp32-c3-idf.yaml b/tests/components/script/test.esp32-c3-idf.yaml
index 3872c690ff..dade44d145 100644
--- a/tests/components/script/test.esp32-c3-idf.yaml
+++ b/tests/components/script/test.esp32-c3-idf.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
+<<: !include common.yaml
diff --git a/tests/components/script/test.esp32-c3.yaml b/tests/components/script/test.esp32-c3.yaml
index 3872c690ff..dade44d145 100644
--- a/tests/components/script/test.esp32-c3.yaml
+++ b/tests/components/script/test.esp32-c3.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
+<<: !include common.yaml
diff --git a/tests/components/script/test.esp32-idf.yaml b/tests/components/script/test.esp32-idf.yaml
index 3872c690ff..dade44d145 100644
--- a/tests/components/script/test.esp32-idf.yaml
+++ b/tests/components/script/test.esp32-idf.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
+<<: !include common.yaml
diff --git a/tests/components/script/test.esp32.yaml b/tests/components/script/test.esp32.yaml
index 3872c690ff..dade44d145 100644
--- a/tests/components/script/test.esp32.yaml
+++ b/tests/components/script/test.esp32.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
+<<: !include common.yaml
diff --git a/tests/components/script/test.esp8266.yaml b/tests/components/script/test.esp8266.yaml
index ce0e40e7ee..dade44d145 100644
--- a/tests/components/script/test.esp8266.yaml
+++ b/tests/components/script/test.esp8266.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD(prefix.c_str(), "Hello World! %i %i", param2, param3);'
+<<: !include common.yaml
diff --git a/tests/components/script/test.rp2040.yaml b/tests/components/script/test.rp2040.yaml
index 3872c690ff..dade44d145 100644
--- a/tests/components/script/test.rp2040.yaml
+++ b/tests/components/script/test.rp2040.yaml
@@ -1,26 +1 @@
-script:
-  - id: my_script
-    mode: single
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_queued
-    mode: queued
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_parallel
-    mode: parallel
-    max_runs: 2
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_restart
-    mode: restart
-    then:
-      - lambda: 'ESP_LOGD("main", "Hello World!");'
-  - id: my_script_with_params
-    parameters:
-      prefix: string
-      param2: int
-      param3: bool
-    then:
-      - lambda: 'ESP_LOGD("main", (prefix + " Hello World!" + to_string(param2) + " " + to_string(param3)).c_str());'
+<<: !include common.yaml

From a4a23d73b32b0b485ccfbd8209b787a6785d5dd9 Mon Sep 17 00:00:00 2001
From: Edward Firmo <94725493+edwardtfn@users.noreply.github.com>
Date: Thu, 2 May 2024 00:05:37 +0200
Subject: [PATCH 77/81] [nextion] Use persistent http connection for TFT upload
 (ESP-IDF) (#6576)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 CODEOWNERS                                    |   2 +-
 esphome/components/nextion/display.py         |   2 +-
 esphome/components/nextion/nextion.h          |  37 +-
 .../components/nextion/nextion_upload_idf.cpp | 395 +++++++++---------
 esphome/core/defines.h                        |   2 +-
 5 files changed, 225 insertions(+), 213 deletions(-)

diff --git a/CODEOWNERS b/CODEOWNERS
index a60a5c3099..d0e920fe1d 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -242,7 +242,7 @@ esphome/components/mpl3115a2/* @kbickar
 esphome/components/mpu6886/* @fabaff
 esphome/components/ms8607/* @e28eta
 esphome/components/network/* @esphome/core
-esphome/components/nextion/* @senexcrenshaw
+esphome/components/nextion/* @edwardtfn @senexcrenshaw
 esphome/components/nextion/binary_sensor/* @senexcrenshaw
 esphome/components/nextion/sensor/* @senexcrenshaw
 esphome/components/nextion/switch/* @senexcrenshaw
diff --git a/esphome/components/nextion/display.py b/esphome/components/nextion/display.py
index 6487c12f36..ce45d25e7b 100644
--- a/esphome/components/nextion/display.py
+++ b/esphome/components/nextion/display.py
@@ -25,7 +25,7 @@ from .base_component import (
     CONF_EXIT_REPARSE_ON_START,
 )
 
-CODEOWNERS = ["@senexcrenshaw"]
+CODEOWNERS = ["@senexcrenshaw", "@edwardtfn"]
 
 DEPENDENCIES = ["uart"]
 AUTO_LOAD = ["binary_sensor", "switch", "sensor", "text_sensor"]
diff --git a/esphome/components/nextion/nextion.h b/esphome/components/nextion/nextion.h
index 7938af0ea5..6435e2b4e2 100644
--- a/esphome/components/nextion/nextion.h
+++ b/esphome/components/nextion/nextion.h
@@ -1013,7 +1013,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    */
   bool upload_tft(uint32_t baud_rate = 0, bool exit_reparse = true);
 
-#endif
+#endif  // USE_NEXTION_TFT_UPLOAD
 
   void dump_config() override;
 
@@ -1142,6 +1142,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    * Sends commands ignoring of the Nextion has been setup.
    */
   bool ignore_is_setup_ = false;
+
   bool nextion_reports_is_setup_ = false;
   uint8_t nextion_event_;
 
@@ -1182,7 +1183,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
   WiFiClient *wifi_client_{nullptr};
   BearSSL::WiFiClientSecure *wifi_client_secure_{nullptr};
   WiFiClient *get_wifi_client_();
-#endif
+#endif  // USE_ESP8266
   std::string tft_url_;
   uint32_t content_length_ = 0;
   int tft_size_ = 0;
@@ -1193,11 +1194,21 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
   /**
    * will request chunk_size chunks from the web server
    * and send each to the nextion
-   * @param HTTPClient http HTTP client handler.
+   * @param HTTPClient http_client HTTP client handler.
    * @param int range_start Position of next byte to transfer.
    * @return position of last byte transferred, -1 for failure.
    */
   int upload_by_chunks_(HTTPClient &http_client, uint32_t &range_start);
+#elif defined(USE_ESP_IDF)
+  /**
+   * will request 4096 bytes chunks from the web server
+   * and send each to Nextion
+   * @param esp_http_client_handle_t http_client HTTP client handler.
+   * @param int range_start Position of next byte to transfer.
+   * @return position of last byte transferred, -1 for failure.
+   */
+  int upload_by_chunks_(esp_http_client_handle_t http_client, uint32_t &range_start);
+#endif  // ARDUINO vs USE_ESP_IDF
 
   /**
    * Ends the upload process, restart Nextion and, if successful,
@@ -1207,24 +1218,6 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
    */
   bool upload_end_(bool successful);
 
-#elif defined(USE_ESP_IDF)
-  /**
-   * will request 4096 bytes chunks from the web server
-   * and send each to Nextion
-   * @param std::string url Full url for download.
-   * @param int range_start Position of next byte to transfer.
-   * @return position of last byte transferred, -1 for failure.
-   */
-  int upload_range(const std::string &url, int range_start);
-
-  /**
-   * Ends the upload process, restart Nextion and, if successful,
-   * restarts ESP
-   * @param bool url successful True: Transfer completed successfuly, False: Transfer failed.
-   * @return bool True: Transfer completed successfuly, False: Transfer failed.
-   */
-  bool upload_end(bool successful);
-#endif  // ARDUINO vs USE_ESP_IDF
   /**
    * Returns the ESP Free Heap memory. This is framework independent.
    * @return Free Heap in bytes.
@@ -1260,7 +1253,7 @@ class Nextion : public NextionBase, public PollingComponent, public uart::UARTDe
 
 #ifdef NEXTION_PROTOCOL_LOG
   void print_queue_members_();
-#endif
+#endif  // NEXTION_PROTOCOL_LOG
   void reset_(bool reset_nextion = true);
 
   std::string command_data_;
diff --git a/esphome/components/nextion/nextion_upload_idf.cpp b/esphome/components/nextion/nextion_upload_idf.cpp
index 163b497d3b..448b6fc0ff 100644
--- a/esphome/components/nextion/nextion_upload_idf.cpp
+++ b/esphome/components/nextion/nextion_upload_idf.cpp
@@ -1,17 +1,16 @@
 #include "nextion.h"
 
-#ifdef USE_ESP_IDF
 #ifdef USE_NEXTION_TFT_UPLOAD
+#ifdef USE_ESP_IDF
 
 #include "esphome/core/application.h"
 #include "esphome/core/defines.h"
 #include "esphome/core/util.h"
 #include "esphome/core/log.h"
 #include "esphome/components/network/util.h"
-
+#include <cinttypes>
 #include <esp_heap_caps.h>
 #include <esp_http_client.h>
-#include <cinttypes>
 
 namespace esphome {
 namespace nextion {
@@ -20,153 +19,147 @@ static const char *const TAG = "nextion.upload.idf";
 // Followed guide
 // https://unofficialnextion.com/t/nextion-upload-protocol-v1-2-the-fast-one/1044/2
 
-int Nextion::upload_range(const std::string &url, int range_start) {
-  ESP_LOGVV(TAG, "url: %s", url.c_str());
-  uint range_size = this->tft_size_ - range_start;
-  ESP_LOGVV(TAG, "tft_size_: %i", this->tft_size_);
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  int range_end = (range_start == 0) ? std::min(this->tft_size_, 16383) : this->tft_size_;
+int Nextion::upload_by_chunks_(esp_http_client_handle_t http_client, uint32_t &range_start) {
+  uint32_t range_size = this->tft_size_ - range_start;
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
+  uint32_t range_end = ((upload_first_chunk_sent_ or this->tft_size_ < 4096) ? this->tft_size_ : 4096) - 1;
+  ESP_LOGD(TAG, "Range start: %" PRIu32, range_start);
   if (range_size <= 0 or range_end <= range_start) {
+    ESP_LOGD(TAG, "Range end: %" PRIu32, range_end);
+    ESP_LOGD(TAG, "Range size: %" PRIu32, range_size);
     ESP_LOGE(TAG, "Invalid range");
-    ESP_LOGD(TAG, "Range start: %i", range_start);
-    ESP_LOGD(TAG, "Range end: %i", range_end);
-    ESP_LOGD(TAG, "Range size: %i", range_size);
     return -1;
   }
 
-  esp_http_client_config_t config = {
-      .url = url.c_str(),
-      .cert_pem = nullptr,
-      .disable_auto_redirect = false,
-      .max_redirection_count = 10,
-  };
-  esp_http_client_handle_t client = esp_http_client_init(&config);
-
-  char range_header[64];
-  sprintf(range_header, "bytes=%d-%d", range_start, range_end);
+  char range_header[32];
+  sprintf(range_header, "bytes=%" PRIu32 "-%" PRIu32, range_start, range_end);
   ESP_LOGV(TAG, "Requesting range: %s", range_header);
-  esp_http_client_set_header(client, "Range", range_header);
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-
-  ESP_LOGV(TAG, "Opening http connetion");
+  esp_http_client_set_header(http_client, "Range", range_header);
+  ESP_LOGV(TAG, "Opening HTTP connetion");
   esp_err_t err;
-  if ((err = esp_http_client_open(client, 0)) != ESP_OK) {
+  if ((err = esp_http_client_open(http_client, 0)) != ESP_OK) {
     ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
-    esp_http_client_cleanup(client);
     return -1;
   }
 
   ESP_LOGV(TAG, "Fetch content length");
-  int content_length = esp_http_client_fetch_headers(client);
-  ESP_LOGV(TAG, "content_length = %d", content_length);
-  if (content_length <= 0) {
-    ESP_LOGE(TAG, "Failed to get content length: %d", content_length);
-    esp_http_client_cleanup(client);
+  const int chunk_size = esp_http_client_fetch_headers(http_client);
+  ESP_LOGV(TAG, "content_length = %d", chunk_size);
+  if (chunk_size <= 0) {
+    ESP_LOGE(TAG, "Failed to get chunk's content length: %d", chunk_size);
     return -1;
   }
 
-  int total_read_len = 0, read_len;
-
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  ESP_LOGV(TAG, "Allocate buffer");
-  uint8_t *buffer = new uint8_t[4096];
-  std::string recv_string;
-  if (buffer == nullptr) {
-    ESP_LOGE(TAG, "Failed to allocate memory for buffer");
-    ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  } else {
-    ESP_LOGV(TAG, "Memory for buffer allocated successfully");
-
-    while (true) {
-      App.feed_wdt();
-      ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-      int read_len = esp_http_client_read(client, reinterpret_cast<char *>(buffer), 4096);
-      ESP_LOGVV(TAG, "Read %d bytes from HTTP client, writing to UART", read_len);
-      if (read_len > 0) {
-        this->write_array(buffer, read_len);
-        ESP_LOGVV(TAG, "Write to UART successful");
-        this->recv_ret_string_(recv_string, 5000, true);
-        this->content_length_ -= read_len;
-        ESP_LOGD(TAG, "Uploaded %0.2f %%, remaining %d bytes, heap is %" PRIu32 " bytes",
-                 100.0 * (this->tft_size_ - this->content_length_) / this->tft_size_, this->content_length_,
-                 esp_get_free_heap_size());
-
-        if (recv_string[0] == 0x08 && recv_string.size() == 5) {  // handle partial upload request
-          ESP_LOGD(
-              TAG, "recv_string [%s]",
-              format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
-          uint32_t result = 0;
-          for (int j = 0; j < 4; ++j) {
-            result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
-          }
-          if (result > 0) {
-            ESP_LOGI(TAG, "Nextion reported new range %" PRIu32, result);
-            this->content_length_ = this->tft_size_ - result;
-            // Deallocate the buffer when done
-            ESP_LOGV(TAG, "Deallocate buffer");
-            ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-            delete[] buffer;
-            ESP_LOGVV(TAG, "Memory for buffer deallocated");
-            ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-            ESP_LOGV(TAG, "Close http client");
-            ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-            esp_http_client_close(client);
-            esp_http_client_cleanup(client);
-            ESP_LOGVV(TAG, "Client closed");
-            ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-            return result;
-          }
-        } else if (recv_string[0] != 0x05) {  // 0x05 == "ok"
-          ESP_LOGE(
-              TAG, "Invalid response from Nextion: [%s]",
-              format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
-          ESP_LOGV(TAG, "Deallocate buffer");
-          ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-          delete[] buffer;
-          ESP_LOGVV(TAG, "Memory for buffer deallocated");
-          ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-          ESP_LOGV(TAG, "Close http client");
-          ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-          esp_http_client_close(client);
-          esp_http_client_cleanup(client);
-          ESP_LOGVV(TAG, "Client closed");
-          ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-          return -1;
-        }
-
-        recv_string.clear();
-      } else if (read_len == 0) {
-        ESP_LOGV(TAG, "End of HTTP response reached");
-        break;  // Exit the loop if there is no more data to read
-      } else {
-        ESP_LOGE(TAG, "Failed to read from HTTP client, error code: %d", read_len);
-        break;  // Exit the loop on error
-      }
-    }
-
-    // Deallocate the buffer when done
-    ESP_LOGV(TAG, "Deallocate buffer");
-    ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-    delete[] buffer;
-    ESP_LOGVV(TAG, "Memory for buffer deallocated");
-    ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  // Allocate the buffer dynamically
+  ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
+  uint8_t *buffer = allocator.allocate(4096);
+  if (!buffer) {
+    ESP_LOGE(TAG, "Failed to allocate upload buffer");
+    return -1;
   }
-  ESP_LOGV(TAG, "Close http client");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  esp_http_client_close(client);
-  esp_http_client_cleanup(client);
-  ESP_LOGVV(TAG, "Client closed");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+
+  std::string recv_string;
+  while (true) {
+    App.feed_wdt();
+    const uint16_t buffer_size =
+        this->content_length_ < 4096 ? this->content_length_ : 4096;  // Limits buffer to the remaining data
+    ESP_LOGV(TAG, "Fetching %" PRIu16 " bytes from HTTP", buffer_size);
+    uint16_t read_len = 0;
+    int partial_read_len = 0;
+    uint8_t retries = 0;
+    // Attempt to read the chunk with retries.
+    while (retries < 5 && read_len < buffer_size) {
+      partial_read_len =
+          esp_http_client_read(http_client, reinterpret_cast<char *>(buffer) + read_len, buffer_size - read_len);
+      if (partial_read_len > 0) {
+        read_len += partial_read_len;  // Accumulate the total read length.
+        // Reset retries on successful read.
+        retries = 0;
+      } else {
+        // If no data was read, increment retries.
+        retries++;
+        vTaskDelay(pdMS_TO_TICKS(2));  // NOLINT
+      }
+      App.feed_wdt();  // Feed the watchdog timer.
+    }
+    if (read_len != buffer_size) {
+      // Did not receive the full package within the timeout period
+      ESP_LOGE(TAG, "Failed to read full package, received only %" PRIu16 " of %" PRIu16 " bytes", read_len,
+               buffer_size);
+      // Deallocate buffer
+      allocator.deallocate(buffer, 4096);
+      buffer = nullptr;
+      return -1;
+    }
+    ESP_LOGV(TAG, "%d bytes fetched, writing it to UART", read_len);
+    if (read_len > 0) {
+      recv_string.clear();
+      this->write_array(buffer, buffer_size);
+      App.feed_wdt();
+      this->recv_ret_string_(recv_string, upload_first_chunk_sent_ ? 500 : 5000, true);
+      this->content_length_ -= read_len;
+      const float upload_percentage = 100.0f * (this->tft_size_ - this->content_length_) / this->tft_size_;
+#ifdef USE_PSRAM
+      ESP_LOGD(
+          TAG,
+          "Uploaded %0.2f%%, remaining %" PRIu32 " bytes, free heap: %" PRIu32 " (DRAM) + %" PRIu32 " (PSRAM) bytes",
+          upload_percentage, this->content_length_, static_cast<uint32_t>(heap_caps_get_free_size(MALLOC_CAP_INTERNAL)),
+          static_cast<uint32_t>(heap_caps_get_free_size(MALLOC_CAP_SPIRAM)));
+#else
+      ESP_LOGD(TAG, "Uploaded %0.2f%%, remaining %" PRIu32 " bytes, free heap: %" PRIu32 " bytes", upload_percentage,
+               this->content_length_, static_cast<uint32_t>(esp_get_free_heap_size()));
+#endif
+      upload_first_chunk_sent_ = true;
+      if (recv_string[0] == 0x08 && recv_string.size() == 5) {  // handle partial upload request
+        ESP_LOGD(TAG, "recv_string [%s]",
+                 format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
+        uint32_t result = 0;
+        for (int j = 0; j < 4; ++j) {
+          result += static_cast<uint8_t>(recv_string[j + 1]) << (8 * j);
+        }
+        if (result > 0) {
+          ESP_LOGI(TAG, "Nextion reported new range %" PRIu32, result);
+          this->content_length_ = this->tft_size_ - result;
+          range_start = result;
+        } else {
+          range_start = range_end + 1;
+        }
+        // Deallocate buffer
+        allocator.deallocate(buffer, 4096);
+        buffer = nullptr;
+        return range_end + 1;
+      } else if (recv_string[0] != 0x05 and recv_string[0] != 0x08) {  // 0x05 == "ok"
+        ESP_LOGE(TAG, "Invalid response from Nextion: [%s]",
+                 format_hex_pretty(reinterpret_cast<const uint8_t *>(recv_string.data()), recv_string.size()).c_str());
+        // Deallocate buffer
+        allocator.deallocate(buffer, 4096);
+        buffer = nullptr;
+        return -1;
+      }
+
+      recv_string.clear();
+    } else if (read_len == 0) {
+      ESP_LOGV(TAG, "End of HTTP response reached");
+      break;  // Exit the loop if there is no more data to read
+    } else {
+      ESP_LOGE(TAG, "Failed to read from HTTP client, error code: %" PRIu16, read_len);
+      break;  // Exit the loop on error
+    }
+  }
+  range_start = range_end + 1;
+  // Deallocate buffer
+  allocator.deallocate(buffer, 4096);
+  buffer = nullptr;
   return range_end + 1;
 }
 
 bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   ESP_LOGD(TAG, "Nextion TFT upload requested");
   ESP_LOGD(TAG, "Exit reparse: %s", YESNO(exit_reparse));
-  ESP_LOGD(TAG, "url: %s", this->tft_url_.c_str());
+  ESP_LOGD(TAG, "URL: %s", this->tft_url_.c_str());
 
   if (this->is_updating_) {
-    ESP_LOGW(TAG, "Currently updating");
+    ESP_LOGW(TAG, "Currently uploading");
     return false;
   }
 
@@ -195,8 +188,8 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   ESP_LOGD(TAG, "Baud rate: %" PRIu32, baud_rate);
 
   // Define the configuration for the HTTP client
-  ESP_LOGV(TAG, "Establishing connection to HTTP server");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  ESP_LOGV(TAG, "Initializing HTTP client");
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
   esp_http_client_config_t config = {
       .url = this->tft_url_.c_str(),
       .cert_pem = nullptr,
@@ -205,58 +198,62 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
       .disable_auto_redirect = false,
       .max_redirection_count = 10,
   };
-
   // Initialize the HTTP client with the configuration
-  ESP_LOGV(TAG, "Initializing HTTP client");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  esp_http_client_handle_t http = esp_http_client_init(&config);
-  if (!http) {
+  esp_http_client_handle_t http_client = esp_http_client_init(&config);
+  if (!http_client) {
     ESP_LOGE(TAG, "Failed to initialize HTTP client.");
-    return this->upload_end(false);
+    return this->upload_end_(false);
+  }
+
+  esp_err_t err = esp_http_client_set_header(http_client, "Connection", "keep-alive");
+  if (err != ESP_OK) {
+    ESP_LOGE(TAG, "HTTP set header failed: %s", esp_err_to_name(err));
+    esp_http_client_cleanup(http_client);
+    return this->upload_end_(false);
   }
 
   // Perform the HTTP request
   ESP_LOGV(TAG, "Check if the client could connect");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  esp_err_t err = esp_http_client_perform(http);
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
+  err = esp_http_client_perform(http_client);
   if (err != ESP_OK) {
     ESP_LOGE(TAG, "HTTP request failed: %s", esp_err_to_name(err));
-    esp_http_client_cleanup(http);
-    return this->upload_end(false);
+    esp_http_client_cleanup(http_client);
+    return this->upload_end_(false);
   }
 
   // Check the HTTP Status Code
   ESP_LOGV(TAG, "Check the HTTP Status Code");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  int status_code = esp_http_client_get_status_code(http);
-  ESP_LOGV(TAG, "HTTP Status Code: %d", status_code);
-  size_t tft_file_size = esp_http_client_get_content_length(http);
-  ESP_LOGD(TAG, "TFT file size: %zu", tft_file_size);
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
+  int status_code = esp_http_client_get_status_code(http_client);
+  if (status_code != 200 && status_code != 206) {
+    return this->upload_end_(false);
+  }
 
-  ESP_LOGD(TAG, "Close HTTP connection");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  esp_http_client_close(http);
-  esp_http_client_cleanup(http);
-  ESP_LOGVV(TAG, "Connection closed");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  this->tft_size_ = esp_http_client_get_content_length(http_client);
 
-  if (tft_file_size < 4096) {
-    ESP_LOGE(TAG, "File size check failed. Size: %zu", tft_file_size);
-    return this->upload_end(false);
+  ESP_LOGD(TAG, "TFT file size: %zu bytes", this->tft_size_);
+  if (this->tft_size_ < 4096 || this->tft_size_ > 134217728) {
+    ESP_LOGE(TAG, "File size check failed.");
+    ESP_LOGD(TAG, "Close HTTP connection");
+    esp_http_client_close(http_client);
+    esp_http_client_cleanup(http_client);
+    ESP_LOGV(TAG, "Connection closed");
+    return this->upload_end_(false);
   } else {
     ESP_LOGV(TAG, "File size check passed. Proceeding...");
   }
-  this->content_length_ = tft_file_size;
-  this->tft_size_ = tft_file_size;
+  this->content_length_ = this->tft_size_;
 
-  ESP_LOGD(TAG, "Updating Nextion");
+  ESP_LOGD(TAG, "Uploading Nextion");
 
-  // The Nextion will ignore the update command if it is sleeping
+  // The Nextion will ignore the upload command if it is sleeping
   ESP_LOGV(TAG, "Wake-up Nextion");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  this->ignore_is_setup_ = true;
   this->send_command_("sleep=0");
-  this->set_backlight_brightness(1.0);
+  this->send_command_("dim=100");
   vTaskDelay(pdMS_TO_TICKS(250));  // NOLINT
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
 
   App.feed_wdt();
   char command[128];
@@ -267,14 +264,11 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
 
   // Clear serial receive buffer
   ESP_LOGV(TAG, "Clear serial receive buffer");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  uint8_t d;
-  while (this->available()) {
-    this->read_byte(&d);
-  };
+  this->reset_(false);
+  vTaskDelay(pdMS_TO_TICKS(250));  // NOLINT
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
 
-  ESP_LOGV(TAG, "Send update instruction: %s", command);
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  ESP_LOGV(TAG, "Send upload instruction: %s", command);
   this->send_command_(command);
 
   if (baud_rate != this->original_baud_rate_) {
@@ -288,41 +282,66 @@ bool Nextion::upload_tft(uint32_t baud_rate, bool exit_reparse) {
   this->recv_ret_string_(response, 5000, true);  // This can take some time to return
 
   // The Nextion display will, if it's ready to accept data, send a 0x05 byte.
-  ESP_LOGD(TAG, "Upgrade response is [%s] - %zu bytes",
+  ESP_LOGD(TAG, "Upgrade response is [%s] - %zu byte(s)",
            format_hex_pretty(reinterpret_cast<const uint8_t *>(response.data()), response.size()).c_str(),
            response.length());
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
+  ESP_LOGV(TAG, "Free heap: %" PRIu32, esp_get_free_heap_size());
 
   if (response.find(0x05) != std::string::npos) {
-    ESP_LOGV(TAG, "Preparation for tft update done");
+    ESP_LOGV(TAG, "Preparation for TFT upload done");
   } else {
-    ESP_LOGE(TAG, "Preparation for tft update failed %d \"%s\"", response[0], response.c_str());
-    return this->upload_end(false);
+    ESP_LOGE(TAG, "Preparation for TFT upload failed %d \"%s\"", response[0], response.c_str());
+    ESP_LOGD(TAG, "Close HTTP connection");
+    esp_http_client_close(http_client);
+    esp_http_client_cleanup(http_client);
+    ESP_LOGV(TAG, "Connection closed");
+    return this->upload_end_(false);
   }
 
-  ESP_LOGD(TAG, "Updating tft from \"%s\" with a file size of %d, Heap Size %" PRIu32, this->tft_url_.c_str(),
-           content_length_, esp_get_free_heap_size());
+  ESP_LOGV(TAG, "Change the method to GET before starting the download");
+  esp_err_t set_method_result = esp_http_client_set_method(http_client, HTTP_METHOD_GET);
+  if (set_method_result != ESP_OK) {
+    ESP_LOGE(TAG, "Failed to set HTTP method to GET: %s", esp_err_to_name(set_method_result));
+    return this->upload_end_(false);
+  }
+
+  ESP_LOGD(TAG, "Uploading TFT to Nextion:");
+  ESP_LOGD(TAG, "  URL: %s", this->tft_url_.c_str());
+  ESP_LOGD(TAG, "  File size: %" PRIu32 " bytes", this->content_length_);
+  ESP_LOGD(TAG, "  Free heap: %" PRIu32, esp_get_free_heap_size());
+
+  // Proceed with the content download as before
 
   ESP_LOGV(TAG, "Starting transfer by chunks loop");
-  ESP_LOGVV(TAG, "Available heap: %" PRIu32, esp_get_free_heap_size());
-  int result = 0;
-  while (content_length_ > 0) {
-    result = upload_range(this->tft_url_.c_str(), result);
-    if (result < 0) {
-      ESP_LOGE(TAG, "Error updating Nextion!");
-      return this->upload_end(false);
+
+  uint32_t position = 0;
+  while (this->content_length_ > 0) {
+    int upload_result = upload_by_chunks_(http_client, position);
+    if (upload_result < 0) {
+      ESP_LOGE(TAG, "Error uploading TFT to Nextion!");
+      ESP_LOGD(TAG, "Close HTTP connection");
+      esp_http_client_close(http_client);
+      esp_http_client_cleanup(http_client);
+      ESP_LOGV(TAG, "Connection closed");
+      return this->upload_end_(false);
     }
     App.feed_wdt();
-    ESP_LOGV(TAG, "Heap Size %" PRIu32 ", Bytes left %d", esp_get_free_heap_size(), content_length_);
+    ESP_LOGV(TAG, "Free heap: %" PRIu32 ", Bytes left: %" PRIu32, esp_get_free_heap_size(), this->content_length_);
   }
 
-  ESP_LOGD(TAG, "Successfully updated Nextion!");
+  ESP_LOGD(TAG, "Successfully uploaded TFT to Nextion!");
 
-  return upload_end(true);
+  ESP_LOGD(TAG, "Close HTTP connection");
+  esp_http_client_close(http_client);
+  esp_http_client_cleanup(http_client);
+  ESP_LOGV(TAG, "Connection closed");
+  return this->upload_end_(true);
 }
 
-bool Nextion::upload_end(bool successful) {
+bool Nextion::upload_end_(bool successful) {
+  ESP_LOGD(TAG, "Nextion TFT upload finished: %s", YESNO(successful));
   this->is_updating_ = false;
+  this->ignore_is_setup_ = false;
 
   uint32_t baud_rate = this->parent_->get_baud_rate();
   if (baud_rate != this->original_baud_rate_) {
@@ -331,12 +350,12 @@ bool Nextion::upload_end(bool successful) {
     this->parent_->load_settings();
   }
 
-  ESP_LOGD(TAG, "Restarting Nextion");
-  this->soft_reset();
-  vTaskDelay(pdMS_TO_TICKS(1500));  // NOLINT
   if (successful) {
     ESP_LOGD(TAG, "Restarting ESPHome");
-    esp_restart();  // NOLINT(readability-static-accessed-through-instance)
+    delay(1500);  // NOLINT
+    arch_restart();
+  } else {
+    ESP_LOGE(TAG, "Nextion TFT upload failed");
   }
   return successful;
 }
@@ -344,5 +363,5 @@ bool Nextion::upload_end(bool successful) {
 }  // namespace nextion
 }  // namespace esphome
 
-#endif  // USE_NEXTION_TFT_UPLOAD
 #endif  // USE_ESP_IDF
+#endif  // USE_NEXTION_TFT_UPLOAD
diff --git a/esphome/core/defines.h b/esphome/core/defines.h
index 619a956071..b09373bcde 100644
--- a/esphome/core/defines.h
+++ b/esphome/core/defines.h
@@ -35,6 +35,7 @@
 #define USE_MDNS
 #define USE_MEDIA_PLAYER
 #define USE_MQTT
+#define USE_NEXTION_TFT_UPLOAD
 #define USE_NUMBER
 #define USE_DATETIME
 #define USE_DATETIME_DATE
@@ -64,7 +65,6 @@
 // Arduino-specific feature flags
 #ifdef USE_ARDUINO
 #define USE_CAPTIVE_PORTAL
-#define USE_NEXTION_TFT_UPLOAD
 #define USE_PROMETHEUS
 #define USE_WEBSERVER
 #define USE_WEBSERVER_PORT 80  // NOLINT

From 539c369eea0c07a89d0b0fbc877d3b14fe17fbdc Mon Sep 17 00:00:00 2001
From: tronikos <tronikos@users.noreply.github.com>
Date: Wed, 1 May 2024 17:39:15 -0700
Subject: [PATCH 78/81] Add a function to return the loop_interval (#6666)

---
 esphome/core/application.h | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/esphome/core/application.h b/esphome/core/application.h
index 7487780412..c4c745b687 100644
--- a/esphome/core/application.h
+++ b/esphome/core/application.h
@@ -222,6 +222,8 @@ class Application {
    */
   void set_loop_interval(uint32_t loop_interval) { this->loop_interval_ = loop_interval; }
 
+  uint32_t get_loop_interval() const { return this->loop_interval_; }
+
   void schedule_dump_config() { this->dump_config_at_ = 0; }
 
   void feed_wdt();

From 1b9a30e921f129f5c9aa3dd1032387722a7babc9 Mon Sep 17 00:00:00 2001
From: Mat931 <49403702+Mat931@users.noreply.github.com>
Date: Thu, 2 May 2024 01:21:57 +0000
Subject: [PATCH 79/81] Remote receiver improvements (#4642)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 .../components/remote_base/remote_base.cpp    |  6 +-
 esphome/components/remote_base/remote_base.h  | 45 +++++++++--
 .../components/remote_receiver/__init__.py    | 75 +++++++++++++++++--
 .../remote_receiver/remote_receiver.h         |  6 +-
 .../remote_receiver/remote_receiver_esp32.cpp | 16 ++--
 .../remote_receiver_esp8266.cpp               |  3 +-
 .../remote_receiver_libretiny.cpp             |  3 +-
 7 files changed, 125 insertions(+), 29 deletions(-)

diff --git a/esphome/components/remote_base/remote_base.cpp b/esphome/components/remote_base/remote_base.cpp
index 0e9cef8cca..fdfd0b43cc 100644
--- a/esphome/components/remote_base/remote_base.cpp
+++ b/esphome/components/remote_base/remote_base.cpp
@@ -108,18 +108,18 @@ void RemoteReceiverBase::register_dumper(RemoteReceiverDumperBase *dumper) {
 
 void RemoteReceiverBase::call_listeners_() {
   for (auto *listener : this->listeners_)
-    listener->on_receive(RemoteReceiveData(this->temp_, this->tolerance_));
+    listener->on_receive(RemoteReceiveData(this->temp_, this->tolerance_, this->tolerance_mode_));
 }
 
 void RemoteReceiverBase::call_dumpers_() {
   bool success = false;
   for (auto *dumper : this->dumpers_) {
-    if (dumper->dump(RemoteReceiveData(this->temp_, this->tolerance_)))
+    if (dumper->dump(RemoteReceiveData(this->temp_, this->tolerance_, this->tolerance_mode_)))
       success = true;
   }
   if (!success) {
     for (auto *dumper : this->secondary_dumpers_)
-      dumper->dump(RemoteReceiveData(this->temp_, this->tolerance_));
+      dumper->dump(RemoteReceiveData(this->temp_, this->tolerance_, this->tolerance_mode_));
   }
 }
 
diff --git a/esphome/components/remote_base/remote_base.h b/esphome/components/remote_base/remote_base.h
index b2a4b543ea..c31127735a 100644
--- a/esphome/components/remote_base/remote_base.h
+++ b/esphome/components/remote_base/remote_base.h
@@ -15,6 +15,11 @@
 namespace esphome {
 namespace remote_base {
 
+enum ToleranceMode : uint8_t {
+  TOLERANCE_MODE_PERCENTAGE = 0,
+  TOLERANCE_MODE_TIME = 1,
+};
+
 using RawTimings = std::vector<int32_t>;
 
 class RemoteTransmitData {
@@ -42,8 +47,8 @@ class RemoteTransmitData {
 
 class RemoteReceiveData {
  public:
-  explicit RemoteReceiveData(const RawTimings &data, uint8_t tolerance)
-      : data_(data), index_(0), tolerance_(tolerance) {}
+  explicit RemoteReceiveData(const RawTimings &data, uint32_t tolerance, ToleranceMode tolerance_mode)
+      : data_(data), index_(0), tolerance_(tolerance), tolerance_mode_(tolerance_mode) {}
 
   const RawTimings &get_raw_data() const { return this->data_; }
   uint32_t get_index() const { return index_; }
@@ -65,13 +70,35 @@ class RemoteReceiveData {
   void advance(uint32_t amount = 1) { this->index_ += amount; }
   void reset() { this->index_ = 0; }
 
+  void set_tolerance(uint32_t tolerance, ToleranceMode tolerance_mode) {
+    this->tolerance_ = tolerance;
+    this->tolerance_mode_ = tolerance_mode;
+  }
+  uint32_t get_tolerance() { return tolerance_; }
+  ToleranceMode get_tolerance_mode() { return this->tolerance_mode_; }
+
  protected:
-  int32_t lower_bound_(uint32_t length) const { return int32_t(100 - this->tolerance_) * length / 100U; }
-  int32_t upper_bound_(uint32_t length) const { return int32_t(100 + this->tolerance_) * length / 100U; }
+  int32_t lower_bound_(uint32_t length) const {
+    if (this->tolerance_mode_ == TOLERANCE_MODE_TIME) {
+      return int32_t(length - this->tolerance_);
+    } else if (this->tolerance_mode_ == TOLERANCE_MODE_PERCENTAGE) {
+      return int32_t(100 - this->tolerance_) * length / 100U;
+    }
+    return 0;
+  }
+  int32_t upper_bound_(uint32_t length) const {
+    if (this->tolerance_mode_ == TOLERANCE_MODE_TIME) {
+      return int32_t(length + this->tolerance_);
+    } else if (this->tolerance_mode_ == TOLERANCE_MODE_PERCENTAGE) {
+      return int32_t(100 + this->tolerance_) * length / 100U;
+    }
+    return 0;
+  }
 
   const RawTimings &data_;
   uint32_t index_;
-  uint8_t tolerance_;
+  uint32_t tolerance_;
+  ToleranceMode tolerance_mode_;
 };
 
 class RemoteComponentBase {
@@ -162,7 +189,10 @@ class RemoteReceiverBase : public RemoteComponentBase {
   RemoteReceiverBase(InternalGPIOPin *pin) : RemoteComponentBase(pin) {}
   void register_listener(RemoteReceiverListener *listener) { this->listeners_.push_back(listener); }
   void register_dumper(RemoteReceiverDumperBase *dumper);
-  void set_tolerance(uint8_t tolerance) { tolerance_ = tolerance; }
+  void set_tolerance(uint32_t tolerance, ToleranceMode tolerance_mode) {
+    this->tolerance_ = tolerance;
+    this->tolerance_mode_ = tolerance_mode;
+  }
 
  protected:
   void call_listeners_();
@@ -176,7 +206,8 @@ class RemoteReceiverBase : public RemoteComponentBase {
   std::vector<RemoteReceiverDumperBase *> dumpers_;
   std::vector<RemoteReceiverDumperBase *> secondary_dumpers_;
   RawTimings temp_;
-  uint8_t tolerance_;
+  uint32_t tolerance_{25};
+  ToleranceMode tolerance_mode_{TOLERANCE_MODE_PERCENTAGE};
 };
 
 class RemoteReceiverBinarySensorBase : public binary_sensor::BinarySensorInitiallyOff,
diff --git a/esphome/components/remote_receiver/__init__.py b/esphome/components/remote_receiver/__init__.py
index 6a68c8b254..6fe20153f4 100644
--- a/esphome/components/remote_receiver/__init__.py
+++ b/esphome/components/remote_receiver/__init__.py
@@ -10,17 +10,69 @@ from esphome.const import (
     CONF_IDLE,
     CONF_PIN,
     CONF_TOLERANCE,
+    CONF_TYPE,
     CONF_MEMORY_BLOCKS,
     CONF_RMT_CHANNEL,
+    CONF_VALUE,
 )
 from esphome.core import CORE, TimePeriod
 
+CONF_CLOCK_DIVIDER = "clock_divider"
+
 AUTO_LOAD = ["remote_base"]
 remote_receiver_ns = cg.esphome_ns.namespace("remote_receiver")
+remote_base_ns = cg.esphome_ns.namespace("remote_base")
+
+ToleranceMode = remote_base_ns.enum("ToleranceMode")
+
+TYPE_PERCENTAGE = "percentage"
+TYPE_TIME = "time"
+
+TOLERANCE_MODE = {
+    TYPE_PERCENTAGE: ToleranceMode.TOLERANCE_MODE_PERCENTAGE,
+    TYPE_TIME: ToleranceMode.TOLERANCE_MODE_TIME,
+}
+
+TOLERANCE_SCHEMA = cv.typed_schema(
+    {
+        TYPE_PERCENTAGE: cv.Schema(
+            {cv.Required(CONF_VALUE): cv.All(cv.percentage_int, cv.uint32_t)}
+        ),
+        TYPE_TIME: cv.Schema(
+            {
+                cv.Required(CONF_VALUE): cv.All(
+                    cv.positive_time_period_microseconds,
+                    cv.Range(max=TimePeriod(microseconds=4294967295)),
+                )
+            }
+        ),
+    },
+    lower=True,
+    enum=TOLERANCE_MODE,
+)
+
 RemoteReceiverComponent = remote_receiver_ns.class_(
     "RemoteReceiverComponent", remote_base.RemoteReceiverBase, cg.Component
 )
 
+
+def validate_tolerance(value):
+    if isinstance(value, dict):
+        return TOLERANCE_SCHEMA(value)
+
+    if "%" in str(value):
+        type_ = TYPE_PERCENTAGE
+    else:
+        type_ = TYPE_TIME
+
+    return TOLERANCE_SCHEMA(
+        {
+            CONF_VALUE: value,
+            CONF_TYPE: type_,
+        }
+    )
+
+
 MULTI_CONF = True
 CONFIG_SCHEMA = remote_base.validate_triggers(
     cv.Schema(
@@ -28,9 +80,7 @@ CONFIG_SCHEMA = remote_base.validate_triggers(
             cv.GenerateID(): cv.declare_id(RemoteReceiverComponent),
             cv.Required(CONF_PIN): cv.All(pins.internal_gpio_input_pin_schema),
             cv.Optional(CONF_DUMP, default=[]): remote_base.validate_dumpers,
-            cv.Optional(CONF_TOLERANCE, default=25): cv.All(
-                cv.percentage_int, cv.Range(min=0)
-            ),
+            cv.Optional(CONF_TOLERANCE, default="25%"): validate_tolerance,
             cv.SplitDefault(
                 CONF_BUFFER_SIZE,
                 esp32="10000b",
@@ -40,11 +90,15 @@ CONFIG_SCHEMA = remote_base.validate_triggers(
             ): cv.validate_bytes,
             cv.Optional(CONF_FILTER, default="50us"): cv.All(
                 cv.positive_time_period_microseconds,
-                cv.Range(max=TimePeriod(microseconds=255)),
+                cv.Range(max=TimePeriod(microseconds=4294967295)),
+            ),
+            cv.SplitDefault(CONF_CLOCK_DIVIDER, esp32=80): cv.All(
+                cv.only_on_esp32, cv.Range(min=1, max=255)
+            ),
+            cv.Optional(CONF_IDLE, default="10ms"): cv.All(
+                cv.positive_time_period_microseconds,
+                cv.Range(max=TimePeriod(microseconds=4294967295)),
             ),
-            cv.Optional(
-                CONF_IDLE, default="10ms"
-            ): cv.positive_time_period_microseconds,
             cv.Optional(CONF_MEMORY_BLOCKS, default=3): cv.Range(min=1, max=8),
             cv.Optional(CONF_RMT_CHANNEL): esp32_rmt.validate_rmt_channel(tx=False),
         }
@@ -61,6 +115,7 @@ async def to_code(config):
             )
         else:
             var = cg.new_Pvariable(config[CONF_ID], pin, config[CONF_MEMORY_BLOCKS])
+        cg.add(var.set_clock_divider(config[CONF_CLOCK_DIVIDER]))
     else:
         var = cg.new_Pvariable(config[CONF_ID], pin)
 
@@ -73,7 +128,11 @@ async def to_code(config):
         cg.add(var.register_listener(trigger))
     await cg.register_component(var, config)
 
-    cg.add(var.set_tolerance(config[CONF_TOLERANCE]))
+    cg.add(
+        var.set_tolerance(
+            config[CONF_TOLERANCE][CONF_VALUE], config[CONF_TOLERANCE][CONF_TYPE]
+        )
+    )
     cg.add(var.set_buffer_size(config[CONF_BUFFER_SIZE]))
     cg.add(var.set_filter_us(config[CONF_FILTER]))
     cg.add(var.set_idle_us(config[CONF_IDLE]))
diff --git a/esphome/components/remote_receiver/remote_receiver.h b/esphome/components/remote_receiver/remote_receiver.h
index f29145a59e..a1db671e5c 100644
--- a/esphome/components/remote_receiver/remote_receiver.h
+++ b/esphome/components/remote_receiver/remote_receiver.h
@@ -22,7 +22,7 @@ struct RemoteReceiverComponentStore {
   uint32_t buffer_read_at{0};
   bool overflow{false};
   uint32_t buffer_size{1000};
-  uint8_t filter_us{10};
+  uint32_t filter_us{10};
   ISRInternalGPIOPin pin;
 };
 #endif
@@ -50,7 +50,7 @@ class RemoteReceiverComponent : public remote_base::RemoteReceiverBase,
   float get_setup_priority() const override { return setup_priority::DATA; }
 
   void set_buffer_size(uint32_t buffer_size) { this->buffer_size_ = buffer_size; }
-  void set_filter_us(uint8_t filter_us) { this->filter_us_ = filter_us; }
+  void set_filter_us(uint32_t filter_us) { this->filter_us_ = filter_us; }
   void set_idle_us(uint32_t idle_us) { this->idle_us_ = idle_us; }
 
  protected:
@@ -66,7 +66,7 @@ class RemoteReceiverComponent : public remote_base::RemoteReceiverBase,
 #endif
 
   uint32_t buffer_size_{};
-  uint8_t filter_us_{10};
+  uint32_t filter_us_{10};
   uint32_t idle_us_{10000};
 };
 
diff --git a/esphome/components/remote_receiver/remote_receiver_esp32.cpp b/esphome/components/remote_receiver/remote_receiver_esp32.cpp
index d19ab695e1..c0bfb0222f 100644
--- a/esphome/components/remote_receiver/remote_receiver_esp32.cpp
+++ b/esphome/components/remote_receiver/remote_receiver_esp32.cpp
@@ -20,9 +20,11 @@ void RemoteReceiverComponent::setup() {
     rmt.rx_config.filter_en = false;
   } else {
     rmt.rx_config.filter_en = true;
-    rmt.rx_config.filter_ticks_thresh = this->from_microseconds_(this->filter_us_);
+    rmt.rx_config.filter_ticks_thresh = static_cast<uint8_t>(
+        std::min(this->from_microseconds_(this->filter_us_) * this->clock_divider_, (uint32_t) 255));
   }
-  rmt.rx_config.idle_threshold = this->from_microseconds_(this->idle_us_);
+  rmt.rx_config.idle_threshold =
+      static_cast<uint16_t>(std::min(this->from_microseconds_(this->idle_us_), (uint32_t) 65535));
 
   esp_err_t error = rmt_config(&rmt);
   if (error != ESP_OK) {
@@ -60,8 +62,9 @@ void RemoteReceiverComponent::dump_config() {
   ESP_LOGCONFIG(TAG, "  Channel: %d", this->channel_);
   ESP_LOGCONFIG(TAG, "  RMT memory blocks: %d", this->mem_block_num_);
   ESP_LOGCONFIG(TAG, "  Clock divider: %u", this->clock_divider_);
-  ESP_LOGCONFIG(TAG, "  Tolerance: %u%%", this->tolerance_);
-  ESP_LOGCONFIG(TAG, "  Filter out pulses shorter than: %u us", this->filter_us_);
+  ESP_LOGCONFIG(TAG, "  Tolerance: %" PRIu32 "%s", this->tolerance_,
+                (this->tolerance_mode_ == remote_base::TOLERANCE_MODE_TIME) ? " us" : "%");
+  ESP_LOGCONFIG(TAG, "  Filter out pulses shorter than: %" PRIu32 " us", this->filter_us_);
   ESP_LOGCONFIG(TAG, "  Signal is done after %" PRIu32 " us of no changes", this->idle_us_);
   if (this->is_failed()) {
     ESP_LOGE(TAG, "Configuring RMT driver failed: %s", esp_err_to_name(this->error_code_));
@@ -88,6 +91,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t len) {
   this->temp_.clear();
   int32_t multiplier = this->pin_->is_inverted() ? -1 : 1;
   size_t item_count = len / sizeof(rmt_item32_t);
+  uint32_t filter_ticks = this->from_microseconds_(this->filter_us_);
 
   ESP_LOGVV(TAG, "START:");
   for (size_t i = 0; i < item_count; i++) {
@@ -112,7 +116,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t len) {
   for (size_t i = 0; i < item_count; i++) {
     if (item[i].duration0 == 0u) {
       // Do nothing
-    } else if (bool(item[i].level0) == prev_level) {
+    } else if ((bool(item[i].level0) == prev_level) || (item[i].duration0 < filter_ticks)) {
       prev_length += item[i].duration0;
     } else {
       if (prev_length > 0) {
@@ -128,7 +132,7 @@ void RemoteReceiverComponent::decode_rmt_(rmt_item32_t *item, size_t len) {
 
     if (item[i].duration1 == 0u) {
       // Do nothing
-    } else if (bool(item[i].level1) == prev_level) {
+    } else if ((bool(item[i].level1) == prev_level) || (item[i].duration1 < filter_ticks)) {
       prev_length += item[i].duration1;
     } else {
       if (prev_length > 0) {
diff --git a/esphome/components/remote_receiver/remote_receiver_esp8266.cpp b/esphome/components/remote_receiver/remote_receiver_esp8266.cpp
index 8700fcf0bb..c92a134bd8 100644
--- a/esphome/components/remote_receiver/remote_receiver_esp8266.cpp
+++ b/esphome/components/remote_receiver/remote_receiver_esp8266.cpp
@@ -64,7 +64,8 @@ void RemoteReceiverComponent::dump_config() {
                   "invert the signal using 'inverted: True' in the pin schema!");
   }
   ESP_LOGCONFIG(TAG, "  Buffer Size: %u", this->buffer_size_);
-  ESP_LOGCONFIG(TAG, "  Tolerance: %u%%", this->tolerance_);
+  ESP_LOGCONFIG(TAG, "  Tolerance: %u%s", this->tolerance_,
+                (this->tolerance_mode_ == remote_base::TOLERANCE_MODE_TIME) ? " us" : "%");
   ESP_LOGCONFIG(TAG, "  Filter out pulses shorter than: %u us", this->filter_us_);
   ESP_LOGCONFIG(TAG, "  Signal is done after %u us of no changes", this->idle_us_);
 }
diff --git a/esphome/components/remote_receiver/remote_receiver_libretiny.cpp b/esphome/components/remote_receiver/remote_receiver_libretiny.cpp
index ac85b6b520..bfc29b4211 100644
--- a/esphome/components/remote_receiver/remote_receiver_libretiny.cpp
+++ b/esphome/components/remote_receiver/remote_receiver_libretiny.cpp
@@ -64,7 +64,8 @@ void RemoteReceiverComponent::dump_config() {
                   "invert the signal using 'inverted: True' in the pin schema!");
   }
   ESP_LOGCONFIG(TAG, "  Buffer Size: %u", this->buffer_size_);
-  ESP_LOGCONFIG(TAG, "  Tolerance: %u%%", this->tolerance_);
+  ESP_LOGCONFIG(TAG, "  Tolerance: %u%s", this->tolerance_,
+                (this->tolerance_mode_ == remote_base::TOLERANCE_MODE_TIME) ? " us" : "%");
   ESP_LOGCONFIG(TAG, "  Filter out pulses shorter than: %u us", this->filter_us_);
   ESP_LOGCONFIG(TAG, "  Signal is done after %u us of no changes", this->idle_us_);
 }

From bc65e6e914ea29da8bbb02ca5f5f3d948823dbd7 Mon Sep 17 00:00:00 2001
From: tronikos <tronikos@users.noreply.github.com>
Date: Wed, 1 May 2024 18:24:18 -0700
Subject: [PATCH 80/81] Make fast update intervals in qmc5883l work (#6647)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 esphome/components/qmc5883l/qmc5883l.cpp | 5 +++++
 esphome/components/qmc5883l/qmc5883l.h   | 1 +
 2 files changed, 6 insertions(+)

diff --git a/esphome/components/qmc5883l/qmc5883l.cpp b/esphome/components/qmc5883l/qmc5883l.cpp
index 8541b41ff7..49a67d4e09 100644
--- a/esphome/components/qmc5883l/qmc5883l.cpp
+++ b/esphome/components/qmc5883l/qmc5883l.cpp
@@ -1,4 +1,5 @@
 #include "qmc5883l.h"
+#include "esphome/core/application.h"
 #include "esphome/core/log.h"
 #include "esphome/core/hal.h"
 #include <cmath>
@@ -59,6 +60,10 @@ void QMC5883LComponent::setup() {
     this->mark_failed();
     return;
   }
+
+  if (this->get_update_interval() < App.get_loop_interval()) {
+    high_freq_.start();
+  }
 }
 void QMC5883LComponent::dump_config() {
   ESP_LOGCONFIG(TAG, "QMC5883L:");
diff --git a/esphome/components/qmc5883l/qmc5883l.h b/esphome/components/qmc5883l/qmc5883l.h
index b0c0af40d2..dd2008d453 100644
--- a/esphome/components/qmc5883l/qmc5883l.h
+++ b/esphome/components/qmc5883l/qmc5883l.h
@@ -56,6 +56,7 @@ class QMC5883LComponent : public PollingComponent, public i2c::I2CDevice {
     COMMUNICATION_FAILED,
   } error_code_;
   bool read_byte_16_(uint8_t a_register, uint16_t *data);
+  HighFrequencyLoopRequester high_freq_;
 };
 
 }  // namespace qmc5883l

From c7c0d97a5ecbaa235636ba9e527f8c9ff7b4c4b0 Mon Sep 17 00:00:00 2001
From: Anton Viktorov <anton.viktorov@live.com>
Date: Thu, 2 May 2024 03:49:01 +0200
Subject: [PATCH 81/81] SPI and I2C for BMP390 and BMP380 (#6652)

Co-authored-by: Jesse Hills <3060199+jesserockz@users.noreply.github.com>
---
 CODEOWNERS                                    |   5 +-
 esphome/components/bmp3xx/sensor.py           | 105 +-----------------
 esphome/components/bmp3xx_base/__init__.py    |  95 ++++++++++++++++
 .../bmp3xx_base.cpp}                          |   7 +-
 .../bmp3xx.h => bmp3xx_base/bmp3xx_base.h}    |  15 ++-
 esphome/components/bmp3xx_i2c/__init__.py     |   0
 esphome/components/bmp3xx_i2c/bmp3xx_i2c.cpp  |  29 +++++
 esphome/components/bmp3xx_i2c/bmp3xx_i2c.h    |  17 +++
 esphome/components/bmp3xx_i2c/sensor.py       |  22 ++++
 esphome/components/bmp3xx_spi/__init__.py     |   0
 esphome/components/bmp3xx_spi/bmp3xx_spi.cpp  |  57 ++++++++++
 esphome/components/bmp3xx_spi/bmp3xx_spi.h    |  19 ++++
 esphome/components/bmp3xx_spi/sensor.py       |  22 ++++
 .../components/bmp3xx/test.esp32-c3-idf.yaml  |  14 ---
 tests/components/bmp3xx/test.esp32-c3.yaml    |  14 ---
 tests/components/bmp3xx/test.esp32.yaml       |  14 ---
 tests/components/bmp3xx/test.esp8266.yaml     |  14 ---
 tests/components/bmp3xx/test.rp2040.yaml      |  14 ---
 .../common.yaml}                              |   7 +-
 .../bmp3xx_i2c/test.esp32-c3-idf.yaml         |   5 +
 .../components/bmp3xx_i2c/test.esp32-c3.yaml  |   5 +
 .../components/bmp3xx_i2c/test.esp32-idf.yaml |   5 +
 tests/components/bmp3xx_i2c/test.esp32.yaml   |   5 +
 tests/components/bmp3xx_i2c/test.esp8266.yaml |   5 +
 tests/components/bmp3xx_i2c/test.rp2040.yaml  |   5 +
 tests/components/bmp3xx_spi/common.yaml       |  16 +++
 .../bmp3xx_spi/test.esp32-c3-idf.yaml         |   7 ++
 .../components/bmp3xx_spi/test.esp32-c3.yaml  |   7 ++
 .../components/bmp3xx_spi/test.esp32-idf.yaml |   7 ++
 tests/components/bmp3xx_spi/test.esp32.yaml   |   7 ++
 tests/components/bmp3xx_spi/test.esp8266.yaml |   7 ++
 tests/components/bmp3xx_spi/test.rp2040.yaml  |   7 ++
 tests/test11.5.yaml                           |   9 --
 tests/test5.yaml                              |   9 --
 34 files changed, 375 insertions(+), 201 deletions(-)
 create mode 100644 esphome/components/bmp3xx_base/__init__.py
 rename esphome/components/{bmp3xx/bmp3xx.cpp => bmp3xx_base/bmp3xx_base.cpp} (99%)
 rename esphome/components/{bmp3xx/bmp3xx.h => bmp3xx_base/bmp3xx_base.h} (94%)
 create mode 100644 esphome/components/bmp3xx_i2c/__init__.py
 create mode 100644 esphome/components/bmp3xx_i2c/bmp3xx_i2c.cpp
 create mode 100644 esphome/components/bmp3xx_i2c/bmp3xx_i2c.h
 create mode 100644 esphome/components/bmp3xx_i2c/sensor.py
 create mode 100644 esphome/components/bmp3xx_spi/__init__.py
 create mode 100644 esphome/components/bmp3xx_spi/bmp3xx_spi.cpp
 create mode 100644 esphome/components/bmp3xx_spi/bmp3xx_spi.h
 create mode 100644 esphome/components/bmp3xx_spi/sensor.py
 delete mode 100644 tests/components/bmp3xx/test.esp32-c3-idf.yaml
 delete mode 100644 tests/components/bmp3xx/test.esp32-c3.yaml
 delete mode 100644 tests/components/bmp3xx/test.esp32.yaml
 delete mode 100644 tests/components/bmp3xx/test.esp8266.yaml
 delete mode 100644 tests/components/bmp3xx/test.rp2040.yaml
 rename tests/components/{bmp3xx/test.esp32-idf.yaml => bmp3xx_i2c/common.yaml} (66%)
 create mode 100644 tests/components/bmp3xx_i2c/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/bmp3xx_i2c/test.esp32-c3.yaml
 create mode 100644 tests/components/bmp3xx_i2c/test.esp32-idf.yaml
 create mode 100644 tests/components/bmp3xx_i2c/test.esp32.yaml
 create mode 100644 tests/components/bmp3xx_i2c/test.esp8266.yaml
 create mode 100644 tests/components/bmp3xx_i2c/test.rp2040.yaml
 create mode 100644 tests/components/bmp3xx_spi/common.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.esp32-c3-idf.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.esp32-c3.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.esp32-idf.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.esp32.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.esp8266.yaml
 create mode 100644 tests/components/bmp3xx_spi/test.rp2040.yaml

diff --git a/CODEOWNERS b/CODEOWNERS
index d0e920fe1d..c630db7948 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -63,7 +63,10 @@ esphome/components/bme280_base/* @esphome/core
 esphome/components/bme280_spi/* @apbodrov
 esphome/components/bme680_bsec/* @trvrnrth
 esphome/components/bmi160/* @flaviut
-esphome/components/bmp3xx/* @martgras
+esphome/components/bmp3xx/* @latonita
+esphome/components/bmp3xx_base/* @latonita @martgras
+esphome/components/bmp3xx_i2c/* @latonita
+esphome/components/bmp3xx_spi/* @latonita
 esphome/components/bmp581/* @kahrendt
 esphome/components/bp1658cj/* @Cossid
 esphome/components/bp5758d/* @Cossid
diff --git a/esphome/components/bmp3xx/sensor.py b/esphome/components/bmp3xx/sensor.py
index 6f90173c7b..89753768c3 100644
--- a/esphome/components/bmp3xx/sensor.py
+++ b/esphome/components/bmp3xx/sensor.py
@@ -1,102 +1,7 @@
-import esphome.codegen as cg
 import esphome.config_validation as cv
-from esphome.components import i2c, sensor
-from esphome.const import (
-    CONF_ID,
-    CONF_IIR_FILTER,
-    CONF_OVERSAMPLING,
-    CONF_PRESSURE,
-    CONF_TEMPERATURE,
-    DEVICE_CLASS_PRESSURE,
-    DEVICE_CLASS_TEMPERATURE,
-    STATE_CLASS_MEASUREMENT,
-    UNIT_CELSIUS,
-    UNIT_HECTOPASCAL,
+
+CODEOWNERS = ["@latonita"]
+
+CONFIG_SCHEMA = CONFIG_SCHEMA = cv.invalid(
+    "The bmp3xx sensor component has been renamed to bmp3xx_i2c."
 )
-
-CODEOWNERS = ["@martgras"]
-DEPENDENCIES = ["i2c"]
-
-bmp3xx_ns = cg.esphome_ns.namespace("bmp3xx")
-Oversampling = bmp3xx_ns.enum("Oversampling")
-OVERSAMPLING_OPTIONS = {
-    "NONE": Oversampling.OVERSAMPLING_NONE,
-    "2X": Oversampling.OVERSAMPLING_X2,
-    "4X": Oversampling.OVERSAMPLING_X4,
-    "8X": Oversampling.OVERSAMPLING_X8,
-    "16X": Oversampling.OVERSAMPLING_X16,
-    "32X": Oversampling.OVERSAMPLING_X32,
-}
-
-IIRFilter = bmp3xx_ns.enum("IIRFilter")
-IIR_FILTER_OPTIONS = {
-    "OFF": IIRFilter.IIR_FILTER_OFF,
-    "2X": IIRFilter.IIR_FILTER_2,
-    "4X": IIRFilter.IIR_FILTER_4,
-    "8X": IIRFilter.IIR_FILTER_8,
-    "16X": IIRFilter.IIR_FILTER_16,
-    "32X": IIRFilter.IIR_FILTER_32,
-    "64X": IIRFilter.IIR_FILTER_64,
-    "128X": IIRFilter.IIR_FILTER_128,
-}
-
-BMP3XXComponent = bmp3xx_ns.class_(
-    "BMP3XXComponent", cg.PollingComponent, i2c.I2CDevice
-)
-
-CONFIG_SCHEMA = (
-    cv.Schema(
-        {
-            cv.GenerateID(): cv.declare_id(BMP3XXComponent),
-            cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
-                unit_of_measurement=UNIT_CELSIUS,
-                accuracy_decimals=1,
-                device_class=DEVICE_CLASS_TEMPERATURE,
-                state_class=STATE_CLASS_MEASUREMENT,
-            ).extend(
-                {
-                    cv.Optional(CONF_OVERSAMPLING, default="2X"): cv.enum(
-                        OVERSAMPLING_OPTIONS, upper=True
-                    ),
-                }
-            ),
-            cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
-                unit_of_measurement=UNIT_HECTOPASCAL,
-                accuracy_decimals=1,
-                device_class=DEVICE_CLASS_PRESSURE,
-                state_class=STATE_CLASS_MEASUREMENT,
-            ).extend(
-                {
-                    cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
-                        OVERSAMPLING_OPTIONS, upper=True
-                    ),
-                }
-            ),
-            cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
-                IIR_FILTER_OPTIONS, upper=True
-            ),
-        }
-    )
-    .extend(cv.polling_component_schema("60s"))
-    .extend(i2c.i2c_device_schema(0x77))
-)
-
-
-async def to_code(config):
-    var = cg.new_Pvariable(config[CONF_ID])
-    await cg.register_component(var, config)
-    await i2c.register_i2c_device(var, config)
-    cg.add(var.set_iir_filter_config(config[CONF_IIR_FILTER]))
-    if temperature_config := config.get(CONF_TEMPERATURE):
-        sens = await sensor.new_sensor(temperature_config)
-        cg.add(var.set_temperature_sensor(sens))
-        cg.add(
-            var.set_temperature_oversampling_config(
-                temperature_config[CONF_OVERSAMPLING]
-            )
-        )
-
-    if pressure_config := config.get(CONF_PRESSURE):
-        sens = await sensor.new_sensor(pressure_config)
-        cg.add(var.set_pressure_sensor(sens))
-        cg.add(var.set_pressure_oversampling_config(pressure_config[CONF_OVERSAMPLING]))
diff --git a/esphome/components/bmp3xx_base/__init__.py b/esphome/components/bmp3xx_base/__init__.py
new file mode 100644
index 0000000000..589d170907
--- /dev/null
+++ b/esphome/components/bmp3xx_base/__init__.py
@@ -0,0 +1,95 @@
+import esphome.codegen as cg
+import esphome.config_validation as cv
+from esphome.components import sensor
+from esphome.const import (
+    CONF_ID,
+    CONF_IIR_FILTER,
+    CONF_OVERSAMPLING,
+    CONF_PRESSURE,
+    CONF_TEMPERATURE,
+    DEVICE_CLASS_PRESSURE,
+    DEVICE_CLASS_TEMPERATURE,
+    STATE_CLASS_MEASUREMENT,
+    UNIT_CELSIUS,
+    UNIT_HECTOPASCAL,
+)
+
+CODEOWNERS = ["@martgras", "@latonita"]
+
+bmp3xx_ns = cg.esphome_ns.namespace("bmp3xx_base")
+Oversampling = bmp3xx_ns.enum("Oversampling")
+OVERSAMPLING_OPTIONS = {
+    "NONE": Oversampling.OVERSAMPLING_NONE,
+    "2X": Oversampling.OVERSAMPLING_X2,
+    "4X": Oversampling.OVERSAMPLING_X4,
+    "8X": Oversampling.OVERSAMPLING_X8,
+    "16X": Oversampling.OVERSAMPLING_X16,
+    "32X": Oversampling.OVERSAMPLING_X32,
+}
+
+IIRFilter = bmp3xx_ns.enum("IIRFilter")
+IIR_FILTER_OPTIONS = {
+    "OFF": IIRFilter.IIR_FILTER_OFF,
+    "2X": IIRFilter.IIR_FILTER_2,
+    "4X": IIRFilter.IIR_FILTER_4,
+    "8X": IIRFilter.IIR_FILTER_8,
+    "16X": IIRFilter.IIR_FILTER_16,
+    "32X": IIRFilter.IIR_FILTER_32,
+    "64X": IIRFilter.IIR_FILTER_64,
+    "128X": IIRFilter.IIR_FILTER_128,
+}
+
+
+CONFIG_SCHEMA_BASE = cv.Schema(
+    {
+        cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
+            unit_of_measurement=UNIT_CELSIUS,
+            accuracy_decimals=1,
+            device_class=DEVICE_CLASS_TEMPERATURE,
+            state_class=STATE_CLASS_MEASUREMENT,
+        ).extend(
+            {
+                cv.Optional(CONF_OVERSAMPLING, default="2X"): cv.enum(
+                    OVERSAMPLING_OPTIONS, upper=True
+                ),
+            }
+        ),
+        cv.Optional(CONF_PRESSURE): sensor.sensor_schema(
+            unit_of_measurement=UNIT_HECTOPASCAL,
+            accuracy_decimals=1,
+            device_class=DEVICE_CLASS_PRESSURE,
+            state_class=STATE_CLASS_MEASUREMENT,
+        ).extend(
+            {
+                cv.Optional(CONF_OVERSAMPLING, default="16X"): cv.enum(
+                    OVERSAMPLING_OPTIONS, upper=True
+                ),
+            }
+        ),
+        cv.Optional(CONF_IIR_FILTER, default="OFF"): cv.enum(
+            IIR_FILTER_OPTIONS, upper=True
+        ),
+    }
+).extend(cv.polling_component_schema("60s"))
+
+
+async def to_code_base(config):
+    var = cg.new_Pvariable(config[CONF_ID])
+    await cg.register_component(var, config)
+
+    cg.add(var.set_iir_filter_config(config[CONF_IIR_FILTER]))
+    if temperature_config := config.get(CONF_TEMPERATURE):
+        sens = await sensor.new_sensor(temperature_config)
+        cg.add(var.set_temperature_sensor(sens))
+        cg.add(
+            var.set_temperature_oversampling_config(
+                temperature_config[CONF_OVERSAMPLING]
+            )
+        )
+
+    if pressure_config := config.get(CONF_PRESSURE):
+        sens = await sensor.new_sensor(pressure_config)
+        cg.add(var.set_pressure_sensor(sens))
+        cg.add(var.set_pressure_oversampling_config(pressure_config[CONF_OVERSAMPLING]))
+
+    return var
diff --git a/esphome/components/bmp3xx/bmp3xx.cpp b/esphome/components/bmp3xx_base/bmp3xx_base.cpp
similarity index 99%
rename from esphome/components/bmp3xx/bmp3xx.cpp
rename to esphome/components/bmp3xx_base/bmp3xx_base.cpp
index de28fd76ff..75b6812f81 100644
--- a/esphome/components/bmp3xx/bmp3xx.cpp
+++ b/esphome/components/bmp3xx_base/bmp3xx_base.cpp
@@ -5,13 +5,13 @@
   http://github.com/MartinL1/BMP388_DEV
 */
 
-#include "bmp3xx.h"
+#include "bmp3xx_base.h"
 #include "esphome/core/log.h"
 #include "esphome/core/hal.h"
 #include <cinttypes>
 
 namespace esphome {
-namespace bmp3xx {
+namespace bmp3xx_base {
 
 static const char *const TAG = "bmp3xx.sensor";
 
@@ -150,7 +150,6 @@ void BMP3XXComponent::setup() {
 void BMP3XXComponent::dump_config() {
   ESP_LOGCONFIG(TAG, "BMP3XX:");
   ESP_LOGCONFIG(TAG, "  Type: %s (0x%X)", LOG_STR_ARG(chip_type_to_str(this->chip_id_.reg)), this->chip_id_.reg);
-  LOG_I2C_DEVICE(this);
   switch (this->error_code_) {
     case NONE:
       break;
@@ -386,5 +385,5 @@ float BMP3XXComponent::bmp388_compensate_pressure_(float uncomp_press, float t_l
   return partial_out1 + partial_out2 + partial_data4;
 }
 
-}  // namespace bmp3xx
+}  // namespace bmp3xx_base
 }  // namespace esphome
diff --git a/esphome/components/bmp3xx/bmp3xx.h b/esphome/components/bmp3xx_base/bmp3xx_base.h
similarity index 94%
rename from esphome/components/bmp3xx/bmp3xx.h
rename to esphome/components/bmp3xx_base/bmp3xx_base.h
index d3b15f601d..50f92e04c1 100644
--- a/esphome/components/bmp3xx/bmp3xx.h
+++ b/esphome/components/bmp3xx_base/bmp3xx_base.h
@@ -9,10 +9,9 @@
 
 #include "esphome/core/component.h"
 #include "esphome/components/sensor/sensor.h"
-#include "esphome/components/i2c/i2c.h"
 
 namespace esphome {
-namespace bmp3xx {
+namespace bmp3xx_base {
 
 static const uint8_t BMP388_ID = 0x50;   // The BMP388 device ID
 static const uint8_t BMP390_ID = 0x60;   // The BMP390 device ID
@@ -69,8 +68,8 @@ enum IIRFilter {
   IIR_FILTER_128 = 0x07
 };
 
-/// This class implements support for the BMP3XX Temperature+Pressure i2c sensor.
-class BMP3XXComponent : public PollingComponent, public i2c::I2CDevice {
+/// This class implements support for the BMP3XX Temperature+Pressure sensor.
+class BMP3XXComponent : public PollingComponent {
  public:
   void setup() override;
   void dump_config() override;
@@ -231,7 +230,13 @@ class BMP3XXComponent : public PollingComponent, public i2c::I2CDevice {
   float bmp388_compensate_temperature_(float uncomp_temp);
   // Bosch pressure compensation function
   float bmp388_compensate_pressure_(float uncomp_press, float t_lin);
+
+  // interface specific functions
+  virtual bool read_byte(uint8_t a_register, uint8_t *data) = 0;
+  virtual bool write_byte(uint8_t a_register, uint8_t data) = 0;
+  virtual bool read_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
+  virtual bool write_bytes(uint8_t a_register, uint8_t *data, size_t len) = 0;
 };
 
-}  // namespace bmp3xx
+}  // namespace bmp3xx_base
 }  // namespace esphome
diff --git a/esphome/components/bmp3xx_i2c/__init__.py b/esphome/components/bmp3xx_i2c/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/esphome/components/bmp3xx_i2c/bmp3xx_i2c.cpp b/esphome/components/bmp3xx_i2c/bmp3xx_i2c.cpp
new file mode 100644
index 0000000000..7531090185
--- /dev/null
+++ b/esphome/components/bmp3xx_i2c/bmp3xx_i2c.cpp
@@ -0,0 +1,29 @@
+#include "esphome/components/i2c/i2c.h"
+#include "bmp3xx_i2c.h"
+#include <cinttypes>
+
+namespace esphome {
+namespace bmp3xx_i2c {
+
+static const char *const TAG = "bmp3xx_i2c.sensor";
+
+bool BMP3XXI2CComponent::read_byte(uint8_t a_register, uint8_t *data) {
+  return I2CDevice::read_byte(a_register, data);
+};
+bool BMP3XXI2CComponent::write_byte(uint8_t a_register, uint8_t data) {
+  return I2CDevice::write_byte(a_register, data);
+};
+bool BMP3XXI2CComponent::read_bytes(uint8_t a_register, uint8_t *data, size_t len) {
+  return I2CDevice::read_bytes(a_register, data, len);
+};
+bool BMP3XXI2CComponent::write_bytes(uint8_t a_register, uint8_t *data, size_t len) {
+  return I2CDevice::write_bytes(a_register, data, len);
+};
+
+void BMP3XXI2CComponent::dump_config() {
+  LOG_I2C_DEVICE(this);
+  BMP3XXComponent::dump_config();
+}
+
+}  // namespace bmp3xx_i2c
+}  // namespace esphome
diff --git a/esphome/components/bmp3xx_i2c/bmp3xx_i2c.h b/esphome/components/bmp3xx_i2c/bmp3xx_i2c.h
new file mode 100644
index 0000000000..d8b95cf843
--- /dev/null
+++ b/esphome/components/bmp3xx_i2c/bmp3xx_i2c.h
@@ -0,0 +1,17 @@
+#pragma once
+#include "esphome/components/i2c/i2c.h"
+#include "esphome/components/bmp3xx_base/bmp3xx_base.h"
+
+namespace esphome {
+namespace bmp3xx_i2c {
+
+class BMP3XXI2CComponent : public bmp3xx_base::BMP3XXComponent, public i2c::I2CDevice {
+  bool read_byte(uint8_t a_register, uint8_t *data) override;
+  bool write_byte(uint8_t a_register, uint8_t data) override;
+  bool read_bytes(uint8_t a_register, uint8_t *data, size_t len) override;
+  bool write_bytes(uint8_t a_register, uint8_t *data, size_t len) override;
+  void dump_config() override;
+};
+
+}  // namespace bmp3xx_i2c
+}  // namespace esphome
diff --git a/esphome/components/bmp3xx_i2c/sensor.py b/esphome/components/bmp3xx_i2c/sensor.py
new file mode 100644
index 0000000000..ae59d29e89
--- /dev/null
+++ b/esphome/components/bmp3xx_i2c/sensor.py
@@ -0,0 +1,22 @@
+import esphome.codegen as cg
+from esphome.components import i2c
+from ..bmp3xx_base import to_code_base, cv, CONFIG_SCHEMA_BASE
+
+AUTO_LOAD = ["bmp3xx_base"]
+CODEOWNERS = ["@latonita"]
+DEPENDENCIES = ["i2c"]
+
+bmp3xx_ns = cg.esphome_ns.namespace("bmp3xx_i2c")
+
+BMP3XXI2CComponent = bmp3xx_ns.class_(
+    "BMP3XXI2CComponent", cg.PollingComponent, i2c.I2CDevice
+)
+
+CONFIG_SCHEMA = CONFIG_SCHEMA_BASE.extend(
+    i2c.i2c_device_schema(default_address=0x77)
+).extend({cv.GenerateID(): cv.declare_id(BMP3XXI2CComponent)})
+
+
+async def to_code(config):
+    var = await to_code_base(config)
+    await i2c.register_i2c_device(var, config)
diff --git a/esphome/components/bmp3xx_spi/__init__.py b/esphome/components/bmp3xx_spi/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/esphome/components/bmp3xx_spi/bmp3xx_spi.cpp b/esphome/components/bmp3xx_spi/bmp3xx_spi.cpp
new file mode 100644
index 0000000000..2084530125
--- /dev/null
+++ b/esphome/components/bmp3xx_spi/bmp3xx_spi.cpp
@@ -0,0 +1,57 @@
+#include "bmp3xx_spi.h"
+#include <cinttypes>
+
+namespace esphome {
+namespace bmp3xx_spi {
+
+static const char *const TAG = "bmp3xx_spi.sensor";
+
+uint8_t set_bit(uint8_t num, int position) {
+  int mask = 1 << position;
+  return num | mask;
+}
+
+uint8_t clear_bit(uint8_t num, int position) {
+  int mask = 1 << position;
+  return num & ~mask;
+}
+
+void BMP3XXSPIComponent::setup() {
+  this->spi_setup();
+  BMP3XXComponent::setup();
+}
+
+bool BMP3XXSPIComponent::read_byte(uint8_t a_register, uint8_t *data) {
+  this->enable();
+  this->transfer_byte(set_bit(a_register, 7));
+  *data = this->transfer_byte(0);
+  this->disable();
+  return true;
+}
+
+bool BMP3XXSPIComponent::write_byte(uint8_t a_register, uint8_t data) {
+  this->enable();
+  this->transfer_byte(clear_bit(a_register, 7));
+  this->transfer_byte(data);
+  this->disable();
+  return true;
+}
+
+bool BMP3XXSPIComponent::read_bytes(uint8_t a_register, uint8_t *data, size_t len) {
+  this->enable();
+  this->transfer_byte(set_bit(a_register, 7));
+  this->read_array(data, len);
+  this->disable();
+  return true;
+}
+
+bool BMP3XXSPIComponent::write_bytes(uint8_t a_register, uint8_t *data, size_t len) {
+  this->enable();
+  this->transfer_byte(clear_bit(a_register, 7));
+  this->transfer_array(data, len);
+  this->disable();
+  return true;
+}
+
+}  // namespace bmp3xx_spi
+}  // namespace esphome
diff --git a/esphome/components/bmp3xx_spi/bmp3xx_spi.h b/esphome/components/bmp3xx_spi/bmp3xx_spi.h
new file mode 100644
index 0000000000..2183994abe
--- /dev/null
+++ b/esphome/components/bmp3xx_spi/bmp3xx_spi.h
@@ -0,0 +1,19 @@
+#pragma once
+#include "esphome/components/bmp3xx_base/bmp3xx_base.h"
+#include "esphome/components/spi/spi.h"
+
+namespace esphome {
+namespace bmp3xx_spi {
+
+class BMP3XXSPIComponent : public bmp3xx_base::BMP3XXComponent,
+                           public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
+                                                 spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1MHZ> {
+  void setup() override;
+  bool read_byte(uint8_t a_register, uint8_t *data) override;
+  bool write_byte(uint8_t a_register, uint8_t data) override;
+  bool read_bytes(uint8_t a_register, uint8_t *data, size_t len) override;
+  bool write_bytes(uint8_t a_register, uint8_t *data, size_t len) override;
+};
+
+}  // namespace bmp3xx_spi
+}  // namespace esphome
diff --git a/esphome/components/bmp3xx_spi/sensor.py b/esphome/components/bmp3xx_spi/sensor.py
new file mode 100644
index 0000000000..3d1acd3c1b
--- /dev/null
+++ b/esphome/components/bmp3xx_spi/sensor.py
@@ -0,0 +1,22 @@
+import esphome.codegen as cg
+from esphome.components import spi
+from ..bmp3xx_base import to_code_base, cv, CONFIG_SCHEMA_BASE
+
+AUTO_LOAD = ["bmp3xx_base"]
+CODEOWNERS = ["@latonita"]
+DEPENDENCIES = ["spi"]
+
+bmp3xx_ns = cg.esphome_ns.namespace("bmp3xx_spi")
+
+BMP3XXSPIComponent = bmp3xx_ns.class_(
+    "BMP3XXSPIComponent", cg.PollingComponent, spi.SPIDevice
+)
+
+CONFIG_SCHEMA = CONFIG_SCHEMA_BASE.extend(spi.spi_device_schema()).extend(
+    {cv.GenerateID(): cv.declare_id(BMP3XXSPIComponent)}
+)
+
+
+async def to_code(config):
+    var = await to_code_base(config)
+    await spi.register_spi_device(var, config)
diff --git a/tests/components/bmp3xx/test.esp32-c3-idf.yaml b/tests/components/bmp3xx/test.esp32-c3-idf.yaml
deleted file mode 100644
index 3b244eccf9..0000000000
--- a/tests/components/bmp3xx/test.esp32-c3-idf.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-i2c:
-  - id: i2c_bmp3xx
-    scl: 5
-    sda: 4
-
-sensor:
-  - platform: bmp3xx
-    address: 0x77
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    iir_filter: 2X
diff --git a/tests/components/bmp3xx/test.esp32-c3.yaml b/tests/components/bmp3xx/test.esp32-c3.yaml
deleted file mode 100644
index 3b244eccf9..0000000000
--- a/tests/components/bmp3xx/test.esp32-c3.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-i2c:
-  - id: i2c_bmp3xx
-    scl: 5
-    sda: 4
-
-sensor:
-  - platform: bmp3xx
-    address: 0x77
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    iir_filter: 2X
diff --git a/tests/components/bmp3xx/test.esp32.yaml b/tests/components/bmp3xx/test.esp32.yaml
deleted file mode 100644
index 677ed8a22d..0000000000
--- a/tests/components/bmp3xx/test.esp32.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-i2c:
-  - id: i2c_bmp3xx
-    scl: 16
-    sda: 17
-
-sensor:
-  - platform: bmp3xx
-    address: 0x77
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    iir_filter: 2X
diff --git a/tests/components/bmp3xx/test.esp8266.yaml b/tests/components/bmp3xx/test.esp8266.yaml
deleted file mode 100644
index 3b244eccf9..0000000000
--- a/tests/components/bmp3xx/test.esp8266.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-i2c:
-  - id: i2c_bmp3xx
-    scl: 5
-    sda: 4
-
-sensor:
-  - platform: bmp3xx
-    address: 0x77
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    iir_filter: 2X
diff --git a/tests/components/bmp3xx/test.rp2040.yaml b/tests/components/bmp3xx/test.rp2040.yaml
deleted file mode 100644
index 3b244eccf9..0000000000
--- a/tests/components/bmp3xx/test.rp2040.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-i2c:
-  - id: i2c_bmp3xx
-    scl: 5
-    sda: 4
-
-sensor:
-  - platform: bmp3xx
-    address: 0x77
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    iir_filter: 2X
diff --git a/tests/components/bmp3xx/test.esp32-idf.yaml b/tests/components/bmp3xx_i2c/common.yaml
similarity index 66%
rename from tests/components/bmp3xx/test.esp32-idf.yaml
rename to tests/components/bmp3xx_i2c/common.yaml
index 677ed8a22d..6641b7a1b8 100644
--- a/tests/components/bmp3xx/test.esp32-idf.yaml
+++ b/tests/components/bmp3xx_i2c/common.yaml
@@ -1,10 +1,11 @@
 i2c:
   - id: i2c_bmp3xx
-    scl: 16
-    sda: 17
+    scl: ${scl_pin}
+    sda: ${sda_pin}
 
 sensor:
-  - platform: bmp3xx
+  - platform: bmp3xx_i2c
+    i2c_id: i2c_bmp3xx
     address: 0x77
     temperature:
       name: BMP Temperature
diff --git a/tests/components/bmp3xx_i2c/test.esp32-c3-idf.yaml b/tests/components/bmp3xx_i2c/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..ee2c29ca4e
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.esp32-c3-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO5
+  sda_pin: GPIO4
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_i2c/test.esp32-c3.yaml b/tests/components/bmp3xx_i2c/test.esp32-c3.yaml
new file mode 100644
index 0000000000..ee2c29ca4e
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.esp32-c3.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO5
+  sda_pin: GPIO4
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_i2c/test.esp32-idf.yaml b/tests/components/bmp3xx_i2c/test.esp32-idf.yaml
new file mode 100644
index 0000000000..63c3bd6afd
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.esp32-idf.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO16
+  sda_pin: GPIO17
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_i2c/test.esp32.yaml b/tests/components/bmp3xx_i2c/test.esp32.yaml
new file mode 100644
index 0000000000..63c3bd6afd
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.esp32.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO16
+  sda_pin: GPIO17
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_i2c/test.esp8266.yaml b/tests/components/bmp3xx_i2c/test.esp8266.yaml
new file mode 100644
index 0000000000..ee2c29ca4e
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.esp8266.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO5
+  sda_pin: GPIO4
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_i2c/test.rp2040.yaml b/tests/components/bmp3xx_i2c/test.rp2040.yaml
new file mode 100644
index 0000000000..ee2c29ca4e
--- /dev/null
+++ b/tests/components/bmp3xx_i2c/test.rp2040.yaml
@@ -0,0 +1,5 @@
+substitutions:
+  scl_pin: GPIO5
+  sda_pin: GPIO4
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/common.yaml b/tests/components/bmp3xx_spi/common.yaml
new file mode 100644
index 0000000000..8d5f897661
--- /dev/null
+++ b/tests/components/bmp3xx_spi/common.yaml
@@ -0,0 +1,16 @@
+spi:
+  - id: spi_bmp3xx
+    clk_pin: ${clk_pin}
+    mosi_pin: ${mosi_pin}
+    miso_pin: ${miso_pin}
+
+sensor:
+  - platform: bmp3xx_spi
+    spi_id: spi_bmp3xx
+    cs_pin: ${cs_pin}
+    temperature:
+      name: BMP Temperature
+      oversampling: 16x
+    pressure:
+      name: BMP Pressure
+    iir_filter: 2X
diff --git a/tests/components/bmp3xx_spi/test.esp32-c3-idf.yaml b/tests/components/bmp3xx_spi/test.esp32-c3-idf.yaml
new file mode 100644
index 0000000000..2415ba5dc6
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.esp32-c3-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO6
+  mosi_pin: GPIO7
+  miso_pin: GPIO5
+  cs_pin: GPIO8
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/test.esp32-c3.yaml b/tests/components/bmp3xx_spi/test.esp32-c3.yaml
new file mode 100644
index 0000000000..2415ba5dc6
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.esp32-c3.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO6
+  mosi_pin: GPIO7
+  miso_pin: GPIO5
+  cs_pin: GPIO8
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/test.esp32-idf.yaml b/tests/components/bmp3xx_spi/test.esp32-idf.yaml
new file mode 100644
index 0000000000..54e027a614
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.esp32-idf.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO16
+  mosi_pin: GPIO17
+  miso_pin: GPIO15
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/test.esp32.yaml b/tests/components/bmp3xx_spi/test.esp32.yaml
new file mode 100644
index 0000000000..54e027a614
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.esp32.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO16
+  mosi_pin: GPIO17
+  miso_pin: GPIO15
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/test.esp8266.yaml b/tests/components/bmp3xx_spi/test.esp8266.yaml
new file mode 100644
index 0000000000..dbd158d030
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.esp8266.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO14
+  mosi_pin: GPIO13
+  miso_pin: GPIO12
+  cs_pin: GPIO15
+
+<<: !include common.yaml
diff --git a/tests/components/bmp3xx_spi/test.rp2040.yaml b/tests/components/bmp3xx_spi/test.rp2040.yaml
new file mode 100644
index 0000000000..f6c3f1eeca
--- /dev/null
+++ b/tests/components/bmp3xx_spi/test.rp2040.yaml
@@ -0,0 +1,7 @@
+substitutions:
+  clk_pin: GPIO2
+  mosi_pin: GPIO3
+  miso_pin: GPIO4
+  cs_pin: GPIO5
+
+<<: !include common.yaml
diff --git a/tests/test11.5.yaml b/tests/test11.5.yaml
index ef260d79c0..13de7f1929 100644
--- a/tests/test11.5.yaml
+++ b/tests/test11.5.yaml
@@ -498,15 +498,6 @@ sensor:
     co2:
       name: CO2 Sensor
 
-  - platform: bmp3xx
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    address: 0x77
-    iir_filter: 2X
-
   - platform: sen5x
     id: sen54
     temperature:
diff --git a/tests/test5.yaml b/tests/test5.yaml
index 81615b24b0..afd3359098 100644
--- a/tests/test5.yaml
+++ b/tests/test5.yaml
@@ -474,15 +474,6 @@ sensor:
     co2:
       name: CO2 Sensor
 
-  - platform: bmp3xx
-    temperature:
-      name: BMP Temperature
-      oversampling: 16x
-    pressure:
-      name: BMP Pressure
-    address: 0x77
-    iir_filter: 2X
-
   - platform: ms8607
     temperature:
       name: Temperature