Merge pull request #675 from iranl/c5
Arduino 3.3.0, C5 support, Watchdog and BLE improvements, No PSRAM builds, Auto restart BLE controller, No restart settings, HTTPS server on C6, Reimplement WebSerial
This commit is contained in:
4
.github/workflows/beta.yml
vendored
4
.github/workflows/beta.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
board: [esp32, esp32-s3, esp32-s3-oct, esp32-c3, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
board: [esp32, esp32-nopsram, esp32-s3, esp32-s3-nopsram, esp32-s3-oct, esp32-c3, esp32-c5, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
||||||
build: [release]
|
build: [release]
|
||||||
env:
|
env:
|
||||||
BOARD: ${{ matrix.board }}
|
BOARD: ${{ matrix.board }}
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.11'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: make deps
|
run: make deps
|
||||||
- name: Add version info
|
- name: Add version info
|
||||||
|
|||||||
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
board: [esp32, esp32-s3, esp32-s3-oct, esp32-c3, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
board: [esp32, esp32-nopsram, esp32-s3, esp32-s3-nopsram, esp32-s3-oct, esp32-c3, esp32-c5, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
||||||
build: [release]
|
build: [release]
|
||||||
env:
|
env:
|
||||||
BOARD: ${{ matrix.board }}
|
BOARD: ${{ matrix.board }}
|
||||||
@@ -42,7 +42,7 @@ jobs:
|
|||||||
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.11'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: make deps
|
run: make deps
|
||||||
- name: Add version info
|
- name: Add version info
|
||||||
|
|||||||
4
.github/workflows/nightly.yml
vendored
4
.github/workflows/nightly.yml
vendored
@@ -34,7 +34,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
board: [esp32, esp32-s3, esp32-s3-oct, esp32-c3, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
board: [esp32, esp32-nopsram, esp32-s3, esp32-s3-nopsram, esp32-s3-oct, esp32-c3, esp32-c5, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
||||||
build: [release]
|
build: [release]
|
||||||
env:
|
env:
|
||||||
BOARD: ${{ matrix.board }}
|
BOARD: ${{ matrix.board }}
|
||||||
@@ -58,7 +58,7 @@ jobs:
|
|||||||
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.11'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: make deps
|
run: make deps
|
||||||
- name: Add version info
|
- name: Add version info
|
||||||
|
|||||||
9
.github/workflows/release.yml
vendored
9
.github/workflows/release.yml
vendored
@@ -12,7 +12,7 @@ jobs:
|
|||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
board: [esp32, esp32-s3, esp32-s3-oct, esp32-c3, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
board: [esp32, esp32-nopsram, esp32-s3, esp32-s3-nopsram, esp32-s3-oct, esp32-c3, esp32-c5, esp32-c6, esp32-h2, esp32-solo1, esp32-gl-s10, esp32-p4]
|
||||||
build: [release]
|
build: [release]
|
||||||
env:
|
env:
|
||||||
BOARD: ${{ matrix.board }}
|
BOARD: ${{ matrix.board }}
|
||||||
@@ -36,7 +36,7 @@ jobs:
|
|||||||
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
key: ${{ runner.os }}-pio-${{ matrix.board }}
|
||||||
- uses: actions/setup-python@v5
|
- uses: actions/setup-python@v5
|
||||||
with:
|
with:
|
||||||
python-version: '3.10'
|
python-version: '3.11'
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: make deps
|
run: make deps
|
||||||
- name: Add version info
|
- name: Add version info
|
||||||
@@ -154,6 +154,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
mkdir -p ota/beta/
|
mkdir -p ota/beta/
|
||||||
mkdir -p ota/master/
|
mkdir -p ota/master/
|
||||||
|
mkdir -p ota/old/
|
||||||
mkdir -p resources/
|
mkdir -p resources/
|
||||||
mkdir -p src/
|
mkdir -p src/
|
||||||
cp -vf release/*/nuki_hub_*.bin ota/
|
cp -vf release/*/nuki_hub_*.bin ota/
|
||||||
@@ -168,11 +169,13 @@ jobs:
|
|||||||
rm -rf .github .gitignore .gitmodules
|
rm -rf .github .gitignore .gitmodules
|
||||||
touch ota/beta/empty
|
touch ota/beta/empty
|
||||||
touch ota/master/empty
|
touch ota/master/empty
|
||||||
|
echo release/*/nuki_hub_*.bin | tr ' ' '\n' | xargs -n1 -I{} bash -c 'cp {} ota/old/$VERSION.$(basename "{}")'
|
||||||
|
python3 resources/old_manifest.py $Version
|
||||||
- name: Commit binaries to binary
|
- name: Commit binaries to binary
|
||||||
uses: stefanzweifel/git-auto-commit-action@v5
|
uses: stefanzweifel/git-auto-commit-action@v5
|
||||||
with:
|
with:
|
||||||
commit_message: "Update binaries"
|
commit_message: "Update binaries"
|
||||||
file_pattern: 'ota/* ota/master/* ota/beta/*'
|
file_pattern: 'ota/* ota/master/* ota/beta/* ota/old/*'
|
||||||
branch: binary
|
branch: binary
|
||||||
skip_dirty_check: true
|
skip_dirty_check: true
|
||||||
skip_fetch: true
|
skip_fetch: true
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
You can build this project using Docker. Just run the following commands in the console:
|
You can build this project using Docker. Just run the following commands in the console:
|
||||||
|
|
||||||
## Build with PlatformIO (will build for the ESP32, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-H2, ESP32-P4 and ESP32-Solo1)
|
## Build with PlatformIO (will build for the ESP32, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2, ESP32-P4 and ESP32-Solo1)
|
||||||
```console
|
```console
|
||||||
git clone https://github.com/technyon/nuki_hub --recursive
|
git clone https://github.com/technyon/nuki_hub --recursive
|
||||||
cd nuki_hub/Docker
|
cd nuki_hub/Docker
|
||||||
|
|||||||
2
Makefile
2
Makefile
@@ -49,7 +49,7 @@ help:
|
|||||||
.PHONY: clean
|
.PHONY: clean
|
||||||
clean:
|
clean:
|
||||||
@echo "Cleaning build artifacts..."
|
@echo "Cleaning build artifacts..."
|
||||||
@-rm -rf release debug .pio/build updater/.pio/build
|
@-rm -rf release debug .pio/build updater/.pio/build dependencies.lock updater/dependencies.lock managed_components updater/managed_components
|
||||||
|
|
||||||
# Install dependencies
|
# Install dependencies
|
||||||
.PHONY: deps
|
.PHONY: deps
|
||||||
|
|||||||
45
README.md
45
README.md
@@ -15,8 +15,8 @@ Feel free to join us on Discord: https://discord.gg/9nPq85bP4p
|
|||||||
## Supported devices
|
## Supported devices
|
||||||
|
|
||||||
<b>Supported ESP32 devices:</b>
|
<b>Supported ESP32 devices:</b>
|
||||||
- Nuki Hub is compiled against all ESP32 models with Wi-Fi and Bluetooh Low Energy (BLE) which are supported by ESP-IDF 5.4.1 and Arduino Core 3.2.0.
|
- Nuki Hub is compiled against all ESP32 models with Wi-Fi and Bluetooh Low Energy (BLE) which are supported by ESP-IDF 5.5.0 and Arduino Core 3.3.0.
|
||||||
- Tested stable builds are provided for the ESP32, ESP32-S3, ESP32-C3, ESP32-C6, ESP32-P4 (with the ESP32-C6-MINI-1 module for BLE and WiFi) and ESP32-H2.
|
- Tested stable builds are provided for the ESP32, ESP32-S3, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-P4 (with the ESP32-C6-MINI-1 module for BLE and WiFi) and ESP32-H2.
|
||||||
- Untested builds are provided for the ESP32-Solo1 (as the developers don't own one).
|
- Untested builds are provided for the ESP32-Solo1 (as the developers don't own one).
|
||||||
|
|
||||||
<b>Not supported ESP32 devices:</b>
|
<b>Not supported ESP32 devices:</b>
|
||||||
@@ -58,8 +58,8 @@ See the "[Connecting via Ethernet](#connecting-via-ethernet-optional)" section f
|
|||||||
|
|
||||||
## Recommended ESP32 devices
|
## Recommended ESP32 devices
|
||||||
|
|
||||||
We don't recommend using single-core ESP32 devices (ESP32-C3, ESP32-C6, ESP32-H2, ESP32-Solo1).<br>
|
We don't recommend using the original ESP32 or ESP32-Solo1 devices because these devices experience unexpected crashes related to the (closed-source) BLE controller.<br>
|
||||||
Although Nuki Hub supports single-core devices, Nuki Hub uses both CPU cores (if available) to process tasks (e.g. HTTP server/MQTT client/BLE scanner/BLE client) and thus runs much better on dual-core devices.<br>
|
In newer models (e.g. ESP32-S3, ESP32-P4, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-H2) these unexpected crashed are seen a lot less.
|
||||||
|
|
||||||
We also don't recommend using the original ESP32 or ESP32-Solo1 devices because these devices experience unexpected crashes related to the (closed-source) BLE controller.<br>
|
We also don't recommend using the original ESP32 or ESP32-Solo1 devices because these devices experience unexpected crashes related to the (closed-source) BLE controller.<br>
|
||||||
In newer models (e.g. ESP32-S3, ESP32-P4, ESP32-C3, ESP32-C6, ESP32-H2) these unexpected crashes are seen less.
|
In newer models (e.g. ESP32-S3, ESP32-P4, ESP32-C3, ESP32-C6, ESP32-H2) these unexpected crashes are seen less.
|
||||||
@@ -71,16 +71,20 @@ It supports (with the C6 co-processor) anything the ESP32 range has to offer wit
|
|||||||
The only function missing (when not using a C5 as co-processor) is 5Ghz WiFi support.
|
The only function missing (when not using a C5 as co-processor) is 5Ghz WiFi support.
|
||||||
|
|
||||||
The ESP32-S3 is a dual-core CPU with many GPIO's, ability to enlarge RAM using PSRAM, ability to connect Ethernet modules over SPI and optionally power the device with a PoE splitter.<br>
|
The ESP32-S3 is a dual-core CPU with many GPIO's, ability to enlarge RAM using PSRAM, ability to connect Ethernet modules over SPI and optionally power the device with a PoE splitter.<br>
|
||||||
The only functions missing from the ESP32-S3 as compared to other ESP devices is the ability to use some Ethernet modules only supported by the original ESP32 (and ESP32-P4) and the ability to connect over WIFI6 (C6 or ESP32-P4 with C6 module)
|
The only functions missing from the ESP32-S3 as compared to other ESP devices is the ability to use some Ethernet modules only supported by the original ESP32 (and ESP32-P4) and the ability to connect over WIFI6 (C5, C6 or ESP32-P4 with C6 module)
|
||||||
|
|
||||||
|
The ESP32-C5 with PSRAM is a good option providing higher clockspeeds than the C6 and adding PSRAM and WIFI 6 on the 5 Ghz band support.
|
||||||
|
Nuki Hub uses both CPU cores (if available) to process tasks (e.g. HTTP server/MQTT client/BLE scanner/BLE client) and thus runs better on dual-core devices.<br>
|
||||||
|
|
||||||
Other considerations:
|
Other considerations:
|
||||||
- If Ethernet/PoE is required: ESP32-P4 with ESP32-C6-MINI-1 module or ESP32-S3 with PSRAM in combination with a SPI Ethernet module ([W5500](https://www.aliexpress.com/w/wholesale-w5500.html)) and [PoE to Ethernet and USB type B/C splitter](https://aliexpress.com/w/wholesale-poe-splitter-usb-c.html) or the LilyGO-T-ETH ELite, LilyGO-T-ETH-Lite-ESP32S3 or M5stack Atom S3R with the M5stack AtomPoe W5500 module
|
- If Ethernet/PoE is required: ESP32-P4 with ESP32-C6-MINI-1 module or ESP32-S3 with PSRAM in combination with a SPI Ethernet module ([W5500](https://www.aliexpress.com/w/wholesale-w5500.html)) and [PoE to Ethernet and USB type B/C splitter](https://aliexpress.com/w/wholesale-poe-splitter-usb-c.html) or the LilyGO-T-ETH ELite, LilyGO-T-ETH-Lite-ESP32S3 or M5stack Atom S3R with the M5stack AtomPoe W5500 module
|
||||||
- If WIFI6 is absolutely required: ESP32-P4 with ESP32-C6-MINI-1 module or ESP32-C6
|
- If WIFI6 is required: ESP32-P4 with ESP32-C6-MINI-1 module, ESP32-C5 or ESP32-C6
|
||||||
|
|
||||||
Devices ranked best-to-worst:
|
Devices ranked best-to-worst:
|
||||||
- ESP32-P4 with ESP32-C6-MINI-1 module
|
- ESP32-P4 with ESP32-C6-MINI-1 module
|
||||||
- ...... <br>
|
- ...... <br>
|
||||||
- ESP32-S3 with PSRAM
|
- ESP32-S3 with PSRAM
|
||||||
|
- ESP32-C5 with PSRAM
|
||||||
- ...... <br>
|
- ...... <br>
|
||||||
(Devices below will not support some Nuki Hub functions, be slower and/or are more likely to experience unexpected crashes)
|
(Devices below will not support some Nuki Hub functions, be slower and/or are more likely to experience unexpected crashes)
|
||||||
- ESP32-S3 without PSRAM
|
- ESP32-S3 without PSRAM
|
||||||
@@ -90,6 +94,7 @@ Devices ranked best-to-worst:
|
|||||||
- ESP32 without PSRAM
|
- ESP32 without PSRAM
|
||||||
- ...... <br>
|
- ...... <br>
|
||||||
(Devices below will not support more Nuki Hub functions, be slower and/or are more likely to experience unexpected crashes)
|
(Devices below will not support more Nuki Hub functions, be slower and/or are more likely to experience unexpected crashes)
|
||||||
|
- ESP32-C5
|
||||||
- ESP32-C6
|
- ESP32-C6
|
||||||
- ESP32-solo1
|
- ESP32-solo1
|
||||||
- ESP32-C3
|
- ESP32-C3
|
||||||
@@ -195,17 +200,19 @@ ESP32 devices have a limited amount of free RAM available.<br>
|
|||||||
<br>
|
<br>
|
||||||
On version >=9.10 of Nuki Hub with only a Nuki Lock connected the expected free amount of RAM/Heap available is around:
|
On version >=9.10 of Nuki Hub with only a Nuki Lock connected the expected free amount of RAM/Heap available is around:
|
||||||
|
|
||||||
- ESP32: 70.000 bytes
|
- ESP32: 105.000 bytes
|
||||||
- ESP32 with PSRAM: 110.000 bytes + PSRAM
|
- ESP32 with PSRAM: 120.000 bytes + PSRAM
|
||||||
- ESP32-C3: 90.000 bytes
|
- ESP32-C3: 70.000 bytes
|
||||||
|
- ESP32-C5 with PSRAM: 130.000 bytes + PSRAM
|
||||||
- ESP32-C6: 200.000 bytes
|
- ESP32-C6: 200.000 bytes
|
||||||
- ESP32-S3 130.000 bytes
|
- ESP32-P4: 450.000 bytes
|
||||||
- ESP32-S3 with PSRAM: 180.000 bytes + PSRAM
|
- ESP32-S3 135.000 bytes
|
||||||
|
- ESP32-S3 with PSRAM: 185.000 bytes + PSRAM
|
||||||
|
|
||||||
This free amount of RAM can be reduced (temporarily) by certain actions (such as changing Nuki device config) or continuously when enabling the following:
|
This free amount of RAM can be reduced (temporarily) by certain actions (such as changing Nuki device config) or continuously when enabling the following:
|
||||||
- Connecting both a Nuki opener and a Nuki lock to Nuki Hub
|
- Connecting both a Nuki opener and a Nuki lock to Nuki Hub
|
||||||
- Enlarging stack sizes of the Nuki and Network task to accommodate large amounts of keypad codes, authorization entries or timecontrol entries
|
- Enlarging stack sizes of the Nuki and Network task to accommodate large amounts of keypad codes, authorization entries or timecontrol entries
|
||||||
- MQTT SSL (Costs about 30k RAM)
|
- MQTT SSL (Costs about 20k-30k RAM)
|
||||||
- HTTP SSL (Costs about 30k RAM)
|
- HTTP SSL (Costs about 30k RAM)
|
||||||
- Developing/debugging Nuki devices and/or Nuki Hub, using WebSerial (Costs about 30k RAM)
|
- Developing/debugging Nuki devices and/or Nuki Hub, using WebSerial (Costs about 30k RAM)
|
||||||
|
|
||||||
@@ -287,7 +294,6 @@ In a browser navigate to the IP address assigned to the ESP32.
|
|||||||
- Nuki Smartlock enabled: Enable if you want Nuki Hub to connect to a Nuki Lock (1.0-4.0 and Ultra)
|
- Nuki Smartlock enabled: Enable if you want Nuki Hub to connect to a Nuki Lock (1.0-4.0 and Ultra)
|
||||||
- Nuki Smartlock Ultra/Go/5th gen enabled: Enable if you want Nuki Hub to connect to a Nuki Lock Ultra/Go/5th gen Pro
|
- Nuki Smartlock Ultra/Go/5th gen enabled: Enable if you want Nuki Hub to connect to a Nuki Lock Ultra/Go/5th gen Pro
|
||||||
- Nuki Opener enabled: Enable if you want Nuki Hub to connect to a Nuki Opener
|
- Nuki Opener enabled: Enable if you want Nuki Hub to connect to a Nuki Opener
|
||||||
- New Nuki Bluetooth connection mode (disable if there are connection issues): Enable to use the latest Nuki BLE connection mode (recommended). Disable if you have issues communicating with the lock/opener
|
|
||||||
|
|
||||||
#### Advanced Nuki Configuration
|
#### Advanced Nuki Configuration
|
||||||
|
|
||||||
@@ -705,7 +711,7 @@ If you have enabled "Allow updating using MQTT" you can also use the Home Assist
|
|||||||
<br>
|
<br>
|
||||||
Alternatively you can select a binary file from your file system to update Nuki Hub or the Nuki Hub updator manually<br>
|
Alternatively you can select a binary file from your file system to update Nuki Hub or the Nuki Hub updator manually<br>
|
||||||
You can only update Nuki Hub from the Nuki Hub updater and update the updater only from Nuki Hub<br>
|
You can only update Nuki Hub from the Nuki Hub updater and update the updater only from Nuki Hub<br>
|
||||||
You can reboot from Nuki Hub to the updater and vice versa by selecting the reboot option from the "Firware update" page<br>
|
You can reboot from Nuki Hub to the updater and vice versa by selecting the reboot option from the "Firmware update" page<br>
|
||||||
When you are on the right application you can upload the new binary by clicking on "Browse" and select the new "nuki_hub\[board\].bin" or "nuki_hub_updater\[board\].bin" file and select "Upload file".<br>
|
When you are on the right application you can upload the new binary by clicking on "Browse" and select the new "nuki_hub\[board\].bin" or "nuki_hub_updater\[board\].bin" file and select "Upload file".<br>
|
||||||
After about a minute the new firmware should be installed afterwhich the ESP will reboot automatically to the updated binary.<br>
|
After about a minute the new firmware should be installed afterwhich the ESP will reboot automatically to the updated binary.<br>
|
||||||
Selecting the wrong binary will lead to an unsuccessfull update<br>
|
Selecting the wrong binary will lead to an unsuccessfull update<br>
|
||||||
@@ -952,7 +958,16 @@ Now connect via Wi-Fi and change the network hardware to "Generic W5500".<br>
|
|||||||
|
|
||||||
If Ethernet hardware isn't detected or initialised properly after changing the network device, Wi-Fi will be used as a fallback.<br>
|
If Ethernet hardware isn't detected or initialised properly after changing the network device, Wi-Fi will be used as a fallback.<br>
|
||||||
<br>
|
<br>
|
||||||
Note: LAN8720 modules are only supported on the ESP32, ESP32-P4 and ESP32-Solo1, not on the ESP32-S3, ESP32-C3 or ESP-C6<br>
|
Note: LAN8720 modules are only supported on the ESP32, ESP32-P4 and ESP32-Solo1, not on the ESP32-S3, ESP32-C3, ESP32-C5 or ESP-C6<br>
|
||||||
|
|
||||||
|
## Debugging crashes
|
||||||
|
|
||||||
|
If you are running a pre-compiled version of NukiHub (latest release, beta or nightly) you can use https://technyon.github.io/nuki_hub/stacktrace/ to debug crashes.
|
||||||
|
You will need to collect a stack trace of the crash while connected to the serial logger (over USB).
|
||||||
|
|
||||||
|
A stack trace usually starts with `Guru Mediation Error` and ends with `ELF file SHA256: ......`
|
||||||
|
Copy the entire stack trace to the box in our online decoder and select the correct binary you are using.
|
||||||
|
Click Run and check the output to find in which function the crash occurs and consider creating an issue on GitHub.
|
||||||
|
|
||||||
## FAQ / Troubleshooting
|
## FAQ / Troubleshooting
|
||||||
|
|
||||||
|
|||||||
31
boards/nuki-esp32-c5.json
Normal file
31
boards/nuki-esp32-c5.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"core": "esp32",
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"mcu": "esp32c5",
|
||||||
|
"variant": "esp32c5"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32c5.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32-C5 (>=4MB QD, QUAD OR NO PSRAM)",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
31
boards/nuki-esp32-c5dbg.json
Normal file
31
boards/nuki-esp32-c5dbg.json
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"core": "esp32",
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"mcu": "esp32c5",
|
||||||
|
"variant": "esp32c5"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_target": "esp32c5.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32-C5 (>=8MB QD, QUAD OR NO PSRAM)",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "8MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 8388608,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-dev-kits/en/latest/esp32c5/esp32-c5-devkitc-1/user_guide.html",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
50
boards/nuki-esp32-s3-nopsram.json
Normal file
50
boards/nuki-esp32-s3-nopsram.json
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32s3_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": [
|
||||||
|
"-DARDUINO_ESP32S3_DEV",
|
||||||
|
"-DARDUINO_USB_MODE=1",
|
||||||
|
"-DARDUINO_RUNNING_CORE=1",
|
||||||
|
"-DARDUINO_EVENT_RUNNING_CORE=1"
|
||||||
|
],
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "80000000L",
|
||||||
|
"flash_mode": "qio",
|
||||||
|
"hwids": [
|
||||||
|
[
|
||||||
|
"0x303A",
|
||||||
|
"0x1001"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"mcu": "esp32s3",
|
||||||
|
"variant": "esp32s3"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"bluetooth",
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"default_tool": "esp-builtin",
|
||||||
|
"onboard_tools": [
|
||||||
|
"esp-builtin"
|
||||||
|
],
|
||||||
|
"openocd_target": "esp32s3.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "ESP32-S3 (NO PSRAM)",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/hw-reference/esp32s3/user-guide-devkitc-1.html",
|
||||||
|
"vendor": "Espressif"
|
||||||
|
}
|
||||||
37
boards/nuki-esp32dev-nopsram.json
Normal file
37
boards/nuki-esp32dev-nopsram.json
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
{
|
||||||
|
"build": {
|
||||||
|
"arduino":{
|
||||||
|
"ldscript": "esp32_out.ld"
|
||||||
|
},
|
||||||
|
"core": "esp32",
|
||||||
|
"extra_flags": "-DARDUINO_ESP32_DEV",
|
||||||
|
"f_cpu": "240000000L",
|
||||||
|
"f_flash": "40000000L",
|
||||||
|
"flash_mode": "dio",
|
||||||
|
"mcu": "esp32",
|
||||||
|
"variant": "esp32"
|
||||||
|
},
|
||||||
|
"connectivity": [
|
||||||
|
"wifi",
|
||||||
|
"bluetooth",
|
||||||
|
"ethernet",
|
||||||
|
"can"
|
||||||
|
],
|
||||||
|
"debug": {
|
||||||
|
"openocd_board": "esp-wroom-32.cfg"
|
||||||
|
},
|
||||||
|
"frameworks": [
|
||||||
|
"arduino",
|
||||||
|
"espidf"
|
||||||
|
],
|
||||||
|
"name": "Espressif ESP32 Dev Module",
|
||||||
|
"upload": {
|
||||||
|
"flash_size": "4MB",
|
||||||
|
"maximum_ram_size": 327680,
|
||||||
|
"maximum_size": 4194304,
|
||||||
|
"require_upload_port": true,
|
||||||
|
"speed": 460800
|
||||||
|
},
|
||||||
|
"url": "https://en.wikipedia.org/wiki/ESP32",
|
||||||
|
"vendor": "AI Thinker"
|
||||||
|
}
|
||||||
12
index.html
12
index.html
@@ -70,23 +70,29 @@
|
|||||||
<div id="URL_based_input" class="collapsible">
|
<div id="URL_based_input" class="collapsible">
|
||||||
<select id="pick-variant-selector">
|
<select id="pick-variant-selector">
|
||||||
<optgroup label="Release version">
|
<optgroup label="Release version">
|
||||||
<option label="NukiHub Default (ESP32, ESP32-C3, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest.json"></option>
|
<option label="NukiHub Default (ESP32, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest.json"></option>
|
||||||
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_s3octal.json"></option>
|
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_s3octal.json"></option>
|
||||||
<option label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_solo1.json"></option>
|
<option label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_solo1.json"></option>
|
||||||
<option label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_gls10.json"></option>
|
<option label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_gls10.json"></option>
|
||||||
|
<option label="NukiHub ESP32 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_esp32nopsram.json"></option>
|
||||||
|
<option label="NukiHub ESP32-S3 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/webflash_manifest_s3nopsram.json"></option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup label="Beta version">
|
<optgroup label="Beta version">
|
||||||
<option class="beta" label="NukiHub Default (ESP32, ESP32-C3, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest.json"></option>
|
<option class="beta" label="NukiHub Default (ESP32, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest.json"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_s3octal.json"></option>
|
<option class="beta" label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_s3octal.json"></option>
|
||||||
<option class="beta" label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_gls10.json"></option>
|
<option class="beta" label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_gls10.json"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_solo1.json"></option>
|
<option class="beta" label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_solo1.json"></option>
|
||||||
|
<option class="beta" label="NukiHub ESP32 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_esp32nopsram.json"></option>
|
||||||
|
<option class="beta" label="NukiHub ESP32-S3 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/webflash_manifest_s3nopsram.json"></option>
|
||||||
<option class="beta" label="No Beta available" disabled value=""></option>
|
<option class="beta" label="No Beta available" disabled value=""></option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
<optgroup label="Development version">
|
<optgroup label="Development version">
|
||||||
<option label="NukiHub Default (ESP32, ESP32-C3, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest.json"></option>
|
<option label="NukiHub Default (ESP32, ESP32-C3, ESP32-C5, ESP32-C6, ESP32-S3, ESP32-P4)" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest.json"></option>
|
||||||
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_s3octal.json"></option>
|
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_s3octal.json"></option>
|
||||||
<option label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_solo1.json"></option>
|
<option label="NukiHub ESP32-SOLO1" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_solo1.json"></option>
|
||||||
<option label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_gls10.json"></option>
|
<option label="NukiHub GL-S10" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_gls10.json"></option>
|
||||||
|
<option label="NukiHub ESP32 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_esp32nopsram.json"></option>
|
||||||
|
<option label="NukiHub ESP32-S3 NO PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/webflash_manifest_s3nopsram.json"></option>
|
||||||
</optgroup>
|
</optgroup>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -20,18 +20,27 @@ Scanner::Scanner(int reservedSubscribers) {
|
|||||||
subscribers.reserve(reservedSubscribers);
|
subscribers.reserve(reservedSubscribers);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Scanner::~Scanner() {
|
||||||
|
Serial.println("Destroying scanner");
|
||||||
|
bleScan->stop();
|
||||||
|
Serial.println("bleScan stopped");
|
||||||
|
bleScan->clearResults();
|
||||||
|
Serial.println("bleScan results cleared");
|
||||||
|
bleScan = nullptr;
|
||||||
|
Serial.println("bleScan nulled");
|
||||||
|
}
|
||||||
|
|
||||||
void Scanner::initialize(const std::string& deviceName, const bool wantDuplicates, const uint16_t interval, const uint16_t window) {
|
void Scanner::initialize(const std::string& deviceName, const bool wantDuplicates, const uint16_t interval, const uint16_t window) {
|
||||||
if (!BLEDevice::isInitialized()) {
|
if (!NimBLEDevice::isInitialized()) {
|
||||||
if (wantDuplicates) {
|
if (wantDuplicates) {
|
||||||
// reduce memory footprint, cache is not used anyway
|
|
||||||
#ifdef CONFIG_BTDM_BLE_SCAN_DUPL
|
#ifdef CONFIG_BTDM_BLE_SCAN_DUPL
|
||||||
NimBLEDevice::setScanDuplicateCacheSize(10);
|
NimBLEDevice::setScanDuplicateCacheSize(10);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
BLEDevice::init(deviceName);
|
NimBLEDevice::init(deviceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
bleScan = BLEDevice::getScan();
|
bleScan = NimBLEDevice::getScan();
|
||||||
|
|
||||||
#ifndef BLESCANNER_USE_LATEST_NIMBLE
|
#ifndef BLESCANNER_USE_LATEST_NIMBLE
|
||||||
bleScan->setAdvertisedDeviceCallbacks(this, wantDuplicates);
|
bleScan->setAdvertisedDeviceCallbacks(this, wantDuplicates);
|
||||||
@@ -49,7 +58,6 @@ void Scanner::update() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (scanDuration == 0) {
|
if (scanDuration == 0) {
|
||||||
// Avoid unbridled growth of results vector
|
|
||||||
bleScan->setMaxResults(0);
|
bleScan->setMaxResults(0);
|
||||||
} else {
|
} else {
|
||||||
log_w("Ble scanner max results not 0. Be aware of memory issue due to unbridled growth of results vector");
|
log_w("Ble scanner max results not 0. Be aware of memory issue due to unbridled growth of results vector");
|
||||||
@@ -60,12 +68,6 @@ void Scanner::update() {
|
|||||||
#else
|
#else
|
||||||
bool result = bleScan->start(scanDuration * 1000, false);
|
bool result = bleScan->start(scanDuration * 1000, false);
|
||||||
#endif
|
#endif
|
||||||
// if (!result) {
|
|
||||||
// scanErrors++;
|
|
||||||
// if (scanErrors % 100 == 0) {
|
|
||||||
// log_w("BLE Scan error (100x)");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scanner::enableScanning(bool enable) {
|
void Scanner::enableScanning(bool enable) {
|
||||||
@@ -100,7 +102,7 @@ void Scanner::onResult(const NimBLEAdvertisedDevice* advertisedDevice) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Scanner::whitelist(BLEAddress bleAddress) {
|
void Scanner::whitelist(BLEAddress bleAddress) {
|
||||||
BLEDevice::whiteListAdd(bleAddress);
|
NimBLEDevice::whiteListAdd(bleAddress);
|
||||||
bleScan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL);
|
bleScan->setFilterPolicy(BLE_HCI_SCAN_FILT_USE_WL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ namespace BleScanner {
|
|||||||
class Scanner : public Publisher, BLEAdvertisedDeviceCallbacks {
|
class Scanner : public Publisher, BLEAdvertisedDeviceCallbacks {
|
||||||
public:
|
public:
|
||||||
Scanner(int reservedSubscribers = 10);
|
Scanner(int reservedSubscribers = 10);
|
||||||
~Scanner() = default;
|
~Scanner();
|
||||||
|
|
||||||
static Scanner& instance() {
|
static Scanner& instance() {
|
||||||
static Scanner* scanner = new Scanner(); // only initialized once on first call
|
static Scanner* scanner = new Scanner(); // only initialized once on first call
|
||||||
@@ -95,7 +95,7 @@ class Scanner : public Publisher, BLEAdvertisedDeviceCallbacks {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
uint32_t scanDuration = 0; //default indefinite scanning time
|
uint32_t scanDuration = 0; //default indefinite scanning time
|
||||||
BLEScan* bleScan = nullptr;
|
NimBLEScan* bleScan = nullptr;
|
||||||
std::vector<Subscriber*> subscribers;
|
std::vector<Subscriber*> subscribers;
|
||||||
uint16_t scanErrors = 0;
|
uint16_t scanErrors = 0;
|
||||||
bool scanningEnabled = true;
|
bool scanningEnabled = true;
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
#include <Arduino.h>
|
|
||||||
|
|
||||||
void setup() {
|
|
||||||
// put your setup code here, to run once:
|
|
||||||
}
|
|
||||||
|
|
||||||
void loop() {
|
|
||||||
// put your main code here, to run repeatedly:
|
|
||||||
}
|
|
||||||
@@ -88,10 +88,9 @@ void MqttLogger::sendBuffer()
|
|||||||
Serial.write(this->buffer, this->bufferCnt);
|
Serial.write(this->buffer, this->bufferCnt);
|
||||||
Serial.println();
|
Serial.println();
|
||||||
}
|
}
|
||||||
if (doWebSerial)
|
if (doWebSerial && websocketHandler != nullptr)
|
||||||
{
|
{
|
||||||
//WebSerial.write(this->buffer, this->bufferCnt);
|
websocketHandler->sendAll(HTTPD_WS_TYPE_TEXT, this->buffer, this->bufferCnt);
|
||||||
//WebSerial.println();
|
|
||||||
}
|
}
|
||||||
this->bufferCnt=0;
|
this->bufferCnt=0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,11 @@
|
|||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <Print.h>
|
#include <Print.h>
|
||||||
#include <espMqttClient.h>
|
#include <espMqttClient.h>
|
||||||
//#include "MycilaWebSerial.h"
|
#include "PsychicWebSocket.h"
|
||||||
|
|
||||||
#define MQTT_MAX_PACKET_SIZE 1024
|
#define MQTT_MAX_PACKET_SIZE 1024
|
||||||
|
|
||||||
|
extern PsychicWebSocketHandler* websocketHandler;
|
||||||
extern bool coredumpPrinted;
|
extern bool coredumpPrinted;
|
||||||
|
|
||||||
enum MqttLoggerMode {
|
enum MqttLoggerMode {
|
||||||
|
|||||||
@@ -306,6 +306,9 @@ String PsychicRequest::getCookie(const char* key)
|
|||||||
if (!hasCookie(key, &size))
|
if (!hasCookie(key, &size))
|
||||||
return cookie;
|
return cookie;
|
||||||
|
|
||||||
|
//Following line is needed until https://github.com/espressif/esp-idf/pull/16202 is merged and available in ESP-IDF 5.5 (beta2/RC/final)
|
||||||
|
size = httpd_req_get_hdr_value_len(this->_req, "Cookie");
|
||||||
|
|
||||||
// allocate cookie buffer... keep it on the stack
|
// allocate cookie buffer... keep it on the stack
|
||||||
char buf[size];
|
char buf[size];
|
||||||
|
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ void start_async_req_workers(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Calculate the maximum size needed for the scratch buffer */
|
/* Calculate the maximum size needed for the scratch buffer */
|
||||||
#define HTTPD_SCRATCH_BUF MAX(HTTPD_MAX_REQ_HDR_LEN, HTTPD_MAX_URI_LEN)
|
#define HTTPD_SCRATCH_BUF MAX(CONFIG_HTTPD_MAX_REQ_HDR_LEN, CONFIG_HTTPD_MAX_URI_LEN)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Auxiliary data structure for use during reception and processing
|
* @brief Auxiliary data structure for use during reception and processing
|
||||||
@@ -170,54 +170,3 @@ struct httpd_req_aux
|
|||||||
uint8_t mask_key[4]; /*!< WebSocket mask key for this payload */
|
uint8_t mask_key[4]; /*!< WebSocket mask key for this payload */
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
esp_err_t httpd_req_async_handler_begin(httpd_req_t* r, httpd_req_t** out)
|
|
||||||
{
|
|
||||||
if (r == NULL || out == NULL)
|
|
||||||
{
|
|
||||||
return ESP_ERR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// alloc async req
|
|
||||||
httpd_req_t* async = (httpd_req_t*)malloc(sizeof(httpd_req_t));
|
|
||||||
if (async == NULL)
|
|
||||||
{
|
|
||||||
return ESP_ERR_NO_MEM;
|
|
||||||
}
|
|
||||||
memcpy((void*)async, (void*)r, sizeof(httpd_req_t));
|
|
||||||
|
|
||||||
// alloc async aux
|
|
||||||
async->aux = (httpd_req_aux*)malloc(sizeof(struct httpd_req_aux));
|
|
||||||
if (async->aux == NULL)
|
|
||||||
{
|
|
||||||
free(async);
|
|
||||||
return ESP_ERR_NO_MEM;
|
|
||||||
}
|
|
||||||
memcpy(async->aux, r->aux, sizeof(struct httpd_req_aux));
|
|
||||||
|
|
||||||
// not available in 4.4.x
|
|
||||||
// mark socket as "in use"
|
|
||||||
// struct httpd_req_aux *ra = r->aux;
|
|
||||||
// ra->sd->for_async_req = true;
|
|
||||||
|
|
||||||
*out = async;
|
|
||||||
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
esp_err_t httpd_req_async_handler_complete(httpd_req_t* r)
|
|
||||||
{
|
|
||||||
if (r == NULL)
|
|
||||||
{
|
|
||||||
return ESP_ERR_INVALID_ARG;
|
|
||||||
}
|
|
||||||
|
|
||||||
// not available in 4.4.x
|
|
||||||
// struct httpd_req_aux *ra = (httpd_req_aux *)r->aux;
|
|
||||||
// ra->sd->for_async_req = false;
|
|
||||||
|
|
||||||
free(r->aux);
|
|
||||||
free(r);
|
|
||||||
|
|
||||||
return ESP_OK;
|
|
||||||
}
|
|
||||||
Submodule lib/nuki_ble updated: 51eb268f53...98872d9004
1
partitions_c5.csv
Normal file
1
partitions_c5.csv
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Espressif ESP32 Partition Table
|
||||||
|
1
partitions_c5dbg.csv
Normal file
1
partitions_c5dbg.csv
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Espressif ESP32 Partition Table
|
||||||
|
@@ -13,6 +13,10 @@ def get_board_name(env):
|
|||||||
board = 'esp32gls10'
|
board = 'esp32gls10'
|
||||||
elif env.get('BOARD') == 'nuki-esp32-s3-oct':
|
elif env.get('BOARD') == 'nuki-esp32-s3-oct':
|
||||||
board = 'esp32s3oct'
|
board = 'esp32s3oct'
|
||||||
|
elif env.get('BOARD') == 'nuki-esp32-s3-nopsram':
|
||||||
|
board = 'esp32s3nopsram'
|
||||||
|
elif env.get('BOARD') == 'nuki-esp32dev-nopsram':
|
||||||
|
board = 'esp32nopsram'
|
||||||
return board
|
return board
|
||||||
|
|
||||||
def create_target_dir(env):
|
def create_target_dir(env):
|
||||||
@@ -38,34 +42,6 @@ def copy_files(source, target, env):
|
|||||||
else:
|
else:
|
||||||
shutil.copy(file, f"{target_dir}/{file.name}")
|
shutil.copy(file, f"{target_dir}/{file.name}")
|
||||||
|
|
||||||
def merge_bin(source, target, env):
|
|
||||||
#if not env.get('BUILD_TYPE') in ['release']:
|
|
||||||
# return
|
|
||||||
|
|
||||||
board = get_board_name(env)
|
|
||||||
chip = env.get('BOARD_MCU')
|
|
||||||
target_dir = create_target_dir(env)
|
|
||||||
target_file = f"{target_dir}/webflash_nuki_hub_{board}.bin"
|
|
||||||
|
|
||||||
app_position = "0x10000"
|
|
||||||
app_path = target[0].get_abspath()
|
|
||||||
|
|
||||||
flash_args = list()
|
|
||||||
flash_args.append(app_position)
|
|
||||||
flash_args.append(app_path)
|
|
||||||
|
|
||||||
for position, bin_file in env.get('FLASH_EXTRA_IMAGES'):
|
|
||||||
if "boot_app0.bin" in bin_file:
|
|
||||||
bin_file = "resources/boot_app0.bin"
|
|
||||||
flash_args.append(position)
|
|
||||||
flash_args.append(bin_file)
|
|
||||||
|
|
||||||
flash_args.append("0x270000")
|
|
||||||
flash_args.append(f"{target_dir}/nuki_hub_updater_{board}.bin")
|
|
||||||
|
|
||||||
cmd = f"esptool.py --chip {chip} merge_bin -o {target_file} --flash_mode dio --flash_freq keep --flash_size keep " + " ".join(flash_args)
|
|
||||||
env.Execute(cmd)
|
|
||||||
|
|
||||||
def package_last_files(source, target, env):
|
def package_last_files(source, target, env):
|
||||||
files = ["resources/boot_app0.bin", "resources/how-to-flash.txt"]
|
files = ["resources/boot_app0.bin", "resources/how-to-flash.txt"]
|
||||||
|
|
||||||
@@ -80,5 +56,3 @@ env.AddPostAction("$BUILD_DIR/firmware.bin", package_last_files)
|
|||||||
env.AddPostAction("$BUILD_DIR/partitions.bin", copy_files)
|
env.AddPostAction("$BUILD_DIR/partitions.bin", copy_files)
|
||||||
env.AddPostAction("$BUILD_DIR/bootloader.bin", copy_files)
|
env.AddPostAction("$BUILD_DIR/bootloader.bin", copy_files)
|
||||||
env.AddPostAction("$BUILD_DIR/firmware.elf", copy_files)
|
env.AddPostAction("$BUILD_DIR/firmware.elf", copy_files)
|
||||||
|
|
||||||
#env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", merge_bin)
|
|
||||||
@@ -10,6 +10,10 @@ def recursive_purge(dir, pattern):
|
|||||||
elif re.search(pattern, os.path.join(dir, f)):
|
elif re.search(pattern, os.path.join(dir, f)):
|
||||||
os.remove(os.path.join(dir, f))
|
os.remove(os.path.join(dir, f))
|
||||||
|
|
||||||
|
os.system("python resources/bin2array/bin2array.py icon/favicon-32x32.png -O src/webServerConstants/favicon-32x32.h -l 16")
|
||||||
|
os.system("python resources/bin2array/bin2array.py resources/style.css -O src/webServerConstants/style.h -l 16")
|
||||||
|
os.system("python resources/bin2array/bin2array.py resources/AsyncWebSerial/frontend/index.html -O src/webServerConstants/webSerial.h -l 16")
|
||||||
|
|
||||||
regex = r"\#define NUKI_HUB_DATE \"(.*)\""
|
regex = r"\#define NUKI_HUB_DATE \"(.*)\""
|
||||||
content_new = ""
|
content_new = ""
|
||||||
file_content = ""
|
file_content = ""
|
||||||
|
|||||||
163
platformio.ini
163
platformio.ini
@@ -13,7 +13,7 @@ default_envs = esp32
|
|||||||
boards_dir = boards
|
boards_dir = boards
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
platform = https://github.com/iranl/nuki_hub/raw/refs/heads/binary/platform-espressif32.zip
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.30/platform-espressif32.zip
|
||||||
platform_packages =
|
platform_packages =
|
||||||
framework = arduino, espidf
|
framework = arduino, espidf
|
||||||
board_build.embed_txtfiles =
|
board_build.embed_txtfiles =
|
||||||
@@ -58,8 +58,12 @@ lib_ignore =
|
|||||||
SimpleBLE
|
SimpleBLE
|
||||||
WiFiProv
|
WiFiProv
|
||||||
NimBLE-Arduino
|
NimBLE-Arduino
|
||||||
|
AsyncTCP
|
||||||
|
ESPAsyncWebServer
|
||||||
|
ESPAsyncTCP
|
||||||
ESPAsyncTCP-esphome
|
ESPAsyncTCP-esphome
|
||||||
AsyncTCP_RP2040W
|
AsyncTCP_RP2040W
|
||||||
|
RPAsyncTCP
|
||||||
monitor_speed = 115200
|
monitor_speed = 115200
|
||||||
monitor_filters =
|
monitor_filters =
|
||||||
esp32_exception_decoder
|
esp32_exception_decoder
|
||||||
@@ -75,14 +79,24 @@ extra_scripts =
|
|||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
-DNUKI_HUB_HTTPS_SERVER
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
|
[env:esp32-nopsram]
|
||||||
|
board = nuki-esp32dev-nopsram
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32-nopsram"
|
||||||
|
extra_scripts =
|
||||||
|
pre:pio_package_pre.py
|
||||||
|
post:pio_package_post.py
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
|
|
||||||
[env:esp32-gl-s10]
|
[env:esp32-gl-s10]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = nuki-esp32gls10
|
board = nuki-esp32gls10
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32;sdkconfig.gls10.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32;sdkconfig.defaults.gls10"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:esp32.build_flags}
|
${env:esp32.build_flags}
|
||||||
-DNUKI_TARGET_GL_S10=y
|
-DNUKI_TARGET_GL_S10=y
|
||||||
@@ -91,66 +105,74 @@ build_flags =
|
|||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = esp32-c3-devkitc-02
|
board = esp32-c3-devkitc-02
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
|
|
||||||
[env:esp32-s3]
|
[env:esp32-s3]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = nuki-esp32-s3
|
board = nuki-esp32-s3
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32-s3"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3"
|
||||||
|
|
||||||
|
[env:esp32-s3-nopsram]
|
||||||
|
extends = env:esp32
|
||||||
|
board = nuki-esp32-s3-nopsram
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3-nopsram"
|
||||||
|
|
||||||
[env:esp32-s3-oct]
|
[env:esp32-s3-oct]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = nuki-esp32-s3-oct
|
board = nuki-esp32-s3-oct
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32-s3-oct"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3-oct"
|
||||||
|
|
||||||
|
[env:esp32-c5]
|
||||||
|
extends = env:esp32
|
||||||
|
board_build.partitions = partitions_c5.csv
|
||||||
|
board = nuki-esp32-c5
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-c5"
|
||||||
|
|
||||||
[env:esp32-c6]
|
[env:esp32-c6]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = esp32-c6-devkitm-1
|
board = esp32-c6-devkitm-1
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
|
build_flags =
|
||||||
|
${env:esp32.build_flags}
|
||||||
|
-DNUKI_HUB_HTTPS_SERVER
|
||||||
|
-DFORCE_NUKI_HUB_HTTPS_SERVER
|
||||||
|
|
||||||
[env:esp32-h2]
|
[env:esp32-h2]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = esp32-h2-devkitm-1
|
board = esp32-h2-devkitm-1
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DNUKI_TARGET_H2=y
|
-DNUKI_TARGET_H2=y
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
lib_ignore =
|
lib_ignore =
|
||||||
BLE
|
${env.lib_ignore}
|
||||||
BluetoothSerial
|
|
||||||
SimpleBLE
|
|
||||||
WiFiProv
|
|
||||||
NimBLE-Arduino
|
|
||||||
ESPAsyncTCP-esphome
|
|
||||||
AsyncTCP_RP2040W
|
|
||||||
WiFiManager
|
WiFiManager
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
|
|
||||||
[env:esp32-solo1]
|
[env:esp32-solo1]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board = nuki-esp32solo1
|
board = nuki-esp32solo1
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.defaults.esp32-solo1"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.singlecore.defaults;sdkconfig.defaults.esp32-solo1"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
||||||
|
|
||||||
[env:esp32-p4]
|
[env:esp32-p4]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
board_build.embed_txtfiles =
|
board_build.embed_txtfiles =
|
||||||
board = esp32-p4
|
board = esp32-p4
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.defaults.esp32-p4"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.release.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-p4"
|
||||||
build_flags =
|
|
||||||
${env.build_flags}
|
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DCONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
|
|
||||||
-DCONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
|
|
||||||
-DCONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
|
||||||
-DCONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
|
|
||||||
|
|
||||||
[env:esp32_dbg]
|
[env:esp32_dbg]
|
||||||
extends = env:esp32
|
extends = env:esp32
|
||||||
@@ -160,15 +182,24 @@ board_build.cmake_extra_args =
|
|||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
-DDEBUG_NUKIHUB
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
-DNUKI_HUB_HTTPS_SERVER
|
||||||
|
|
||||||
|
[env:esp32-nopsram_dbg]
|
||||||
|
extends = env:esp32-nopsram
|
||||||
|
custom_build = debug
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32-nopsram"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
-DDEBUG_NUKIHUB
|
-DDEBUG_NUKIHUB
|
||||||
|
|
||||||
[env:esp32-gl-s10_dbg]
|
[env:esp32-gl-s10_dbg]
|
||||||
extends = env:esp32-gl-s10
|
extends = env:esp32-gl-s10
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32;sdkconfig.gls10.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32;sdkconfig.defaults.gls10"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env:esp32_dbg.build_flags}
|
${env:esp32_dbg.build_flags}
|
||||||
-DNUKI_TARGET_GL_S10=y
|
-DNUKI_TARGET_GL_S10=y
|
||||||
@@ -177,62 +208,65 @@ build_flags =
|
|||||||
extends = env:esp32-c3
|
extends = env:esp32-c3
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
-DDEBUG_NUKIHUB
|
||||||
|
|
||||||
|
[env:esp32-c5_dbg]
|
||||||
|
extends = env:esp32-c5
|
||||||
|
board_build.partitions = partitions_c5dbg.csv
|
||||||
|
board = nuki-esp32-c5dbg
|
||||||
|
custom_build = debug
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-c5;sdkconfig.defaults.esp32-c5dbg"
|
||||||
|
build_flags =
|
||||||
|
${env:esp32_dbg.build_flags}
|
||||||
|
|
||||||
[env:esp32-c6_dbg]
|
[env:esp32-c6_dbg]
|
||||||
extends = env:esp32-c6
|
extends = env:esp32-c6
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env:esp32_dbg.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
-DFORCE_NUKI_HUB_HTTPS_SERVER
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
|
||||||
|
|
||||||
[env:esp32-h2_dbg]
|
[env:esp32-h2_dbg]
|
||||||
extends = env:esp32-h2
|
extends = env:esp32-h2
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DNUKI_TARGET_H2=y
|
-DNUKI_TARGET_H2=y
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.singlecore.defaults;sdkconfig.ramoptimize.defaults"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
-DDEBUG_NUKIHUB
|
||||||
|
|
||||||
[env:esp32-s3_dbg]
|
[env:esp32-s3_dbg]
|
||||||
extends = env:esp32-s3
|
extends = env:esp32-s3
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32-s3"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env:esp32_dbg.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
[env:esp32-s3-nopsram_dbg]
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
extends = env:esp32-s3-nopsram
|
||||||
-DDEBUG_NUKIHUB
|
custom_build = debug
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3-nopsram"
|
||||||
|
build_flags =
|
||||||
|
${env:esp32-nopsram_dbg.build_flags}
|
||||||
|
|
||||||
[env:esp32-s3-oct_dbg]
|
[env:esp32-s3-oct_dbg]
|
||||||
extends = env:esp32-s3-oct
|
extends = env:esp32-s3-oct
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32-s3-oct"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-s3-oct"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env:esp32_dbg.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
|
||||||
|
|
||||||
[env:esp32-solo1_dbg]
|
[env:esp32-solo1_dbg]
|
||||||
extends = env:esp32-solo1
|
extends = env:esp32-solo1
|
||||||
@@ -242,25 +276,12 @@ board_build.cmake_extra_args =
|
|||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
-DDEBUG_NUKIHUB
|
||||||
|
|
||||||
[env:esp32-p4_dbg]
|
[env:esp32-p4_dbg]
|
||||||
extends = env:esp32-p4
|
extends = env:esp32-p4
|
||||||
custom_build = debug
|
custom_build = debug
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.defaults.esp32-p4"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.debug.defaults;sdkconfig.ramoptimize.defaults;sdkconfig.defaults.esp32-p4"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env:esp32_dbg.build_flags}
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_DEBUG
|
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DDEBUG_NUKIHUB
|
|
||||||
-DCONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
|
|
||||||
-DCONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
|
|
||||||
-DCONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
|
||||||
-DCONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
|
|
||||||
39
resources/AsyncWebSerial/.clang-format
Normal file
39
resources/AsyncWebSerial/.clang-format
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Base style
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
|
||||||
|
# Custom configurations
|
||||||
|
IndentWidth: 4 # Number of spaces per indentation level
|
||||||
|
TabWidth: 4 # Width of a tab (useful if 'UseTab' is set)
|
||||||
|
UseTab: Never # Use spaces instead of tabs
|
||||||
|
|
||||||
|
# Function formatting
|
||||||
|
BreakBeforeBraces: Linux
|
||||||
|
AllowShortFunctionsOnASingleLine: Inline # Allow short functions to stay on a single line
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false # Keep multiline strings together
|
||||||
|
|
||||||
|
# Alignment
|
||||||
|
AlignConsecutiveAssignments: true # Align consecutive assignments
|
||||||
|
AlignTrailingComments: true # Align trailing comments
|
||||||
|
|
||||||
|
# Parameter formatting
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: false # Parameters declared on the same line if possible
|
||||||
|
|
||||||
|
# Array and list formatting
|
||||||
|
BinPackArguments: true # Place multiple arguments on the same line if possible
|
||||||
|
BinPackParameters: true # Same logic for parameters
|
||||||
|
ColumnLimit: 120 # Line length limit
|
||||||
|
|
||||||
|
# Pointer and reference formatting
|
||||||
|
PointerAlignment: Right # Align pointer near the variable name or type (values: Left, Right, Middle)
|
||||||
|
ReferenceAlignment: Right # Same logic for references
|
||||||
|
|
||||||
|
# Namespace
|
||||||
|
IndentNamespace: None # No indentation for namespaces
|
||||||
|
NamespaceIndentation: None # Alternative namespace indentation option
|
||||||
|
|
||||||
|
# Comments
|
||||||
|
ReflowComments: true # Reformat comments to fit within the line length limit
|
||||||
|
|
||||||
|
# Optional advanced configurations
|
||||||
|
IncludeBlocks: Preserve # Preserve blank lines between includes
|
||||||
|
SortIncludes: true # Sort includes alphabetically EmptyLineBeforeAccessModifier: Always # Blank line before "public:", "private:", etc.
|
||||||
7
resources/AsyncWebSerial/.github/dependabot.yml
vendored
Normal file
7
resources/AsyncWebSerial/.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
38
resources/AsyncWebSerial/.github/workflows/ci.yml
vendored
Normal file
38
resources/AsyncWebSerial/.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: Build
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
platformio:
|
||||||
|
name: PlatformIO
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
board: [esp32dev]
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Cache PlatformIO
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
key: ${{ runner.os }}-pio
|
||||||
|
path: |
|
||||||
|
~/.cache/pip
|
||||||
|
~/.platformio
|
||||||
|
|
||||||
|
- name: Python
|
||||||
|
uses: actions/setup-python@v5
|
||||||
|
with:
|
||||||
|
python-version: '3.x'
|
||||||
|
|
||||||
|
- name: Install PlatformIO
|
||||||
|
run: |
|
||||||
|
python -m pip install -U pip
|
||||||
|
pip install -U platformio
|
||||||
|
|
||||||
|
- run: PLATFORMIO_SRC_DIR=examples/demo PIO_BOARD=${{ matrix.board }} pio run
|
||||||
19
resources/AsyncWebSerial/.github/workflows/dependabot.yml
vendored
Normal file
19
resources/AsyncWebSerial/.github/workflows/dependabot.yml
vendored
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
name: PlatformIO Dependabot
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch: # option to manually trigger the workflow
|
||||||
|
schedule:
|
||||||
|
# Runs every day at 00:00
|
||||||
|
- cron: '0 0 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dependabot:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
name: run PlatformIO Dependabot
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
- name: run PlatformIO Dependabot
|
||||||
|
uses: peterus/platformio_dependabot@v1
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
3
resources/AsyncWebSerial/.gitignore
vendored
Normal file
3
resources/AsyncWebSerial/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
/.pio
|
||||||
|
/.vscode
|
||||||
|
node_modules
|
||||||
21
resources/AsyncWebSerial/LICENSE
Normal file
21
resources/AsyncWebSerial/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Andrea Sessa
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
95
resources/AsyncWebSerial/README.md
Normal file
95
resources/AsyncWebSerial/README.md
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# AsyncWebSerial
|
||||||
|
|
||||||
|
AsyncWebSerial: Simplify ESP32 debugging and logging with seamless browser-based serial communication.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Browser-Based Serial Access**: Log and debug ESP32 microcontrollers directly from a web browser using the Web Serial API.
|
||||||
|
- **Real-Time Communication**: Stream logs and data in real time, eliminating the need for traditional serial monitors.
|
||||||
|
- **Asynchronous Operation**: Leverages asynchronous processing for smooth and efficient communication.
|
||||||
|
- **Cross-Platform Compatibility**: Works on any browser that supports the Web Serial API, no additional software required.
|
||||||
|
- **Customizable Integration**: Easily integrates into ESP32 projects, enabling tailored debugging and logging workflows.
|
||||||
|
- **User-Friendly Interface**: Provides an intuitive way to monitor and interact with the ESP32 during development.
|
||||||
|
|
||||||
|
## Dependencies
|
||||||
|
|
||||||
|
- [AsyncTCP (mathieucarbou fork)](https://github.com/mathieucarbou/AsyncTCP)
|
||||||
|
- [ESPAsyncWebServer (mathieucarbou fork)](https://github.com/mathieucarbou/ESPAsyncWebServer)
|
||||||
|
|
||||||
|
## Build web interface
|
||||||
|
|
||||||
|
Install frontend dependencies:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn && yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Implementation
|
||||||
|
|
||||||
|
### Add AsyncWebSerial to your platformIO project platformio.ini
|
||||||
|
|
||||||
|
```ini
|
||||||
|
[env:esp32]
|
||||||
|
platform = espressif32
|
||||||
|
board = esp32dev
|
||||||
|
framework = arduino
|
||||||
|
monitor_speed = 115200
|
||||||
|
lib_deps =
|
||||||
|
circuitcode/AsyncWebSerial
|
||||||
|
```
|
||||||
|
|
||||||
|
### Include the library in your code
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#include <AsyncWebSerial.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Initialize the library
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
AsyncWebServer server(80);
|
||||||
|
AsyncWebSerial webSerial;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Use the library
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
void setup() {
|
||||||
|
webSerial.begin(&server);
|
||||||
|
server.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
webSerial.loop();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Send data to the AsyncWebSerial
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
webSerial.println("Hello, World!");
|
||||||
|
webSerial.printf("Hello, %s!", "World");
|
||||||
|
```
|
||||||
|
|
||||||
|
### Receive data from the AsyncWebSerial
|
||||||
|
|
||||||
|
You can use the `onMessage` method to receive data from the AsyncWebSerial. The method accepts a callback function that will be called when data is received. The callback function can accept both `const char *` and `String` data types.
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
webSerial.onMessage([](const char *data, size_t len) {
|
||||||
|
Serial.write(data, len);
|
||||||
|
});
|
||||||
|
|
||||||
|
webSerial.onMessage([](const String &msg) {
|
||||||
|
Serial.println(msg);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### Connect to the device serial page
|
||||||
|
|
||||||
|
Navigate to `http://<device-ip>/webserial` to access the serial page.
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
|
||||||
|
|
||||||
18
resources/AsyncWebSerial/examples/demo/demo.ino
Normal file
18
resources/AsyncWebSerial/examples/demo/demo.ino
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
#include <Arduino.h>
|
||||||
|
#include <AsyncWebSerial.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
|
||||||
|
AsyncWebSerial webSerial;
|
||||||
|
AsyncWebServer server(80);
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
webSerial.begin(&server);
|
||||||
|
server.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
webSerial.loop();
|
||||||
|
delay(10);
|
||||||
|
}
|
||||||
74
resources/AsyncWebSerial/frontend/build.js
Normal file
74
resources/AsyncWebSerial/frontend/build.js
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const zlib = require("zlib");
|
||||||
|
const htmlMinifier = require("html-minifier-terser").minify;
|
||||||
|
|
||||||
|
// Define paths
|
||||||
|
const inputPath = path.join(__dirname, "index.html");
|
||||||
|
const outputPath = path.join(__dirname, "../src/AsyncWebSerialHTML.h");
|
||||||
|
|
||||||
|
// Function to split buffer into 64-byte chunks
|
||||||
|
function splitIntoChunks(buffer, chunkSize) {
|
||||||
|
let chunks = [];
|
||||||
|
for (let i = 0; i < buffer.length; i += chunkSize) {
|
||||||
|
chunks.push(buffer.slice(i, i + chunkSize));
|
||||||
|
}
|
||||||
|
return chunks;
|
||||||
|
}
|
||||||
|
|
||||||
|
(async function () {
|
||||||
|
// read the index.html file
|
||||||
|
const indexHtml = fs.readFileSync(inputPath, "utf8").toString();
|
||||||
|
|
||||||
|
// Minify the HTML content
|
||||||
|
const minifiedHtml = await htmlMinifier(indexHtml, {
|
||||||
|
collapseWhitespace: true,
|
||||||
|
removeComments: true,
|
||||||
|
removeAttributeQuotes: true,
|
||||||
|
removeRedundantAttributes: true,
|
||||||
|
removeScriptTypeAttributes: true,
|
||||||
|
removeStyleLinkTypeAttributes: true,
|
||||||
|
useShortDoctype: true,
|
||||||
|
minifyCSS: true,
|
||||||
|
minifyJS: true,
|
||||||
|
shortAttributes: true,
|
||||||
|
shortClassName: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
let oldSize = (indexHtml.length / 1024).toFixed(2);
|
||||||
|
let newSize = (minifiedHtml.length / 1024).toFixed(2);
|
||||||
|
|
||||||
|
console.log(`[Minifier] Original: ${oldSize}KB | Minified: ${newSize}KB`);
|
||||||
|
|
||||||
|
// Gzip the minified HTML content
|
||||||
|
let gzippedHtml = zlib.gzipSync(minifiedHtml);
|
||||||
|
|
||||||
|
// Recreate the AsyncWebSerialHTML.h file with the new gzipped content
|
||||||
|
// the content is stored as a byte array split into 64 byte chunks to avoid issues with the IDE
|
||||||
|
let content = `#ifndef AsyncWebSerial_HTML_H
|
||||||
|
#define AsyncWebSerial_HTML_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
const uint8_t ASYNCWEBSERIAL_HTML[] PROGMEM = {\n`;
|
||||||
|
|
||||||
|
// Split gzipped HTML into 64-byte chunks
|
||||||
|
let chunks = splitIntoChunks(gzippedHtml, 64);
|
||||||
|
chunks.forEach((chunk, index) => {
|
||||||
|
content += ` ${Array.from(chunk)
|
||||||
|
.map((byte) => `0x${byte.toString(16).padStart(2, "0")}`)
|
||||||
|
.join(", ")}`;
|
||||||
|
if (index < chunks.length - 1) {
|
||||||
|
content += ",\n";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
content += `\n};
|
||||||
|
|
||||||
|
#endif // AsyncWebSerial_HTML_H`;
|
||||||
|
|
||||||
|
// Write the content to the output file
|
||||||
|
fs.writeFileSync(outputPath, content);
|
||||||
|
|
||||||
|
console.log("AsyncWebSerialHTML.h file created successfully!");
|
||||||
|
})();
|
||||||
365
resources/AsyncWebSerial/frontend/index.html
Normal file
365
resources/AsyncWebSerial/frontend/index.html
Normal file
@@ -0,0 +1,365 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<title>NukiHub WebSerial</title>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
<style type="text/css">
|
||||||
|
div {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
margin: 0.4rem;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
::after,
|
||||||
|
::before {
|
||||||
|
box-sizing: border-box;
|
||||||
|
border-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overscroll-behavior: none;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI",
|
||||||
|
Roboto, "Helvetica Neue", sans-serif;
|
||||||
|
background: #000;
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app {
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grid {
|
||||||
|
display: grid;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gap-2 {
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content {
|
||||||
|
flex: 1 1 0%;
|
||||||
|
align-content: flex-end;
|
||||||
|
height: 100%;
|
||||||
|
color: #d4d4d8;
|
||||||
|
font-family: monospace;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.content p {
|
||||||
|
margin: 0;
|
||||||
|
overflow-wrap: break-word;
|
||||||
|
text-wrap: wrap;
|
||||||
|
white-space: pre-line;
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
position: relative;
|
||||||
|
border: #fff 0.5rem solid;
|
||||||
|
border-radius: 1rem;
|
||||||
|
max-width: 45rem;
|
||||||
|
width: calc(100% - 1rem);
|
||||||
|
font-size: medium;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
flex-direction: row;
|
||||||
|
column-gap: 1.5rem;
|
||||||
|
padding-top: 0.5rem;
|
||||||
|
padding-bottom: 0.5rem;
|
||||||
|
padding-right: 0.5rem;
|
||||||
|
color: #a1a1aa;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons button {
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 8px 10px 8px;
|
||||||
|
font-size: medium;
|
||||||
|
outline-style: none;
|
||||||
|
border: 0px;
|
||||||
|
color: #a1a1aa;
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons button svg {
|
||||||
|
width: 1.4rem;
|
||||||
|
height: 1.4rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons button:hover {
|
||||||
|
background-color: #18181b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.w-full {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rounded {
|
||||||
|
border-radius: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.grow {
|
||||||
|
flex-grow: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shadow {
|
||||||
|
filter: drop-shadow(0 4px 3px rgb(0 0 0 / 0.07)) drop-shadow(0 2px 2px rgb(0 0 0 / 0.06));
|
||||||
|
}
|
||||||
|
|
||||||
|
.items-center {
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.command_container {
|
||||||
|
border-top-width: 1px;
|
||||||
|
border-bottom: 1px;
|
||||||
|
border-color: #18181b;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
input {
|
||||||
|
margin: 0;
|
||||||
|
padding: .375rem .75rem;
|
||||||
|
border: 0 solid #6b7280;
|
||||||
|
border-radius: .25rem;
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: .875rem;
|
||||||
|
line-height: 1.5rem;
|
||||||
|
background-color: #ffffff0d;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.command {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
#submit-button {
|
||||||
|
border: 0 solid #e5e7eb;
|
||||||
|
margin: 0;
|
||||||
|
text-transform: none;
|
||||||
|
background-image: none;
|
||||||
|
cursor: pointer;
|
||||||
|
display: flex;
|
||||||
|
width: 100%;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: .25rem;
|
||||||
|
padding: .5rem 1.5rem;
|
||||||
|
font-size: .875rem;
|
||||||
|
line-height: 1.25rem;
|
||||||
|
color: #fff;
|
||||||
|
background-color: rgb(29 78 216);
|
||||||
|
}
|
||||||
|
|
||||||
|
#submit-button svg {
|
||||||
|
width: 1rem;
|
||||||
|
height: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ml-4 {
|
||||||
|
margin-left: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.connection-status {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
padding: 0.5rem 1rem;
|
||||||
|
font-size: .75rem;
|
||||||
|
line-height: 1rem;
|
||||||
|
color: rgb(113 113 122);
|
||||||
|
align-items: center;
|
||||||
|
border-color: rgb(24 24 27);
|
||||||
|
gap: 0.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge {
|
||||||
|
width: 0.375rem;
|
||||||
|
height: 0.375rem;
|
||||||
|
border-radius: 9999px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge.green {
|
||||||
|
background-color: #22c55e;
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge.orange {
|
||||||
|
background-color: #f59e0b;
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge.red {
|
||||||
|
background-color: #ef4444;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div class="app">
|
||||||
|
<header>
|
||||||
|
<div class="buttons">
|
||||||
|
<div>
|
||||||
|
Buffer size:
|
||||||
|
<input type="text" id="buffer" class="rounded shadow" placeholder="Buffer size" value="1000">
|
||||||
|
</div>
|
||||||
|
<button class="rounded shadow" onclick="terminalClean()">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
|
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M4 7l16 0" />
|
||||||
|
<path d="M10 11l0 6" />
|
||||||
|
<path d="M14 11l0 6" />
|
||||||
|
<path d="M5 7l1 12a2 2 0 0 0 2 2h8a2 2 0 0 0 2 -2l1 -12" />
|
||||||
|
<path d="M9 7v-3a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v3" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button class="rounded shadow" onclick="enableScroll=!enableScroll">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
|
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M5 13a2 2 0 0 1 2 -2h10a2 2 0 0 1 2 2v6a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-6z" />
|
||||||
|
<path d="M11 16a1 1 0 1 0 2 0a1 1 0 0 0 -2 0" />
|
||||||
|
<path d="M8 11v-4a4 4 0 1 1 8 0v4" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button class="rounded shadow" onclick="enableTimestamp=!enableTimestamp">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
|
||||||
|
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M3 12a9 9 0 1 0 18 0a9 9 0 0 0 -18 0" />
|
||||||
|
<path d="M12 7v5l3 3" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="content"></div>
|
||||||
|
|
||||||
|
<footer>
|
||||||
|
<div class="command_container">
|
||||||
|
<form class="flex w-full items-center">
|
||||||
|
<input id="command" autocomplete="off" type="text" required="" class="command"
|
||||||
|
placeholder="Enter command here">
|
||||||
|
<div class="ml-4">
|
||||||
|
<button id="submit-button" type="submit">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"
|
||||||
|
fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"
|
||||||
|
stroke-linejoin="round">
|
||||||
|
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
|
||||||
|
<path d="M10 14l11 -11" />
|
||||||
|
<path d="M21 3l-6.5 18a.55 .55 0 0 1 -1 0l-3.5 -7l-7 -3.5a.55 .55 0 0 1 0 -1l18 -6.5" />
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="connection-status"></div>
|
||||||
|
</footer>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
let enableScroll = true;
|
||||||
|
let enableTimestamp = true;
|
||||||
|
|
||||||
|
let url = `ws://${window.location.hostname}/ws`;
|
||||||
|
let websocket;
|
||||||
|
let contentArea = document.querySelector('.content');
|
||||||
|
let connectionStatus = document.querySelector('.connection-status');
|
||||||
|
|
||||||
|
initApp();
|
||||||
|
|
||||||
|
function initApp() {
|
||||||
|
connectionStatus.innerHTML = '';
|
||||||
|
initWebSocket();
|
||||||
|
|
||||||
|
document.querySelector('form').addEventListener('submit', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
let command = document.getElementById('command').value;
|
||||||
|
websocket.send(command);
|
||||||
|
document.getElementById('command').value = '';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function initWebSocket() {
|
||||||
|
connectionStatus.innerHTML = '<div class="badge orange"></div> Connecting...';
|
||||||
|
websocket = new WebSocket(url);
|
||||||
|
websocket.onopen = onOpen;
|
||||||
|
websocket.onclose = onClose;
|
||||||
|
websocket.onmessage = onMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onOpen(event) {
|
||||||
|
connectionStatus.innerHTML = '<div class="badge green"></div> Connected';
|
||||||
|
terminalWrite('Connected to ' + url);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onClose(event) {
|
||||||
|
connectionStatus.innerHTML = '<div class="badge red"></div> Disconnected';
|
||||||
|
setTimeout(initWebSocket, 2000);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onMessage(event) {
|
||||||
|
terminalWrite(event.data);
|
||||||
|
}
|
||||||
|
|
||||||
|
function terminalWrite(data) {
|
||||||
|
if (enableTimestamp) {
|
||||||
|
let now = new Date();
|
||||||
|
data = "[" + now.toLocaleTimeString() + "] " + data;
|
||||||
|
}
|
||||||
|
contentArea.innerHTML += '<p>' + data + '</p>';
|
||||||
|
if (enableScroll) {
|
||||||
|
contentArea.scrollTop = contentArea.scrollHeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Limit buffer size to avoid memory issues in the browser
|
||||||
|
let bufferSize = parseInt(document.getElementById('buffer').value);
|
||||||
|
if (isNaN(bufferSize)) {
|
||||||
|
bufferSize = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
let lines = contentArea.querySelectorAll('p');
|
||||||
|
if (lines.length > bufferSize) {
|
||||||
|
for (let i = 0; i < lines.length - bufferSize; i++) {
|
||||||
|
contentArea.removeChild(lines[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function terminalClean() {
|
||||||
|
contentArea.innerHTML = '';
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</html>
|
||||||
12
resources/AsyncWebSerial/frontend/package.json
Normal file
12
resources/AsyncWebSerial/frontend/package.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"scripts": {
|
||||||
|
"build": "node build.js"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"html-minifier-terser": "^7.1.0"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"files": [
|
||||||
|
"LICENSE"
|
||||||
|
]
|
||||||
|
}
|
||||||
168
resources/AsyncWebSerial/frontend/yarn.lock
Normal file
168
resources/AsyncWebSerial/frontend/yarn.lock
Normal file
@@ -0,0 +1,168 @@
|
|||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
"@jridgewell/gen-mapping@^0.3.5":
|
||||||
|
version "0.3.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36"
|
||||||
|
integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/set-array" "^1.2.1"
|
||||||
|
"@jridgewell/sourcemap-codec" "^1.4.10"
|
||||||
|
"@jridgewell/trace-mapping" "^0.3.24"
|
||||||
|
|
||||||
|
"@jridgewell/resolve-uri@^3.1.0":
|
||||||
|
version "3.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
|
||||||
|
integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
|
||||||
|
|
||||||
|
"@jridgewell/set-array@^1.2.1":
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280"
|
||||||
|
integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==
|
||||||
|
|
||||||
|
"@jridgewell/source-map@^0.3.3":
|
||||||
|
version "0.3.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a"
|
||||||
|
integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/gen-mapping" "^0.3.5"
|
||||||
|
"@jridgewell/trace-mapping" "^0.3.25"
|
||||||
|
|
||||||
|
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
|
||||||
|
version "1.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
|
||||||
|
integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
|
||||||
|
|
||||||
|
"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
|
||||||
|
version "0.3.25"
|
||||||
|
resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
|
||||||
|
integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/resolve-uri" "^3.1.0"
|
||||||
|
"@jridgewell/sourcemap-codec" "^1.4.14"
|
||||||
|
|
||||||
|
acorn@^8.8.2:
|
||||||
|
version "8.14.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0"
|
||||||
|
integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==
|
||||||
|
|
||||||
|
buffer-from@^1.0.0:
|
||||||
|
version "1.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
|
||||||
|
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
|
||||||
|
|
||||||
|
camel-case@^4.1.2:
|
||||||
|
version "4.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a"
|
||||||
|
integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==
|
||||||
|
dependencies:
|
||||||
|
pascal-case "^3.1.2"
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
clean-css@~5.3.2:
|
||||||
|
version "5.3.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-5.3.3.tgz#b330653cd3bd6b75009cc25c714cae7b93351ccd"
|
||||||
|
integrity sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==
|
||||||
|
dependencies:
|
||||||
|
source-map "~0.6.0"
|
||||||
|
|
||||||
|
commander@^10.0.0:
|
||||||
|
version "10.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
|
||||||
|
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
|
||||||
|
|
||||||
|
commander@^2.20.0:
|
||||||
|
version "2.20.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
|
||||||
|
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
|
||||||
|
|
||||||
|
dot-case@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751"
|
||||||
|
integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==
|
||||||
|
dependencies:
|
||||||
|
no-case "^3.0.4"
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
entities@^4.4.0:
|
||||||
|
version "4.5.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
|
||||||
|
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
|
||||||
|
|
||||||
|
html-minifier-terser@^7.1.0:
|
||||||
|
version "7.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz#18752e23a2f0ed4b0f550f217bb41693e975b942"
|
||||||
|
integrity sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==
|
||||||
|
dependencies:
|
||||||
|
camel-case "^4.1.2"
|
||||||
|
clean-css "~5.3.2"
|
||||||
|
commander "^10.0.0"
|
||||||
|
entities "^4.4.0"
|
||||||
|
param-case "^3.0.4"
|
||||||
|
relateurl "^0.2.7"
|
||||||
|
terser "^5.15.1"
|
||||||
|
|
||||||
|
lower-case@^2.0.2:
|
||||||
|
version "2.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
|
||||||
|
integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==
|
||||||
|
dependencies:
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
no-case@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
|
||||||
|
integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==
|
||||||
|
dependencies:
|
||||||
|
lower-case "^2.0.2"
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
param-case@^3.0.4:
|
||||||
|
version "3.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5"
|
||||||
|
integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==
|
||||||
|
dependencies:
|
||||||
|
dot-case "^3.0.4"
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
pascal-case@^3.1.2:
|
||||||
|
version "3.1.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
|
||||||
|
integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==
|
||||||
|
dependencies:
|
||||||
|
no-case "^3.0.4"
|
||||||
|
tslib "^2.0.3"
|
||||||
|
|
||||||
|
relateurl@^0.2.7:
|
||||||
|
version "0.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9"
|
||||||
|
integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==
|
||||||
|
|
||||||
|
source-map-support@~0.5.20:
|
||||||
|
version "0.5.21"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
|
||||||
|
integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
|
||||||
|
dependencies:
|
||||||
|
buffer-from "^1.0.0"
|
||||||
|
source-map "^0.6.0"
|
||||||
|
|
||||||
|
source-map@^0.6.0, source-map@~0.6.0:
|
||||||
|
version "0.6.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
|
||||||
|
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
|
||||||
|
|
||||||
|
terser@^5.15.1:
|
||||||
|
version "5.36.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/terser/-/terser-5.36.0.tgz#8b0dbed459ac40ff7b4c9fd5a3a2029de105180e"
|
||||||
|
integrity sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==
|
||||||
|
dependencies:
|
||||||
|
"@jridgewell/source-map" "^0.3.3"
|
||||||
|
acorn "^8.8.2"
|
||||||
|
commander "^2.20.0"
|
||||||
|
source-map-support "~0.5.20"
|
||||||
|
|
||||||
|
tslib@^2.0.3:
|
||||||
|
version "2.8.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
|
||||||
|
integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
|
||||||
33
resources/AsyncWebSerial/library.json
Normal file
33
resources/AsyncWebSerial/library.json
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"name": "AsyncWebSerial",
|
||||||
|
"version": "1.0.1",
|
||||||
|
"keywords": "web serial, ESP32",
|
||||||
|
"description": "AsyncWebSerial: Simplify ESP32 debugging and logging with seamless browser-based serial communication.",
|
||||||
|
"homepage": "https://github.com/circuitcode/AsyncWebSerial",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/circuitcode/AsyncWebSerial.git"
|
||||||
|
},
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Andrea Sessa",
|
||||||
|
"maintanier": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"license": "MIT",
|
||||||
|
"framworks": "arduino",
|
||||||
|
"platforms": "espressif32",
|
||||||
|
"headers": [
|
||||||
|
"AsyncWebSerial.h"
|
||||||
|
],
|
||||||
|
"export": {
|
||||||
|
"include": [
|
||||||
|
"examples",
|
||||||
|
"src",
|
||||||
|
"library.json",
|
||||||
|
"library.properties",
|
||||||
|
"LICENSE",
|
||||||
|
"README.md"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
10
resources/AsyncWebSerial/library.properties
Normal file
10
resources/AsyncWebSerial/library.properties
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
name=AsyncWebSerial
|
||||||
|
version=1.0.1
|
||||||
|
author=Andrea Sessa <andrea.sessa@gmail.com>
|
||||||
|
maintainer=Andrea Sessa <andrea.sessa@gmail.com>
|
||||||
|
category=Device Control
|
||||||
|
sentence=Browser-based logging and debugging for ESP32 using the Web Serial API.
|
||||||
|
paragraph=AsyncWebSerial is a lightweight library designed for ESP32 microcontrollers, enabling developers to log and debug their projects directly from a web browser. Its asynchronous design ensures smooth communication, making it an ideal tool for modern ESP32 development workflows.
|
||||||
|
url=https://github.com/circuitcode/AsyncWebSerial
|
||||||
|
architectures=esp32
|
||||||
|
license=MIT
|
||||||
13
resources/AsyncWebSerial/platformio.ini
Normal file
13
resources/AsyncWebSerial/platformio.ini
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
[platformio]
|
||||||
|
lib_dir = .
|
||||||
|
|
||||||
|
[env:esp32dev]
|
||||||
|
platform = espressif32
|
||||||
|
board = esp32dev
|
||||||
|
framework = arduino
|
||||||
|
lib_deps =
|
||||||
|
mathieucarbou/AsyncTCP@^3.2.14
|
||||||
|
mathieucarbou/ESPAsyncWebServer@^3.3.23
|
||||||
|
build_flags =
|
||||||
|
-D CONFIG_ASYNC_TCP_QUEUE_SIZE=512
|
||||||
|
-D CONFIG_ASYNC_TCP_RUNNING_CORE=1
|
||||||
119
resources/AsyncWebSerial/src/AsyncWebSerial.cpp
Normal file
119
resources/AsyncWebSerial/src/AsyncWebSerial.cpp
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
/*
|
||||||
|
* AsyncWebSerial.cpp
|
||||||
|
*
|
||||||
|
* This file implements the AsyncWebSerial class, which provides a web-based serial interface
|
||||||
|
* using an asynchronous web server and WebSocket communication. It allows for sending
|
||||||
|
* and receiving serial data over a web interface, with optional authentication.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* - Call begin() to initialize the AsyncWebSerial with a server and URL.
|
||||||
|
* - Use onMessage() to set a callback for received messages.
|
||||||
|
* - Use setAuthentication() to enable authentication for the web interface.
|
||||||
|
* - Use the Print interface to send data to the web interface.
|
||||||
|
* - Call loop() periodically to clean up inactive clients.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "AsyncWebSerial.h"
|
||||||
|
#include "AsyncWebSerialHTML.h"
|
||||||
|
|
||||||
|
void AsyncWebSerial::begin(AsyncWebServer *server, const char *url)
|
||||||
|
{
|
||||||
|
_server = server;
|
||||||
|
_socket = new AsyncWebSocket("/ws_serial");
|
||||||
|
|
||||||
|
if (_isAuthenticationRequired)
|
||||||
|
_socket->setAuthentication(_username.c_str(), _password.c_str());
|
||||||
|
|
||||||
|
// handle web page request
|
||||||
|
_server->on(url, HTTP_GET, [&](AsyncWebServerRequest *request) {
|
||||||
|
if (_isAuthenticationRequired && !request->authenticate(_username.c_str(), _password.c_str()))
|
||||||
|
return request->requestAuthentication();
|
||||||
|
|
||||||
|
AsyncWebServerResponse *response =
|
||||||
|
request->beginResponse(200, "text/html", ASYNCWEBSERIAL_HTML, sizeof(ASYNCWEBSERIAL_HTML));
|
||||||
|
response->addHeader("Content-Encoding", "gzip");
|
||||||
|
request->send(response);
|
||||||
|
});
|
||||||
|
|
||||||
|
// handle websocket connection
|
||||||
|
_socket->onEvent([&](AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg,
|
||||||
|
uint8_t *data, size_t len) {
|
||||||
|
switch (type) {
|
||||||
|
case WS_EVT_CONNECT:
|
||||||
|
// set the client to not close when the queue is full
|
||||||
|
client->setCloseClientOnQueueFull(false);
|
||||||
|
break;
|
||||||
|
case WS_EVT_DATA:
|
||||||
|
if (len > 0) {
|
||||||
|
// invoke the message received callback
|
||||||
|
if (_onMessageReceived != nullptr)
|
||||||
|
_onMessageReceived(data, len);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
_server->addHandler(_socket);
|
||||||
|
}
|
||||||
|
|
||||||
|
// onMessage callback setter
|
||||||
|
void AsyncWebSerial::onMessage(WSMessageCallback callback)
|
||||||
|
{
|
||||||
|
_onMessageReceived = callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
// onMessage callback setter
|
||||||
|
void AsyncWebSerial::onMessage(WSStringMessageCallback callback)
|
||||||
|
{
|
||||||
|
// keep a reference to the callback function
|
||||||
|
_stringMessageCallback = callback;
|
||||||
|
|
||||||
|
// set the internal callback to convert the uint8_t data to a string and
|
||||||
|
// call the string callback
|
||||||
|
_onMessageReceived = [&](uint8_t *data, size_t len) {
|
||||||
|
if (data && len) {
|
||||||
|
String msg;
|
||||||
|
msg.reserve(len);
|
||||||
|
msg = String((char *)data, len);
|
||||||
|
_stringMessageCallback(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncWebSerial::setAuthentication(const String &username, const String &password)
|
||||||
|
{
|
||||||
|
_username = username;
|
||||||
|
_password = password;
|
||||||
|
_isAuthenticationRequired = !_username.isEmpty() && !_password.isEmpty();
|
||||||
|
|
||||||
|
// if the socket is already created, set the authentication immediately
|
||||||
|
if (_socket != nullptr)
|
||||||
|
_socket->setAuthentication(_username.c_str(), _password.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void AsyncWebSerial::loop()
|
||||||
|
{
|
||||||
|
if (_socket)
|
||||||
|
_socket->cleanupClients();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print interface implementation
|
||||||
|
size_t AsyncWebSerial::write(uint8_t m)
|
||||||
|
{
|
||||||
|
if (!_socket)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return write(&m, 1);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print interface implementation
|
||||||
|
size_t AsyncWebSerial::write(const uint8_t *buffer, size_t size)
|
||||||
|
{
|
||||||
|
if (!_socket || size == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
String message((const char *)buffer, size);
|
||||||
|
_socket->textAll(message);
|
||||||
|
return size;
|
||||||
|
}
|
||||||
48
resources/AsyncWebSerial/src/AsyncWebSerial.h
Normal file
48
resources/AsyncWebSerial/src/AsyncWebSerial.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
/**
|
||||||
|
* @file AsyncWebSerial.h
|
||||||
|
* @brief A web serial interface for the ESP32 microcontroller.
|
||||||
|
* @license MIT License (https://opensource.org/licenses/MIT)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AsyncWebSerial_h
|
||||||
|
#define AsyncWebSerial_h
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <AsyncTCP.h>
|
||||||
|
#include <ESPAsyncWebServer.h>
|
||||||
|
#include <WiFi.h>
|
||||||
|
#include <stdlib_noniso.h>
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
|
// define the callable object type for the message received callback
|
||||||
|
typedef std::function<void(uint8_t *data, size_t len)> WSMessageCallback;
|
||||||
|
typedef std::function<void(const String &msg)> WSStringMessageCallback;
|
||||||
|
|
||||||
|
class AsyncWebSerial : public Print
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void begin(AsyncWebServer *server, const char *url = "/webserial");
|
||||||
|
|
||||||
|
void setAuthentication(const String &username, const String &password);
|
||||||
|
void onMessage(WSMessageCallback callback);
|
||||||
|
void onMessage(WSStringMessageCallback callback);
|
||||||
|
|
||||||
|
void loop();
|
||||||
|
|
||||||
|
// Print interface implementation
|
||||||
|
virtual size_t write(uint8_t) override;
|
||||||
|
virtual size_t write(const uint8_t *buffer, size_t size) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
AsyncWebServer *_server;
|
||||||
|
AsyncWebSocket *_socket;
|
||||||
|
bool _isAuthenticationRequired = false;
|
||||||
|
String _username;
|
||||||
|
String _password;
|
||||||
|
|
||||||
|
WSMessageCallback _onMessageReceived = nullptr;
|
||||||
|
WSStringMessageCallback _stringMessageCallback = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AsyncWebSerial_h
|
||||||
46
resources/AsyncWebSerial/src/AsyncWebSerialHTML.h
Normal file
46
resources/AsyncWebSerial/src/AsyncWebSerialHTML.h
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
#ifndef AsyncWebSerial_HTML_H
|
||||||
|
#define AsyncWebSerial_HTML_H
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
const uint8_t ASYNCWEBSERIAL_HTML[] PROGMEM = {
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xdd, 0x59, 0x61, 0x8f, 0xdb, 0x36, 0x12, 0xfd, 0x2b, 0xac, 0xf6, 0x9a, 0x48, 0xb7, 0xa6, 0x2c, 0xc9, 0xf6, 0xae, 0x57, 0xb2, 0x0c, 0x24, 0x9b, 0x1c, 0x12, 0x20, 0xc9, 0x01, 0xb7, 0x29, 0x7a, 0x40, 0x51, 0xb4, 0x94, 0x34, 0xb2, 0xd9, 0xa5, 0x48, 0x95, 0xa2, 0x6c, 0x6f, 0x04, 0xff, 0xf7, 0x03, 0x29, 0xd9, 0x96, 0xec, 0x4d,
|
||||||
|
0xdb, 0xe0, 0xbe, 0x35, 0x89, 0x2d, 0x71, 0x38, 0xe4, 0x90, 0x6f, 0xde, 0x0c, 0xc7, 0xcc, 0xe2, 0xbb, 0x4c, 0xa4, 0xea, 0xa9, 0x04, 0xb4, 0x56, 0x05, 0x5b, 0x2e, 0xba, 0x6f, 0x20, 0xd9, 0x72, 0x51, 0x80, 0x22, 0x28, 0x5d, 0x13, 0x59, 0x81, 0x8a, 0x6b, 0x95, 0xe3, 0x79, 0x27, 0x5b, 0x2b, 0x55, 0x62, 0xf8, 0xbd, 0xa6, 0x9b, 0xf8, 0xbf, 0xf8, 0x87, 0x57, 0xf8, 0x5e, 0x14, 0x25, 0x51,
|
||||||
|
0x34, 0x61, 0x80, 0x52, 0xc1, 0x15, 0x70, 0x15, 0x5b, 0xef, 0xdf, 0xc6, 0x90, 0xad, 0xc0, 0x5a, 0x2e, 0x14, 0x55, 0x0c, 0x96, 0xaf, 0xaa, 0x27, 0x9e, 0xfe, 0x08, 0xc9, 0x03, 0x48, 0x4a, 0xd8, 0x62, 0xdc, 0x4a, 0xdb, 0xf9, 0x38, 0x29, 0x20, 0xde, 0x50, 0xd8, 0x96, 0x42, 0xaa, 0xd3, 0x14, 0x5b, 0x9a, 0xa9, 0x75, 0x9c, 0xc1, 0x86, 0xa6, 0x80, 0x4d, 0x63, 0x44, 0x39, 0x55, 0x94, 0x30,
|
||||||
|
0x5c, 0xa5, 0x84, 0x41, 0xec, 0x5b, 0xcb, 0x45, 0xa5, 0x9e, 0x18, 0x2c, 0x33, 0xba, 0x69, 0x32, 0x5a, 0x95, 0x8c, 0x3c, 0x85, 0x09, 0x13, 0xe9, 0xe3, 0x9e, 0x34, 0x05, 0x91, 0x2b, 0xca, 0x43, 0x77, 0x2a, 0xa1, 0x88, 0x14, 0xec, 0x14, 0xce, 0x20, 0x15, 0x92, 0x28, 0x2a, 0x78, 0xc8, 0x05, 0x87, 0xfd, 0x3f, 0x47, 0x61, 0x48, 0x72, 0x05, 0x72, 0x14, 0x86, 0x09, 0xe4, 0x42, 0x42, 0x93,
|
||||||
|
0x88, 0x1d, 0xae, 0xe8, 0x17, 0xca, 0x57, 0x61, 0x22, 0x64, 0x06, 0x12, 0x27, 0x62, 0x17, 0x75, 0xaf, 0x66, 0x0d, 0xa1, 0xb7, 0xd7, 0x20, 0x35, 0x6b, 0xa0, 0xab, 0xb5, 0x0a, 0x7d, 0xcf, 0xfb, 0x7e, 0x9f, 0x88, 0xec, 0xa9, 0x11, 0x1b, 0x90, 0x55, 0x2a, 0x05, 0x63, 0x38, 0x81, 0x35, 0xd9, 0x50, 0x21, 0x8d, 0x99, 0xa8, 0xa7, 0x19, 0xb5, 0x53, 0x98, 0xd7, 0x6e, 0x7d, 0x5e, 0x54, 0x92,
|
||||||
|
0x2c, 0xd3, 0x06, 0xbd, 0x28, 0x17, 0x5c, 0xe1, 0x9c, 0x14, 0x94, 0x3d, 0x85, 0x98, 0x94, 0x25, 0x03, 0x5c, 0x3d, 0x55, 0x0a, 0x8a, 0x51, 0xfb, 0xc0, 0x35, 0x1d, 0xbd, 0x66, 0x94, 0x3f, 0x7e, 0x24, 0xe9, 0x83, 0x91, 0xfc, 0x4b, 0x70, 0x35, 0xb2, 0x1e, 0x60, 0x25, 0x00, 0xfd, 0xf0, 0xde, 0x1a, 0xfd, 0x47, 0x24, 0x42, 0x89, 0x91, 0xf5, 0x0e, 0xd8, 0x06, 0x14, 0x4d, 0x09, 0xfa, 0x04,
|
||||||
|
0x35, 0x58, 0xa3, 0x8a, 0xf0, 0x0a, 0x57, 0x20, 0x69, 0x1e, 0x25, 0x24, 0x7d, 0x5c, 0x49, 0x51, 0xf3, 0x2c, 0xbc, 0xf2, 0x3c, 0xaf, 0xbf, 0xbc, 0xbd, 0x4b, 0xca, 0xb2, 0xbf, 0xb3, 0xe8, 0x00, 0x6a, 0xce, 0x60, 0x17, 0xe9, 0x2f, 0x9c, 0x51, 0x09, 0xa9, 0xc1, 0x30, 0x15, 0xac, 0x2e, 0xf8, 0xde, 0x5d, 0x49, 0x9a, 0x1d, 0xd1, 0xd7, 0x8d, 0xbd, 0xbb, 0x22, 0x25, 0x0e, 0x9a, 0x15, 0x29,
|
||||||
|
0x43, 0x77, 0x26, 0xa1, 0xd8, 0xbb, 0x9d, 0x53, 0x1b, 0x3d, 0x45, 0xe8, 0x23, 0x1f, 0x79, 0xdf, 0x47, 0x84, 0xd1, 0x15, 0xc7, 0x5d, 0x8f, 0xb1, 0x80, 0x81, 0x67, 0x03, 0xb8, 0x52, 0xc1, 0x84, 0x0c, 0xaf, 0xb2, 0x69, 0x36, 0xcd, 0xe6, 0x03, 0x78, 0x0a, 0xc1, 0x45, 0x55, 0x92, 0x14, 0x22, 0x8d, 0x7b, 0xce, 0xc4, 0x16, 0xef, 0xc2, 0x35, 0xcd, 0x32, 0xe0, 0x27, 0xc9, 0x53, 0x48, 0x6a,
|
||||||
|
0x25, 0xda, 0x71, 0x15, 0xfd, 0x02, 0xa1, 0x3f, 0x2d, 0x77, 0xc7, 0xc5, 0xa0, 0xb2, 0x39, 0xfa, 0xe0, 0x38, 0x64, 0x2b, 0x49, 0x19, 0x26, 0x12, 0xc8, 0x23, 0xde, 0x0a, 0x99, 0xb5, 0xc4, 0x31, 0x42, 0xfd, 0x15, 0x6d, 0xd7, 0x54, 0x01, 0x36, 0x86, 0xc3, 0x52, 0x02, 0x66, 0x94, 0xc3, 0xde, 0x2d, 0x09, 0x07, 0xd6, 0x94, 0xa2, 0xa2, 0x06, 0x18, 0x09, 0x8c, 0x28, 0xba, 0x81, 0x8e, 0x37,
|
||||||
|
0xe1, 0x55, 0x9e, 0xe7, 0xc8, 0x00, 0x81, 0x2a, 0xc1, 0x68, 0x76, 0xe0, 0x93, 0x24, 0x19, 0xad, 0xab, 0xd0, 0xd7, 0x04, 0x2d, 0xc8, 0xae, 0xe3, 0xd7, 0x54, 0x2b, 0x76, 0x44, 0x49, 0x09, 0x4b, 0x6d, 0x8d, 0x04, 0xc2, 0x48, 0xab, 0x39, 0xbd, 0xbd, 0x14, 0x90, 0xd1, 0xba, 0xd8, 0xbb, 0x49, 0xad, 0x94, 0xe0, 0x55, 0x33, 0x70, 0x55, 0x8b, 0x2d, 0x55, 0x50, 0x54, 0x61, 0x0a, 0x5c, 0x81,
|
||||||
|
0x8c, 0x7e, 0xab, 0x2b, 0x45, 0xf3, 0xa7, 0x4b, 0xc0, 0x5b, 0x10, 0x30, 0x83, 0x5c, 0xb5, 0x78, 0x75, 0x02, 0x69, 0xfc, 0x60, 0x24, 0xc7, 0x58, 0x50, 0x4a, 0x14, 0xdd, 0x3a, 0xfd, 0xf2, 0x82, 0x11, 0x52, 0x6c, 0xa3, 0x96, 0x15, 0x58, 0xfb, 0xde, 0x37, 0x7b, 0x3e, 0xf0, 0x1b, 0x2b, 0xd1, 0xd1, 0xe1, 0x28, 0x69, 0xe7, 0x3b, 0x13, 0xb6, 0x66, 0x5b, 0x59, 0xe7, 0x7f, 0xe2, 0x13, 0x9f,
|
||||||
|
0x90, 0xe3, 0x56, 0x51, 0xfb, 0x6c, 0xd2, 0x5a, 0x56, 0x42, 0x86, 0xa5, 0xa0, 0x66, 0x83, 0x87, 0x38, 0x9a, 0x97, 0x3b, 0xe4, 0x7b, 0xe5, 0x0e, 0xcd, 0xf5, 0x0a, 0xcf, 0xf0, 0x8a, 0x44, 0xad, 0xb4, 0xd3, 0xb0, 0x49, 0x1c, 0x6d, 0x80, 0x76, 0x6e, 0xf2, 0x86, 0xe6, 0x7a, 0x81, 0x82, 0xdb, 0x0e, 0x25, 0x09, 0xaf, 0x4a, 0x22, 0x81, 0xab, 0xf3, 0xb5, 0xa0, 0x6a, 0xb3, 0x6a, 0x3a, 0x5c,
|
||||||
|
0xda, 0x8c, 0x73, 0xa0, 0xb1, 0x69, 0x9d, 0xab, 0x87, 0x6b, 0x4d, 0xb8, 0xe6, 0xc2, 0xc2, 0x95, 0x3f, 0xf7, 0xe7, 0x7e, 0xb2, 0x77, 0xb7, 0x38, 0xaf, 0x19, 0x6b, 0x4e, 0xe9, 0x62, 0xef, 0x1a, 0x3d, 0xc8, 0x9a, 0x21, 0x79, 0xba, 0xf8, 0xd2, 0x8e, 0x18, 0x30, 0x40, 0x87, 0xa5, 0xd8, 0x9a, 0x78, 0xc3, 0xfa, 0x2d, 0xf4, 0xf7, 0x6e, 0xb5, 0x26, 0x99, 0x96, 0x51, 0xa6, 0x40, 0x86, 0x99,
|
||||||
|
0x14, 0x25, 0x6e, 0x45, 0xb6, 0x87, 0xa6, 0xe5, 0x0e, 0x4d, 0xca, 0x1d, 0x92, 0xab, 0xc4, 0xf6, 0x90, 0xfe, 0x3b, 0x46, 0xae, 0x77, 0xeb, 0x38, 0x68, 0xa8, 0x17, 0x94, 0x3b, 0xf3, 0x19, 0xea, 0xdd, 0x38, 0xce, 0xde, 0x35, 0x6c, 0xc3, 0x2d, 0xdb, 0x9a, 0x4b, 0x02, 0xea, 0xb8, 0x2b, 0x0a, 0xc2, 0xb3, 0x5f, 0x34, 0x03, 0x09, 0xe5, 0x1a, 0x80, 0x76, 0x2f, 0x4a, 0x94, 0x3d, 0x52, 0x0d,
|
||||||
|
0xc8, 0xd6, 0x97, 0x0c, 0x30, 0x8a, 0xbe, 0x95, 0xef, 0x26, 0x68, 0x71, 0x02, 0x6a, 0x0b, 0xc0, 0x8f, 0x64, 0xd1, 0x51, 0xb5, 0xa7, 0xbc, 0xac, 0x55, 0x73, 0x91, 0x90, 0xdd, 0xc9, 0xad, 0x09, 0x5a, 0xd7, 0x3c, 0x8e, 0x34, 0x69, 0x83, 0x18, 0x5d, 0xdd, 0x24, 0xb7, 0xc1, 0xdc, 0x3b, 0x0b, 0x66, 0x37, 0x30, 0xba, 0xcf, 0xa7, 0xaa, 0x13, 0x19, 0xdd, 0x79, 0x3b, 0xa7, 0xa1, 0xe2, 0x91,
|
||||||
|
0x2a, 0xad, 0x99, 0x0b, 0x52, 0xe4, 0xe6, 0x8f, 0x97, 0x45, 0xa7, 0xf6, 0x11, 0xcc, 0x3e, 0x45, 0xae, 0xaa, 0x3a, 0x29, 0xa8, 0xc2, 0x5d, 0x78, 0x9c, 0xaf, 0x17, 0x66, 0x70, 0x0b, 0xc9, 0xe9, 0xdc, 0x31, 0xa9, 0xcd, 0x70, 0x3a, 0x17, 0xb2, 0xe8, 0x42, 0xe1, 0x64, 0x9c, 0x16, 0x64, 0xd5, 0x05, 0xc8, 0x59, 0xa0, 0x0d, 0x90, 0xef, 0x9d, 0x68, 0x7f, 0xc1, 0x09, 0x9d, 0xf8, 0x59, 0xcc,
|
||||||
|
0x8e, 0xb0, 0x1b, 0xd0, 0x3b, 0x34, 0xfe, 0x0c, 0xb2, 0xa0, 0x9f, 0x27, 0xf2, 0x3c, 0xbf, 0x84, 0x4f, 0x33, 0x35, 0xb8, 0x43, 0xb7, 0x73, 0x14, 0xf8, 0x37, 0xce, 0x19, 0x48, 0xfd, 0xb8, 0xed, 0x47, 0xad, 0x09, 0xaa, 0x82, 0xe1, 0x69, 0xd3, 0xcf, 0x8e, 0xfe, 0xe1, 0x2c, 0xe3, 0x6d, 0xc2, 0xc3, 0x95, 0x22, 0xaa, 0x3e, 0x4b, 0xbd, 0x5f, 0xcd, 0xb3, 0x5f, 0x4b, 0xa2, 0x67, 0xfb, 0x3e,
|
||||||
|
0xdb, 0xf5, 0x33, 0x9b, 0x3e, 0xed, 0x58, 0xef, 0xcd, 0xf7, 0x27, 0xc8, 0x7c, 0x82, 0xc0, 0x79, 0xce, 0x05, 0x83, 0xe0, 0x31, 0x60, 0x4c, 0x91, 0xfe, 0x77, 0xeb, 0x44, 0xbd, 0x03, 0x3a, 0x21, 0xd9, 0x0a, 0x3a, 0x24, 0x3a, 0xde, 0x1f, 0xc0, 0x38, 0x34, 0x87, 0x4e, 0xbb, 0xbb, 0xbb, 0xbb, 0xd3, 0x87, 0xa9, 0x19, 0xe8, 0xae, 0x24, 0x00, 0x7f, 0x26, 0x9f, 0x05, 0x41, 0x3a, 0x9b, 0xc1,
|
||||||
|
0x41, 0x4b, 0x48, 0xc2, 0x57, 0xf0, 0x8c, 0x5a, 0x3e, 0xbb, 0x03, 0x2f, 0x39, 0xa8, 0x49, 0x9d, 0xe5, 0x2e, 0x74, 0x20, 0x9f, 0x4e, 0xa7, 0xd3, 0xfd, 0x62, 0xdc, 0x96, 0x7c, 0x8b, 0x71, 0x5b, 0xa5, 0xea, 0xda, 0x6b, 0xb9, 0xc8, 0xe8, 0x06, 0xa5, 0x8c, 0x54, 0x55, 0x4c, 0xca, 0xb2, 0x2d, 0x60, 0x41, 0xf6, 0xc5, 0x5d, 0xfe, 0x35, 0xa2, 0xe5, 0xeb, 0x3a, 0xcf, 0x41, 0x22, 0x03, 0x30,
|
||||||
|
0x5a, 0x98, 0xe8, 0x47, 0x34, 0x8b, 0x93, 0x56, 0xdc, 0x0e, 0xb0, 0xba, 0x7c, 0x8b, 0xda, 0xd4, 0x67, 0xa1, 0x92, 0x91, 0x14, 0xd6, 0x82, 0x65, 0x20, 0x63, 0xab, 0x37, 0x83, 0x85, 0x36, 0x84, 0xd5, 0x10, 0xfb, 0x9e, 0xe7, 0x2d, 0x17, 0x63, 0x3d, 0xff, 0xa2, 0x23, 0xd7, 0x57, 0x66, 0x12, 0x3c, 0x65, 0x34, 0x7d, 0x8c, 0x15, 0xc8, 0x82, 0x72, 0xc2, 0xee, 0x19, 0x10, 0x6e, 0x3b, 0xcb,
|
||||||
|
0x45, 0xb5, 0x59, 0xa1, 0x5d, 0xc1, 0x78, 0x15, 0xeb, 0x12, 0x3b, 0x1c, 0x8f, 0xb7, 0xdb, 0xad, 0xbb, 0x9d, 0xb8, 0x42, 0xae, 0xc6, 0x81, 0xe7, 0x79, 0x63, 0xad, 0xd0, 0x96, 0xc5, 0xc1, 0x14, 0xb5, 0xee, 0xd1, 0x6f, 0xba, 0x76, 0x7e, 0x2d, 0x76, 0xb1, 0xa5, 0xf3, 0xb1, 0x71, 0xaf, 0x85, 0x72, 0xca, 0x58, 0xac, 0xa3, 0x17, 0x55, 0x4a, 0x8a, 0x47, 0x88, 0xd3, 0x5a, 0xea, 0x93, 0xeb,
|
||||||
|
0x5e, 0xa3, 0xd9, 0xc9, 0x70, 0x37, 0xd7, 0xa1, 0xa9, 0x59, 0x96, 0x92, 0x32, 0x36, 0x0b, 0xee, 0x0b, 0x7f, 0x13, 0x94, 0xb7, 0xd2, 0xe5, 0xa2, 0x24, 0x6a, 0x7d, 0x98, 0xd3, 0xcc, 0x9f, 0xc5, 0xd6, 0x47, 0x0f, 0x79, 0xeb, 0x60, 0xba, 0x09, 0xa6, 0xef, 0xbc, 0x2f, 0x7d, 0xdb, 0xe3, 0x4e, 0x5f, 0xeb, 0x4c, 0xd1, 0x2d, 0xf3, 0x6f, 0x90, 0x67, 0xf5, 0x85, 0xbe, 0x87, 0x7c, 0x9f, 0x79,
|
||||||
|
0xe8, 0x66, 0x28, 0x9d, 0x3e, 0x27, 0x9d, 0xe9, 0x09, 0x90, 0x1f, 0x90, 0x00, 0x05, 0xa8, 0x3d, 0x7c, 0x02, 0x14, 0xac, 0xe7, 0x83, 0x36, 0x0e, 0x98, 0x8f, 0xb0, 0x1f, 0x0c, 0x46, 0xde, 0xa1, 0xdb, 0x0d, 0x9e, 0x10, 0x53, 0x78, 0x22, 0x0f, 0xe9, 0x27, 0xf6, 0xd7, 0xd3, 0x81, 0xc0, 0xdf, 0x4c, 0xf4, 0x18, 0x8d, 0xf1, 0x72, 0x31, 0x6e, 0x3d, 0xb8, 0x44, 0x7f, 0xd1, 0x95, 0x16, 0x70,
|
||||||
|
0x92, 0x30, 0x78, 0x30, 0xf5, 0x7f, 0xfc, 0x5d, 0xbf, 0x65, 0xfd, 0xdd, 0xfd, 0x3a, 0x43, 0xfe, 0xe4, 0xe8, 0x02, 0xdf, 0xb8, 0x60, 0xed, 0x7b, 0x03, 0x49, 0xb0, 0xb9, 0xe9, 0xb5, 0xb1, 0xf6, 0x1a, 0x1e, 0xa8, 0x60, 0x3d, 0x6a, 0x83, 0x6f, 0xbe, 0x0c, 0x69, 0xe0, 0x23, 0xff, 0xa6, 0x73, 0x92, 0x6f, 0xbc, 0xeb, 0x1d, 0x5d, 0xe6, 0xe9, 0x31, 0x43, 0x2e, 0xcd, 0x91, 0xef, 0x6f, 0xf0,
|
||||||
|
0x94, 0x4c, 0xd1, 0xb4, 0xf3, 0xe9, 0x1c, 0x79, 0x9b, 0xe9, 0xff, 0xed, 0xd5, 0xcf, 0xb4, 0x80, 0x4a, 0x91, 0xa2, 0x3c, 0x38, 0xf6, 0x28, 0xf8, 0xdb, 0xfb, 0x56, 0x1f, 0x2b, 0xe4, 0x0e, 0xdd, 0x75, 0x0e, 0xf0, 0xe7, 0xc8, 0xeb, 0x9a, 0xc6, 0x03, 0xba, 0x3d, 0xf4, 0x58, 0x80, 0x6e, 0x37, 0x33, 0x36, 0x41, 0xcf, 0xc4, 0x52, 0x97, 0x1b, 0xc7, 0x97, 0xc9, 0xb9, 0x3b, 0x2a, 0x0f, 0x1a,
|
||||||
|
0xb9, 0x10, 0xea, 0x5c, 0xe1, 0xac, 0x72, 0xd4, 0x4a, 0xb2, 0x38, 0xf8, 0x4f, 0x1f, 0xb1, 0xa8, 0x2d, 0x99, 0x51, 0xbf, 0x0a, 0xb5, 0x96, 0xa7, 0xe4, 0xde, 0x4d, 0x81, 0xf4, 0xef, 0x99, 0x54, 0x14, 0x25, 0x03, 0x05, 0xb1, 0xc8, 0x73, 0x24, 0xf5, 0x4d, 0x86, 0x84, 0x2c, 0xb6, 0xac, 0xa1, 0xb5, 0x61, 0xc6, 0x7f, 0xab, 0x27, 0x44, 0x87, 0xae, 0x35, 0x48, 0x7d, 0xb7, 0x71, 0x5a, 0xa1,
|
||||||
|
0xae, 0x15, 0x8e, 0x79, 0x9f, 0x66, 0xf1, 0xb0, 0xca, 0xd0, 0x37, 0x2c, 0x9d, 0xe8, 0xef, 0xce, 0x18, 0x9d, 0xd0, 0xa7, 0xcc, 0xd7, 0x09, 0xd6, 0x1f, 0x50, 0x23, 0xf0, 0xd1, 0x84, 0xe1, 0x1b, 0x77, 0x86, 0xfc, 0x39, 0x71, 0x67, 0x33, 0xa4, 0x3f, 0x5d, 0xf4, 0xfb, 0xc8, 0x63, 0x78, 0xe2, 0xce, 0x10, 0xbe, 0x65, 0xf8, 0x16, 0xe9, 0xd7, 0x33, 0x15, 0x4d, 0x36, 0xe6, 0xcf, 0x91, 0x9e,
|
||||||
|
0xe0, 0xeb, 0xd4, 0xd2, 0xa4, 0x38, 0x34, 0x06, 0xf4, 0x1a, 0x16, 0x6c, 0x3d, 0xfd, 0x96, 0x69, 0x5d, 0xb3, 0xad, 0x25, 0xaa, 0x54, 0xd2, 0x52, 0x2d, 0x19, 0x28, 0xb4, 0x85, 0xa4, 0x12, 0xe9, 0x23, 0xa8, 0xd1, 0x30, 0xbf, 0x7b, 0xa3, 0x8b, 0xcc, 0xe0, 0x8d, 0x6a, 0xc9, 0xe2, 0x5f, 0xb7, 0x55, 0x38, 0x1e, 0xff, 0xa3, 0xd9, 0x52, 0x9e, 0x89, 0xad, 0xcb, 0x44, 0x6a, 0xee, 0x9b, 0xdc,
|
||||||
|
0xb5, 0xa8, 0x94, 0xbe, 0xe6, 0xda, 0x87, 0x97, 0x7d, 0xfa, 0xd6, 0x6b, 0x3f, 0xde, 0x56, 0xbf, 0x54, 0xe6, 0x6e, 0xec, 0xd7, 0x51, 0x17, 0x0e, 0xaf, 0x24, 0x90, 0x38, 0x13, 0x69, 0x5d, 0x00, 0x57, 0xee, 0xef, 0x35, 0xc8, 0xa7, 0x07, 0x60, 0x90, 0x2a, 0x21, 0x6d, 0xeb, 0x70, 0x89, 0x61, 0x39, 0xa3, 0xd3, 0xf6, 0x1e, 0xcc, 0xee, 0xfe, 0x70, 0xcc, 0x10, 0x08, 0xcb, 0x89, 0xf2, 0x9a,
|
||||||
|
0x1b, 0x09, 0xd2, 0x77, 0x6b, 0xaf, 0xca, 0xd2, 0x76, 0x9a, 0xf3, 0x09, 0x5d, 0xca, 0x39, 0xc8, 0x77, 0x9f, 0x3f, 0x7e, 0x88, 0x2d, 0xcb, 0xdc, 0xc1, 0xe9, 0x8b, 0x3c, 0x83, 0x8b, 0xed, 0x8c, 0xbe, 0x66, 0x4d, 0xfb, 0xc2, 0x72, 0x5c, 0x92, 0x65, 0x6f, 0x37, 0xc0, 0xd5, 0x07, 0x5a, 0x29, 0xe0, 0x20, 0x6d, 0xab, 0x8d, 0x03, 0x6b, 0x64, 0x1f, 0x4c, 0xdb, 0xe0, 0x34, 0xe0, 0x96, 0x12,
|
||||||
|
0xb4, 0xde, 0x1b, 0xc8, 0x49, 0xcd, 0x94, 0xed, 0x44, 0xda, 0x01, 0xfc, 0xb4, 0x99, 0x15, 0xa8, 0xb7, 0x0c, 0xf4, 0xeb, 0xeb, 0xa7, 0xf7, 0x99, 0x6d, 0x75, 0xa1, 0x68, 0x39, 0xae, 0xa9, 0xbf, 0xa2, 0xa3, 0xaf, 0xdc, 0x0a, 0x78, 0x66, 0xf3, 0xde, 0xca, 0xfe, 0x64, 0x68, 0x6c, 0x59, 0x7b, 0xc7, 0xd9, 0x0f, 0x90, 0xe8, 0xed, 0xf0, 0x8f, 0xf0, 0x78, 0xd9, 0xa3, 0x99, 0x65, 0xaa, 0x57,
|
||||||
|
0xd4, 0x16, 0xb9, 0x56, 0x47, 0x2a, 0x74, 0xdf, 0x0d, 0xe6, 0x2b, 0xd7, 0x75, 0x5f, 0x8e, 0x8e, 0xab, 0x8c, 0x39, 0x6c, 0xd1, 0xc9, 0x4a, 0x2d, 0x99, 0x73, 0xea, 0x74, 0x05, 0x17, 0x25, 0xf0, 0x58, 0xf0, 0x7f, 0x97, 0xc0, 0x07, 0xf2, 0x94, 0x89, 0x0a, 0x62, 0xc1, 0xef, 0xf5, 0x73, 0xd0, 0x53, 0x40, 0x55, 0x91, 0x95, 0xee, 0xfb, 0xd8, 0xbe, 0x9d, 0x76, 0xd4, 0xce, 0xa3, 0x71, 0xfe,
|
||||||
|
0xb6, 0xbd, 0x98, 0xb2, 0xfe, 0x7c, 0x2b, 0x90, 0xbd, 0x1c, 0x1d, 0x4a, 0xd7, 0x1f, 0x25, 0x55, 0x60, 0x5b, 0xc7, 0x1e, 0xa4, 0x04, 0xb2, 0xae, 0xf5, 0x66, 0xfa, 0xc6, 0xcd, 0x5a, 0xbf, 0xdd, 0xba, 0x84, 0xec, 0x68, 0xfb, 0x0d, 0xad, 0xd2, 0x93, 0xf9, 0x0a, 0x94, 0x0e, 0x3d, 0x51, 0x2b, 0x7b, 0xe0, 0xac, 0x51, 0x00, 0x93, 0x81, 0xe5, 0x0e, 0x09, 0x6d, 0x7b, 0xb8, 0x64, 0x70, 0x33,
|
||||||
|
0xa2, 0x48, 0x4f, 0xf7, 0xac, 0xdb, 0x69, 0x68, 0x6e, 0x9f, 0x05, 0xb9, 0xd3, 0x40, 0x6c, 0xfd, 0x64, 0x5d, 0xdb, 0xda, 0x75, 0x6f, 0x88, 0x02, 0xc7, 0x55, 0xe2, 0x83, 0xd0, 0x77, 0xd1, 0x5a, 0xe7, 0x41, 0x49, 0xca, 0x57, 0xb6, 0x73, 0x6d, 0xfd, 0x8c, 0xac, 0x6b, 0xd8, 0xf7, 0xc2, 0xf8, 0xb4, 0xcf, 0xeb, 0xd8, 0x5a, 0x94, 0x4b, 0xeb, 0x1a, 0xae, 0xad, 0xc5, 0xb8, 0x5c, 0x5a, 0x83,
|
||||||
|
0xc4, 0xf2, 0xe2, 0x85, 0xdd, 0x1f, 0xd4, 0xde, 0x26, 0x7f, 0x16, 0x65, 0x7c, 0x29, 0x7d, 0x67, 0x8e, 0x85, 0x43, 0x90, 0x94, 0xfa, 0x92, 0xfe, 0x3d, 0x57, 0xf6, 0x57, 0x29, 0xdf, 0xfe, 0xb6, 0x39, 0x30, 0xde, 0x89, 0x68, 0xf5, 0x89, 0x7c, 0xb2, 0xb9, 0xf3, 0xe2, 0x85, 0xcd, 0x63, 0x1f, 0x26, 0xed, 0x4c, 0x6a, 0x60, 0x69, 0x10, 0xd0, 0xaf, 0x18, 0xb3, 0xad, 0xd2, 0x72, 0x22, 0x9a,
|
||||||
|
0xdb, 0xca, 0x65, 0xc0, 0x57, 0x6a, 0xbd, 0xe4, 0x4e, 0x2e, 0xa4, 0xad, 0x47, 0x42, 0xec, 0x45, 0xb0, 0x38, 0x74, 0x60, 0x1e, 0xc1, 0xf5, 0xb5, 0xd3, 0x9f, 0x4c, 0x42, 0x21, 0x36, 0x70, 0xbf, 0xa6, 0x2c, 0xb3, 0xd5, 0x4f, 0xf0, 0xf3, 0x33, 0xd0, 0x77, 0xbf, 0x83, 0x9a, 0x67, 0x81, 0xd3, 0x41, 0x7a, 0x4c, 0x51, 0x8b, 0x71, 0x97, 0xa4, 0x17, 0x63, 0xf3, 0x3f, 0x16, 0xff, 0x03, 0xd8,
|
||||||
|
0x33, 0xf7, 0x07, 0xc7, 0x18, 0x00, 0x00
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // AsyncWebSerial_HTML_H
|
||||||
163
resources/bin2array/.gitignore
vendored
Normal file
163
resources/bin2array/.gitignore
vendored
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/macos,python,windows,visualstudiocode
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
*.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### Python ###
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
wheels/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*.cover
|
||||||
|
.hypothesis/
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
local_settings.py
|
||||||
|
|
||||||
|
# Flask stuff:
|
||||||
|
instance/
|
||||||
|
.webassets-cache
|
||||||
|
|
||||||
|
# Scrapy stuff:
|
||||||
|
.scrapy
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# PyBuilder
|
||||||
|
target/
|
||||||
|
|
||||||
|
# Jupyter Notebook
|
||||||
|
.ipynb_checkpoints
|
||||||
|
|
||||||
|
# pyenv
|
||||||
|
.python-version
|
||||||
|
|
||||||
|
# celery beat schedule file
|
||||||
|
celerybeat-schedule
|
||||||
|
|
||||||
|
# SageMath parsed files
|
||||||
|
*.sage.py
|
||||||
|
|
||||||
|
# Environments
|
||||||
|
.env
|
||||||
|
.venv
|
||||||
|
env/
|
||||||
|
venv/
|
||||||
|
ENV/
|
||||||
|
env.bak/
|
||||||
|
venv.bak/
|
||||||
|
|
||||||
|
# Spyder project settings
|
||||||
|
.spyderproject
|
||||||
|
.spyproject
|
||||||
|
|
||||||
|
# Rope project settings
|
||||||
|
.ropeproject
|
||||||
|
|
||||||
|
# mkdocs documentation
|
||||||
|
/site
|
||||||
|
|
||||||
|
# mypy
|
||||||
|
.mypy_cache/
|
||||||
|
|
||||||
|
### VisualStudioCode ###
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.history
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
Desktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# End of https://www.gitignore.io/api/macos,python,windows,visualstudiocode
|
||||||
21
resources/bin2array/LICENSE
Normal file
21
resources/bin2array/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 James Swineson <github@public.swineson.me>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
95
resources/bin2array/README.md
Normal file
95
resources/bin2array/README.md
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
# bin2array
|
||||||
|
|
||||||
|
Converts binary file to C-style array initializer.
|
||||||
|
|
||||||
|
Ever wanted to embed a binary file in your program? Trying to serve images and executables from a tiny web server on Arduino or ESP8266? This utility is here to help.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
* Python 3
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
I guess it is self-explanatory.
|
||||||
|
|
||||||
|
```
|
||||||
|
usage: bin2array.py [-h] [-O OUTPUT] [-l LINEBREAK] [-L LINEBREAK_STRING]
|
||||||
|
[-S SEPARATOR_STRING] [-H ELEMENT_PREFIX]
|
||||||
|
[-T ELEMENT_SUFFIX] [-U] [-n]
|
||||||
|
filename
|
||||||
|
|
||||||
|
Convert binary file to C-style array initializer.
|
||||||
|
|
||||||
|
positional arguments:
|
||||||
|
filename the file to be converted
|
||||||
|
|
||||||
|
optional arguments:
|
||||||
|
-h, --help show this help message and exit
|
||||||
|
-O OUTPUT, --output OUTPUT
|
||||||
|
write output to a file
|
||||||
|
-l LINEBREAK, --linebreak LINEBREAK
|
||||||
|
add linebreak after every N element
|
||||||
|
-L LINEBREAK_STRING, --linebreak-string LINEBREAK_STRING
|
||||||
|
use what to break link, defaults to "\n"
|
||||||
|
-S SEPARATOR_STRING, --separator-string SEPARATOR_STRING
|
||||||
|
use what to separate elements, defaults to ", "
|
||||||
|
-H ELEMENT_PREFIX, --element-prefix ELEMENT_PREFIX
|
||||||
|
string to be added to the head of element, defaults to
|
||||||
|
"0x"
|
||||||
|
-T ELEMENT_SUFFIX, --element-suffix ELEMENT_SUFFIX
|
||||||
|
string to be added to the tail of element, defaults to
|
||||||
|
none
|
||||||
|
-U, --force-uppercase
|
||||||
|
force uppercase HEX representation
|
||||||
|
-n, --newline add a newline on file end
|
||||||
|
```
|
||||||
|
|
||||||
|
## Caveats
|
||||||
|
|
||||||
|
### Arduino IDE
|
||||||
|
|
||||||
|
**Do not put large source code files in the root folder of your project.** Otherwise some of the following events will happen:
|
||||||
|
|
||||||
|
* One of your CPU cores been eaten up by java
|
||||||
|
* The splash screen shows up but never loads
|
||||||
|
* 3rd World War
|
||||||
|
|
||||||
|
Make a new folder inside project root, put the converted file (use `.h` as extension, otherwise may not be recognized) in, then use the following grammer to use it:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
const char great_image[] PROGMEM = {
|
||||||
|
#include "data/great_image.png.h"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
If you are using ESP8266WebServer to serve static binary files, you can use the following code:
|
||||||
|
|
||||||
|
```C++
|
||||||
|
#include <ESP8266WebServer.h>
|
||||||
|
|
||||||
|
// create server
|
||||||
|
ESP8266WebServer server(80);
|
||||||
|
|
||||||
|
// include the image data
|
||||||
|
const char image[] PROGMEM = {
|
||||||
|
#include "data/image.png.h"
|
||||||
|
};
|
||||||
|
|
||||||
|
// statis binary file handler
|
||||||
|
void handleImage() {
|
||||||
|
server.sendHeader("Cache-Control", "max-age=31536000", false);
|
||||||
|
server.send_P(200, "image/png", image, sizeof(image));
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
// do other things...
|
||||||
|
// register image handler before server.begin()
|
||||||
|
server.on("/image.png", handleImage);
|
||||||
|
// do other things...
|
||||||
|
server.begin();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Do not use command line redirection (`python bin2array.py test.png > test.png.h`) since CMD will save the file using UTF-16 which is not recognized by some compiler. Use `-O` option to save output to file, or manually convert UTF-16 to UTF-8 for maximum compatibility.
|
||||||
48
resources/bin2array/bin2array.py
Normal file
48
resources/bin2array/bin2array.py
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import binascii
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Convert binary file to C-style array initializer.')
|
||||||
|
parser.add_argument("filename", help="the file to be converted")
|
||||||
|
parser.add_argument("-O", "--output", help="write output to a file")
|
||||||
|
parser.add_argument("-l", "--linebreak", type=int, help="add linebreak after every N element")
|
||||||
|
parser.add_argument("-L", "--linebreak-string", default="\n", help="use what to break link, defaults to \"\\n\"")
|
||||||
|
parser.add_argument("-S", "--separator-string", default=", ", help="use what to separate elements, defaults to \", \"")
|
||||||
|
parser.add_argument("-H", "--element-prefix", default="0x", help="string to be added to the head of element, defaults to \"0x\"")
|
||||||
|
parser.add_argument("-T", "--element-suffix", default="", help="string to be added to the tail of element, defaults to none")
|
||||||
|
parser.add_argument("-U", "--force-uppercase", action='store_true', help="force uppercase HEX representation")
|
||||||
|
parser.add_argument("-n", "--newline", action='store_true', help="add a newline on file end")
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
def make_sublist_group(lst: list, grp: int) -> list:
|
||||||
|
"""
|
||||||
|
Group list elements into sublists.
|
||||||
|
|
||||||
|
make_sublist_group([1, 2, 3, 4, 5, 6, 7], 3) = [[1, 2, 3], [4, 5, 6], 7]
|
||||||
|
"""
|
||||||
|
return [lst[i:i+grp] for i in range(0, len(lst), grp)]
|
||||||
|
|
||||||
|
def do_convension(content: bytes, to_uppercase: bool=False) -> str:
|
||||||
|
hexstr = binascii.hexlify(content).decode("UTF-8")
|
||||||
|
if to_uppercase:
|
||||||
|
hexstr = hexstr.upper()
|
||||||
|
array = [args.element_prefix + hexstr[i:i + 2] + args.element_suffix for i in range(0, len(hexstr), 2)]
|
||||||
|
if args.linebreak:
|
||||||
|
array = make_sublist_group(array, args.linebreak)
|
||||||
|
else:
|
||||||
|
array = [array,]
|
||||||
|
|
||||||
|
return args.linebreak_string.join([args.separator_string.join(e) + args.separator_string for e in array])
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
with open(args.filename, 'rb') as f:
|
||||||
|
file_content = f.read()
|
||||||
|
ret = do_convension(file_content, to_uppercase=args.force_uppercase)
|
||||||
|
if args.newline:
|
||||||
|
ret = ret + args.linebreak_string
|
||||||
|
if args.output:
|
||||||
|
with open(args.output, 'w') as f:
|
||||||
|
f.write(ret)
|
||||||
|
else:
|
||||||
|
print(ret)
|
||||||
@@ -29,12 +29,19 @@ e000 boot_app0.bin
|
|||||||
10000 nuki_hub_esp32.bin
|
10000 nuki_hub_esp32.bin
|
||||||
270000 nuki_hub_updater_esp32.bin
|
270000 nuki_hub_updater_esp32.bin
|
||||||
|
|
||||||
|
ESP32-NOPSRAM
|
||||||
|
e000 boot_app0.bin
|
||||||
|
1000 nuki_hub_bootloader_esp32nopsram.bin
|
||||||
|
8000 nuki_hub_partitions_esp32nopsram.bin
|
||||||
|
10000 nuki_hub_esp32nopsram.bin
|
||||||
|
270000 nuki_hub_updater_esp32nopsram.bin
|
||||||
|
|
||||||
ESP32-GL-S10
|
ESP32-GL-S10
|
||||||
e000 boot_app0.bin
|
e000 boot_app0.bin
|
||||||
1000 nuki_hub_bootloader_esp32.bin
|
1000 nuki_hub_bootloader_esp32gls10.bin
|
||||||
8000 nuki_hub_partitions_esp32.bin
|
8000 nuki_hub_partitions_esp32gls10.bin
|
||||||
10000 nuki_hub_esp32.bin
|
10000 nuki_hub_esp32gls10.bin
|
||||||
270000 nuki_hub_updater_esp32.bin
|
270000 nuki_hub_updater_esp32gls10.bin
|
||||||
|
|
||||||
ESP32-S3
|
ESP32-S3
|
||||||
e000 boot_app0.bin
|
e000 boot_app0.bin
|
||||||
@@ -43,6 +50,13 @@ e000 boot_app0.bin
|
|||||||
10000 nuki_hub_esp32s3.bin
|
10000 nuki_hub_esp32s3.bin
|
||||||
270000 nuki_hub_updater_esp32s3.bin
|
270000 nuki_hub_updater_esp32s3.bin
|
||||||
|
|
||||||
|
ESP32-S3-NOPSRAM
|
||||||
|
e000 boot_app0.bin
|
||||||
|
0 nuki_hub_bootloader_esp32s3nopsram.bin
|
||||||
|
8000 nuki_hub_partitions_esp32s3nopsram.bin
|
||||||
|
10000 nuki_hub_esp32s3nopsram.bin
|
||||||
|
270000 nuki_hub_updater_esp32s3nopsram.bin
|
||||||
|
|
||||||
ESP32-S3-OCT
|
ESP32-S3-OCT
|
||||||
e000 boot_app0.bin
|
e000 boot_app0.bin
|
||||||
0 nuki_hub_bootloader_esp32s3oct.bin
|
0 nuki_hub_bootloader_esp32s3oct.bin
|
||||||
@@ -57,6 +71,13 @@ e000 boot_app0.bin
|
|||||||
10000 nuki_hub_esp32c3.bin
|
10000 nuki_hub_esp32c3.bin
|
||||||
270000 nuki_hub_updater_esp32c3.bin
|
270000 nuki_hub_updater_esp32c3.bin
|
||||||
|
|
||||||
|
ESP32-C5
|
||||||
|
e000 boot_app0.bin
|
||||||
|
2000 nuki_hub_bootloader_esp32c5.bin
|
||||||
|
8000 nuki_hub_partitions_esp32c5.bin
|
||||||
|
10000 nuki_hub_esp32c5.bin
|
||||||
|
260000 nuki_hub_updater_esp32c5.bin
|
||||||
|
|
||||||
ESP32-C6
|
ESP32-C6
|
||||||
e000 boot_app0.bin
|
e000 boot_app0.bin
|
||||||
0 nuki_hub_bootloader_esp32c6.bin
|
0 nuki_hub_bootloader_esp32c6.bin
|
||||||
@@ -80,10 +101,10 @@ e000 boot_app0.bin
|
|||||||
|
|
||||||
ESP32-SOLO1
|
ESP32-SOLO1
|
||||||
e000 boot_app0.bin
|
e000 boot_app0.bin
|
||||||
1000 nuki_hub_bootloader_esp32-solo1.bin
|
1000 nuki_hub_bootloader_esp32solo1.bin
|
||||||
8000 nuki_hub_partitions_esp32-solo1.bin
|
8000 nuki_hub_partitions_esp32solo1.bin
|
||||||
10000 nuki_hub_esp32-solo1.bin
|
10000 nuki_hub_esp32solo1.bin
|
||||||
270000 nuki_hub_updater_esp32-solo1.bin
|
270000 nuki_hub_updater_esp32solo1.bin
|
||||||
|
|
||||||
Make sure the checkmarks for all files are enabled.
|
Make sure the checkmarks for all files are enabled.
|
||||||
|
|
||||||
@@ -99,38 +120,50 @@ As an alternative to the Download Tools, you can also use the esptool from the E
|
|||||||
|
|
||||||
## ESP32
|
## ESP32
|
||||||
|
|
||||||
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32.bin 0x10000 nuki_hub_esp32.bin 0x270000 nuki_hub_updater_esp32.bin 0x8000 nuki_hub_partitions_esp32.bin
|
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32.bin 0x10000 nuki_hub_esp32.bin 0x270000 nuki_hub_updater_esp32.bin 0x8000 nuki_hub_partitions_esp32.bin
|
||||||
|
|
||||||
|
## ESP32-NOPSRAM
|
||||||
|
|
||||||
|
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32nopsram.bin 0x10000 nuki_hub_esp32nopsram.bin 0x270000 nuki_hub_updater_esp32nopsram.bin 0x8000 nuki_hub_partitions_esp32nopsram.bin
|
||||||
|
|
||||||
## ESP32-GL-S10
|
## ESP32-GL-S10
|
||||||
|
|
||||||
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32.bin 0x10000 nuki_hub_esp32.bin 0x270000 nuki_hub_updater_esp32.bin 0x8000 nuki_hub_partitions_esp32.bin
|
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32gls10.bin 0x10000 nuki_hub_esp32gls10.bin 0x270000 nuki_hub_updater_esp32gls10.bin 0x8000 nuki_hub_partitions_esp32gls10.bin
|
||||||
|
|
||||||
## ESP32-S3
|
## ESP32-S3
|
||||||
|
|
||||||
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32s3.bin 0x10000 nuki_hub_esp32s3.bin 0x270000 nuki_hub_updater_esp32s3.bin 0x8000 nuki_hub_partitions_esp32s3.bin
|
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32s3.bin 0x10000 nuki_hub_esp32s3.bin 0x270000 nuki_hub_updater_esp32s3.bin 0x8000 nuki_hub_partitions_esp32s3.bin
|
||||||
|
|
||||||
|
## ESP32-S3-NOPSRAM
|
||||||
|
|
||||||
|
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32s3nopsram.bin 0x10000 nuki_hub_esp32s3nopsram.bin 0x270000 nuki_hub_updater_esp32s3nopsram.bin 0x8000 nuki_hub_partitions_esp32s3nopsram.bin
|
||||||
|
|
||||||
## ESP32-S3-OCT
|
## ESP32-S3-OCT
|
||||||
|
|
||||||
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32s3oct.bin 0x10000 nuki_hub_esp32s3oct.bin 0x270000 nuki_hub_updater_esp32s3oct.bin 0x8000 nuki_hub_partitions_esp32s3oct.bin
|
esptool.py --chip esp32s3 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32s3oct.bin 0x10000 nuki_hub_esp32s3oct.bin 0x270000 nuki_hub_updater_esp32s3oct.bin 0x8000 nuki_hub_partitions_esp32s3oct.bin
|
||||||
|
|
||||||
## ESP32-C3
|
## ESP32-C3
|
||||||
|
|
||||||
esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32c3.bin 0x10000 nuki_hub_esp32c3.bin 0x270000 nuki_hub_updater_esp32c3.bin 0x8000 nuki_hub_partitions_esp32c3.bin
|
esptool.py --chip esp32c3 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32c3.bin 0x10000 nuki_hub_esp32c3.bin 0x270000 nuki_hub_updater_esp32c3.bin 0x8000 nuki_hub_partitions_esp32c3.bin
|
||||||
|
|
||||||
|
## ESP32-C5
|
||||||
|
|
||||||
|
esptool.py --chip esp32c5 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x2000 nuki_hub_bootloader_esp32c5.bin 0x10000 nuki_hub_esp32c5.bin 0x260000 nuki_hub_updater_esp32c5.bin 0x8000 nuki_hub_partitions_esp32c5.bin
|
||||||
|
|
||||||
## ESP32-C6
|
## ESP32-C6
|
||||||
|
|
||||||
esptool.py --chip esp32c6 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32c6.bin 0x10000 nuki_hub_esp32c6.bin 0x270000 nuki_hub_updater_esp32c6.bin 0x8000 nuki_hub_partitions_esp32c6.bin
|
esptool.py --chip esp32c6 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32c6.bin 0x10000 nuki_hub_esp32c6.bin 0x270000 nuki_hub_updater_esp32c6.bin 0x8000 nuki_hub_partitions_esp32c6.bin
|
||||||
|
|
||||||
## ESP32-H2
|
## ESP32-H2
|
||||||
|
|
||||||
esptool.py --chip esp32h2 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32h2.bin 0x10000 nuki_hub_esp32h2.bin 0x270000 nuki_hub_updater_esp32h2.bin 0x8000 nuki_hub_partitions_esp32h2.bin
|
esptool.py --chip esp32h2 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x0 nuki_hub_bootloader_esp32h2.bin 0x10000 nuki_hub_esp32h2.bin 0x270000 nuki_hub_updater_esp32h2.bin 0x8000 nuki_hub_partitions_esp32h2.bin
|
||||||
|
|
||||||
## ESP32-P4
|
## ESP32-P4
|
||||||
|
|
||||||
esptool.py --chip esp32p4 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x2000 nuki_hub_bootloader_esp32p4.bin 0x10000 nuki_hub_esp32p4.bin 0x270000 nuki_hub_updater_esp32p4.bin 0x8000 nuki_hub_partitions_esp32p4.bin
|
esptool.py --chip esp32p4 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x2000 nuki_hub_bootloader_esp32p4.bin 0x10000 nuki_hub_esp32p4.bin 0x270000 nuki_hub_updater_esp32p4.bin 0x8000 nuki_hub_partitions_esp32p4.bin
|
||||||
|
|
||||||
## ESP32-SOLO1
|
## ESP32-SOLO1
|
||||||
|
|
||||||
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default_reset --after hard_reset write_flash -z --flash_mode dio --flash_freq keep --flash_size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32-solo1.bin 0x10000 nuki_hub_esp32-solo1.bin 0x270000 nuki_hub_updater_esp32-solo1.bin 0x8000 nuki_hub_partitions_esp32-solo1.bin
|
esptool.py --chip esp32 --port /dev/ttyUSB0 --baud 921600 --before default-reset --after hard-reset write-flash -z --flash-mode dio --flash-freq keep --flash-size detect 0xe000 boot_app0.bin 0x1000 nuki_hub_bootloader_esp32solo1.bin 0x10000 nuki_hub_esp32solo1.bin 0x270000 nuki_hub_updater_esp32solo1.bin 0x8000 nuki_hub_partitions_esp32solo1.bin
|
||||||
|
|
||||||
Adjust the serial device and path to the binaries if necessary.
|
Adjust the serial device and path to the binaries if necessary.
|
||||||
20
resources/old_manifest.py
Normal file
20
resources/old_manifest.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import re, json, argparse
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
|
||||||
|
parser.add_argument('version', type=str)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
with open('ota/old/manifest.json', 'r+') as json_file:
|
||||||
|
data = json.load(json_file)
|
||||||
|
data[str(int((float(args.version)*100)+0.1))] = args.version
|
||||||
|
data2 = sorted(data.items(), reverse=True)
|
||||||
|
sorted_dict = {}
|
||||||
|
k = 6
|
||||||
|
for key, value in data2:
|
||||||
|
if k > 0:
|
||||||
|
sorted_dict[key] = value
|
||||||
|
k = k - 1
|
||||||
|
json_file.seek(0)
|
||||||
|
json.dump(sorted_dict, json_file, indent=4)
|
||||||
|
json_file.truncate()
|
||||||
@@ -11,32 +11,32 @@ source: https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--nc-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
|
--nc-font-sans: 'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';
|
||||||
--nc-font-mono: Consolas, monaco, 'Ubuntu Mono', 'Liberation Mono', 'Courier New', Courier, monospace;
|
--nc-font-mono: Consolas,monaco,'Ubuntu Mono','Liberation Mono','Courier New',Courier,monospace;
|
||||||
--nc-tx-1: #000000;
|
--nc-tx-1: #000;
|
||||||
--nc-tx-2: #1A1A1A;
|
--nc-tx-2: #1a1a1a;
|
||||||
--nc-bg-1: #FFFFFF;
|
--nc-bg-1: #fff;
|
||||||
--nc-bg-2: #F6F8FA;
|
--nc-bg-2: #f6f8fa;
|
||||||
--nc-bg-3: #E5E7EB;
|
--nc-bg-3: #e5e7eb;
|
||||||
--nc-lk-1: #0070F3;
|
--nc-lk-1: #0070f3;
|
||||||
--nc-lk-2: #0366D6;
|
--nc-lk-2: #0366d6;
|
||||||
--nc-lk-tx: #FFFFFF;
|
--nc-lk-tx: #fff;
|
||||||
--nc-ac-1: #79FFE1;
|
--nc-ac-1: #79ffe1;
|
||||||
--nc-ac-tx: #0C4047
|
--nc-ac-tx: #0c4047
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (prefers-color-scheme:dark) {
|
@media(prefers-color-scheme: dark) {
|
||||||
:root {
|
:root {
|
||||||
--nc-tx-1: #ffffff;
|
--nc-tx-1:#fff;
|
||||||
--nc-tx-2: #eeeeee;
|
--nc-tx-2: #eee;
|
||||||
--nc-bg-1: #000000;
|
--nc-bg-1: #000;
|
||||||
--nc-bg-2: #111111;
|
--nc-bg-2: #111;
|
||||||
--nc-bg-3: #222222;
|
--nc-bg-3: #222;
|
||||||
--nc-lk-1: #3291FF;
|
--nc-lk-1: #3291ff;
|
||||||
--nc-lk-2: #0070F3;
|
--nc-lk-2: #0070f3;
|
||||||
--nc-lk-tx: #FFFFFF;
|
--nc-lk-tx: #fff;
|
||||||
--nc-ac-1: #7928CA;
|
--nc-ac-1: #7928ca;
|
||||||
--nc-ac-tx: #FFFFFF
|
--nc-ac-tx: #fff
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,20 +45,11 @@ source: https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css
|
|||||||
padding: 0
|
padding: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
img,
|
img,input,option,p,table,textarea,ul {
|
||||||
input,
|
|
||||||
option,
|
|
||||||
p,
|
|
||||||
table,
|
|
||||||
textarea,
|
|
||||||
ul {
|
|
||||||
margin-bottom: 1rem
|
margin-bottom: 1rem
|
||||||
}
|
}
|
||||||
|
|
||||||
button,
|
button,html,input,select {
|
||||||
html,
|
|
||||||
input,
|
|
||||||
select {
|
|
||||||
font-family: var(--nc-font-sans)
|
font-family: var(--nc-font-sans)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,39 +72,64 @@ body {
|
|||||||
color: var(--nc-ac-tx)
|
color: var(--nc-ac-tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
h1,h2,h3,h4,h5,h6 {
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: var(--nc-tx-1);
|
color: var(--nc-tx-1);
|
||||||
padding-top: .875rem
|
padding-top: .875rem
|
||||||
}
|
}
|
||||||
|
|
||||||
h1, h2, h3 {
|
h1,h2,h3 {
|
||||||
color: var(--nc-tx-1);
|
color: var(--nc-tx-1);
|
||||||
padding-bottom: 2px;
|
padding-bottom: 2px;
|
||||||
margin-bottom: 8px;
|
margin-bottom: 8px;
|
||||||
border-bottom: 1px solid var(--nc-bg-2)
|
border-bottom: 1px solid var(--nc-bg-2)
|
||||||
}
|
}
|
||||||
|
|
||||||
h4, h5, h6 {
|
h4,h5,h6 {
|
||||||
margin-bottom: .3rem
|
margin-bottom: .3rem
|
||||||
}
|
}
|
||||||
|
|
||||||
h1 { font-size: 2.25rem }
|
h1 {
|
||||||
h2 { font-size: 1.85rem }
|
font-size: 2.25rem
|
||||||
h3 { font-size: 1.55rem }
|
}
|
||||||
h4 { font-size: 1.25rem }
|
|
||||||
h5 { font-size: 1rem }
|
|
||||||
h6 { font-size: .875rem }
|
|
||||||
a { color: var(--nc-lk-1) }
|
|
||||||
a:hover { color: var(--nc-lk-2) !important; }
|
|
||||||
abbr { cursor: help }
|
|
||||||
abbr:hover { cursor: help }
|
|
||||||
|
|
||||||
a button,
|
h2 {
|
||||||
button,
|
font-size: 1.85rem
|
||||||
input[type=button],
|
}
|
||||||
input[type=reset],
|
|
||||||
input[type=submit] {
|
h3 {
|
||||||
|
font-size: 1.55rem
|
||||||
|
}
|
||||||
|
|
||||||
|
h4 {
|
||||||
|
font-size: 1.25rem
|
||||||
|
}
|
||||||
|
|
||||||
|
h5 {
|
||||||
|
font-size: 1rem
|
||||||
|
}
|
||||||
|
|
||||||
|
h6 {
|
||||||
|
font-size: .875rem
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--nc-lk-1)
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
color: var(--nc-lk-2) !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr {
|
||||||
|
cursor: help
|
||||||
|
}
|
||||||
|
|
||||||
|
abbr:hover {
|
||||||
|
cursor: help
|
||||||
|
}
|
||||||
|
|
||||||
|
a button,button,input[type=button],input[type=reset],input[type=submit] {
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
@@ -129,26 +145,13 @@ input[type=submit] {
|
|||||||
color: var(--nc-lk-tx)
|
color: var(--nc-lk-tx)
|
||||||
}
|
}
|
||||||
|
|
||||||
a button[disabled],
|
a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled] {
|
||||||
button[disabled],
|
|
||||||
input[type=button][disabled],
|
|
||||||
input[type=reset][disabled],
|
|
||||||
input[type=submit][disabled] {
|
|
||||||
cursor: default;
|
cursor: default;
|
||||||
opacity: .5;
|
opacity: .5;
|
||||||
cursor: not-allowed
|
cursor: not-allowed
|
||||||
}
|
}
|
||||||
|
|
||||||
.button:focus,
|
.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover {
|
||||||
.button:hover,
|
|
||||||
button:focus,
|
|
||||||
button:hover,
|
|
||||||
input[type=button]:focus,
|
|
||||||
input[type=button]:hover,
|
|
||||||
input[type=reset]:focus,
|
|
||||||
input[type=reset]:hover,
|
|
||||||
input[type=submit]:focus,
|
|
||||||
input[type=submit]:hover {
|
|
||||||
background: var(--nc-lk-2)
|
background: var(--nc-lk-2)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,18 +160,25 @@ table {
|
|||||||
width: 100%
|
width: 100%
|
||||||
}
|
}
|
||||||
|
|
||||||
td, th {
|
td,th {
|
||||||
border: 1px solid var(--nc-bg-3);
|
border: 1px solid var(--nc-bg-3);
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding: .5rem
|
padding: .5rem
|
||||||
}
|
}
|
||||||
|
|
||||||
th { background: var(--nc-bg-2) }
|
th {
|
||||||
tr:nth-child(even) { background: var(--nc-bg-2) }
|
background: var(--nc-bg-2)
|
||||||
|
}
|
||||||
|
|
||||||
textarea { max-width: 100% }
|
tr:nth-child(even) {
|
||||||
|
background: var(--nc-bg-2)
|
||||||
|
}
|
||||||
|
|
||||||
input, select, textarea {
|
textarea {
|
||||||
|
max-width: 100%
|
||||||
|
}
|
||||||
|
|
||||||
|
input,select,textarea {
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
margin-bottom: .5rem;
|
margin-bottom: .5rem;
|
||||||
background: var(--nc-bg-2);
|
background: var(--nc-bg-2);
|
||||||
@@ -179,50 +189,57 @@ input, select, textarea {
|
|||||||
box-sizing: border-box
|
box-sizing: border-box
|
||||||
}
|
}
|
||||||
|
|
||||||
img { max-width: 100% }
|
img {
|
||||||
|
max-width: 100%
|
||||||
|
}
|
||||||
|
|
||||||
td>input {
|
td>input {
|
||||||
margin-top: 0px;
|
margin-top: 0;
|
||||||
margin-bottom: 0px
|
margin-bottom: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
td>textarea {
|
td>textarea {
|
||||||
margin-top: 0px;
|
margin-top: 0;
|
||||||
margin-bottom: 0px
|
margin-bottom: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
td>select {
|
td>select {
|
||||||
margin-top: 0px;
|
margin-top: 0;
|
||||||
margin-bottom: 0px
|
margin-bottom: 0
|
||||||
}
|
}
|
||||||
|
|
||||||
.warning {
|
.warning {
|
||||||
color: #f00;
|
color: red
|
||||||
}
|
}
|
||||||
|
|
||||||
@media only screen and (max-width: 600px) {
|
@media only screen and (max-width: 600px) {
|
||||||
.adapt td { display: block; }
|
.adapt td {
|
||||||
|
display:block
|
||||||
|
}
|
||||||
|
|
||||||
.adapt input[type=text],
|
.adapt input[type=text],.adapt input[type=password],.adapt input[type=submit],.adapt textarea,.adapt select {
|
||||||
.adapt input[type=password],
|
width: 100%
|
||||||
.adapt input[type=submit],
|
}
|
||||||
.adapt textarea,
|
|
||||||
.adapt select { width: 100%; }
|
|
||||||
|
|
||||||
.adapt td:has(input[type=checkbox]) {
|
.adapt td:has(input[type=checkbox]) {
|
||||||
text-align: center;
|
text-align: center
|
||||||
}
|
}
|
||||||
|
|
||||||
.adapt input[type=checkbox] {
|
.adapt input[type=checkbox] {
|
||||||
width: 1.5em;
|
width: 1.5em;
|
||||||
height: 1.5em;
|
height: 1.5em
|
||||||
}
|
}
|
||||||
|
|
||||||
.adapt table td:first-child { border-bottom: 0; }
|
.adapt table td:first-child {
|
||||||
.adapt table td:last-child { border-top: 0; }
|
border-bottom: 0
|
||||||
|
}
|
||||||
|
|
||||||
|
.adapt table td:last-child {
|
||||||
|
border-top: 0
|
||||||
|
}
|
||||||
|
|
||||||
#tblnav a li>span {
|
#tblnav a li>span {
|
||||||
max-width: 140px;
|
max-width: 140px
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -236,32 +253,31 @@ td>select {
|
|||||||
line-height: 1;
|
line-height: 1;
|
||||||
color: var(--nc-tx-1);
|
color: var(--nc-tx-1);
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
background: linear-gradient(to left,transparent 50%,rgba(255,255,255,0.4) 50%) right;
|
||||||
background: linear-gradient(to left, transparent 50%, rgba(255,255,255,0.4) 50%) right;
|
|
||||||
background-size: 200% 100%;
|
background-size: 200% 100%;
|
||||||
transition:all .2s ease;
|
transition: all .2s ease
|
||||||
}
|
}
|
||||||
|
|
||||||
#tblnav a:nth-child(even) {
|
#tblnav a {
|
||||||
background: linear-gradient(to left, var(--nc-bg-2) 50%, rgba(255,255,255,0.4) 50%) right;
|
background: linear-gradient(to left,var(--nc-bg-2) 50%,rgba(255,255,255,0.4) 50%) right;
|
||||||
background-size: 200% 100%;
|
background-size: 200% 100%
|
||||||
}
|
}
|
||||||
|
|
||||||
#tblnav a:hover {
|
#tblnav a:hover {
|
||||||
background-position: left;
|
background-position: left;
|
||||||
transition:all .45s ease;
|
transition: all .45s ease
|
||||||
}
|
}
|
||||||
|
|
||||||
#tblnav a:active {
|
#tblnav a:active {
|
||||||
background: var(--nc-lk-1);
|
background: var(--nc-lk-1);
|
||||||
transition:all .15s ease;
|
transition: all .15s ease
|
||||||
}
|
}
|
||||||
|
|
||||||
#tblnav a li {
|
#tblnav a li {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
padding: .5rem;
|
padding: .5rem;
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 100%;
|
width: 100%
|
||||||
}
|
}
|
||||||
|
|
||||||
#tblnav a li>span {
|
#tblnav a li>span {
|
||||||
@@ -271,10 +287,16 @@ td>select {
|
|||||||
color: #f70;
|
color: #f70;
|
||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
display: block;
|
display: block
|
||||||
}
|
}
|
||||||
|
|
||||||
.tdbtn {
|
.tdbtn {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: middle;
|
vertical-align: middle
|
||||||
|
}
|
||||||
|
|
||||||
|
.naventry {
|
||||||
|
float: left;
|
||||||
|
max-width: 375px;
|
||||||
|
width: 100%
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@ Prior to running the script, pyserial has to be installed via pip.
|
|||||||
The ESP will only accept a configuration via serial as long as the device in not configured yet, meaning the ESP Wifi access point is open.
|
The ESP will only accept a configuration via serial as long as the device in not configured yet, meaning the ESP Wifi access point is open.
|
||||||
Once the ESP is connected to a network, it will ignore any commands send via the serial interface.<br><br>
|
Once the ESP is connected to a network, it will ignore any commands send via the serial interface.<br><br>
|
||||||
To generate a configuration a configuration file, the export configuration function can be used.
|
To generate a configuration a configuration file, the export configuration function can be used.
|
||||||
After exporting a configuration, it can be edited to the required values. Usually only specific valus like
|
After exporting a configuration, it can be edited to the required values. Usually only specific values like
|
||||||
the IP address, Wifi credentials or network hardware are intended to be set. In that case all other configuration values can be deleted from the configuration.<br>
|
the IP address, Wifi credentials or network hardware are intended to be set. In that case all other configuration values can be deleted from the configuration.<br>
|
||||||
For example configurations, see the "example_configurations" subdirectory.
|
For example configurations, see the "example_configurations" subdirectory.
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ All configuration entries are saved in JSON format.
|
|||||||
- ipgtw: Gateway used to connect to the internet
|
- ipgtw: Gateway used to connect to the internet
|
||||||
- dnssrv: DNS server used to resolve domain names
|
- dnssrv: DNS server used to resolve domain names
|
||||||
- nwhw: Network hardware used. See WebCfgServer.cpp, method getNetworkDetectionOptions for possible values.
|
- nwhw: Network hardware used. See WebCfgServer.cpp, method getNetworkDetectionOptions for possible values.
|
||||||
At the time of writing: 1=Wifi, 2=Generic W5500, 3 = M5Stack Atom POE (W5500), 4 = "Olimex ESP32-POE / ESP-POE-ISO, 5 = WT32-ETH01, 6 = M5STACK PoESP32 Unit, 7 = LilyGO T-ETH-POE, 8 = GL-S10, 9 = ETH01-Evo, 10 = M5Stack Atom POE S3 (W5500), 11 = Custom LAN module, 12 = LilyGO T-ETH ELite, 13 = Waveshare ESP32-S3-ETH / ESP32-S3-ETH-POE, 14 = LilyGO T-ETH-Lite-ESP32S3
|
At the time of writing: 1=Wifi, 2=Generic W5500, 3 = M5Stack Atom POE (W5500), 4 = "Olimex ESP32-POE / ESP-POE-ISO, 5 = WT32-ETH01, 6 = M5STACK PoESP32 Unit, 7 = LilyGO T-ETH-POE, 8 = GL-S10, 9 = ETH01-Evo, 10 = M5Stack Atom POE S3 (W5500), 11 = Custom LAN module, 12 = LilyGO T-ETH ELite, 13 = Waveshare ESP32-S3-ETH / ESP32-S3-ETH-POE, 14 = LilyGO T-ETH-Lite-ESP32S3, 15 = Waveshare ESP32-P4-NANO, 16 = Waveshare ESP32-P4-Module-DEV-KIT, 17 = ESP32-P4-Function-EV-Board
|
||||||
|
|
||||||
## Serial commands
|
## Serial commands
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,9 @@ CONFIG_ARDUINO_SELECTIVE_Insights=n
|
|||||||
CONFIG_ARDUINO_LOOP_STACK_SIZE=12288
|
CONFIG_ARDUINO_LOOP_STACK_SIZE=12288
|
||||||
|
|
||||||
# LOGS
|
# LOGS
|
||||||
CONFIG_HEAP_TASK_TRACKING=n
|
#CONFIG_HEAP_TASK_TRACKING=y
|
||||||
|
#CONFIG_HEAP_TRACK_DELETED_TASKS=y
|
||||||
|
#CONFIG_ESP_SYSTEM_USE_FRAME_POINTER=y
|
||||||
CONFIG_LOG_COLORS=n
|
CONFIG_LOG_COLORS=n
|
||||||
CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=n
|
CONFIG_LOG_MAXIMUM_EQUALS_DEFAULT=n
|
||||||
CONFIG_LOG_MAXIMUM_LEVEL=4
|
CONFIG_LOG_MAXIMUM_LEVEL=4
|
||||||
@@ -84,11 +86,12 @@ CONFIG_BT_NIMBLE_PINNED_TO_CORE_0=y
|
|||||||
CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
|
CONFIG_BT_NIMBLE_PINNED_TO_CORE=0
|
||||||
CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=12288
|
CONFIG_BT_NIMBLE_HOST_TASK_STACK_SIZE=12288
|
||||||
CONFIG_BT_NIMBLE_ROLE_CENTRAL=y
|
CONFIG_BT_NIMBLE_ROLE_CENTRAL=y
|
||||||
CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=n
|
CONFIG_BT_NIMBLE_ROLE_PERIPHERAL=y
|
||||||
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y
|
CONFIG_BT_NIMBLE_ROLE_BROADCASTER=y
|
||||||
CONFIG_BT_NIMBLE_ROLE_OBSERVER=y
|
CONFIG_BT_NIMBLE_ROLE_OBSERVER=y
|
||||||
CONFIG_BT_NIMBLE_SM_LEGACY=y
|
CONFIG_BT_NIMBLE_SECURITY_ENABLE=n
|
||||||
CONFIG_BT_NIMBLE_SM_SC=y
|
CONFIG_BT_NIMBLE_SM_LEGACY=n
|
||||||
|
CONFIG_BT_NIMBLE_SM_SC=n
|
||||||
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
|
CONFIG_BT_NIMBLE_SVC_GAP_DEVICE_NAME="nimble"
|
||||||
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
|
CONFIG_BT_NIMBLE_GAP_DEVICE_NAME_MAX_LEN=31
|
||||||
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
|
CONFIG_BT_NIMBLE_ATT_PREFERRED_MTU=256
|
||||||
@@ -127,6 +130,7 @@ CONFIG_BTDM_BLE_ADV_REPORT_FLOW_CTRL_NUM=100
|
|||||||
CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20
|
CONFIG_BTDM_BLE_ADV_REPORT_DISCARD_THRSHOLD=20
|
||||||
CONFIG_BT_NIMBLE_MSYS_BUF_FROM_HEAP=n
|
CONFIG_BT_NIMBLE_MSYS_BUF_FROM_HEAP=n
|
||||||
CONFIG_BT_NIMBLE_50_FEATURE_SUPPORT=n
|
CONFIG_BT_NIMBLE_50_FEATURE_SUPPORT=n
|
||||||
|
CONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
||||||
|
|
||||||
# LWIP
|
# LWIP
|
||||||
CONFIG_LWIP_MAX_SOCKETS=24
|
CONFIG_LWIP_MAX_SOCKETS=24
|
||||||
@@ -161,7 +165,7 @@ CONFIG_ESP_HTTP_CLIENT_ENABLE_DIGEST_AUTH=y
|
|||||||
# HTTP(S) SERVER
|
# HTTP(S) SERVER
|
||||||
CONFIG_ESP_HTTPS_SERVER_ENABLE=y
|
CONFIG_ESP_HTTPS_SERVER_ENABLE=y
|
||||||
CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048
|
CONFIG_HTTPD_MAX_REQ_HDR_LEN=2048
|
||||||
CONFIG_HTTPD_MAX_URI_LEN=512
|
CONFIG_HTTPD_MAX_URI_LEN=2048
|
||||||
CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
|
CONFIG_HTTPD_ERR_RESP_NO_DELAY=y
|
||||||
CONFIG_HTTPD_PURGE_BUF_LEN=32
|
CONFIG_HTTPD_PURGE_BUF_LEN=32
|
||||||
CONFIG_HTTPD_WS_SUPPORT=y
|
CONFIG_HTTPD_WS_SUPPORT=y
|
||||||
|
|||||||
6
sdkconfig.defaults.esp32-c5
Normal file
6
sdkconfig.defaults.esp32-c5
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
CONFIG_SPIRAM=y
|
||||||
|
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
|
||||||
|
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
|
||||||
|
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT=y
|
||||||
|
CONFIG_ESPTOOLPY_NO_STUB=n
|
||||||
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=50768
|
||||||
4
sdkconfig.defaults.esp32-c5dbg
Normal file
4
sdkconfig.defaults.esp32-c5dbg
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
|
||||||
|
CONFIG_BT_NIMBLE_LOG_LEVEL_DEBUG=y
|
||||||
|
CONFIG_BT_NIMBLE_LOG_LEVEL=4
|
||||||
|
CONFIG_NIMBLE_CPP_LOG_LEVEL=4
|
||||||
1
sdkconfig.defaults.esp32-nopsram
Normal file
1
sdkconfig.defaults.esp32-nopsram
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CONFIG_SPIRAM=n
|
||||||
@@ -18,6 +18,7 @@ CONFIG_ESP_WIFI_AMPDU_TX_ENABLED=y
|
|||||||
CONFIG_ESP_WIFI_TX_BA_WIN=32
|
CONFIG_ESP_WIFI_TX_BA_WIN=32
|
||||||
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
|
CONFIG_ESP_WIFI_AMPDU_RX_ENABLED=y
|
||||||
CONFIG_ESP_WIFI_RX_BA_WIN=32
|
CONFIG_ESP_WIFI_RX_BA_WIN=32
|
||||||
|
|
||||||
CONFIG_ESP_WIFI_REMOTE_ENABLED=y
|
CONFIG_ESP_WIFI_REMOTE_ENABLED=y
|
||||||
CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED=y
|
CONFIG_ESP_WIFI_REMOTE_LIBRARY_HOSTED=y
|
||||||
CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
|
CONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
|
||||||
@@ -27,11 +28,12 @@ CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
|
|||||||
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
||||||
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
CONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
||||||
|
|
||||||
CONFIG_ESP_HCI_VHCI=y
|
CONFIG_BT_ENABLED=y
|
||||||
CONFIG_BT_CONTROLLER_DISABLED=y
|
CONFIG_BT_NIMBLE_ENABLED=y
|
||||||
CONFIG_BT_BLUEDROID_ENABLED=n
|
CONFIG_BT_BLUEDROID_ENABLED=n
|
||||||
CONFIG_BT_NIMBLE_TRANSPORT_UART=n
|
CONFIG_BT_NIMBLE_TRANSPORT_UART=n
|
||||||
CONFIG_ESP_ENABLE_BT=y
|
CONFIG_BT_CONTROLLER_DISABLED=y
|
||||||
CONFIG_BT_NIMBLE_ENABLED=y
|
CONFIG_ESP_HOSTED_SDIO_HOST_INTERFACE=y
|
||||||
CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE=y
|
CONFIG_ESP_HOSTED_ENABLE_BT_NIMBLE=y
|
||||||
|
CONFIG_ESP_HOSTED_NIMBLE_HCI_VHCI=y
|
||||||
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
|
CONFIG_SLAVE_IDF_TARGET_ESP32C6=y
|
||||||
1
sdkconfig.defaults.esp32-s3-nopsram
Normal file
1
sdkconfig.defaults.esp32-s3-nopsram
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CONFIG_SPIRAM=n
|
||||||
34
sdkconfig.ramoptimize.defaults
Normal file
34
sdkconfig.ramoptimize.defaults
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
CONFIG_COMPILER_OPTIMIZATION_NONE=n
|
||||||
|
CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT=y
|
||||||
|
CONFIG_LWIP_IRAM_OPTIMIZATION=n
|
||||||
|
CONFIG_LWIP_EXTRA_IRAM_OPTIMIZATION=n
|
||||||
|
CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_SPI_MASTER_IN_IRAM=n
|
||||||
|
CONFIG_SPI_SLAVE_IN_IRAM=n
|
||||||
|
CONFIG_ANA_CMPR_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_PARLIO_TX_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_PARLIO_RX_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_RMT_TX_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_RMT_RX_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_I2C_MASTER_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_GDMA_ISR_HANDLER_IN_IRAM=n
|
||||||
|
CONFIG_LIBC_LOCKS_PLACE_IN_IRAM=n
|
||||||
|
CONFIG_HAL_ASSERTION_SILENT=y
|
||||||
|
#CONFIG_SPI_FLASH_AUTO_SUSPEND=y ## CAUSES CRASHES ON SOME DEVICES
|
||||||
|
#CONFIG_SPI_FLASH_PLACE_FUNCTIONS_IN_IRAM=n ## CAUSES CRASHES ON SOME DEVICES
|
||||||
|
#CONFIG_SPI_FLASH_AUTO_CHECK_SUSPEND_STATUS=y ## CAUSES CRASHES ON SOME DEVICES
|
||||||
|
CONFIG_LIBC_MISC_IN_IRAM=n
|
||||||
|
CONFIG_ESP_TIMER_IN_IRAM=n
|
||||||
|
CONFIG_ESP_INTR_IN_IRAM=n
|
||||||
|
CONFIG_LOG_IN_IRAM=n
|
||||||
|
CONFIG_ESP_ROM_PRINT_IN_IRAM=n
|
||||||
|
CONFIG_PM_SLEEP_FUNC_IN_IRAM=n
|
||||||
|
CONFIG_PM_RTOS_IDLE_OPT=n
|
||||||
|
CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=n
|
||||||
|
CONFIG_PM_SLP_IRAM_OPT=n
|
||||||
|
CONFIG_ESP_REGI2C_CTRL_FUNC_IN_IRAM=n
|
||||||
|
CONFIG_ESP_PERIPH_CTRL_FUNC_IN_IRAM=n
|
||||||
|
CONFIG_ESP_PHY_IRAM_OPT=n
|
||||||
|
CONFIG_ESP_WIFI_SLP_IRAM_OPT=n
|
||||||
|
CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=n
|
||||||
|
CONFIG_SPI_FLASH_ENABLE_ENCRYPTED_READ_WRITE=n
|
||||||
87
src/Config.h
87
src/Config.h
@@ -5,7 +5,7 @@
|
|||||||
#define NUKI_HUB_VERSION "9.12"
|
#define NUKI_HUB_VERSION "9.12"
|
||||||
#define NUKI_HUB_VERSION_INT (uint32_t)912
|
#define NUKI_HUB_VERSION_INT (uint32_t)912
|
||||||
#define NUKI_HUB_BUILD "unknownbuildnr"
|
#define NUKI_HUB_BUILD "unknownbuildnr"
|
||||||
#define NUKI_HUB_DATE "2025-06-09"
|
#define NUKI_HUB_DATE "2025-07-21"
|
||||||
|
|
||||||
#define GITHUB_LATEST_RELEASE_URL (char*)"https://github.com/technyon/nuki_hub/releases/latest"
|
#define GITHUB_LATEST_RELEASE_URL (char*)"https://github.com/technyon/nuki_hub/releases/latest"
|
||||||
#define GITHUB_OTA_MANIFEST_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/manifest.json"
|
#define GITHUB_OTA_MANIFEST_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/manifest.json"
|
||||||
@@ -56,9 +56,11 @@
|
|||||||
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32s3oct.bin"
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32s3oct.bin"
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
#define NUKI_HUB_HW (char*)"ESP32-S3 (Octal PSRAM)"
|
#define NUKI_HUB_HW (char*)"ESP32-S3 (Octal PSRAM)"
|
||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
#else
|
#elif defined(CONFIG_SPIRAM)
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3.bin"
|
||||||
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3.bin"
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3.bin"
|
||||||
@@ -73,9 +75,45 @@
|
|||||||
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32s3.bin"
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32s3.bin"
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3oct.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3oct.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3oct.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3oct.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
#define NUKI_HUB_HW (char*)"ESP32-S3"
|
#define NUKI_HUB_HW (char*)"ESP32-S3"
|
||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
|
#else
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32s3nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3oct.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32s3oct.bin"
|
||||||
|
#define NUKI_HUB_HW (char*)"ESP32-S3 (No PSRAM)"
|
||||||
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
#endif
|
#endif
|
||||||
|
#elif defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32c5.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32c5.bin"
|
||||||
|
#define NUKI_HUB_HW (char*)"ESP32-C5"
|
||||||
|
#define BOOT_BUTTON_GPIO (gpio_num_t)28
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
|
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c6.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c6.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32c6.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32c6.bin"
|
||||||
@@ -108,7 +146,7 @@
|
|||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)9
|
#define BOOT_BUTTON_GPIO (gpio_num_t)9
|
||||||
#else
|
#else
|
||||||
#if defined(CONFIG_FREERTOS_UNICORE)
|
#if defined(CONFIG_FREERTOS_UNICORE)
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL "https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32-solo1.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32-solo1.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32-solo1.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32-solo1.bin"
|
||||||
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32-solo1.bin"
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32-solo1.bin"
|
||||||
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32-solo1.bin"
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32-solo1.bin"
|
||||||
@@ -123,24 +161,26 @@
|
|||||||
#define NUKI_HUB_HW (char*)"ESP32-SOLO1"
|
#define NUKI_HUB_HW (char*)"ESP32-SOLO1"
|
||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
#elif defined(NUKI_TARGET_GL_S10)
|
#elif defined(NUKI_TARGET_GL_S10)
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL "https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_MASTER_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_MASTER_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_MASTER_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_MASTER_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_BETA_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_BETA_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32gls10.bin"
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32gls10.bin"
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32nopsram.bin"
|
||||||
#define NUKI_HUB_HW (char*)"ESP32-GL-S10"
|
#define NUKI_HUB_HW (char*)"ESP32-GL-S10"
|
||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
#else
|
#elif defined(CONFIG_SPIRAM)
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL "https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
||||||
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32.bin"
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32.bin"
|
||||||
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32.bin"
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32.bin"
|
||||||
@@ -152,10 +192,31 @@
|
|||||||
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32.bin"
|
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32.bin"
|
||||||
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32.bin"
|
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32.bin"
|
||||||
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32.bin"
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32.bin"
|
||||||
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32-gl-s10.bin"
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32gls10.bin"
|
||||||
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32gls10.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32nopsram.bin"
|
||||||
#define NUKI_HUB_HW (char*)"ESP32"
|
#define NUKI_HUB_HW (char*)"ESP32"
|
||||||
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
|
#else
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_BETA_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_BETA_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/beta/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_RELEASE_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_esp32nopsram.bin"
|
||||||
|
#define GITHUB_MASTER_UPDATER_BINARY_URL_DBG (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/debug/master/nuki_hub_updater_esp32nopsram.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32gls10.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32gls10.bin"
|
||||||
|
#define GITHUB_LATEST_RELEASE_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.bin"
|
||||||
|
#define GITHUB_LATEST_UPDATER_BINARY_URL_OTHER2 (char*)"https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_updater_esp32.bin"
|
||||||
|
#define NUKI_HUB_HW (char*)"ESP32 (No PSRAM)"
|
||||||
|
#define BOOT_BUTTON_GPIO (gpio_num_t)0
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
11
src/Gpio.cpp
11
src/Gpio.cpp
@@ -15,7 +15,6 @@ Gpio::Gpio(Preferences* preferences)
|
|||||||
: _preferences(preferences)
|
: _preferences(preferences)
|
||||||
{
|
{
|
||||||
_inst = this;
|
_inst = this;
|
||||||
loadPinConfiguration();
|
|
||||||
_inst->init();
|
_inst->init();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,6 +119,13 @@ void Gpio::init()
|
|||||||
_inst->_triggerState.push_back(0);
|
_inst->_triggerState.push_back(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_inst->setPins();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Gpio::setPins()
|
||||||
|
{
|
||||||
|
loadPinConfiguration();
|
||||||
|
|
||||||
bool hasInputPin = false;
|
bool hasInputPin = false;
|
||||||
|
|
||||||
if (_inst->_preferences->getBool(preference_cred_bypass_boot_btn_enabled, false))
|
if (_inst->_preferences->getBool(preference_cred_bypass_boot_btn_enabled, false))
|
||||||
@@ -180,8 +186,9 @@ void Gpio::init()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hasInputPin)
|
if(hasInputPin && _first)
|
||||||
{
|
{
|
||||||
|
_first = false;
|
||||||
_inst->timer = timerBegin(1000000);
|
_inst->timer = timerBegin(1000000);
|
||||||
timerAttachInterrupt(_inst->timer, isrOnTimer);
|
timerAttachInterrupt(_inst->timer, isrOnTimer);
|
||||||
timerAlarm(_inst->timer, 100000, true, 0);
|
timerAlarm(_inst->timer, 100000, true, 0);
|
||||||
|
|||||||
17
src/Gpio.h
17
src/Gpio.h
@@ -76,6 +76,7 @@ public:
|
|||||||
const std::vector<PinRole>& getAllRoles() const;
|
const std::vector<PinRole>& getAllRoles() const;
|
||||||
|
|
||||||
void setPinOutput(const uint8_t& pin, const uint8_t& state);
|
void setPinOutput(const uint8_t& pin, const uint8_t& state);
|
||||||
|
void setPins();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void IRAM_ATTR notify(const GpioAction& action, const int& pin);
|
void IRAM_ATTR notify(const GpioAction& action, const int& pin);
|
||||||
@@ -85,16 +86,22 @@ private:
|
|||||||
static void IRAM_ATTR isrOnTimer();
|
static void IRAM_ATTR isrOnTimer();
|
||||||
|
|
||||||
#if defined(CONFIG_IDF_TARGET_ESP32C3)
|
#if defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||||
//Based on https://docs.espressif.com/projects/esp-idf/en/stable/esp32c3/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf
|
//Based on https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-c3_datasheet_en.pdf
|
||||||
const std::vector<uint8_t> _availablePins = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 21 };
|
const std::vector<uint8_t> _availablePins = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 18, 19, 20, 21 };
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
|
#elif defined(CONFIG_IDF_TARGET_ESP32S3)
|
||||||
//Based on https://github.com/atomic14/esp32-s3-pinouts?tab=readme-ov-file and https://docs.espressif.com/projects/esp-idf/en/v5.3/esp32s3/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf
|
//Based on https://github.com/atomic14/esp32-s3-pinouts?tab=readme-ov-file and https://docs.espressif.com/projects/esp-idf/en/latest/esp32s3/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-s3_datasheet_en.pdf
|
||||||
const std::vector<uint8_t> _availablePins = { 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 38, 39, 40, 41, 42 };
|
const std::vector<uint8_t> _availablePins = { 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 21, 38, 39, 40, 41, 42 };
|
||||||
|
#elif defined(CONFIG_IDF_TARGET_ESP32C5)
|
||||||
|
//Based on https://docs.espressif.com/projects/esp-idf/en/latest/esp32c5/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-c5_datasheet_en.pdf
|
||||||
|
const std::vector<uint8_t> _availablePins = { 0, 1, 3, 4, 5, 6, 8, 9, 10, 11, 12, 15, 23, 24, 26 };
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
|
#elif defined(CONFIG_IDF_TARGET_ESP32C6)
|
||||||
//Based on https://docs.espressif.com/projects/esp-idf/en/v5.3/esp32c6/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf
|
//Based on https://docs.espressif.com/projects/esp-idf/en/latest/esp32c6/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-c6_datasheet_en.pdf
|
||||||
const std::vector<uint8_t> _availablePins = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
|
const std::vector<uint8_t> _availablePins = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23 };
|
||||||
|
#elif defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||||
|
//Based on https://docs.espressif.com/projects/esp-idf/en/latest/esp32p4/api-reference/peripherals/gpio.html
|
||||||
|
const std::vector<uint8_t> _availablePins = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 };
|
||||||
#elif defined(CONFIG_IDF_TARGET_ESP32H2)
|
#elif defined(CONFIG_IDF_TARGET_ESP32H2)
|
||||||
//Based on https://docs.espressif.com/projects/esp-idf/en/v5.3/esp32h2/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf
|
//Based on https://docs.espressif.com/projects/esp-idf/en/latest/esp32h2/api-reference/peripherals/gpio.html and https://www.espressif.com/sites/default/files/documentation/esp32-h2_datasheet_en.pdf
|
||||||
const std::vector<uint8_t> _availablePins = { 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 22, 23, 24, 25, 26, 27 };
|
const std::vector<uint8_t> _availablePins = { 0, 1, 2, 3, 4, 5, 8, 9, 10, 11, 12, 13, 14, 22, 23, 24, 25, 26, 27 };
|
||||||
#else
|
#else
|
||||||
//Based on https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
|
//Based on https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
|
||||||
@@ -134,5 +141,7 @@ private:
|
|||||||
std::vector<uint8_t> _triggerState;
|
std::vector<uint8_t> _triggerState;
|
||||||
hw_timer_t* timer = nullptr;
|
hw_timer_t* timer = nullptr;
|
||||||
|
|
||||||
|
bool _first = true;
|
||||||
|
|
||||||
Preferences* _preferences = nullptr;
|
Preferences* _preferences = nullptr;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,11 +11,7 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference
|
|||||||
_buffer(buffer),
|
_buffer(buffer),
|
||||||
_bufferSize(bufferSize)
|
_bufferSize(bufferSize)
|
||||||
{
|
{
|
||||||
_discoveryTopic = _preferences->getString(preference_mqtt_hass_discovery, "");
|
|
||||||
_baseTopic = _preferences->getString(preference_mqtt_lock_path);
|
_baseTopic = _preferences->getString(preference_mqtt_lock_path);
|
||||||
_offEnabled = _preferences->getBool(preference_official_hybrid_enabled, false);
|
|
||||||
_checkUpdates = _preferences->getBool(preference_check_updates, false);
|
|
||||||
_updateFromMQTT = _preferences->getBool(preference_update_from_mqtt, false);
|
|
||||||
_hostname = _preferences->getString(preference_hostname, "");
|
_hostname = _preferences->getString(preference_hostname, "");
|
||||||
uint64_t savedDevId = _preferences->getULong64(preference_nukihub_id, 0);
|
uint64_t savedDevId = _preferences->getULong64(preference_nukihub_id, 0);
|
||||||
uint8_t mac[8];
|
uint8_t mac[8];
|
||||||
@@ -29,7 +25,10 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference
|
|||||||
char uidString[20];
|
char uidString[20];
|
||||||
itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10);
|
itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10);
|
||||||
removeHASSConfig(uidString);
|
removeHASSConfig(uidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
else if(savedDevId != curDevId)
|
else if(savedDevId != curDevId)
|
||||||
{
|
{
|
||||||
@@ -42,10 +41,16 @@ HomeAssistantDiscovery::HomeAssistantDiscovery(NetworkDevice* device, Preference
|
|||||||
char uidString[20];
|
char uidString[20];
|
||||||
itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10);
|
itoa(_preferences->getUInt(preference_device_id_lock, 0), uidString, 10);
|
||||||
removeHASSConfig(uidString);
|
removeHASSConfig(uidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
itoa(savedDevId, uidString, 10);
|
itoa(savedDevId, uidString, 10);
|
||||||
removeHASSConfig(uidString);
|
removeHASSConfig(uidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
sprintf(_nukiHubUidString, "%" PRIu64, curDevId);
|
sprintf(_nukiHubUidString, "%" PRIu64, curDevId);
|
||||||
@@ -97,7 +102,10 @@ void HomeAssistantDiscovery::setupHASS(int type, uint32_t nukiId, char* nukiName
|
|||||||
void HomeAssistantDiscovery::disableHASS()
|
void HomeAssistantDiscovery::disableHASS()
|
||||||
{
|
{
|
||||||
removeHASSConfig(_nukiHubUidString);
|
removeHASSConfig(_nukiHubUidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
char uidString[20];
|
char uidString[20];
|
||||||
|
|
||||||
@@ -105,13 +113,19 @@ void HomeAssistantDiscovery::disableHASS()
|
|||||||
{
|
{
|
||||||
itoa(_preferences->getUInt(preference_nuki_id_lock, 0), uidString, 16);
|
itoa(_preferences->getUInt(preference_nuki_id_lock, 0), uidString, 16);
|
||||||
removeHASSConfig(uidString);
|
removeHASSConfig(uidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
if(_preferences->getUInt(preference_nuki_id_opener, 0) != 0)
|
if(_preferences->getUInt(preference_nuki_id_opener, 0) != 0)
|
||||||
{
|
{
|
||||||
itoa(_preferences->getUInt(preference_nuki_id_opener, 0), uidString, 16);
|
itoa(_preferences->getUInt(preference_nuki_id_opener, 0), uidString, 16);
|
||||||
removeHASSConfig(uidString);
|
removeHASSConfig(uidString);
|
||||||
delay(3000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(3000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -349,7 +363,7 @@ void HomeAssistantDiscovery::publishHASSNukiHubConfig()
|
|||||||
"",
|
"",
|
||||||
{ { (char*)"en", (char*)"true" }});
|
{ { (char*)"en", (char*)"true" }});
|
||||||
|
|
||||||
if(_checkUpdates)
|
if(_preferences->getBool(preference_check_updates, false))
|
||||||
{
|
{
|
||||||
// Nuki Hub latest
|
// Nuki Hub latest
|
||||||
publishHassTopic("sensor",
|
publishHassTopic("sensor",
|
||||||
@@ -375,7 +389,7 @@ void HomeAssistantDiscovery::publishHASSNukiHubConfig()
|
|||||||
_baseTopic.toCharArray(latest_version_topic,_baseTopic.length() + 1);
|
_baseTopic.toCharArray(latest_version_topic,_baseTopic.length() + 1);
|
||||||
strcat(latest_version_topic, mqtt_topic_info_nuki_hub_latest);
|
strcat(latest_version_topic, mqtt_topic_info_nuki_hub_latest);
|
||||||
|
|
||||||
if(!_updateFromMQTT)
|
if(!_preferences->getBool(preference_update_from_mqtt, false))
|
||||||
{
|
{
|
||||||
publishHassTopic("update",
|
publishHassTopic("update",
|
||||||
"nuki_hub_update",
|
"nuki_hub_update",
|
||||||
@@ -667,7 +681,7 @@ void HomeAssistantDiscovery::publishHASSDeviceConfig(char* deviceType, const cha
|
|||||||
"",
|
"",
|
||||||
{ { (char*)"en", (char*)"true" } });
|
{ { (char*)"en", (char*)"true" } });
|
||||||
|
|
||||||
if(_offEnabled && strcmp(deviceType, "SmartLock") == 0)
|
if(_preferences->getBool(preference_official_hybrid_enabled, false) && strcmp(deviceType, "SmartLock") == 0)
|
||||||
{
|
{
|
||||||
// Hybrid connected
|
// Hybrid connected
|
||||||
String hybridPath = _baseTopic;
|
String hybridPath = _baseTopic;
|
||||||
@@ -2988,7 +3002,7 @@ void HomeAssistantDiscovery::publishHassTopic(const String& mqttDeviceType,
|
|||||||
std::vector<std::pair<char*, char*>> additionalEntries
|
std::vector<std::pair<char*, char*>> additionalEntries
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (_discoveryTopic != "")
|
if (_preferences->getString(preference_mqtt_hass_discovery, "") != "")
|
||||||
{
|
{
|
||||||
JsonDocument json;
|
JsonDocument json;
|
||||||
json = createHassJson(uidString, uidStringPostfix, displayName, name, baseTopic, stateTopic, deviceType, deviceClass, stateClass, entityCat, commandTopic, additionalEntries);
|
json = createHassJson(uidString, uidStringPostfix, displayName, name, baseTopic, stateTopic, deviceType, deviceClass, stateClass, entityCat, commandTopic, additionalEntries);
|
||||||
@@ -3000,7 +3014,7 @@ void HomeAssistantDiscovery::publishHassTopic(const String& mqttDeviceType,
|
|||||||
|
|
||||||
String HomeAssistantDiscovery::createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
|
String HomeAssistantDiscovery::createHassTopicPath(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
|
||||||
{
|
{
|
||||||
String path = _discoveryTopic;
|
String path = _preferences->getString(preference_mqtt_hass_discovery, "");
|
||||||
path.concat("/");
|
path.concat("/");
|
||||||
path.concat(mqttDeviceType);
|
path.concat(mqttDeviceType);
|
||||||
path.concat("/");
|
path.concat("/");
|
||||||
@@ -3014,7 +3028,7 @@ String HomeAssistantDiscovery::createHassTopicPath(const String& mqttDeviceType,
|
|||||||
|
|
||||||
void HomeAssistantDiscovery::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
|
void HomeAssistantDiscovery::removeHassTopic(const String& mqttDeviceType, const String& mqttDeviceName, const String& uidString)
|
||||||
{
|
{
|
||||||
if (_discoveryTopic != "")
|
if (_preferences->getString(preference_mqtt_hass_discovery, "") != "")
|
||||||
{
|
{
|
||||||
String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString);
|
String path = createHassTopicPath(mqttDeviceType, mqttDeviceName, uidString);
|
||||||
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, "");
|
_device->mqttPublish(path.c_str(), MQTT_QOS_LEVEL, true, "");
|
||||||
|
|||||||
@@ -59,17 +59,12 @@ private:
|
|||||||
NetworkDevice* _device = nullptr;
|
NetworkDevice* _device = nullptr;
|
||||||
Preferences* _preferences = nullptr;
|
Preferences* _preferences = nullptr;
|
||||||
|
|
||||||
String _discoveryTopic;
|
|
||||||
String _baseTopic;
|
String _baseTopic;
|
||||||
String _hostname;
|
String _hostname;
|
||||||
|
|
||||||
JsonDocument _uidToName;
|
JsonDocument _uidToName;
|
||||||
char _nukiHubUidString[20];
|
char _nukiHubUidString[20];
|
||||||
|
|
||||||
bool _offEnabled = false;
|
|
||||||
bool _checkUpdates = false;
|
|
||||||
bool _updateFromMQTT = false;
|
|
||||||
|
|
||||||
char* _buffer;
|
char* _buffer;
|
||||||
const size_t _bufferSize;
|
const size_t _bufferSize;
|
||||||
};
|
};
|
||||||
@@ -41,6 +41,7 @@ void ImportExport::readSettings()
|
|||||||
_totpEnabled = _totpKey.length() > 0;
|
_totpEnabled = _totpKey.length() > 0;
|
||||||
_bypassKey = _preferences->getString(preference_bypass_secret, "");
|
_bypassKey = _preferences->getString(preference_bypass_secret, "");
|
||||||
_bypassEnabled = _bypassKey.length() > 0;
|
_bypassEnabled = _bypassKey.length() > 0;
|
||||||
|
_updateTime = _preferences->getBool(preference_update_time, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ImportExport::getDuoEnabled()
|
bool ImportExport::getDuoEnabled()
|
||||||
@@ -117,7 +118,7 @@ void ImportExport::setDuoCheckId(String duoCheckId)
|
|||||||
|
|
||||||
void ImportExport::saveSessions()
|
void ImportExport::saveSessions()
|
||||||
{
|
{
|
||||||
if(_preferences->getBool(preference_update_time, false))
|
if(_updateTime)
|
||||||
{
|
{
|
||||||
if (!SPIFFS.begin(true))
|
if (!SPIFFS.begin(true))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ private:
|
|||||||
bool _duoActiveRequest;
|
bool _duoActiveRequest;
|
||||||
bool _duoEnabled = false;
|
bool _duoEnabled = false;
|
||||||
bool _bypassGPIO = false;
|
bool _bypassGPIO = false;
|
||||||
|
bool _updateTime = false;
|
||||||
int _bypassGPIOHigh = -1;
|
int _bypassGPIOHigh = -1;
|
||||||
int _bypassGPIOLow = -1;
|
int _bypassGPIOLow = -1;
|
||||||
int64_t _duoRequestTS = 0;
|
int64_t _duoRequestTS = 0;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ extern const uint8_t x509_crt_imported_bundle_bin_start[] asm("_binary_x509_crt_
|
|||||||
extern const uint8_t x509_crt_imported_bundle_bin_end[] asm("_binary_x509_crt_bundle_end");
|
extern const uint8_t x509_crt_imported_bundle_bin_end[] asm("_binary_x509_crt_bundle_end");
|
||||||
|
|
||||||
#ifndef NUKI_HUB_UPDATER
|
#ifndef NUKI_HUB_UPDATER
|
||||||
NukiNetwork::NukiNetwork(Preferences *preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize, ImportExport* importExport)
|
NukiNetwork::NukiNetwork(Preferences *preferences, Gpio* gpio, char* buffer, size_t bufferSize, ImportExport* importExport)
|
||||||
: _preferences(preferences),
|
: _preferences(preferences),
|
||||||
_gpio(gpio),
|
_gpio(gpio),
|
||||||
_buffer(buffer),
|
_buffer(buffer),
|
||||||
@@ -35,33 +35,6 @@ NukiNetwork::NukiNetwork(Preferences *preferences)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
_inst = this;
|
_inst = this;
|
||||||
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
|
|
||||||
|
|
||||||
#ifndef NUKI_HUB_UPDATER
|
|
||||||
memset(_maintenancePathPrefix, 0, sizeof(_maintenancePathPrefix));
|
|
||||||
size_t len = maintenancePathPrefix.length();
|
|
||||||
for(int i=0; i < len; i++)
|
|
||||||
{
|
|
||||||
_maintenancePathPrefix[i] = maintenancePathPrefix.charAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
_lockPath = _preferences->getString(preference_mqtt_lock_path);
|
|
||||||
String connectionStateTopic = _lockPath + mqtt_topic_mqtt_connection_state;
|
|
||||||
|
|
||||||
memset(_mqttConnectionStateTopic, 0, sizeof(_mqttConnectionStateTopic));
|
|
||||||
len = connectionStateTopic.length();
|
|
||||||
for(int i=0; i < len; i++)
|
|
||||||
{
|
|
||||||
_mqttConnectionStateTopic[i] = connectionStateTopic.charAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_preferences->getString(preference_mqtt_hass_discovery, "") != "" && !_preferences->getBool(preference_mqtt_hass_enabled, false))
|
|
||||||
{
|
|
||||||
_preferences->putBool(preference_mqtt_hass_enabled, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
setupDevice();
|
setupDevice();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,9 +49,9 @@ void NukiNetwork::setupDevice()
|
|||||||
|
|
||||||
if(hardwareDetect == 0)
|
if(hardwareDetect == 0)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_IDF_TARGET_ESP32H2
|
#ifndef CONFIG_IDF_TARGET_ESP32H2
|
||||||
hardwareDetect = 1;
|
hardwareDetect = 1;
|
||||||
#else
|
#else
|
||||||
hardwareDetect = 11;
|
hardwareDetect = 11;
|
||||||
_preferences->putInt(preference_network_custom_addr, 1);
|
_preferences->putInt(preference_network_custom_addr, 1);
|
||||||
_preferences->putInt(preference_network_custom_cs, 8);
|
_preferences->putInt(preference_network_custom_cs, 8);
|
||||||
@@ -88,13 +61,13 @@ void NukiNetwork::setupDevice()
|
|||||||
_preferences->putInt(preference_network_custom_miso, 12);
|
_preferences->putInt(preference_network_custom_miso, 12);
|
||||||
_preferences->putInt(preference_network_custom_mosi, 13);
|
_preferences->putInt(preference_network_custom_mosi, 13);
|
||||||
_preferences->putBool(preference_ntw_reconfigure, true);
|
_preferences->putBool(preference_ntw_reconfigure, true);
|
||||||
#endif
|
#endif
|
||||||
_preferences->putInt(preference_network_hardware, hardwareDetect);
|
_preferences->putInt(preference_network_hardware, hardwareDetect);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(wifiFallback == true)
|
if(wifiFallback == true)
|
||||||
{
|
{
|
||||||
#ifndef CONFIG_IDF_TARGET_ESP32H2
|
#ifndef CONFIG_IDF_TARGET_ESP32H2
|
||||||
if(!_firstBootAfterDeviceChange)
|
if(!_firstBootAfterDeviceChange)
|
||||||
{
|
{
|
||||||
Log->println("Failed to connect to network. Wi-Fi fallback is disabled, rebooting.");
|
Log->println("Failed to connect to network. Wi-Fi fallback is disabled, rebooting.");
|
||||||
@@ -105,7 +78,7 @@ void NukiNetwork::setupDevice()
|
|||||||
|
|
||||||
Log->println("Switching to Wi-Fi device as fallback.");
|
Log->println("Switching to Wi-Fi device as fallback.");
|
||||||
_networkDeviceType = NetworkDeviceType::WiFi;
|
_networkDeviceType = NetworkDeviceType::WiFi;
|
||||||
#else
|
#else
|
||||||
int custEth = _preferences->getInt(preference_network_custom_phy, 0);
|
int custEth = _preferences->getInt(preference_network_custom_phy, 0);
|
||||||
|
|
||||||
if(custEth<3)
|
if(custEth<3)
|
||||||
@@ -118,7 +91,7 @@ void NukiNetwork::setupDevice()
|
|||||||
}
|
}
|
||||||
_preferences->putInt(preference_network_custom_phy, custEth);
|
_preferences->putInt(preference_network_custom_phy, custEth);
|
||||||
_preferences->putBool(preference_ntw_reconfigure, true);
|
_preferences->putBool(preference_ntw_reconfigure, true);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -130,19 +103,9 @@ void NukiNetwork::setupDevice()
|
|||||||
Log->print("Network device: ");
|
Log->print("Network device: ");
|
||||||
Log->println(_device->deviceName());
|
Log->println(_device->deviceName());
|
||||||
|
|
||||||
#ifndef NUKI_HUB_UPDATER
|
#ifndef NUKI_HUB_UPDATER
|
||||||
_device->mqttOnConnect([&](bool sessionPresent)
|
|
||||||
{
|
|
||||||
onMqttConnect(sessionPresent);
|
|
||||||
});
|
|
||||||
_device->mqttOnDisconnect([&](espMqttClientTypes::DisconnectReason reason)
|
|
||||||
{
|
|
||||||
onMqttDisconnect(reason);
|
|
||||||
});
|
|
||||||
|
|
||||||
_hadiscovery = new HomeAssistantDiscovery(_device, _preferences, _buffer, _bufferSize);
|
_hadiscovery = new HomeAssistantDiscovery(_device, _preferences, _buffer, _bufferSize);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NukiNetwork::reconfigureDevice()
|
void NukiNetwork::reconfigureDevice()
|
||||||
@@ -212,6 +175,11 @@ bool NukiNetwork::wifiConnected()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String NukiNetwork::localIP()
|
||||||
|
{
|
||||||
|
return _device->localIP();
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef NUKI_HUB_UPDATER
|
#ifdef NUKI_HUB_UPDATER
|
||||||
void NukiNetwork::initialize()
|
void NukiNetwork::initialize()
|
||||||
{
|
{
|
||||||
@@ -248,6 +216,9 @@ bool NukiNetwork::update()
|
|||||||
#else
|
#else
|
||||||
void NukiNetwork::initialize()
|
void NukiNetwork::initialize()
|
||||||
{
|
{
|
||||||
|
readSettings();
|
||||||
|
setMQTTConnectionSettings();
|
||||||
|
|
||||||
_gpio->addCallback([this](const GpioAction& action, const int& pin)
|
_gpio->addCallback([this](const GpioAction& action, const int& pin)
|
||||||
{
|
{
|
||||||
gpioActionCallback(action, pin);
|
gpioActionCallback(action, pin);
|
||||||
@@ -255,14 +226,6 @@ void NukiNetwork::initialize()
|
|||||||
|
|
||||||
if(!disableNetwork)
|
if(!disableNetwork)
|
||||||
{
|
{
|
||||||
String mqttPath = _preferences->getString(preference_mqtt_lock_path, "");
|
|
||||||
|
|
||||||
size_t len = mqttPath.length();
|
|
||||||
for(int i=0; i < len; i++)
|
|
||||||
{
|
|
||||||
_nukiHubPath[i] = mqttPath.charAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
_hostname = _preferences->getString(preference_hostname, "");
|
_hostname = _preferences->getString(preference_hostname, "");
|
||||||
|
|
||||||
if(_hostname == "")
|
if(_hostname == "")
|
||||||
@@ -277,48 +240,12 @@ void NukiNetwork::initialize()
|
|||||||
_preferences->putString(preference_hostname, _hostname);
|
_preferences->putString(preference_hostname, _hostname);
|
||||||
}
|
}
|
||||||
|
|
||||||
_mqttPort = _preferences->getInt(preference_mqtt_broker_port, 0);
|
|
||||||
|
|
||||||
if(_mqttPort == 0)
|
|
||||||
{
|
|
||||||
_mqttPort = 1883;
|
|
||||||
_preferences->putInt(preference_mqtt_broker_port, _mqttPort);
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy(_hostnameArr, _hostname.c_str());
|
strcpy(_hostnameArr, _hostname.c_str());
|
||||||
_device->initialize();
|
_device->initialize();
|
||||||
|
|
||||||
Log->print("Host name: ");
|
Log->print("Host name: ");
|
||||||
Log->println(_hostname);
|
Log->println(_hostname);
|
||||||
|
|
||||||
String brokerAddr = _preferences->getString(preference_mqtt_broker);
|
|
||||||
strcpy(_mqttBrokerAddr, brokerAddr.c_str());
|
|
||||||
|
|
||||||
String mqttUser = _preferences->getString(preference_mqtt_user);
|
|
||||||
if(mqttUser.length() > 0)
|
|
||||||
{
|
|
||||||
size_t len = mqttUser.length();
|
|
||||||
for(int i=0; i < len; i++)
|
|
||||||
{
|
|
||||||
_mqttUser[i] = mqttUser.charAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String mqttPass = _preferences->getString(preference_mqtt_password);
|
|
||||||
if(mqttPass.length() > 0)
|
|
||||||
{
|
|
||||||
size_t len = mqttPass.length();
|
|
||||||
for(int i=0; i < len; i++)
|
|
||||||
{
|
|
||||||
_mqttPass[i] = mqttPass.charAt(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Log->print("MQTT Broker: ");
|
|
||||||
Log->print(_mqttBrokerAddr);
|
|
||||||
Log->print(":");
|
|
||||||
Log->println(_mqttPort);
|
|
||||||
|
|
||||||
_device->mqttSetClientId(_hostnameArr);
|
_device->mqttSetClientId(_hostnameArr);
|
||||||
_device->mqttSetCleanSession(false);
|
_device->mqttSetCleanSession(false);
|
||||||
_device->mqttSetKeepAlive(60);
|
_device->mqttSetKeepAlive(60);
|
||||||
@@ -359,13 +286,12 @@ void NukiNetwork::initialize()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
readSettings();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void NukiNetwork::readSettings()
|
void NukiNetwork::readSettings()
|
||||||
{
|
{
|
||||||
|
_webEnabled = _preferences->getBool(preference_webserver_enabled, true);
|
||||||
_disableNetworkIfNotConnected = _preferences->getBool(preference_disable_network_not_connected, false);
|
_disableNetworkIfNotConnected = _preferences->getBool(preference_disable_network_not_connected, false);
|
||||||
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect, false);
|
_restartOnDisconnect = _preferences->getBool(preference_restart_on_disconnect, false);
|
||||||
_checkUpdates = _preferences->getBool(preference_check_updates, false);
|
_checkUpdates = _preferences->getBool(preference_check_updates, false);
|
||||||
@@ -388,6 +314,110 @@ void NukiNetwork::readSettings()
|
|||||||
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info, false);
|
_publishDebugInfo = _preferences->getBool(preference_publish_debug_info, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NukiNetwork::setMQTTConnectionSettings()
|
||||||
|
{
|
||||||
|
String mqttPath = _preferences->getString(preference_mqtt_lock_path, "");
|
||||||
|
memset(_nukiHubPath, 0, sizeof(_nukiHubPath));
|
||||||
|
size_t len = mqttPath.length();
|
||||||
|
for(int i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
_nukiHubPath[i] = mqttPath.charAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
String maintenancePathPrefix = _preferences->getString(preference_mqtt_lock_path);
|
||||||
|
memset(_maintenancePathPrefix, 0, sizeof(_maintenancePathPrefix));
|
||||||
|
len = maintenancePathPrefix.length();
|
||||||
|
for(int i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
_maintenancePathPrefix[i] = maintenancePathPrefix.charAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
_lockPath = _preferences->getString(preference_mqtt_lock_path);
|
||||||
|
String connectionStateTopic = _lockPath + mqtt_topic_mqtt_connection_state;
|
||||||
|
|
||||||
|
memset(_mqttConnectionStateTopic, 0, sizeof(_mqttConnectionStateTopic));
|
||||||
|
len = connectionStateTopic.length();
|
||||||
|
for(int i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
_mqttConnectionStateTopic[i] = connectionStateTopic.charAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(_preferences->getString(preference_mqtt_hass_discovery, "") != "" && !_preferences->getBool(preference_mqtt_hass_enabled, false))
|
||||||
|
{
|
||||||
|
_preferences->putBool(preference_mqtt_hass_enabled, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(_mqttBrokerAddr, 0, sizeof(_mqttBrokerAddr));
|
||||||
|
memset(_mqttUser, 0, sizeof(_mqttUser));
|
||||||
|
memset(_mqttPass, 0, sizeof(_mqttPass));
|
||||||
|
|
||||||
|
String brokerAddr = _preferences->getString(preference_mqtt_broker);
|
||||||
|
strcpy(_mqttBrokerAddr, brokerAddr.c_str());
|
||||||
|
|
||||||
|
_mqttPort = _preferences->getInt(preference_mqtt_broker_port, 0);
|
||||||
|
|
||||||
|
if(_mqttPort == 0)
|
||||||
|
{
|
||||||
|
_mqttPort = 1883;
|
||||||
|
_preferences->putInt(preference_mqtt_broker_port, _mqttPort);
|
||||||
|
}
|
||||||
|
|
||||||
|
String mqttUser = _preferences->getString(preference_mqtt_user);
|
||||||
|
if(mqttUser.length() > 0)
|
||||||
|
{
|
||||||
|
len = mqttUser.length();
|
||||||
|
for(int i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
_mqttUser[i] = mqttUser.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String mqttPass = _preferences->getString(preference_mqtt_password);
|
||||||
|
if(mqttPass.length() > 0)
|
||||||
|
{
|
||||||
|
len = mqttPass.length();
|
||||||
|
for(int i=0; i < len; i++)
|
||||||
|
{
|
||||||
|
_mqttPass[i] = mqttPass.charAt(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Log->print("MQTT Broker: ");
|
||||||
|
Log->print(_mqttBrokerAddr);
|
||||||
|
Log->print(":");
|
||||||
|
Log->println(_mqttPort);
|
||||||
|
|
||||||
|
#ifndef NUKI_HUB_UPDATER
|
||||||
|
_device->mqttOnConnect([&](bool sessionPresent)
|
||||||
|
{
|
||||||
|
onMqttConnect(sessionPresent);
|
||||||
|
});
|
||||||
|
_device->mqttOnDisconnect([&](espMqttClientTypes::DisconnectReason reason)
|
||||||
|
{
|
||||||
|
onMqttDisconnect(reason);
|
||||||
|
});
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
int NukiNetwork::getRestartServices()
|
||||||
|
{
|
||||||
|
int restartServices = _restartServices;
|
||||||
|
_restartServices = 0;
|
||||||
|
return restartServices;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NukiNetwork::setRestartServices(bool reconnect)
|
||||||
|
{
|
||||||
|
if (reconnect)
|
||||||
|
{
|
||||||
|
_restartServices = 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_restartServices = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool NukiNetwork::update()
|
bool NukiNetwork::update()
|
||||||
{
|
{
|
||||||
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
@@ -446,7 +476,10 @@ bool NukiNetwork::update()
|
|||||||
bool success = reconnect();
|
bool success = reconnect();
|
||||||
if(!success)
|
if(!success)
|
||||||
{
|
{
|
||||||
delay(2000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
_mqttConnectCounter++;
|
_mqttConnectCounter++;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -455,14 +488,20 @@ bool NukiNetwork::update()
|
|||||||
if(forceEnableWebServer && !_webEnabled)
|
if(forceEnableWebServer && !_webEnabled)
|
||||||
{
|
{
|
||||||
forceEnableWebServer = false;
|
forceEnableWebServer = false;
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
restartEsp(RestartReason::ReconfigureWebServer);
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
|
setRestartServices(false);
|
||||||
}
|
}
|
||||||
else if(!_webEnabled)
|
else if(!_webEnabled)
|
||||||
{
|
{
|
||||||
forceEnableWebServer = false;
|
forceEnableWebServer = false;
|
||||||
}
|
}
|
||||||
delay(2000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!_device->isConnected() || !_device->mqttConnected() )
|
if(!_device->isConnected() || !_device->mqttConnected() )
|
||||||
@@ -474,10 +513,16 @@ bool NukiNetwork::update()
|
|||||||
forceEnableWebServer = true;
|
forceEnableWebServer = true;
|
||||||
}
|
}
|
||||||
Log->println("Network timeout has been reached, restarting ...");
|
Log->println("Network timeout has been reached, restarting ...");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::NetworkTimeoutWatchdog);
|
restartEsp(RestartReason::NetworkTimeoutWatchdog);
|
||||||
}
|
}
|
||||||
delay(2000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -656,12 +701,21 @@ void NukiNetwork::onMqttDisconnect(const espMqttClientTypes::DisconnectReason &r
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool NukiNetwork::reconnect()
|
bool NukiNetwork::reconnect(bool force)
|
||||||
{
|
{
|
||||||
_mqttConnectionState = 0;
|
_mqttConnectionState = 0;
|
||||||
|
|
||||||
while (!_device->mqttConnected() && espMillis() > _nextReconnect)
|
while (force || (!_device->mqttConnected() && espMillis() > _nextReconnect))
|
||||||
{
|
{
|
||||||
|
if (force)
|
||||||
|
{
|
||||||
|
_mqttReceivers.clear();
|
||||||
|
_device->mqttRestart();
|
||||||
|
setMQTTConnectionSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
force = false;
|
||||||
|
|
||||||
if(strcmp(_mqttBrokerAddr, "") == 0)
|
if(strcmp(_mqttBrokerAddr, "") == 0)
|
||||||
{
|
{
|
||||||
Log->println("MQTT Broker not configured, aborting connection attempt.");
|
Log->println("MQTT Broker not configured, aborting connection attempt.");
|
||||||
@@ -697,7 +751,10 @@ bool NukiNetwork::reconnect()
|
|||||||
|
|
||||||
while(!_connectReplyReceived && espMillis() < timeout)
|
while(!_connectReplyReceived && espMillis() < timeout)
|
||||||
{
|
{
|
||||||
delay(50);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(50 / portTICK_PERIOD_MS);
|
||||||
_device->update();
|
_device->update();
|
||||||
if(_keepAliveCallback != nullptr)
|
if(_keepAliveCallback != nullptr)
|
||||||
{
|
{
|
||||||
@@ -710,7 +767,10 @@ bool NukiNetwork::reconnect()
|
|||||||
Log->println("MQTT connected");
|
Log->println("MQTT connected");
|
||||||
_mqttConnectedTs = millis();
|
_mqttConnectedTs = millis();
|
||||||
_mqttConnectionState = 1;
|
_mqttConnectionState = 1;
|
||||||
delay(100);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
_device->mqttOnMessage(onMqttDataReceivedCallback);
|
_device->mqttOnMessage(onMqttDataReceivedCallback);
|
||||||
|
|
||||||
if(_firstConnect)
|
if(_firstConnect)
|
||||||
@@ -955,7 +1015,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
{
|
{
|
||||||
Log->println("Restart requested via MQTT.");
|
Log->println("Restart requested via MQTT.");
|
||||||
clearWifiFallback();
|
clearWifiFallback();
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::RequestedViaMqtt);
|
restartEsp(RestartReason::RequestedViaMqtt);
|
||||||
}
|
}
|
||||||
else if(comparePrefixedPath(topic, mqtt_topic_update) && strcmp(data, "1") == 0 && _preferences->getBool(preference_update_from_mqtt, false) && !mqttRecentlyConnected())
|
else if(comparePrefixedPath(topic, mqtt_topic_update) && strcmp(data, "1") == 0 && _preferences->getBool(preference_update_from_mqtt, false) && !mqttRecentlyConnected())
|
||||||
@@ -1008,7 +1071,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
_preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL);
|
_preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL);
|
||||||
_preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL);
|
_preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL);
|
||||||
Log->println("Updating to latest release version.");
|
Log->println("Updating to latest release version.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::OTAReboot);
|
restartEsp(RestartReason::OTAReboot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1023,7 +1089,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
_preferences->putString(preference_ota_updater_url, GITHUB_BETA_UPDATER_BINARY_URL);
|
_preferences->putString(preference_ota_updater_url, GITHUB_BETA_UPDATER_BINARY_URL);
|
||||||
_preferences->putString(preference_ota_main_url, GITHUB_BETA_RELEASE_BINARY_URL);
|
_preferences->putString(preference_ota_main_url, GITHUB_BETA_RELEASE_BINARY_URL);
|
||||||
Log->println("Updating to latest beta version.");
|
Log->println("Updating to latest beta version.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::OTAReboot);
|
restartEsp(RestartReason::OTAReboot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1038,7 +1107,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
_preferences->putString(preference_ota_updater_url, GITHUB_MASTER_UPDATER_BINARY_URL);
|
_preferences->putString(preference_ota_updater_url, GITHUB_MASTER_UPDATER_BINARY_URL);
|
||||||
_preferences->putString(preference_ota_main_url, GITHUB_MASTER_RELEASE_BINARY_URL);
|
_preferences->putString(preference_ota_main_url, GITHUB_MASTER_RELEASE_BINARY_URL);
|
||||||
Log->println("Updating to latest developmemt version.");
|
Log->println("Updating to latest developmemt version.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::OTAReboot);
|
restartEsp(RestartReason::OTAReboot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1053,7 +1125,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
_preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL);
|
_preferences->putString(preference_ota_updater_url, GITHUB_LATEST_UPDATER_BINARY_URL);
|
||||||
_preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL);
|
_preferences->putString(preference_ota_main_url, GITHUB_LATEST_RELEASE_BINARY_URL);
|
||||||
Log->println("Updating to latest release version.");
|
Log->println("Updating to latest release version.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::OTAReboot);
|
restartEsp(RestartReason::OTAReboot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1077,7 +1152,7 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log->println("Webserver enabled, restarting.");
|
Log->println("Webserver enabled");
|
||||||
_preferences->putBool(preference_webserver_enabled, true);
|
_preferences->putBool(preference_webserver_enabled, true);
|
||||||
}
|
}
|
||||||
else if (strcmp(data, "0") == 0)
|
else if (strcmp(data, "0") == 0)
|
||||||
@@ -1086,12 +1161,15 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Log->println("Webserver disabled, restarting.");
|
Log->println("Webserver disabled");
|
||||||
_preferences->putBool(preference_webserver_enabled, false);
|
_preferences->putBool(preference_webserver_enabled, false);
|
||||||
}
|
}
|
||||||
clearWifiFallback();
|
clearWifiFallback();
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
restartEsp(RestartReason::ReconfigureWebServer);
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
|
setRestartServices(false);
|
||||||
}
|
}
|
||||||
else if(comparePrefixedPath(topic, mqtt_topic_nuki_hub_config_action) && !mqttRecentlyConnected())
|
else if(comparePrefixedPath(topic, mqtt_topic_nuki_hub_config_action) && !mqttRecentlyConnected())
|
||||||
{
|
{
|
||||||
@@ -1141,9 +1219,11 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
while (duoResult == 2)
|
while (duoResult == 2)
|
||||||
{
|
{
|
||||||
duoResult = _importExport->checkDuoApprove();
|
duoResult = _importExport->checkDuoApprove();
|
||||||
delay(2000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
esp_task_wdt_reset();
|
esp_task_wdt_reset();
|
||||||
}
|
}
|
||||||
|
vTaskDelay(2000 / portTICK_PERIOD_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (duoResult != 1)
|
if (duoResult != 1)
|
||||||
@@ -1259,7 +1339,10 @@ void NukiNetwork::onMqttDataReceived(const char* topic, byte* payload, const uns
|
|||||||
serializeJson(json, _buffer, _bufferSize);
|
serializeJson(json, _buffer, _bufferSize);
|
||||||
publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_json, _buffer, false);
|
publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_json, _buffer, false);
|
||||||
publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_action, "--", true);
|
publishString(_maintenancePathPrefix, mqtt_topic_nuki_hub_config_action, "--", true);
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::ConfigurationUpdated);
|
restartEsp(RestartReason::ConfigurationUpdated);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1396,10 +1479,10 @@ void NukiNetwork::removeTopic(const String& mqttPath, const String& mqttTopic)
|
|||||||
path.concat(mqttTopic);
|
path.concat(mqttTopic);
|
||||||
publish(path.c_str(), "", true);
|
publish(path.c_str(), "", true);
|
||||||
|
|
||||||
#ifdef DEBUG_NUKIHUB
|
#ifdef DEBUG_NUKIHUB
|
||||||
Log->print("Removing MQTT topic: ");
|
Log->print("Removing MQTT topic: ");
|
||||||
Log->println(path.c_str());
|
Log->println(path.c_str());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void NukiNetwork::setupHASS(int type, uint32_t nukiId, char* nukiName, const char* firmwareVersion, const char* hardwareVersion, bool hasDoorSensor, bool hasKeypad)
|
void NukiNetwork::setupHASS(int type, uint32_t nukiId, char* nukiName, const char* firmwareVersion, const char* hardwareVersion, bool hasDoorSensor, bool hasKeypad)
|
||||||
@@ -1653,9 +1736,4 @@ void NukiNetwork::disableMqtt()
|
|||||||
_device->mqttDisable();
|
_device->mqttDisable();
|
||||||
_mqttEnabled = false;
|
_mqttEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
String NukiNetwork::localIP()
|
|
||||||
{
|
|
||||||
return _device->localIP();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -32,24 +32,27 @@ public:
|
|||||||
bool mqttConnected();
|
bool mqttConnected();
|
||||||
bool wifiConnected();
|
bool wifiConnected();
|
||||||
void clearWifiFallback();
|
void clearWifiFallback();
|
||||||
|
int getRestartServices();
|
||||||
|
void setRestartServices(bool reconnect = false);
|
||||||
|
|
||||||
const String networkDeviceName() const;
|
const String networkDeviceName() const;
|
||||||
const String networkBSSID() const;
|
const String networkBSSID() const;
|
||||||
const NetworkDeviceType networkDeviceType();
|
const NetworkDeviceType networkDeviceType();
|
||||||
void setKeepAliveCallback(std::function<void()> reconnectTick);
|
void setKeepAliveCallback(std::function<void()> reconnectTick);
|
||||||
|
String localIP();
|
||||||
|
|
||||||
NetworkDevice* device();
|
NetworkDevice* device();
|
||||||
|
|
||||||
#ifdef NUKI_HUB_UPDATER
|
#ifdef NUKI_HUB_UPDATER
|
||||||
explicit NukiNetwork(Preferences* preferences);
|
explicit NukiNetwork(Preferences* preferences);
|
||||||
#else
|
#else
|
||||||
explicit NukiNetwork(Preferences* preferences, Gpio* gpio, const String& maintenancePathPrefix, char* buffer, size_t bufferSize, ImportExport* importExport);
|
explicit NukiNetwork(Preferences* preferences, Gpio* gpio, char* buffer, size_t bufferSize, ImportExport* importExport);
|
||||||
|
|
||||||
void registerMqttReceiver(MqttReceiver* receiver);
|
void registerMqttReceiver(MqttReceiver* receiver);
|
||||||
void disableAutoRestarts(); // disable on OTA start
|
void disableAutoRestarts(); // disable on OTA start
|
||||||
void disableMqtt();
|
void disableMqtt();
|
||||||
String localIP();
|
|
||||||
|
|
||||||
|
bool reconnect(bool force = false);
|
||||||
void subscribe(const char* prefix, const char* path);
|
void subscribe(const char* prefix, const char* path);
|
||||||
void initTopic(const char* prefix, const char* path, const char* value);
|
void initTopic(const char* prefix, const char* path, const char* value);
|
||||||
void publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision = 2);
|
void publishFloat(const char* prefix, const char* topic, const float value, bool retain, const uint8_t precision = 2);
|
||||||
@@ -93,7 +96,7 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
private:
|
private:
|
||||||
void setupDevice();
|
void setupDevice();
|
||||||
bool reconnect();
|
void setMQTTConnectionSettings();
|
||||||
|
|
||||||
static NukiNetwork* _inst;
|
static NukiNetwork* _inst;
|
||||||
|
|
||||||
@@ -132,6 +135,7 @@ private:
|
|||||||
ImportExport* _importExport;
|
ImportExport* _importExport;
|
||||||
Gpio* _gpio;
|
Gpio* _gpio;
|
||||||
|
|
||||||
|
int _restartServices = 0;
|
||||||
int _mqttConnectionState = 0;
|
int _mqttConnectionState = 0;
|
||||||
int _mqttConnectCounter = 0;
|
int _mqttConnectCounter = 0;
|
||||||
int _mqttPort = 1883;
|
int _mqttPort = 1883;
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include "RestartReason.h"
|
#include "RestartReason.h"
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include "hal/wdt_hal.h"
|
||||||
|
|
||||||
extern bool forceEnableWebServer;
|
extern bool forceEnableWebServer;
|
||||||
extern const uint8_t x509_crt_imported_bundle_bin_start[] asm("_binary_x509_crt_bundle_start");
|
extern const uint8_t x509_crt_imported_bundle_bin_start[] asm("_binary_x509_crt_bundle_start");
|
||||||
@@ -160,6 +161,11 @@ void NukiNetworkLock::initialize()
|
|||||||
|
|
||||||
bool NukiNetworkLock::update()
|
bool NukiNetworkLock::update()
|
||||||
{
|
{
|
||||||
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
|
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_feed(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_write_protect_enable(&rtc_wdt_ctx);
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
if(_nukiOfficial->hasOffStateToPublish())
|
if(_nukiOfficial->hasOffStateToPublish())
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#include "Logger.h"
|
#include "Logger.h"
|
||||||
#include "Config.h"
|
#include "Config.h"
|
||||||
#include <ArduinoJson.h>
|
#include <ArduinoJson.h>
|
||||||
|
#include "hal/wdt_hal.h"
|
||||||
|
|
||||||
NukiNetworkOpener::NukiNetworkOpener(NukiNetwork* network, Preferences* preferences, char* buffer, size_t bufferSize)
|
NukiNetworkOpener::NukiNetworkOpener(NukiNetwork* network, Preferences* preferences, char* buffer, size_t bufferSize)
|
||||||
: _preferences(preferences),
|
: _preferences(preferences),
|
||||||
@@ -131,6 +132,11 @@ void NukiNetworkOpener::initialize()
|
|||||||
|
|
||||||
void NukiNetworkOpener::update()
|
void NukiNetworkOpener::update()
|
||||||
{
|
{
|
||||||
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
|
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_feed(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_write_protect_enable(&rtc_wdt_ctx);
|
||||||
|
|
||||||
if(_resetRingStateTs != 0 && espMillis() >= _resetRingStateTs)
|
if(_resetRingStateTs != 0 && espMillis() >= _resetRingStateTs)
|
||||||
{
|
{
|
||||||
_resetRingStateTs = 0;
|
_resetRingStateTs = 0;
|
||||||
|
|||||||
@@ -62,10 +62,10 @@ void NukiOpenerWrapper::initialize()
|
|||||||
_nukiOpener.setDebugCommand(_preferences->getBool(preference_debug_command, false));
|
_nukiOpener.setDebugCommand(_preferences->getBool(preference_debug_command, false));
|
||||||
_nukiOpener.registerLogger(Log);
|
_nukiOpener.registerLogger(Log);
|
||||||
|
|
||||||
_nukiOpener.initialize(_preferences->getBool(preference_connect_mode, true));
|
_nukiOpener.initialize();
|
||||||
_nukiOpener.registerBleScanner(_bleScanner);
|
_nukiOpener.registerBleScanner(_bleScanner);
|
||||||
_nukiOpener.setEventHandler(this);
|
_nukiOpener.setEventHandler(this);
|
||||||
_nukiOpener.setConnectTimeout(3);
|
_nukiOpener.setConnectTimeout(2);
|
||||||
_nukiOpener.setDisconnectTimeout(2000);
|
_nukiOpener.setDisconnectTimeout(2000);
|
||||||
|
|
||||||
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
|
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
|
||||||
@@ -214,6 +214,16 @@ void NukiOpenerWrapper::readSettings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t NukiOpenerWrapper::restartController()
|
||||||
|
{
|
||||||
|
return _restartController;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NukiOpenerWrapper::hasConnected()
|
||||||
|
{
|
||||||
|
return _hasConnected;
|
||||||
|
}
|
||||||
|
|
||||||
void NukiOpenerWrapper::update()
|
void NukiOpenerWrapper::update()
|
||||||
{
|
{
|
||||||
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
@@ -237,7 +247,10 @@ void NukiOpenerWrapper::update()
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,9 +267,12 @@ void NukiOpenerWrapper::update()
|
|||||||
{
|
{
|
||||||
Log->print("No BLE beacon received from the opener for ");
|
Log->print("No BLE beacon received from the opener for ");
|
||||||
Log->print((ts - lastReceivedBeaconTs) / 1000);
|
Log->print((ts - lastReceivedBeaconTs) / 1000);
|
||||||
Log->println(" seconds, restarting device.");
|
Log->println(" seconds, signalling to restart BLE controller.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
restartEsp(RestartReason::BLEBeaconWatchdog);
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
|
_restartController = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
_nukiOpener.updateConnectionState();
|
_nukiOpener.updateConnectionState();
|
||||||
@@ -288,7 +304,10 @@ void NukiOpenerWrapper::update()
|
|||||||
|
|
||||||
_network->publishRetry(std::to_string(retryCount + 1));
|
_network->publishRetry(std::to_string(retryCount + 1));
|
||||||
|
|
||||||
delay(_retryDelay);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(_retryDelay / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
++retryCount;
|
++retryCount;
|
||||||
}
|
}
|
||||||
@@ -318,9 +337,17 @@ void NukiOpenerWrapper::update()
|
|||||||
}
|
}
|
||||||
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
if(_statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
||||||
{
|
{
|
||||||
_statusUpdated = updateKeyTurnerState();
|
|
||||||
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
||||||
|
_statusUpdated = updateKeyTurnerState();
|
||||||
_network->publishStatusUpdated(_statusUpdated);
|
_network->publishStatusUpdated(_statusUpdated);
|
||||||
|
|
||||||
|
if(_statusUpdated)
|
||||||
|
{
|
||||||
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(_network->mqttConnectionState() == 2)
|
if(_network->mqttConnectionState() == 2)
|
||||||
{
|
{
|
||||||
@@ -498,9 +525,18 @@ bool NukiOpenerWrapper::updateKeyTurnerState()
|
|||||||
Log->println("ms");
|
Log->println("ms");
|
||||||
_nextLockStateUpdateTs = espMillis() + _retryDelay;
|
_nextLockStateUpdateTs = espMillis() + _retryDelay;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_nextLockStateUpdateTs = espMillis() + (_retryLockstateCount * 333);
|
||||||
|
}
|
||||||
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (!_hasConnected)
|
||||||
|
{
|
||||||
|
_hasConnected = true;
|
||||||
|
}
|
||||||
|
|
||||||
_retryLockstateCount = 0;
|
_retryLockstateCount = 0;
|
||||||
|
|
||||||
const NukiOpener::LockState& lockState = _keyTurnerState.lockState;
|
const NukiOpener::LockState& lockState = _keyTurnerState.lockState;
|
||||||
@@ -579,7 +615,10 @@ void NukiOpenerWrapper::updateBatteryState()
|
|||||||
{
|
{
|
||||||
Log->print("Querying opener battery state: ");
|
Log->print("Querying opener battery state: ");
|
||||||
result = _nukiOpener.requestBatteryReport(&_batteryReport);
|
result = _nukiOpener.requestBatteryReport(&_batteryReport);
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
if(result != Nuki::CmdResult::Success)
|
if(result != Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
++retryCount;
|
++retryCount;
|
||||||
@@ -751,7 +790,10 @@ void NukiOpenerWrapper::updateAuthData(bool retrieved)
|
|||||||
if(result == Nuki::CmdResult::Success)
|
if(result == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
_waitAuthLogUpdateTs = espMillis() + 5000;
|
_waitAuthLogUpdateTs = espMillis() + 5000;
|
||||||
delay(100);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
std::list<NukiOpener::LogEntry> log;
|
std::list<NukiOpener::LogEntry> log;
|
||||||
_nukiOpener.getLogEntries(&log);
|
_nukiOpener.getLogEntries(&log);
|
||||||
@@ -978,7 +1020,10 @@ void NukiOpenerWrapper::updateAuth(bool retrieved)
|
|||||||
{
|
{
|
||||||
Log->print("Querying opener authorization: ");
|
Log->print("Querying opener authorization: ");
|
||||||
result = _nukiOpener.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH));
|
result = _nukiOpener.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH));
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
if(result != Nuki::CmdResult::Success)
|
if(result != Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
++retryCount;
|
++retryCount;
|
||||||
@@ -3017,7 +3062,10 @@ void NukiOpenerWrapper::onKeypadJsonCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultKp == Nuki::CmdResult::Success)
|
if(resultKp == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiOpener::KeypadEntry> entries;
|
std::list<NukiOpener::KeypadEntry> entries;
|
||||||
_nukiOpener.getKeypadEntries(&entries);
|
_nukiOpener.getKeypadEntries(&entries);
|
||||||
|
|
||||||
@@ -3383,7 +3431,10 @@ void NukiOpenerWrapper::onTimeControlCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultTc == Nuki::CmdResult::Success)
|
if(resultTc == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiOpener::TimeControlEntry> timeControlEntries;
|
std::list<NukiOpener::TimeControlEntry> timeControlEntries;
|
||||||
_nukiOpener.getTimeControlEntries(&timeControlEntries);
|
_nukiOpener.getTimeControlEntries(&timeControlEntries);
|
||||||
|
|
||||||
@@ -3839,7 +3890,10 @@ void NukiOpenerWrapper::onAuthCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultAuth == Nuki::CmdResult::Success)
|
if(resultAuth == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiOpener::AuthorizationEntry> entries;
|
std::list<NukiOpener::AuthorizationEntry> entries;
|
||||||
_nukiOpener.getAuthorizationEntries(&entries);
|
_nukiOpener.getAuthorizationEntries(&entries);
|
||||||
|
|
||||||
@@ -4068,8 +4122,8 @@ void NukiOpenerWrapper::notify(Nuki::EventType eventType)
|
|||||||
}
|
}
|
||||||
else if(eventType == Nuki::EventType::BLE_ERROR_ON_DISCONNECT)
|
else if(eventType == Nuki::EventType::BLE_ERROR_ON_DISCONNECT)
|
||||||
{
|
{
|
||||||
Log->println("Error in disconnecting BLE client, rebooting");
|
Log->println("Error in disconnecting BLE client, signalling to restart BLE controller");
|
||||||
restartEsp(RestartReason::BLEError);
|
_restartController = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ public:
|
|||||||
void deactivateRTO();
|
void deactivateRTO();
|
||||||
void deactivateCM();
|
void deactivateCM();
|
||||||
|
|
||||||
|
bool hasConnected();
|
||||||
bool isPinValid();
|
bool isPinValid();
|
||||||
void setPin(const uint16_t pin);
|
void setPin(const uint16_t pin);
|
||||||
uint16_t getPin();
|
uint16_t getPin();
|
||||||
@@ -36,6 +37,7 @@ public:
|
|||||||
const bool isPaired() const;
|
const bool isPaired() const;
|
||||||
const bool hasKeypad() const;
|
const bool hasKeypad() const;
|
||||||
const BLEAddress getBleAddress() const;
|
const BLEAddress getBleAddress() const;
|
||||||
|
uint8_t restartController();
|
||||||
|
|
||||||
std::string firmwareVersion() const;
|
std::string firmwareVersion() const;
|
||||||
std::string hardwareVersion() const;
|
std::string hardwareVersion() const;
|
||||||
@@ -135,9 +137,11 @@ private:
|
|||||||
bool _forceKeypad = false;
|
bool _forceKeypad = false;
|
||||||
bool _keypadEnabled = false;
|
bool _keypadEnabled = false;
|
||||||
bool _forceId = false;
|
bool _forceId = false;
|
||||||
|
bool _hasConnected = false;
|
||||||
uint _maxKeypadCodeCount = 0;
|
uint _maxKeypadCodeCount = 0;
|
||||||
uint _maxTimeControlEntryCount = 0;
|
uint _maxTimeControlEntryCount = 0;
|
||||||
uint _maxAuthEntryCount = 0;
|
uint _maxAuthEntryCount = 0;
|
||||||
|
uint8_t _restartController = 0;
|
||||||
int _rssiPublishInterval = 0;
|
int _rssiPublishInterval = 0;
|
||||||
int64_t _statusUpdatedTs = 0;
|
int64_t _statusUpdatedTs = 0;
|
||||||
int64_t _nextLockStateUpdateTs = 0;
|
int64_t _nextLockStateUpdateTs = 0;
|
||||||
|
|||||||
@@ -68,10 +68,10 @@ void NukiWrapper::initialize()
|
|||||||
_nukiLock.saveUltraPincode(_preferences->getInt(preference_lock_gemini_pin, 0), false);
|
_nukiLock.saveUltraPincode(_preferences->getInt(preference_lock_gemini_pin, 0), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
_nukiLock.initialize(_preferences->getBool(preference_connect_mode, true));
|
_nukiLock.initialize();
|
||||||
_nukiLock.registerBleScanner(_bleScanner);
|
_nukiLock.registerBleScanner(_bleScanner);
|
||||||
_nukiLock.setEventHandler(this);
|
_nukiLock.setEventHandler(this);
|
||||||
_nukiLock.setConnectTimeout(3);
|
_nukiLock.setConnectTimeout(2);
|
||||||
_nukiLock.setDisconnectTimeout(2000);
|
_nukiLock.setDisconnectTimeout(2000);
|
||||||
|
|
||||||
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
|
_hassEnabled = _preferences->getBool(preference_mqtt_hass_enabled, false);
|
||||||
@@ -229,6 +229,16 @@ void NukiWrapper::readSettings()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t NukiWrapper::restartController()
|
||||||
|
{
|
||||||
|
return _restartController;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NukiWrapper::hasConnected()
|
||||||
|
{
|
||||||
|
return _hasConnected;
|
||||||
|
}
|
||||||
|
|
||||||
void NukiWrapper::update(bool reboot)
|
void NukiWrapper::update(bool reboot)
|
||||||
{
|
{
|
||||||
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
@@ -253,7 +263,10 @@ void NukiWrapper::update(bool reboot)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,9 +283,12 @@ void NukiWrapper::update(bool reboot)
|
|||||||
{
|
{
|
||||||
Log->print("No BLE beacon received from the lock for ");
|
Log->print("No BLE beacon received from the lock for ");
|
||||||
Log->print((ts - lastReceivedBeaconTs) / 1000);
|
Log->print((ts - lastReceivedBeaconTs) / 1000);
|
||||||
Log->println(" seconds, restarting device.");
|
Log->println(" seconds, signalling to restart BLE controller.");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
restartEsp(RestartReason::BLEBeaconWatchdog);
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
|
_restartController = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
_nukiLock.updateConnectionState();
|
_nukiLock.updateConnectionState();
|
||||||
@@ -308,7 +324,10 @@ void NukiWrapper::update(bool reboot)
|
|||||||
|
|
||||||
_network->publishRetry(std::to_string(retryCount + 1));
|
_network->publishRetry(std::to_string(retryCount + 1));
|
||||||
|
|
||||||
delay(_retryDelay);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(_retryDelay / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
++retryCount;
|
++retryCount;
|
||||||
}
|
}
|
||||||
@@ -342,9 +361,17 @@ void NukiWrapper::update(bool reboot)
|
|||||||
if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
if(_nukiOfficial->getStatusUpdated() || _statusUpdated || _nextLockStateUpdateTs == 0 || ts >= _nextLockStateUpdateTs || (queryCommands & QUERY_COMMAND_LOCKSTATE) > 0)
|
||||||
{
|
{
|
||||||
Log->println("Updating Lock state based on status, timer or query");
|
Log->println("Updating Lock state based on status, timer or query");
|
||||||
_statusUpdated = updateKeyTurnerState();
|
|
||||||
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
_nextLockStateUpdateTs = ts + _intervalLockstate * 1000;
|
||||||
|
_statusUpdated = updateKeyTurnerState();
|
||||||
_network->publishStatusUpdated(_statusUpdated);
|
_network->publishStatusUpdated(_statusUpdated);
|
||||||
|
|
||||||
|
if(_statusUpdated)
|
||||||
|
{
|
||||||
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if(_network->mqttConnectionState() == 2)
|
if(_network->mqttConnectionState() == 2)
|
||||||
{
|
{
|
||||||
@@ -363,7 +390,7 @@ void NukiWrapper::update(bool reboot)
|
|||||||
updateConfig();
|
updateConfig();
|
||||||
if(_isDebugging)
|
if(_isDebugging)
|
||||||
{
|
{
|
||||||
updateDebug();
|
//updateDebug();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(_waitAuthLogUpdateTs != 0 && ts > _waitAuthLogUpdateTs)
|
if(_waitAuthLogUpdateTs != 0 && ts > _waitAuthLogUpdateTs)
|
||||||
@@ -532,9 +559,17 @@ bool NukiWrapper::updateKeyTurnerState()
|
|||||||
Log->println("ms");
|
Log->println("ms");
|
||||||
_nextLockStateUpdateTs = espMillis() + _retryDelay;
|
_nextLockStateUpdateTs = espMillis() + _retryDelay;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_nextLockStateUpdateTs = espMillis() + (_retryLockstateCount * 333);
|
||||||
|
}
|
||||||
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
_network->publishKeyTurnerState(_keyTurnerState, _lastKeyTurnerState);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (!_hasConnected)
|
||||||
|
{
|
||||||
|
_hasConnected = true;
|
||||||
|
}
|
||||||
|
|
||||||
_retryLockstateCount = 0;
|
_retryLockstateCount = 0;
|
||||||
|
|
||||||
@@ -787,8 +822,10 @@ void NukiWrapper::updateDebug()
|
|||||||
Log->println(result);
|
Log->println(result);
|
||||||
count = 0;
|
count = 0;
|
||||||
while (count < 5) {
|
while (count < 5) {
|
||||||
delay(1000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
esp_task_wdt_reset();
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -807,8 +844,10 @@ void NukiWrapper::updateDebug()
|
|||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
while (count < 15) {
|
while (count < 15) {
|
||||||
delay(1000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
esp_task_wdt_reset();
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -827,8 +866,10 @@ void NukiWrapper::updateDebug()
|
|||||||
|
|
||||||
count = 0;
|
count = 0;
|
||||||
while (count < 20) {
|
while (count < 20) {
|
||||||
delay(1000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
esp_task_wdt_reset();
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -907,7 +948,10 @@ void NukiWrapper::updateAuthData(bool retrieved)
|
|||||||
if(result == Nuki::CmdResult::Success)
|
if(result == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
_waitAuthLogUpdateTs = espMillis() + 5000;
|
_waitAuthLogUpdateTs = espMillis() + 5000;
|
||||||
delay(100);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
|
||||||
std::list<NukiLock::LogEntry> log;
|
std::list<NukiLock::LogEntry> log;
|
||||||
_nukiLock.getLogEntries(&log);
|
_nukiLock.getLogEntries(&log);
|
||||||
@@ -1132,7 +1176,10 @@ void NukiWrapper::updateAuth(bool retrieved)
|
|||||||
{
|
{
|
||||||
Log->print("Querying lock authorization: ");
|
Log->print("Querying lock authorization: ");
|
||||||
result = _nukiLock.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH));
|
result = _nukiLock.retrieveAuthorizationEntries(0, _preferences->getInt(preference_auth_max_entries, MAX_AUTH));
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
if(result != Nuki::CmdResult::Success)
|
if(result != Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
++retryCount;
|
++retryCount;
|
||||||
@@ -3265,7 +3312,10 @@ void NukiWrapper::onKeypadJsonCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultKp == Nuki::CmdResult::Success)
|
if(resultKp == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiLock::KeypadEntry> entries;
|
std::list<NukiLock::KeypadEntry> entries;
|
||||||
_nukiLock.getKeypadEntries(&entries);
|
_nukiLock.getKeypadEntries(&entries);
|
||||||
|
|
||||||
@@ -3632,7 +3682,10 @@ void NukiWrapper::onTimeControlCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultTc == Nuki::CmdResult::Success)
|
if(resultTc == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiLock::TimeControlEntry> timeControlEntries;
|
std::list<NukiLock::TimeControlEntry> timeControlEntries;
|
||||||
_nukiLock.getTimeControlEntries(&timeControlEntries);
|
_nukiLock.getTimeControlEntries(&timeControlEntries);
|
||||||
|
|
||||||
@@ -3848,7 +3901,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value)
|
|||||||
if(idExists)
|
if(idExists)
|
||||||
{
|
{
|
||||||
result = _nukiLock.deleteAuthorizationEntry(authId);
|
result = _nukiLock.deleteAuthorizationEntry(authId);
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
Log->print("Delete authorization: ");
|
Log->print("Delete authorization: ");
|
||||||
Log->println((int)result);
|
Log->println((int)result);
|
||||||
}
|
}
|
||||||
@@ -4068,7 +4124,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = _nukiLock.addAuthorizationEntry(entry);
|
result = _nukiLock.addAuthorizationEntry(entry);
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
Log->print("Add authorization: ");
|
Log->print("Add authorization: ");
|
||||||
Log->println((int)result);
|
Log->println((int)result);
|
||||||
}
|
}
|
||||||
@@ -4091,7 +4150,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value)
|
|||||||
|
|
||||||
if(resultAuth == Nuki::CmdResult::Success)
|
if(resultAuth == Nuki::CmdResult::Success)
|
||||||
{
|
{
|
||||||
delay(5000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(5000 / portTICK_PERIOD_MS);
|
||||||
std::list<NukiLock::AuthorizationEntry> entries;
|
std::list<NukiLock::AuthorizationEntry> entries;
|
||||||
_nukiLock.getAuthorizationEntries(&entries);
|
_nukiLock.getAuthorizationEntries(&entries);
|
||||||
|
|
||||||
@@ -4234,7 +4296,10 @@ void NukiWrapper::onAuthCommandReceived(const char *value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = _nukiLock.updateAuthorizationEntry(entry);
|
result = _nukiLock.updateAuthorizationEntry(entry);
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
Log->print("Update authorization: ");
|
Log->print("Update authorization: ");
|
||||||
Log->println((int)result);
|
Log->println((int)result);
|
||||||
}
|
}
|
||||||
@@ -4320,8 +4385,8 @@ void NukiWrapper::notify(Nuki::EventType eventType)
|
|||||||
}
|
}
|
||||||
else if(eventType == Nuki::EventType::BLE_ERROR_ON_DISCONNECT)
|
else if(eventType == Nuki::EventType::BLE_ERROR_ON_DISCONNECT)
|
||||||
{
|
{
|
||||||
Log->println("Error in disconnecting BLE client, rebooting");
|
Log->println("Error in disconnecting BLE client, signalling to restart BLE controller");
|
||||||
restartEsp(RestartReason::BLEError);
|
_restartController = 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -4346,7 +4411,10 @@ void NukiWrapper::readConfig()
|
|||||||
{
|
{
|
||||||
++retryCount;
|
++retryCount;
|
||||||
Log->println("Failed to retrieve lock config, retrying in 1s");
|
Log->println("Failed to retrieve lock config, retrying in 1s");
|
||||||
delay(1000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -4374,7 +4442,10 @@ void NukiWrapper::readAdvancedConfig()
|
|||||||
{
|
{
|
||||||
++retryCount;
|
++retryCount;
|
||||||
Log->println("Failed to retrieve lock advanced config, retrying in 1s");
|
Log->println("Failed to retrieve lock advanced config, retrying in 1s");
|
||||||
delay(1000);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(1000 / portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public:
|
|||||||
void lockngo();
|
void lockngo();
|
||||||
void lockngounlatch();
|
void lockngounlatch();
|
||||||
|
|
||||||
|
bool hasConnected();
|
||||||
bool isPinValid();
|
bool isPinValid();
|
||||||
void setPin(const uint16_t pin);
|
void setPin(const uint16_t pin);
|
||||||
void setUltraPin(const uint32_t pin);
|
void setUltraPin(const uint32_t pin);
|
||||||
@@ -42,6 +43,7 @@ public:
|
|||||||
bool hasDoorSensor() const;
|
bool hasDoorSensor() const;
|
||||||
bool offConnected();
|
bool offConnected();
|
||||||
const BLEAddress getBleAddress() const;
|
const BLEAddress getBleAddress() const;
|
||||||
|
uint8_t restartController();
|
||||||
|
|
||||||
std::string firmwareVersion() const;
|
std::string firmwareVersion() const;
|
||||||
std::string hardwareVersion() const;
|
std::string hardwareVersion() const;
|
||||||
@@ -142,9 +144,11 @@ private:
|
|||||||
bool _forceId = false;
|
bool _forceId = false;
|
||||||
bool _isUltra = false;
|
bool _isUltra = false;
|
||||||
bool _isDebugging = false;
|
bool _isDebugging = false;
|
||||||
|
bool _hasConnected = false;
|
||||||
uint _maxKeypadCodeCount = 0;
|
uint _maxKeypadCodeCount = 0;
|
||||||
uint _maxTimeControlEntryCount = 0;
|
uint _maxTimeControlEntryCount = 0;
|
||||||
uint _maxAuthEntryCount = 0;
|
uint _maxAuthEntryCount = 0;
|
||||||
|
uint8_t _restartController = 0;
|
||||||
int _nrOfRetries = 0;
|
int _nrOfRetries = 0;
|
||||||
int _retryDelay = 0;
|
int _retryDelay = 0;
|
||||||
int _retryConfigCount = 0;
|
int _retryConfigCount = 0;
|
||||||
|
|||||||
@@ -12,23 +12,12 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
//CHANGE REQUIRES REBOOT TO TAKE EFFECT
|
//CHANGE REQUIRES REBOOT TO TAKE EFFECT
|
||||||
|
//NETWORK RELATED
|
||||||
#define preference_ip_dhcp_enabled (char*)"dhcpena"
|
#define preference_ip_dhcp_enabled (char*)"dhcpena"
|
||||||
#define preference_ip_address (char*)"ipaddr"
|
#define preference_ip_address (char*)"ipaddr"
|
||||||
#define preference_ip_subnet (char*)"ipsub"
|
#define preference_ip_subnet (char*)"ipsub"
|
||||||
#define preference_ip_gateway (char*)"ipgtw"
|
#define preference_ip_gateway (char*)"ipgtw"
|
||||||
#define preference_ip_dns_server (char*)"dnssrv"
|
#define preference_ip_dns_server (char*)"dnssrv"
|
||||||
#define preference_mqtt_broker (char*)"mqttbroker"
|
|
||||||
#define preference_mqtt_broker_port (char*)"mqttport"
|
|
||||||
#define preference_mqtt_user (char*)"mqttuser"
|
|
||||||
#define preference_mqtt_password (char*)"mqttpass"
|
|
||||||
#define preference_mqtt_log_enabled (char*)"mqttlog"
|
|
||||||
#define preference_webserial_enabled (char*)"weblog"
|
|
||||||
#define preference_lock_enabled (char*)"lockena"
|
|
||||||
#define preference_mqtt_lock_path (char*)"mqttpath"
|
|
||||||
#define preference_opener_enabled (char*)"openerena"
|
|
||||||
#define preference_mqtt_ca (char*)"mqttca"
|
|
||||||
#define preference_mqtt_crt (char*)"mqttcrt"
|
|
||||||
#define preference_mqtt_key (char*)"mqttkey"
|
|
||||||
#define preference_network_hardware (char*)"nwhw"
|
#define preference_network_hardware (char*)"nwhw"
|
||||||
#define preference_hostname (char*)"hostname"
|
#define preference_hostname (char*)"hostname"
|
||||||
#define preference_network_custom_phy (char*)"ntwPHY"
|
#define preference_network_custom_phy (char*)"ntwPHY"
|
||||||
@@ -43,61 +32,22 @@
|
|||||||
#define preference_network_custom_mdio (char*)"ntwMDIO"
|
#define preference_network_custom_mdio (char*)"ntwMDIO"
|
||||||
#define preference_network_custom_mdc (char*)"ntwMDC"
|
#define preference_network_custom_mdc (char*)"ntwMDC"
|
||||||
#define preference_network_custom_clk (char*)"ntwCLK"
|
#define preference_network_custom_clk (char*)"ntwCLK"
|
||||||
#define preference_auth_control_enabled (char*)"authCtrlEna"
|
|
||||||
#define preference_keypad_control_enabled (char*)"kpCntrlEnabled"
|
|
||||||
#define preference_timecontrol_control_enabled (char*)"tcCntrlEnabled"
|
|
||||||
#define preference_ota_main_url (char*)"otaMainUrl"
|
|
||||||
#define preference_ota_updater_url (char*)"otaUpdUrl"
|
|
||||||
#define preference_task_size_network (char*)"tsksznetw"
|
|
||||||
#define preference_task_size_nuki (char*)"tsksznuki"
|
|
||||||
#define preference_buffer_size (char*)"buffsize"
|
|
||||||
#define preference_cred_user (char*)"crdusr"
|
|
||||||
#define preference_cred_password (char*)"crdpass"
|
|
||||||
#define preference_gpio_configuration (char*)"gpiocfg"
|
|
||||||
#define preference_mqtt_hass_enabled (char*)"hassena"
|
|
||||||
#define preference_mqtt_hass_discovery (char*)"hassdiscovery"
|
|
||||||
#define preference_hass_device_discovery (char*)"hassdevdisc"
|
|
||||||
#define preference_webserver_enabled (char*)"websrvena"
|
|
||||||
#define preference_update_from_mqtt (char*)"updMqtt"
|
|
||||||
#define preference_disable_non_json (char*)"disnonjson"
|
|
||||||
#define preference_official_hybrid_enabled (char*)"offHybrid"
|
|
||||||
#define preference_wifi_ssid (char*)"wifiSSID"
|
#define preference_wifi_ssid (char*)"wifiSSID"
|
||||||
#define preference_wifi_pass (char*)"wifiPass"
|
#define preference_wifi_pass (char*)"wifiPass"
|
||||||
#define preference_disable_network_not_connected (char*)"disNtwNoCon"
|
|
||||||
#define preference_debug_connect (char*)"dbgConnect"
|
|
||||||
#define preference_debug_communication (char*)"dbgCommu"
|
|
||||||
#define preference_debug_readable_data (char*)"dbgReadData"
|
|
||||||
#define preference_debug_hex_data (char*)"dbgHexData"
|
|
||||||
#define preference_debug_command (char*)"dbgCommand"
|
|
||||||
#define preference_connect_mode (char*)"nukiConnMode"
|
|
||||||
#define preference_http_auth_type (char*)"httpdAuthType"
|
|
||||||
#define preference_update_time (char*)"updateTime"
|
|
||||||
#define preference_time_server (char*)"timeServer"
|
#define preference_time_server (char*)"timeServer"
|
||||||
#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
|
|
||||||
#define preference_lock_gemini_pin (char*)"geminiPin"
|
//MQTT RELATED
|
||||||
#define preference_lock_gemini_enabled (char*)"geminiena"
|
#define preference_mqtt_log_enabled (char*)"mqttlog"
|
||||||
#define preference_cred_duo_enabled (char*)"duoena"
|
#define preference_gpio_configuration (char*)"gpiocfg"
|
||||||
#define preference_cred_duo_host (char*)"duoHost"
|
|
||||||
#define preference_cred_duo_ikey (char*)"duoIkey"
|
//TASKS RELATED
|
||||||
#define preference_cred_duo_skey (char*)"duoSkey"
|
#define preference_task_size_network (char*)"tsksznetw"
|
||||||
#define preference_cred_duo_user (char*)"duoUser"
|
#define preference_task_size_nuki (char*)"tsksznuki"
|
||||||
#define preference_https_fqdn (char*)"httpsFQDN"
|
|
||||||
#define preference_bypass_proxy (char*)"credBypass"
|
//OTHER
|
||||||
#define preference_cred_session_lifetime (char*)"credLf"
|
#define preference_ota_main_url (char*)"otaMainUrl"
|
||||||
#define preference_cred_session_lifetime_remember (char*)"credLfRmbr"
|
#define preference_ota_updater_url (char*)"otaUpdUrl"
|
||||||
#define preference_cred_session_lifetime_duo (char*)"credLfDuo"
|
#define preference_buffer_size (char*)"buffsize"
|
||||||
#define preference_cred_session_lifetime_duo_remember (char*)"credLfDuoRmbr"
|
|
||||||
#define preference_cred_session_lifetime_totp (char*)"credLfTotp"
|
|
||||||
#define preference_cred_session_lifetime_totp_remember (char*)"credLfTotpRmbr"
|
|
||||||
#define preference_cred_duo_approval (char*)"duoApprove"
|
|
||||||
#define preference_cred_bypass_boot_btn_enabled (char*)"bypassBtBtn"
|
|
||||||
#define preference_cred_bypass_gpio_high (char*)"bypassHigh"
|
|
||||||
#define preference_cred_bypass_gpio_low (char*)"bypassLow"
|
|
||||||
#define preference_publish_config (char*)"nhPubConfig"
|
|
||||||
#define preference_config_from_mqtt (char*)"nhCntrlEnabled"
|
|
||||||
#define preference_totp_secret (char*)"totpsecret"
|
|
||||||
#define preference_bypass_secret (char*)"bypassecret"
|
|
||||||
#define preference_admin_secret (char*)"adminsecret"
|
|
||||||
|
|
||||||
// CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT
|
// CHANGE DOES NOT REQUIRE REBOOT TO TAKE EFFECT
|
||||||
#define preference_find_best_rssi (char*)"nwbestrssi"
|
#define preference_find_best_rssi (char*)"nwbestrssi"
|
||||||
@@ -149,7 +99,65 @@
|
|||||||
#define preference_lock_force_keypad (char*)"lckForceKp"
|
#define preference_lock_force_keypad (char*)"lckForceKp"
|
||||||
#define preference_opener_force_id (char*)"opForceId"
|
#define preference_opener_force_id (char*)"opForceId"
|
||||||
#define preference_opener_force_keypad (char*)"opForceKp"
|
#define preference_opener_force_keypad (char*)"opForceKp"
|
||||||
|
#define preference_admin_secret (char*)"adminsecret"
|
||||||
|
|
||||||
|
//REQUIRE SERVICES RELOAD
|
||||||
|
#define preference_lock_enabled (char*)"lockena"
|
||||||
|
#define preference_opener_enabled (char*)"openerena"
|
||||||
|
#define preference_debug_connect (char*)"dbgConnect"
|
||||||
|
#define preference_debug_communication (char*)"dbgCommu"
|
||||||
|
#define preference_debug_readable_data (char*)"dbgReadData"
|
||||||
|
#define preference_debug_hex_data (char*)"dbgHexData"
|
||||||
|
#define preference_debug_command (char*)"dbgCommand"
|
||||||
|
#define preference_update_time (char*)"updateTime"
|
||||||
|
#define preference_cred_user (char*)"crdusr"
|
||||||
|
#define preference_cred_password (char*)"crdpass"
|
||||||
|
#define preference_lock_gemini_pin (char*)"geminiPin"
|
||||||
|
#define preference_lock_gemini_enabled (char*)"geminiena"
|
||||||
|
#define preference_https_fqdn (char*)"httpsFQDN"
|
||||||
|
#define preference_bypass_proxy (char*)"credBypass"
|
||||||
|
#define preference_http_auth_type (char*)"httpdAuthType"
|
||||||
|
#define preference_cred_duo_enabled (char*)"duoena"
|
||||||
|
#define preference_cred_duo_host (char*)"duoHost"
|
||||||
|
#define preference_cred_duo_ikey (char*)"duoIkey"
|
||||||
|
#define preference_cred_duo_skey (char*)"duoSkey"
|
||||||
|
#define preference_cred_duo_user (char*)"duoUser"
|
||||||
|
#define preference_cred_session_lifetime (char*)"credLf"
|
||||||
|
#define preference_cred_session_lifetime_remember (char*)"credLfRmbr"
|
||||||
|
#define preference_cred_session_lifetime_duo (char*)"credLfDuo"
|
||||||
|
#define preference_cred_session_lifetime_duo_remember (char*)"credLfDuoRmbr"
|
||||||
|
#define preference_cred_session_lifetime_totp (char*)"credLfTotp"
|
||||||
|
#define preference_cred_session_lifetime_totp_remember (char*)"credLfTotpRmbr"
|
||||||
|
#define preference_cred_duo_approval (char*)"duoApprove"
|
||||||
|
#define preference_cred_bypass_boot_btn_enabled (char*)"bypassBtBtn"
|
||||||
|
#define preference_cred_bypass_gpio_high (char*)"bypassHigh"
|
||||||
|
#define preference_cred_bypass_gpio_low (char*)"bypassLow"
|
||||||
|
#define preference_disable_network_not_connected (char*)"disNtwNoCon"
|
||||||
|
#define preference_webserver_enabled (char*)"websrvena"
|
||||||
|
#define preference_hass_device_discovery (char*)"hassdevdisc"
|
||||||
|
#define preference_webserial_enabled (char*)"weblog"
|
||||||
|
#define preference_config_from_mqtt (char*)"nhCntrlEnabled"
|
||||||
|
#define preference_publish_config (char*)"nhPubConfig"
|
||||||
|
#define preference_update_from_mqtt (char*)"updMqtt"
|
||||||
|
#define preference_mqtt_broker (char*)"mqttbroker"
|
||||||
|
#define preference_mqtt_broker_port (char*)"mqttport"
|
||||||
|
#define preference_mqtt_user (char*)"mqttuser"
|
||||||
|
#define preference_mqtt_password (char*)"mqttpass"
|
||||||
|
#define preference_mqtt_lock_path (char*)"mqttpath"
|
||||||
|
#define preference_mqtt_hass_enabled (char*)"hassena"
|
||||||
|
#define preference_mqtt_hass_discovery (char*)"hassdiscovery"
|
||||||
|
#define preference_disable_non_json (char*)"disnonjson"
|
||||||
|
#define preference_official_hybrid_enabled (char*)"offHybrid"
|
||||||
|
#define preference_auth_control_enabled (char*)"authCtrlEna"
|
||||||
|
#define preference_keypad_control_enabled (char*)"kpCntrlEnabled"
|
||||||
|
#define preference_timecontrol_control_enabled (char*)"tcCntrlEnabled"
|
||||||
#define preference_hybrid_reboot_on_disconnect (char*)"hybridRbtLck"
|
#define preference_hybrid_reboot_on_disconnect (char*)"hybridRbtLck"
|
||||||
|
#define preference_bypass_secret (char*)"bypassecret"
|
||||||
|
#define preference_totp_secret (char*)"totpsecret"
|
||||||
|
#define preference_mqtt_ssl_enabled (char*)"mqttSSLena"
|
||||||
|
#define preference_mqtt_ca (char*)"mqttca"
|
||||||
|
#define preference_mqtt_crt (char*)"mqttcrt"
|
||||||
|
#define preference_mqtt_key (char*)"mqttkey"
|
||||||
|
|
||||||
//NOT USER CHANGABLE
|
//NOT USER CHANGABLE
|
||||||
#define preference_mfa_reconfigure (char*)"mfaRECONF"
|
#define preference_mfa_reconfigure (char*)"mfaRECONF"
|
||||||
@@ -242,7 +250,6 @@ inline void initPreferences(Preferences* preferences)
|
|||||||
preferences->putBool(preference_debug_readable_data, false);
|
preferences->putBool(preference_debug_readable_data, false);
|
||||||
preferences->putBool(preference_debug_hex_data, false);
|
preferences->putBool(preference_debug_hex_data, false);
|
||||||
preferences->putBool(preference_debug_command, false);
|
preferences->putBool(preference_debug_command, false);
|
||||||
preferences->putBool(preference_connect_mode, true);
|
|
||||||
preferences->putBool(preference_retain_gpio, false);
|
preferences->putBool(preference_retain_gpio, false);
|
||||||
preferences->putBool(preference_enable_debug_mode, false);
|
preferences->putBool(preference_enable_debug_mode, false);
|
||||||
preferences->putBool(preference_cred_duo_enabled, false);
|
preferences->putBool(preference_cred_duo_enabled, false);
|
||||||
@@ -532,7 +539,7 @@ private:
|
|||||||
preference_network_custom_pwr, preference_network_custom_mdio, preference_lock_max_auth_entry_count, preference_opener_max_auth_entry_count,
|
preference_network_custom_pwr, preference_network_custom_mdio, preference_lock_max_auth_entry_count, preference_opener_max_auth_entry_count,
|
||||||
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_auth_max_entries, preference_wifi_ssid, preference_wifi_pass,
|
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_auth_max_entries, preference_wifi_ssid, preference_wifi_pass,
|
||||||
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_mqtt_hass_enabled, preference_hass_device_discovery, preference_retain_gpio,
|
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_mqtt_hass_enabled, preference_hass_device_discovery, preference_retain_gpio,
|
||||||
preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command, preference_connect_mode,
|
preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command,
|
||||||
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_nukihub_id,
|
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_nukihub_id,
|
||||||
preference_cred_duo_host, preference_cred_duo_ikey, preference_cred_duo_skey, preference_cred_duo_user, preference_cred_duo_enabled, preference_https_fqdn, preference_bypass_proxy,
|
preference_cred_duo_host, preference_cred_duo_ikey, preference_cred_duo_skey, preference_cred_duo_user, preference_cred_duo_enabled, preference_https_fqdn, preference_bypass_proxy,
|
||||||
preference_cred_session_lifetime, preference_cred_session_lifetime_remember, preference_cred_session_lifetime_duo, preference_cred_session_lifetime_duo_remember,
|
preference_cred_session_lifetime, preference_cred_session_lifetime_remember, preference_cred_session_lifetime_duo, preference_cred_session_lifetime_duo_remember,
|
||||||
@@ -556,7 +563,7 @@ private:
|
|||||||
preference_official_hybrid_actions, preference_official_hybrid_retry, preference_conf_info_enabled, preference_disable_non_json, preference_update_from_mqtt,
|
preference_official_hybrid_actions, preference_official_hybrid_retry, preference_conf_info_enabled, preference_disable_non_json, preference_update_from_mqtt,
|
||||||
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_webserial_enabled, preference_hass_device_discovery,
|
preference_auth_control_enabled, preference_auth_topic_per_entry, preference_auth_info_enabled, preference_webserial_enabled, preference_hass_device_discovery,
|
||||||
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_find_best_rssi, preference_cred_bypass_boot_btn_enabled,
|
preference_keypad_check_code_enabled, preference_disable_network_not_connected, preference_find_best_rssi, preference_cred_bypass_boot_btn_enabled,
|
||||||
preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command, preference_connect_mode,
|
preference_debug_connect, preference_debug_communication, preference_debug_readable_data, preference_debug_hex_data, preference_debug_command,
|
||||||
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_mqtt_ssl_enabled,
|
preference_lock_force_id, preference_lock_force_doorsensor, preference_lock_force_keypad, preference_opener_force_id, preference_opener_force_keypad, preference_mqtt_ssl_enabled,
|
||||||
preference_hybrid_reboot_on_disconnect, preference_lock_gemini_enabled, preference_enable_debug_mode, preference_cred_duo_enabled, preference_cred_duo_approval,
|
preference_hybrid_reboot_on_disconnect, preference_lock_gemini_enabled, preference_enable_debug_mode, preference_cred_duo_enabled, preference_cred_duo_approval,
|
||||||
preference_publish_config, preference_config_from_mqtt
|
preference_publish_config, preference_config_from_mqtt
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#include "SerialReader.h"
|
#include "SerialReader.h"
|
||||||
#include "RestartReason.h"
|
#include "RestartReason.h"
|
||||||
#include "EspMillis.h"
|
#include "EspMillis.h"
|
||||||
|
#include "hal/wdt_hal.h"
|
||||||
|
|
||||||
SerialReader::SerialReader(ImportExport *importExport, NukiNetwork* network)
|
SerialReader::SerialReader(ImportExport *importExport, NukiNetwork* network)
|
||||||
: _importExport(importExport),
|
: _importExport(importExport),
|
||||||
@@ -11,6 +12,11 @@ SerialReader::SerialReader(ImportExport *importExport, NukiNetwork* network)
|
|||||||
|
|
||||||
void SerialReader::update()
|
void SerialReader::update()
|
||||||
{
|
{
|
||||||
|
wdt_hal_context_t rtc_wdt_ctx = RWDT_HAL_CONTEXT_DEFAULT();
|
||||||
|
wdt_hal_write_protect_disable(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_feed(&rtc_wdt_ctx);
|
||||||
|
wdt_hal_write_protect_enable(&rtc_wdt_ctx);
|
||||||
|
|
||||||
if(Serial.available())
|
if(Serial.available())
|
||||||
{
|
{
|
||||||
String line = Serial.readStringUntil('\n');
|
String line = Serial.readStringUntil('\n');
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -18,6 +18,7 @@
|
|||||||
#include "ImportExport.h"
|
#include "ImportExport.h"
|
||||||
|
|
||||||
extern TaskHandle_t nukiTaskHandle;
|
extern TaskHandle_t nukiTaskHandle;
|
||||||
|
extern bool nuki_hub_https_server_enabled;
|
||||||
|
|
||||||
enum class TokenType
|
enum class TokenType
|
||||||
{
|
{
|
||||||
@@ -43,6 +44,7 @@ class WebCfgServer
|
|||||||
public:
|
public:
|
||||||
#ifndef NUKI_HUB_UPDATER
|
#ifndef NUKI_HUB_UPDATER
|
||||||
WebCfgServer(NukiWrapper* nuki, NukiOpenerWrapper* nukiOpener, NukiNetwork* network, Gpio* gpio, Preferences* preferences, bool allowRestartToPortal, uint8_t partitionType, PsychicHttpServer* psychicServer, ImportExport* importExport);
|
WebCfgServer(NukiWrapper* nuki, NukiOpenerWrapper* nukiOpener, NukiNetwork* network, Gpio* gpio, Preferences* preferences, bool allowRestartToPortal, uint8_t partitionType, PsychicHttpServer* psychicServer, ImportExport* importExport);
|
||||||
|
void updateWebSerial();
|
||||||
#else
|
#else
|
||||||
WebCfgServer(NukiNetwork* network, Preferences* preferences, bool allowRestartToPortal, uint8_t partitionType, PsychicHttpServer* psychicServer, ImportExport* importExport);
|
WebCfgServer(NukiNetwork* network, Preferences* preferences, bool allowRestartToPortal, uint8_t partitionType, PsychicHttpServer* psychicServer, ImportExport* importExport);
|
||||||
#endif
|
#endif
|
||||||
@@ -86,7 +88,7 @@ private:
|
|||||||
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32P4)
|
#if defined(CONFIG_IDF_TARGET_ESP32) || defined(CONFIG_IDF_TARGET_ESP32P4)
|
||||||
const std::vector<std::pair<String, String>> getNetworkCustomCLKOptions() const;
|
const std::vector<std::pair<String, String>> getNetworkCustomCLKOptions() const;
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_SOC_SPIRAM_SUPPORTED
|
#ifdef NUKI_HUB_HTTPS_SERVER
|
||||||
void createSSLCertificate();
|
void createSSLCertificate();
|
||||||
#endif
|
#endif
|
||||||
const String getPreselectionForGpio(const uint8_t& pin) const;
|
const String getPreselectionForGpio(const uint8_t& pin) const;
|
||||||
@@ -99,6 +101,7 @@ private:
|
|||||||
Gpio* _gpio = nullptr;
|
Gpio* _gpio = nullptr;
|
||||||
bool _brokerConfigured = false;
|
bool _brokerConfigured = false;
|
||||||
bool _rebootRequired = false;
|
bool _rebootRequired = false;
|
||||||
|
int _restartServicesRequired = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::vector<String> _ssidList;
|
std::vector<String> _ssidList;
|
||||||
@@ -125,6 +128,7 @@ private:
|
|||||||
esp_err_t buildConfirmHtml(PsychicRequest *request, PsychicResponse* resp, const String &message, uint32_t redirectDelay = 5, bool redirect = false, String redirectTo = "/");
|
esp_err_t buildConfirmHtml(PsychicRequest *request, PsychicResponse* resp, const String &message, uint32_t redirectDelay = 5, bool redirect = false, String redirectTo = "/");
|
||||||
esp_err_t buildOtaHtml(PsychicRequest *request, PsychicResponse* resp, bool debug = false);
|
esp_err_t buildOtaHtml(PsychicRequest *request, PsychicResponse* resp, bool debug = false);
|
||||||
esp_err_t sendCss(PsychicRequest *request, PsychicResponse* resp);
|
esp_err_t sendCss(PsychicRequest *request, PsychicResponse* resp);
|
||||||
|
esp_err_t sendWebSerial(PsychicRequest *request, PsychicResponse* resp);
|
||||||
esp_err_t sendFavicon(PsychicRequest *request, PsychicResponse* resp);
|
esp_err_t sendFavicon(PsychicRequest *request, PsychicResponse* resp);
|
||||||
void createSsidList();
|
void createSsidList();
|
||||||
void buildHtmlHeader(PsychicStreamResponse *response, String additionalHeader = "");
|
void buildHtmlHeader(PsychicStreamResponse *response, String additionalHeader = "");
|
||||||
|
|||||||
@@ -1,62 +1,17 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
// escaped by https://www.cescaper.com/
|
// converted to char array by bin2array
|
||||||
// source: https://cdn.jsdelivr.net/npm/@exampledev/new.css@1.1.2/new.min.css
|
const char stylecss[] = {
|
||||||
|
#include "webServerConstants/style.h"
|
||||||
const char stylecss[] = ":root{--nc-font-sans:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Open Sans','Helvetica Neue',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';--nc-font-mono:Consolas,monaco,'Ubuntu Mono','Liberation Mono','Courier New',Courier,monospace;--nc-tx-1:#000;--nc-tx-2:#1a1a1a;--nc-bg-1:#fff;--nc-bg-2:#f6f8fa;--nc-bg-3:#e5e7eb;--nc-lk-1:#0070f3;--nc-lk-2:#0366d6;--nc-lk-tx:#fff;--nc-ac-1:#79ffe1;--nc-ac-tx:#0c4047}@media(prefers-color-scheme:dark){:root{--nc-tx-1:#fff;--nc-tx-2:#eee;--nc-bg-1:#000;--nc-bg-2:#111;--nc-bg-3:#222;--nc-lk-1:#3291ff;--nc-lk-2:#0070f3;--nc-lk-tx:#fff;--nc-ac-1:#7928ca;--nc-ac-tx:#fff}}*{margin:0;padding:0}img,input,option,p,table,textarea,ul{margin-bottom:1rem}button,html,input,select{font-family:var(--nc-font-sans)}body{margin:0 auto;max-width:750px;padding:2rem;border-radius:6px;overflow-x:hidden;word-break:normal;overflow-wrap:anywhere;background:var(--nc-bg-1);color:var(--nc-tx-2);font-size:1.03rem;line-height:1.5}::selection{background:var(--nc-ac-1);color:var(--nc-ac-tx)}h1,h2,h3,h4,h5,h6{line-height:1;color:var(--nc-tx-1);padding-top:.875rem}h1,h2,h3{color:var(--nc-tx-1);padding-bottom:2px;margin-bottom:8px;border-bottom:1px solid var(--nc-bg-2)}h4,h5,h6{margin-bottom:.3rem}h1{font-size:2.25rem}h2{font-size:1.85rem}h3{font-size:1.55rem}h4{font-size:1.25rem}h5{font-size:1rem}h6{font-size:.875rem}a{color:var(--nc-lk-1)}a:hover{color:var(--nc-lk-2) !important;}abbr{cursor:help}abbr:hover{cursor:help}a button,button,input[type=button],input[type=reset],input[type=submit]{font-size:1rem;display:inline-block;padding:6px 12px;text-align:center;text-decoration:none;white-space:nowrap;background:var(--nc-lk-1);color:var(--nc-lk-tx);border:0;border-radius:4px;box-sizing:border-box;cursor:pointer;color:var(--nc-lk-tx)}a button[disabled],button[disabled],input[type=button][disabled],input[type=reset][disabled],input[type=submit][disabled]{cursor:default;opacity:.5;cursor:not-allowed}.button:focus,.button:hover,button:focus,button:hover,input[type=button]:focus,input[type=button]:hover,input[type=reset]:focus,input[type=reset]:hover,input[type=submit]:focus,input[type=submit]:hover{background:var(--nc-lk-2)}table{border-collapse:collapse;width:100%}td,th{border:1px solid var(--nc-bg-3);text-align:left;padding:.5rem}th{background:var(--nc-bg-2)}tr:nth-child(even){background:var(--nc-bg-2)}textarea{max-width:100%}input,select,textarea{padding:6px 12px;margin-bottom:.5rem;background:var(--nc-bg-2);color:var(--nc-tx-2);border:1px solid var(--nc-bg-3);border-radius:4px;box-shadow:none;box-sizing:border-box}img{max-width:100%}td>input{margin-top:0;margin-bottom:0}td>textarea{margin-top:0;margin-bottom:0}td>select{margin-top:0;margin-bottom:0}.warning{color:red}@media only screen and (max-width:600px){.adapt td{display:block}.adapt input[type=text],.adapt input[type=password],.adapt input[type=submit],.adapt textarea,.adapt select{width:100%}.adapt td:has(input[type=checkbox]){text-align:center}.adapt input[type=checkbox]{width:1.5em;height:1.5em}.adapt table td:first-child{border-bottom:0}.adapt table td:last-child{border-top:0}#tblnav a li>span{max-width:140px}}#tblnav a{border:0;border-bottom:1px solid;display:block;font-size:1rem;font-weight:bold;padding:.6rem 0;line-height:1;color:var(--nc-tx-1);text-decoration:none;background:linear-gradient(to left,transparent 50%,rgba(255,255,255,0.4) 50%) right;background-size:200% 100%;transition:all .2s ease}#tblnav a{background:linear-gradient(to left,var(--nc-bg-2) 50%,rgba(255,255,255,0.4) 50%) right;background-size:200% 100%}#tblnav a:hover{background-position:left;transition:all .45s ease}#tblnav a:active{background:var(--nc-lk-1);transition:all .15s ease}#tblnav a li{list-style:none;padding:.5rem;display:inline-block;width:100%}#tblnav a li>span{float:right;text-align:right;margin-right:10px;color:#f70;font-weight:100;font-style:italic;display:block}.tdbtn{text-align:center;vertical-align:middle}.naventry{float:left;max-width:375px;width:100%}";
|
|
||||||
|
|
||||||
// converted to char array by https://notisrac.github.io/FileToCArray/
|
|
||||||
const uint8_t favicon_32x32[] = {
|
|
||||||
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
|
||||||
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a,
|
|
||||||
0xf4, 0x00, 0x00, 0x02, 0xfb, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0xcd, 0x97, 0x4b, 0x4c, 0x53,
|
|
||||||
0x41, 0x14, 0x86, 0xff, 0x69, 0xa5, 0x3c, 0x8a, 0x12, 0x14, 0x84, 0xa6, 0x96, 0x60, 0x6d, 0xd0,
|
|
||||||
0x50, 0x14, 0x51, 0xd1, 0x6a, 0x4c, 0x51, 0x63, 0x88, 0x8a, 0x06, 0x63, 0x42, 0xc0, 0x85, 0x01,
|
|
||||||
0xc3, 0xae, 0xe8, 0x0a, 0x0d, 0x4a, 0x30, 0x31, 0x18, 0xd1, 0x84, 0x18, 0x83, 0x46, 0x5d, 0xa9,
|
|
||||||
0x09, 0xb8, 0x01, 0xa2, 0x31, 0x82, 0x31, 0x82, 0x6e, 0x48, 0x78, 0xb6, 0x74, 0xe1, 0x8b, 0x47,
|
|
||||||
0xb0, 0x3e, 0x0a, 0xb4, 0x05, 0xa1, 0xe1, 0x25, 0x14, 0x68, 0xeb, 0x9d, 0x22, 0xb7, 0x40, 0x1f,
|
|
||||||
0x1b, 0xef, 0xa5, 0xce, 0xea, 0xde, 0x99, 0xce, 0x39, 0xdf, 0xfc, 0x7f, 0x67, 0xee, 0x1c, 0xe2,
|
|
||||||
0xbc, 0x0e, 0x81, 0xe3, 0x84, 0xba, 0x58, 0x40, 0x88, 0xc6, 0x09, 0x48, 0xb0, 0x0a, 0x8d, 0x00,
|
|
||||||
0x26, 0x07, 0x71, 0x3e, 0x14, 0xd4, 0x37, 0x95, 0x11, 0x7b, 0x87, 0xba, 0x84, 0x10, 0x72, 0x63,
|
|
||||||
0x15, 0xf2, 0x7a, 0xa4, 0x70, 0x12, 0xe7, 0x35, 0xe2, 0xe8, 0x48, 0x33, 0x81, 0x20, 0x36, 0x10,
|
|
||||||
0x00, 0x4c, 0x4e, 0x33, 0x71, 0x68, 0xd3, 0x18, 0xe5, 0x03, 0xd7, 0xfe, 0x6f, 0x80, 0x86, 0xb6,
|
|
||||||
0x51, 0xd4, 0xbe, 0x1b, 0x66, 0xe5, 0xd1, 0x64, 0x49, 0x91, 0xb2, 0x35, 0xdc, 0xaf, 0x5c, 0x25,
|
|
||||||
0x8f, 0xbe, 0xc1, 0x36, 0xeb, 0x60, 0x7f, 0x93, 0x79, 0x28, 0x0a, 0x07, 0x93, 0x23, 0x7c, 0xce,
|
|
||||||
0xf1, 0xab, 0xc0, 0x9d, 0x67, 0x46, 0x5c, 0xae, 0x30, 0xb0, 0x93, 0x93, 0xb6, 0x88, 0xa1, 0xad,
|
|
||||||
0xdc, 0x85, 0x60, 0x91, 0xc0, 0x67, 0xc0, 0xc8, 0xc3, 0xcd, 0x18, 0x9b, 0x9c, 0x67, 0xc7, 0x2b,
|
|
||||||
0x2e, 0x29, 0x70, 0x31, 0x5b, 0xca, 0x0d, 0x00, 0x8d, 0x72, 0xf5, 0x7c, 0x1c, 0x6e, 0x6a, 0x36,
|
|
||||||
0xfb, 0x0c, 0xb8, 0xe1, 0x48, 0x33, 0xac, 0x13, 0x3c, 0x02, 0xac, 0x11, 0x12, 0xb4, 0x3c, 0x49,
|
|
||||||
0xc1, 0x9e, 0xc4, 0xb5, 0x5e, 0x21, 0xa2, 0x8f, 0xb6, 0x60, 0x64, 0x6c, 0x8e, 0x3f, 0x05, 0x68,
|
|
||||||
0x64, 0xa5, 0x5c, 0x0c, 0x5d, 0x95, 0x77, 0x2b, 0x62, 0xd2, 0x5b, 0x30, 0x6c, 0xe5, 0x19, 0xc0,
|
|
||||||
0x9f, 0x15, 0x92, 0x63, 0xad, 0xb0, 0x8c, 0xcc, 0xf2, 0xab, 0x00, 0x8d, 0x4e, 0xad, 0x68, 0x66,
|
|
||||||
0xac, 0x48, 0x5d, 0x61, 0xc5, 0xa6, 0xe3, 0xad, 0x18, 0xfc, 0xc5, 0x13, 0xc0, 0x3a, 0xb1, 0x10,
|
|
||||||
0xe3, 0x53, 0x76, 0x76, 0x75, 0x4a, 0x79, 0x18, 0x63, 0xc5, 0xee, 0x65, 0xbb, 0x22, 0x2e, 0xa3,
|
|
||||||
0x0d, 0xfd, 0x43, 0x36, 0x7e, 0x14, 0x50, 0xa7, 0x44, 0xb8, 0x92, 0x35, 0xb6, 0x5b, 0xd9, 0x04,
|
|
||||||
0x57, 0xf2, 0x64, 0x28, 0x2b, 0x90, 0xb3, 0xef, 0xf1, 0xa7, 0xda, 0xf0, 0xd3, 0xcc, 0x13, 0x00,
|
|
||||||
0x3d, 0x84, 0x6a, 0x6e, 0x27, 0x62, 0x47, 0x8e, 0x0e, 0xd3, 0xb6, 0x85, 0xc3, 0xc6, 0x65, 0xc5,
|
|
||||||
0x63, 0xc6, 0x0a, 0xe5, 0xc2, 0xae, 0x90, 0x67, 0xb6, 0xe3, 0xfb, 0xe0, 0x0c, 0x3f, 0x0a, 0x50,
|
|
||||||
0xc9, 0x3f, 0x56, 0xa7, 0xa2, 0xbc, 0xd2, 0x88, 0xa2, 0xfb, 0xee, 0x03, 0x2a, 0xf1, 0xaf, 0x15,
|
|
||||||
0x21, 0x8c, 0x3a, 0x8a, 0xd3, 0xed, 0x30, 0x0c, 0xf0, 0x04, 0xb0, 0x2d, 0x3e, 0x0c, 0x5f, 0x6a,
|
|
||||||
0x53, 0x31, 0x6f, 0x77, 0x42, 0x95, 0xab, 0x87, 0xbe, 0x67, 0x92, 0x5d, 0x69, 0x51, 0xae, 0x0c,
|
|
||||||
0xb7, 0x2e, 0xc8, 0x91, 0x70, 0xa6, 0x03, 0x7d, 0xc6, 0x69, 0x7e, 0x14, 0x48, 0x88, 0x0b, 0x45,
|
|
||||||
0xf7, 0xf3, 0xbd, 0xae, 0xe0, 0xfa, 0xee, 0x49, 0xa8, 0xf2, 0xf4, 0x2e, 0x18, 0xda, 0x84, 0x02,
|
|
||||||
0xba, 0x2b, 0x76, 0x22, 0xbf, 0xb4, 0x17, 0x9f, 0x0d, 0x53, 0xfc, 0x00, 0x28, 0x64, 0xa1, 0xe8,
|
|
||||||
0x7d, 0xb1, 0x00, 0x40, 0x5b, 0xd1, 0x3d, 0x03, 0xca, 0xab, 0x8c, 0xec, 0xfb, 0x76, 0x85, 0x18,
|
|
||||||
0xa2, 0x20, 0x01, 0x3a, 0xbb, 0x26, 0xf8, 0x01, 0x90, 0x4b, 0x43, 0xd0, 0xf7, 0x72, 0x1f, 0x1b,
|
|
||||||
0xfc, 0xf7, 0x8c, 0x1d, 0xc9, 0x67, 0x3b, 0xf1, 0xb5, 0xdf, 0x2d, 0x39, 0x23, 0x04, 0x1c, 0x4b,
|
|
||||||
0x6e, 0x18, 0x9c, 0x7e, 0x8c, 0xe2, 0x25, 0x21, 0x30, 0xbc, 0x72, 0x03, 0x50, 0x92, 0xf7, 0x5a,
|
|
||||||
0x2b, 0xd2, 0x35, 0x1f, 0xe0, 0xeb, 0x56, 0xc3, 0x29, 0x80, 0x2c, 0x36, 0x18, 0x3f, 0xea, 0x54,
|
|
||||||
0xac, 0x02, 0x8b, 0x0f, 0xf9, 0xa5, 0x3d, 0x78, 0x5a, 0x67, 0xf6, 0xe8, 0xa7, 0x1d, 0x9c, 0x02,
|
|
||||||
0x48, 0x37, 0x06, 0xc3, 0xf8, 0xda, 0x13, 0x60, 0x74, 0x7c, 0x0e, 0xca, 0x2c, 0x1d, 0x2c, 0xa3,
|
|
||||||
0xee, 0x23, 0x78, 0x91, 0x86, 0x53, 0x00, 0x49, 0x94, 0x08, 0x03, 0x6f, 0xf6, 0x7b, 0x5d, 0x69,
|
|
||||||
0x4d, 0xe3, 0x10, 0x72, 0x8a, 0xbb, 0x3c, 0xc6, 0x38, 0x05, 0x88, 0x59, 0x2f, 0x82, 0xe9, 0xad,
|
|
||||||
0x77, 0x00, 0x9a, 0x39, 0xb3, 0xf0, 0x13, 0xea, 0x9a, 0x46, 0x96, 0x41, 0x70, 0x0a, 0x10, 0x1d,
|
|
||||||
0x19, 0x04, 0x4b, 0xc3, 0x01, 0xaf, 0x0a, 0xd0, 0xce, 0x7e, 0x8b, 0x0d, 0x49, 0xd9, 0xda, 0x65,
|
|
||||||
0x1f, 0xac, 0x7f, 0x02, 0x58, 0x79, 0x29, 0x0d, 0x0f, 0x15, 0xe2, 0x6e, 0xa1, 0xc2, 0x27, 0x00,
|
|
||||||
0x1d, 0xa8, 0x66, 0xac, 0xa8, 0x5f, 0xa2, 0xc2, 0xb9, 0x8c, 0x58, 0xa4, 0xab, 0x22, 0x7d, 0xce,
|
|
||||||
0xf9, 0xbf, 0xaf, 0xe5, 0x7e, 0x97, 0xca, 0xd1, 0x20, 0x55, 0xc0, 0xc4, 0xc4, 0x0a, 0x5c, 0x69,
|
|
||||||
0x66, 0xd7, 0x31, 0xc5, 0xa9, 0x33, 0x30, 0xc5, 0x29, 0xa1, 0xc5, 0xa9, 0xab, 0x3c, 0x3f, 0xa9,
|
|
||||||
0x2e, 0x66, 0x20, 0x0a, 0x56, 0x51, 0x09, 0x33, 0x93, 0xfc, 0x01, 0xf3, 0x6f, 0x2d, 0xfb, 0x03,
|
|
||||||
0xed, 0x06, 0xb0, 0xce, 0xb5, 0xc4, 0xb4, 0x59, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
|
|
||||||
0xae, 0x42, 0x60, 0x82
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// converted to char array by bin2array
|
||||||
|
const uint8_t favicon_32x32[] = {
|
||||||
|
#include "webServerConstants/favicon-32x32.h"
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifndef NUKI_HUB_UPDATER
|
||||||
|
const uint8_t WEBSERIAL_HTML[] = {
|
||||||
|
#include "webServerConstants/webSerial.h"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
@@ -1,20 +1,22 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
# Required IDF version
|
# Required IDF version
|
||||||
idf: ">=5.2"
|
idf: ">=5.5"
|
||||||
|
|
||||||
esp-nimble-cpp:
|
esp-nimble-cpp:
|
||||||
git: https://github.com/h2zero/esp-nimble-cpp.git
|
git: https://github.com/h2zero/esp-nimble-cpp.git
|
||||||
version: 2.3.0
|
version: 8af38e7eb9ae779bf54708c029f33a875d5e8d62
|
||||||
|
|
||||||
espressif/libsodium: "^1.0.20~2"
|
espressif/libsodium: "^1.0.20~2"
|
||||||
|
|
||||||
espressif/esp_hosted:
|
espressif/esp_hosted:
|
||||||
version: "*"
|
version: "*"
|
||||||
|
#override_path: "../resources/espressif__esp_hosted"
|
||||||
rules:
|
rules:
|
||||||
- if: "target in [esp32p4]"
|
- if: "target in [esp32p4]"
|
||||||
|
|
||||||
espressif/esp_wifi_remote:
|
espressif/esp_wifi_remote:
|
||||||
version: "*"
|
version: "*"
|
||||||
|
#override_path: "../resources/espressif__esp_wifi_remote"
|
||||||
rules:
|
rules:
|
||||||
- if: "target in [esp32p4]"
|
- if: "target in [esp32p4]"
|
||||||
|
|
||||||
|
|||||||
691
src/main.cpp
691
src/main.cpp
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,4 @@
|
|||||||
|
#include "esp_task_wdt.h"
|
||||||
#include "EthernetDevice.h"
|
#include "EthernetDevice.h"
|
||||||
#include "../PreferencesKeys.h"
|
#include "../PreferencesKeys.h"
|
||||||
#include "../Logger.h"
|
#include "../Logger.h"
|
||||||
@@ -68,14 +69,20 @@ const String EthernetDevice::deviceName() const
|
|||||||
|
|
||||||
void EthernetDevice::initialize()
|
void EthernetDevice::initialize()
|
||||||
{
|
{
|
||||||
delay(250);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(250 / portTICK_PERIOD_MS);
|
||||||
if(ethCriticalFailure)
|
if(ethCriticalFailure)
|
||||||
{
|
{
|
||||||
ethCriticalFailure = false;
|
ethCriticalFailure = false;
|
||||||
Log->println("Failed to initialize ethernet hardware");
|
Log->println("Failed to initialize ethernet hardware");
|
||||||
Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot.");
|
Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot.");
|
||||||
wifiFallback = true;
|
wifiFallback = true;
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::NetworkDeviceCriticalFailure);
|
restartEsp(RestartReason::NetworkDeviceCriticalFailure);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -101,7 +108,11 @@ void EthernetDevice::initialize()
|
|||||||
// https://github.com/arendst/Tasmota/commit/f8fbe153000591727e40b5007e0de78c33833131
|
// https://github.com/arendst/Tasmota/commit/f8fbe153000591727e40b5007e0de78c33833131
|
||||||
// https://github.com/arendst/Tasmota/commit/f8fbe153000591727e40b5007e0de78c33833131#diff-32fc0eefbf488dd507b3bef52189bbe37158737aba6f96fe98a8746dc5021955R417
|
// https://github.com/arendst/Tasmota/commit/f8fbe153000591727e40b5007e0de78c33833131#diff-32fc0eefbf488dd507b3bef52189bbe37158737aba6f96fe98a8746dc5021955R417
|
||||||
uint32_t pkg_version = bootloader_common_get_chip_ver_pkg();
|
uint32_t pkg_version = bootloader_common_get_chip_ver_pkg();
|
||||||
|
#if defined(CONFIG_SOC_SPIRAM_SUPPORTED) && defined(CONFIG_SPIRAM)
|
||||||
if(esp_psram_get_size() <= 0 && pkg_version <= 3)
|
if(esp_psram_get_size() <= 0 && pkg_version <= 3)
|
||||||
|
#else
|
||||||
|
if(pkg_version <= 3)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
esp_gpio_revoke(0xFFFFFFFFFFFFFFFF);
|
esp_gpio_revoke(0xFFFFFFFFFFFFFFFF);
|
||||||
}
|
}
|
||||||
@@ -136,7 +147,10 @@ void EthernetDevice::initialize()
|
|||||||
Log->println("Failed to initialize ethernet hardware");
|
Log->println("Failed to initialize ethernet hardware");
|
||||||
Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot.");
|
Log->println("Network device has a critical failure, enable fallback to Wi-Fi and reboot.");
|
||||||
wifiFallback = true;
|
wifiFallback = true;
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::NetworkDeviceCriticalFailure);
|
restartEsp(RestartReason::NetworkDeviceCriticalFailure);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -218,7 +232,10 @@ void EthernetDevice::onNetworkEvent(arduino_event_id_t event, arduino_event_info
|
|||||||
|
|
||||||
void EthernetDevice::reconfigure()
|
void EthernetDevice::reconfigure()
|
||||||
{
|
{
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::ReconfigureETH);
|
restartEsp(RestartReason::ReconfigureETH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,19 +7,10 @@
|
|||||||
#include "SPIFFS.h"
|
#include "SPIFFS.h"
|
||||||
#include "../MqttTopics.h"
|
#include "../MqttTopics.h"
|
||||||
#include "PreferencesKeys.h"
|
#include "PreferencesKeys.h"
|
||||||
#ifdef CONFIG_SOC_SPIRAM_SUPPORTED
|
|
||||||
#include "esp_psram.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void NetworkDevice::init()
|
void NetworkDevice::init()
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SOC_SPIRAM_SUPPORTED
|
_useEncryption = false;
|
||||||
if(esp_psram_get_size() > 0)
|
|
||||||
{
|
|
||||||
//_mqttInternal = true;
|
|
||||||
_mqttInternal = false;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if(_preferences->getBool(preference_mqtt_ssl_enabled, false)) {
|
if(_preferences->getBool(preference_mqtt_ssl_enabled, false)) {
|
||||||
if (!SPIFFS.begin(true)) {
|
if (!SPIFFS.begin(true)) {
|
||||||
@@ -276,6 +267,21 @@ void NetworkDevice::mqttDisable()
|
|||||||
_mqttEnabled = false;
|
_mqttEnabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NetworkDevice::mqttRestart()
|
||||||
|
{
|
||||||
|
if (_useEncryption)
|
||||||
|
{
|
||||||
|
delete _mqttClientSecure;
|
||||||
|
_mqttClientSecure = nullptr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delete _mqttClient;
|
||||||
|
_mqttClient = nullptr;
|
||||||
|
}
|
||||||
|
init();
|
||||||
|
}
|
||||||
|
|
||||||
bool NetworkDevice::isEncrypted()
|
bool NetworkDevice::isEncrypted()
|
||||||
{
|
{
|
||||||
return _useEncryption;
|
return _useEncryption;
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ public:
|
|||||||
virtual bool mqttConnect();
|
virtual bool mqttConnect();
|
||||||
virtual bool mqttDisconnect(bool force);
|
virtual bool mqttDisconnect(bool force);
|
||||||
virtual void mqttDisable();
|
virtual void mqttDisable();
|
||||||
|
virtual void mqttRestart();
|
||||||
virtual bool mqttConnected() const;
|
virtual bool mqttConnected() const;
|
||||||
|
|
||||||
virtual uint16_t mqttPublish(const char* topic, uint8_t qos, bool retain, const char* payload);
|
virtual uint16_t mqttPublish(const char* topic, uint8_t qos, bool retain, const char* payload);
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
#include "esp_task_wdt.h"
|
||||||
#include "WifiDevice.h"
|
#include "WifiDevice.h"
|
||||||
#include "../PreferencesKeys.h"
|
#include "../PreferencesKeys.h"
|
||||||
#include "../Logger.h"
|
#include "../Logger.h"
|
||||||
@@ -36,21 +37,38 @@ void WifiDevice::initialize()
|
|||||||
{
|
{
|
||||||
Log->println(String("Attempting to connect to saved SSID ") + String(ssid));
|
Log->println(String("Attempting to connect to saved SSID ") + String(ssid));
|
||||||
_openAP = false;
|
_openAP = false;
|
||||||
|
if(_preferences->getBool(preference_find_best_rssi, false))
|
||||||
|
{
|
||||||
|
scan(false, true);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WiFi.mode(WIFI_STA);
|
||||||
|
connect();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Log->println("No SSID or Wifi password saved, opening AP");
|
Log->println("No SSID or Wifi password saved, opening AP");
|
||||||
_openAP = true;
|
_openAP = true;
|
||||||
}
|
|
||||||
|
|
||||||
scan(false, true);
|
scan(false, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
WiFi.disconnect(true);
|
WiFi.disconnect(true);
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
WiFi.disconnect();
|
WiFi.disconnect();
|
||||||
delay(5000);
|
|
||||||
|
int loop = 0;
|
||||||
|
while (!_wifiClientStarted && loop < 50) {
|
||||||
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
loop++;
|
||||||
|
}
|
||||||
|
|
||||||
Log->println("Dummy WiFi device for Hosted on P4 done");
|
Log->println("Dummy WiFi device for Hosted on P4 done");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
@@ -60,11 +78,21 @@ void WifiDevice::scan(bool passive, bool async)
|
|||||||
{
|
{
|
||||||
if (!_openAP)
|
if (!_openAP)
|
||||||
{
|
{
|
||||||
|
_wifiClientStarted = false;
|
||||||
WiFi.disconnect(true);
|
WiFi.disconnect(true);
|
||||||
WiFi.mode(WIFI_STA);
|
WiFi.mode(WIFI_STA);
|
||||||
WiFi.disconnect();
|
WiFi.disconnect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int loop = 0;
|
||||||
|
while (!_wifiClientStarted && loop < 50) {
|
||||||
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
loop++;
|
||||||
|
}
|
||||||
|
|
||||||
WiFi.scanDelete();
|
WiFi.scanDelete();
|
||||||
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
WiFi.setScanMethod(WIFI_ALL_CHANNEL_SCAN);
|
||||||
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);
|
WiFi.setSortMethod(WIFI_CONNECT_AP_BY_SIGNAL);
|
||||||
@@ -94,9 +122,15 @@ void WifiDevice::openAP()
|
|||||||
Log->println("Starting AP with SSID NukiHub and Password NukiHubESP32");
|
Log->println("Starting AP with SSID NukiHub and Password NukiHubESP32");
|
||||||
_startAP = false;
|
_startAP = false;
|
||||||
WiFi.mode(WIFI_AP);
|
WiFi.mode(WIFI_AP);
|
||||||
delay(500);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||||
WiFi.softAPsetHostname(_hostname.c_str());
|
WiFi.softAPsetHostname(_hostname.c_str());
|
||||||
delay(500);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(500 / portTICK_PERIOD_MS);
|
||||||
WiFi.softAP("NukiHub", "NukiHubESP32");
|
WiFi.softAP("NukiHub", "NukiHubESP32");
|
||||||
|
|
||||||
//if(MDNS.begin(_hostname.c_str())){
|
//if(MDNS.begin(_hostname.c_str())){
|
||||||
@@ -107,9 +141,14 @@ void WifiDevice::openAP()
|
|||||||
|
|
||||||
bool WifiDevice::connect()
|
bool WifiDevice::connect()
|
||||||
{
|
{
|
||||||
WiFi.mode(WIFI_STA);
|
int loop = 0;
|
||||||
WiFi.setHostname(_hostname.c_str());
|
while (!_wifiClientStarted && loop < 50) {
|
||||||
delay(500);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
|
loop++;
|
||||||
|
}
|
||||||
|
|
||||||
int bestConnection = -1;
|
int bestConnection = -1;
|
||||||
|
|
||||||
@@ -158,14 +197,24 @@ bool WifiDevice::connect()
|
|||||||
WiFi.config(_ipConfiguration->ipAddress(), _ipConfiguration->dnsServer(), _ipConfiguration->defaultGateway(), _ipConfiguration->subnet());
|
WiFi.config(_ipConfiguration->ipAddress(), _ipConfiguration->dnsServer(), _ipConfiguration->defaultGateway(), _ipConfiguration->subnet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (bestConnection == -1)
|
||||||
|
{
|
||||||
WiFi.begin(ssid, pass);
|
WiFi.begin(ssid, pass);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
WiFi.begin(ssid, pass, WiFi.channel(bestConnection), WiFi.BSSID(bestConnection), 1);
|
||||||
|
}
|
||||||
|
|
||||||
Log->print("WiFi connecting");
|
Log->print("WiFi connecting");
|
||||||
int loop = 0;
|
loop = 0;
|
||||||
while(!isConnected() && loop < 150)
|
while(!isConnected() && loop < 600)
|
||||||
{
|
{
|
||||||
Log->print(".");
|
Log->print(".");
|
||||||
delay(100);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(25 / portTICK_PERIOD_MS);
|
||||||
loop++;
|
loop++;
|
||||||
}
|
}
|
||||||
Log->println("");
|
Log->println("");
|
||||||
@@ -177,7 +226,10 @@ bool WifiDevice::connect()
|
|||||||
if(_preferences->getBool(preference_restart_on_disconnect, false) && (espMillis() > 60000))
|
if(_preferences->getBool(preference_restart_on_disconnect, false) && (espMillis() > 60000))
|
||||||
{
|
{
|
||||||
Log->println("Restart on disconnect watchdog triggered, rebooting");
|
Log->println("Restart on disconnect watchdog triggered, rebooting");
|
||||||
delay(100);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(100 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::RestartOnDisconnectWatchdog);
|
restartEsp(RestartReason::RestartOnDisconnectWatchdog);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -201,7 +253,10 @@ void WifiDevice::reconfigure()
|
|||||||
{
|
{
|
||||||
_preferences->putString(preference_wifi_ssid, "");
|
_preferences->putString(preference_wifi_ssid, "");
|
||||||
_preferences->putString(preference_wifi_pass, "");
|
_preferences->putString(preference_wifi_pass, "");
|
||||||
delay(200);
|
if (esp_task_wdt_status(NULL) == ESP_OK) {
|
||||||
|
esp_task_wdt_reset();
|
||||||
|
}
|
||||||
|
vTaskDelay(200 / portTICK_PERIOD_MS);
|
||||||
restartEsp(RestartReason::ReconfigureWifi);
|
restartEsp(RestartReason::ReconfigureWifi);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,6 +341,7 @@ void WifiDevice::onWifiEvent(const WiFiEvent_t &event, const WiFiEventInfo_t &in
|
|||||||
break;
|
break;
|
||||||
case ARDUINO_EVENT_WIFI_STA_START:
|
case ARDUINO_EVENT_WIFI_STA_START:
|
||||||
Log->println("WiFi client started");
|
Log->println("WiFi client started");
|
||||||
|
_wifiClientStarted = true;
|
||||||
break;
|
break;
|
||||||
case ARDUINO_EVENT_WIFI_STA_STOP:
|
case ARDUINO_EVENT_WIFI_STA_STOP:
|
||||||
Log->println("WiFi clients stopped");
|
Log->println("WiFi clients stopped");
|
||||||
|
|||||||
@@ -43,4 +43,5 @@ private:
|
|||||||
bool _openAP = false;
|
bool _openAP = false;
|
||||||
bool _startAP = true;
|
bool _startAP = true;
|
||||||
bool _connected = false;
|
bool _connected = false;
|
||||||
|
bool _wifiClientStarted = false;
|
||||||
};
|
};
|
||||||
52
src/webServerConstants/favicon-32x32.h
Normal file
52
src/webServerConstants/favicon-32x32.h
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
|
||||||
|
0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x08, 0x06, 0x00, 0x00, 0x00, 0x73, 0x7a, 0x7a,
|
||||||
|
0xf4, 0x00, 0x00, 0x02, 0xfb, 0x49, 0x44, 0x41, 0x54, 0x58, 0x47, 0xcd, 0x97, 0x4b, 0x4c, 0x53,
|
||||||
|
0x41, 0x14, 0x86, 0xff, 0x69, 0xa5, 0x3c, 0x8a, 0x12, 0x14, 0x84, 0xa6, 0x96, 0x60, 0x6d, 0xd0,
|
||||||
|
0x50, 0x14, 0x51, 0xd1, 0x6a, 0x4c, 0x51, 0x63, 0x88, 0x8a, 0x06, 0x63, 0x42, 0xc0, 0x85, 0x01,
|
||||||
|
0xc3, 0xae, 0xe8, 0x0a, 0x0d, 0x4a, 0x30, 0x31, 0x18, 0xd1, 0x84, 0x18, 0x83, 0x46, 0x5d, 0xa9,
|
||||||
|
0x09, 0xb8, 0x01, 0xa2, 0x31, 0x82, 0x31, 0x82, 0x6e, 0x48, 0x78, 0xb6, 0x74, 0xe1, 0x8b, 0x47,
|
||||||
|
0xb0, 0x3e, 0x0a, 0xb4, 0x05, 0xa1, 0xe1, 0x25, 0x14, 0x68, 0xeb, 0x9d, 0x22, 0xb7, 0x40, 0x1f,
|
||||||
|
0x1b, 0xef, 0xa5, 0xce, 0xea, 0xde, 0x99, 0xce, 0x39, 0xdf, 0xfc, 0x7f, 0x67, 0xee, 0x1c, 0xe2,
|
||||||
|
0xbc, 0x0e, 0x81, 0xe3, 0x84, 0xba, 0x58, 0x40, 0x88, 0xc6, 0x09, 0x48, 0xb0, 0x0a, 0x8d, 0x00,
|
||||||
|
0x26, 0x07, 0x71, 0x3e, 0x14, 0xd4, 0x37, 0x95, 0x11, 0x7b, 0x87, 0xba, 0x84, 0x10, 0x72, 0x63,
|
||||||
|
0x15, 0xf2, 0x7a, 0xa4, 0x70, 0x12, 0xe7, 0x35, 0xe2, 0xe8, 0x48, 0x33, 0x81, 0x20, 0x36, 0x10,
|
||||||
|
0x00, 0x4c, 0x4e, 0x33, 0x71, 0x68, 0xd3, 0x18, 0xe5, 0x03, 0xd7, 0xfe, 0x6f, 0x80, 0x86, 0xb6,
|
||||||
|
0x51, 0xd4, 0xbe, 0x1b, 0x66, 0xe5, 0xd1, 0x64, 0x49, 0x91, 0xb2, 0x35, 0xdc, 0xaf, 0x5c, 0x25,
|
||||||
|
0x8f, 0xbe, 0xc1, 0x36, 0xeb, 0x60, 0x7f, 0x93, 0x79, 0x28, 0x0a, 0x07, 0x93, 0x23, 0x7c, 0xce,
|
||||||
|
0xf1, 0xab, 0xc0, 0x9d, 0x67, 0x46, 0x5c, 0xae, 0x30, 0xb0, 0x93, 0x93, 0xb6, 0x88, 0xa1, 0xad,
|
||||||
|
0xdc, 0x85, 0x60, 0x91, 0xc0, 0x67, 0xc0, 0xc8, 0xc3, 0xcd, 0x18, 0x9b, 0x9c, 0x67, 0xc7, 0x2b,
|
||||||
|
0x2e, 0x29, 0x70, 0x31, 0x5b, 0xca, 0x0d, 0x00, 0x8d, 0x72, 0xf5, 0x7c, 0x1c, 0x6e, 0x6a, 0x36,
|
||||||
|
0xfb, 0x0c, 0xb8, 0xe1, 0x48, 0x33, 0xac, 0x13, 0x3c, 0x02, 0xac, 0x11, 0x12, 0xb4, 0x3c, 0x49,
|
||||||
|
0xc1, 0x9e, 0xc4, 0xb5, 0x5e, 0x21, 0xa2, 0x8f, 0xb6, 0x60, 0x64, 0x6c, 0x8e, 0x3f, 0x05, 0x68,
|
||||||
|
0x64, 0xa5, 0x5c, 0x0c, 0x5d, 0x95, 0x77, 0x2b, 0x62, 0xd2, 0x5b, 0x30, 0x6c, 0xe5, 0x19, 0xc0,
|
||||||
|
0x9f, 0x15, 0x92, 0x63, 0xad, 0xb0, 0x8c, 0xcc, 0xf2, 0xab, 0x00, 0x8d, 0x4e, 0xad, 0x68, 0x66,
|
||||||
|
0xac, 0x48, 0x5d, 0x61, 0xc5, 0xa6, 0xe3, 0xad, 0x18, 0xfc, 0xc5, 0x13, 0xc0, 0x3a, 0xb1, 0x10,
|
||||||
|
0xe3, 0x53, 0x76, 0x76, 0x75, 0x4a, 0x79, 0x18, 0x63, 0xc5, 0xee, 0x65, 0xbb, 0x22, 0x2e, 0xa3,
|
||||||
|
0x0d, 0xfd, 0x43, 0x36, 0x7e, 0x14, 0x50, 0xa7, 0x44, 0xb8, 0x92, 0x35, 0xb6, 0x5b, 0xd9, 0x04,
|
||||||
|
0x57, 0xf2, 0x64, 0x28, 0x2b, 0x90, 0xb3, 0xef, 0xf1, 0xa7, 0xda, 0xf0, 0xd3, 0xcc, 0x13, 0x00,
|
||||||
|
0x3d, 0x84, 0x6a, 0x6e, 0x27, 0x62, 0x47, 0x8e, 0x0e, 0xd3, 0xb6, 0x85, 0xc3, 0xc6, 0x65, 0xc5,
|
||||||
|
0x63, 0xc6, 0x0a, 0xe5, 0xc2, 0xae, 0x90, 0x67, 0xb6, 0xe3, 0xfb, 0xe0, 0x0c, 0x3f, 0x0a, 0x50,
|
||||||
|
0xc9, 0x3f, 0x56, 0xa7, 0xa2, 0xbc, 0xd2, 0x88, 0xa2, 0xfb, 0xee, 0x03, 0x2a, 0xf1, 0xaf, 0x15,
|
||||||
|
0x21, 0x8c, 0x3a, 0x8a, 0xd3, 0xed, 0x30, 0x0c, 0xf0, 0x04, 0xb0, 0x2d, 0x3e, 0x0c, 0x5f, 0x6a,
|
||||||
|
0x53, 0x31, 0x6f, 0x77, 0x42, 0x95, 0xab, 0x87, 0xbe, 0x67, 0x92, 0x5d, 0x69, 0x51, 0xae, 0x0c,
|
||||||
|
0xb7, 0x2e, 0xc8, 0x91, 0x70, 0xa6, 0x03, 0x7d, 0xc6, 0x69, 0x7e, 0x14, 0x48, 0x88, 0x0b, 0x45,
|
||||||
|
0xf7, 0xf3, 0xbd, 0xae, 0xe0, 0xfa, 0xee, 0x49, 0xa8, 0xf2, 0xf4, 0x2e, 0x18, 0xda, 0x84, 0x02,
|
||||||
|
0xba, 0x2b, 0x76, 0x22, 0xbf, 0xb4, 0x17, 0x9f, 0x0d, 0x53, 0xfc, 0x00, 0x28, 0x64, 0xa1, 0xe8,
|
||||||
|
0x7d, 0xb1, 0x00, 0x40, 0x5b, 0xd1, 0x3d, 0x03, 0xca, 0xab, 0x8c, 0xec, 0xfb, 0x76, 0x85, 0x18,
|
||||||
|
0xa2, 0x20, 0x01, 0x3a, 0xbb, 0x26, 0xf8, 0x01, 0x90, 0x4b, 0x43, 0xd0, 0xf7, 0x72, 0x1f, 0x1b,
|
||||||
|
0xfc, 0xf7, 0x8c, 0x1d, 0xc9, 0x67, 0x3b, 0xf1, 0xb5, 0xdf, 0x2d, 0x39, 0x23, 0x04, 0x1c, 0x4b,
|
||||||
|
0x6e, 0x18, 0x9c, 0x7e, 0x8c, 0xe2, 0x25, 0x21, 0x30, 0xbc, 0x72, 0x03, 0x50, 0x92, 0xf7, 0x5a,
|
||||||
|
0x2b, 0xd2, 0x35, 0x1f, 0xe0, 0xeb, 0x56, 0xc3, 0x29, 0x80, 0x2c, 0x36, 0x18, 0x3f, 0xea, 0x54,
|
||||||
|
0xac, 0x02, 0x8b, 0x0f, 0xf9, 0xa5, 0x3d, 0x78, 0x5a, 0x67, 0xf6, 0xe8, 0xa7, 0x1d, 0x9c, 0x02,
|
||||||
|
0x48, 0x37, 0x06, 0xc3, 0xf8, 0xda, 0x13, 0x60, 0x74, 0x7c, 0x0e, 0xca, 0x2c, 0x1d, 0x2c, 0xa3,
|
||||||
|
0xee, 0x23, 0x78, 0x91, 0x86, 0x53, 0x00, 0x49, 0x94, 0x08, 0x03, 0x6f, 0xf6, 0x7b, 0x5d, 0x69,
|
||||||
|
0x4d, 0xe3, 0x10, 0x72, 0x8a, 0xbb, 0x3c, 0xc6, 0x38, 0x05, 0x88, 0x59, 0x2f, 0x82, 0xe9, 0xad,
|
||||||
|
0x77, 0x00, 0x9a, 0x39, 0xb3, 0xf0, 0x13, 0xea, 0x9a, 0x46, 0x96, 0x41, 0x70, 0x0a, 0x10, 0x1d,
|
||||||
|
0x19, 0x04, 0x4b, 0xc3, 0x01, 0xaf, 0x0a, 0xd0, 0xce, 0x7e, 0x8b, 0x0d, 0x49, 0xd9, 0xda, 0x65,
|
||||||
|
0x1f, 0xac, 0x7f, 0x02, 0x58, 0x79, 0x29, 0x0d, 0x0f, 0x15, 0xe2, 0x6e, 0xa1, 0xc2, 0x27, 0x00,
|
||||||
|
0x1d, 0xa8, 0x66, 0xac, 0xa8, 0x5f, 0xa2, 0xc2, 0xb9, 0x8c, 0x58, 0xa4, 0xab, 0x22, 0x7d, 0xce,
|
||||||
|
0xf9, 0xbf, 0xaf, 0xe5, 0x7e, 0x97, 0xca, 0xd1, 0x20, 0x55, 0xc0, 0xc4, 0xc4, 0x0a, 0x5c, 0x69,
|
||||||
|
0x66, 0xd7, 0x31, 0xc5, 0xa9, 0x33, 0x30, 0xc5, 0x29, 0xa1, 0xc5, 0xa9, 0xab, 0x3c, 0x3f, 0xa9,
|
||||||
|
0x2e, 0x66, 0x20, 0x0a, 0x56, 0x51, 0x09, 0x33, 0x93, 0xfc, 0x01, 0xf3, 0x6f, 0x2d, 0xfb, 0x03,
|
||||||
|
0xed, 0x06, 0xb0, 0xce, 0xb5, 0xc4, 0xb4, 0x59, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
|
||||||
|
0xae, 0x42, 0x60, 0x82,
|
||||||
363
src/webServerConstants/style.h
Normal file
363
src/webServerConstants/style.h
Normal file
@@ -0,0 +1,363 @@
|
|||||||
|
0x2f, 0x2a, 0x0d, 0x0a, 0x65, 0x73, 0x63, 0x61, 0x70, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x68,
|
||||||
|
0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x63, 0x65, 0x73, 0x63, 0x61,
|
||||||
|
0x70, 0x65, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x0d, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
|
||||||
|
0x3a, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x63, 0x64, 0x6e, 0x2e, 0x6a, 0x73,
|
||||||
|
0x64, 0x65, 0x6c, 0x69, 0x76, 0x72, 0x2e, 0x6e, 0x65, 0x74, 0x2f, 0x6e, 0x70, 0x6d, 0x2f, 0x40,
|
||||||
|
0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x65, 0x76, 0x2f, 0x6e, 0x65, 0x77, 0x2e, 0x63,
|
||||||
|
0x73, 0x73, 0x40, 0x31, 0x2e, 0x31, 0x2e, 0x32, 0x2f, 0x6e, 0x65, 0x77, 0x2e, 0x6d, 0x69, 0x6e,
|
||||||
|
0x2e, 0x63, 0x73, 0x73, 0x0d, 0x0a, 0x2a, 0x2f, 0x0d, 0x0a, 0x0d, 0x0a, 0x2f, 0x2a, 0x0d, 0x0a,
|
||||||
|
0x20, 0x2a, 0x20, 0x55, 0x73, 0x61, 0x67, 0x65, 0x3a, 0x0d, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f,
|
||||||
|
0x6d, 0x70, 0x61, 0x63, 0x74, 0x20, 0x2f, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x66, 0x79, 0x20, 0x74,
|
||||||
|
0x68, 0x69, 0x73, 0x20, 0x63, 0x6f, 0x64, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e,
|
||||||
|
0x79, 0x20, 0x74, 0x6f, 0x6f, 0x6c, 0x0d, 0x0a, 0x20, 0x2a, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x20,
|
||||||
|
0x6f, 0x6e, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20,
|
||||||
|
0x74, 0x6f, 0x20, 0x73, 0x72, 0x63, 0x2f, 0x57, 0x65, 0x62, 0x43, 0x66, 0x67, 0x53, 0x65, 0x72,
|
||||||
|
0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x73, 0x2e, 0x68, 0x20, 0x61,
|
||||||
|
0x73, 0x20, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x63, 0x73, 0x73, 0x0d, 0x0a, 0x20, 0x2a, 0x20, 0x54,
|
||||||
|
0x4f, 0x44, 0x4f, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68,
|
||||||
|
0x69, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x20, 0x75, 0x70, 0x6f, 0x6e, 0x20,
|
||||||
|
0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x3a, 0x29, 0x0d, 0x0a, 0x2a, 0x2f, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x3a, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x61, 0x6e, 0x73, 0x3a, 0x20,
|
||||||
|
0x27, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x27, 0x2c, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x73,
|
||||||
|
0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x63, 0x53, 0x79,
|
||||||
|
0x73, 0x74, 0x65, 0x6d, 0x46, 0x6f, 0x6e, 0x74, 0x2c, 0x27, 0x53, 0x65, 0x67, 0x6f, 0x65, 0x20,
|
||||||
|
0x55, 0x49, 0x27, 0x2c, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x2c, 0x4f, 0x78, 0x79, 0x67, 0x65,
|
||||||
|
0x6e, 0x2c, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x2c, 0x43, 0x61, 0x6e, 0x74, 0x61, 0x72, 0x65,
|
||||||
|
0x6c, 0x6c, 0x2c, 0x27, 0x4f, 0x70, 0x65, 0x6e, 0x20, 0x53, 0x61, 0x6e, 0x73, 0x27, 0x2c, 0x27,
|
||||||
|
0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x20, 0x4e, 0x65, 0x75, 0x65, 0x27, 0x2c,
|
||||||
|
0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x2c, 0x27, 0x41, 0x70, 0x70, 0x6c,
|
||||||
|
0x65, 0x20, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x27, 0x2c, 0x27,
|
||||||
|
0x53, 0x65, 0x67, 0x6f, 0x65, 0x20, 0x55, 0x49, 0x20, 0x45, 0x6d, 0x6f, 0x6a, 0x69, 0x27, 0x2c,
|
||||||
|
0x27, 0x53, 0x65, 0x67, 0x6f, 0x65, 0x20, 0x55, 0x49, 0x20, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c,
|
||||||
|
0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x66, 0x6f, 0x6e,
|
||||||
|
0x74, 0x2d, 0x6d, 0x6f, 0x6e, 0x6f, 0x3a, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x61, 0x73,
|
||||||
|
0x2c, 0x6d, 0x6f, 0x6e, 0x61, 0x63, 0x6f, 0x2c, 0x27, 0x55, 0x62, 0x75, 0x6e, 0x74, 0x75, 0x20,
|
||||||
|
0x4d, 0x6f, 0x6e, 0x6f, 0x27, 0x2c, 0x27, 0x4c, 0x69, 0x62, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x20, 0x4d, 0x6f, 0x6e, 0x6f, 0x27, 0x2c, 0x27, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72,
|
||||||
|
0x20, 0x4e, 0x65, 0x77, 0x27, 0x2c, 0x43, 0x6f, 0x75, 0x72, 0x69, 0x65, 0x72, 0x2c, 0x6d, 0x6f,
|
||||||
|
0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d,
|
||||||
|
0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x32, 0x3a, 0x20, 0x23,
|
||||||
|
0x31, 0x61, 0x31, 0x61, 0x31, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e,
|
||||||
|
0x63, 0x2d, 0x62, 0x67, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x32, 0x3a, 0x20, 0x23, 0x66,
|
||||||
|
0x36, 0x66, 0x38, 0x66, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63,
|
||||||
|
0x2d, 0x62, 0x67, 0x2d, 0x33, 0x3a, 0x20, 0x23, 0x65, 0x35, 0x65, 0x37, 0x65, 0x62, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x31, 0x3a, 0x20,
|
||||||
|
0x23, 0x30, 0x30, 0x37, 0x30, 0x66, 0x33, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d,
|
||||||
|
0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x32, 0x3a, 0x20, 0x23, 0x30, 0x33, 0x36, 0x36, 0x64, 0x36,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x74,
|
||||||
|
0x78, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d,
|
||||||
|
0x6e, 0x63, 0x2d, 0x61, 0x63, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x37, 0x39, 0x66, 0x66, 0x65, 0x31,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x61, 0x63, 0x2d, 0x74,
|
||||||
|
0x78, 0x3a, 0x20, 0x23, 0x30, 0x63, 0x34, 0x30, 0x34, 0x37, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x28, 0x70, 0x72, 0x65, 0x66, 0x65, 0x72, 0x73, 0x2d,
|
||||||
|
0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x2d, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x3a, 0x20, 0x64, 0x61,
|
||||||
|
0x72, 0x6b, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3a, 0x72, 0x6f, 0x6f, 0x74,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63,
|
||||||
|
0x2d, 0x74, 0x78, 0x2d, 0x31, 0x3a, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x32, 0x3a, 0x20,
|
||||||
|
0x23, 0x65, 0x65, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
|
||||||
|
0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67,
|
||||||
|
0x2d, 0x32, 0x3a, 0x20, 0x23, 0x31, 0x31, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x33, 0x3a, 0x20, 0x23, 0x32,
|
||||||
|
0x32, 0x32, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e,
|
||||||
|
0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x33, 0x32, 0x39, 0x31, 0x66, 0x66, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c,
|
||||||
|
0x6b, 0x2d, 0x32, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x37, 0x30, 0x66, 0x33, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x74,
|
||||||
|
0x78, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x61, 0x63, 0x2d, 0x31, 0x3a, 0x20, 0x23, 0x37, 0x39,
|
||||||
|
0x32, 0x38, 0x63, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2d,
|
||||||
|
0x2d, 0x6e, 0x63, 0x2d, 0x61, 0x63, 0x2d, 0x74, 0x78, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2a, 0x20, 0x7b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30,
|
||||||
|
0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x69, 0x6d, 0x67, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
||||||
|
0x2c, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x70, 0x2c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x2c,
|
||||||
|
0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x2c, 0x75, 0x6c, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d,
|
||||||
|
0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x75, 0x74,
|
||||||
|
0x74, 0x6f, 0x6e, 0x2c, 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x73,
|
||||||
|
0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e,
|
||||||
|
0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d,
|
||||||
|
0x6e, 0x63, 0x2d, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x61, 0x6e, 0x73, 0x29, 0x0d, 0x0a, 0x7d,
|
||||||
|
0x0d, 0x0a, 0x0d, 0x0a, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20,
|
||||||
|
0x37, 0x35, 0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64,
|
||||||
|
0x69, 0x6e, 0x67, 0x3a, 0x20, 0x32, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x36,
|
||||||
|
0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f,
|
||||||
|
0x77, 0x2d, 0x78, 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x77, 0x6f, 0x72, 0x64, 0x2d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x3a, 0x20, 0x6e, 0x6f,
|
||||||
|
0x72, 0x6d, 0x61, 0x6c, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66,
|
||||||
|
0x6c, 0x6f, 0x77, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x3a, 0x20, 0x61, 0x6e, 0x79, 0x77, 0x68, 0x65,
|
||||||
|
0x72, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
|
||||||
|
0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67,
|
||||||
|
0x2d, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
||||||
|
0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x32, 0x29, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a,
|
||||||
|
0x20, 0x31, 0x2e, 0x30, 0x33, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c,
|
||||||
|
0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x2e, 0x35, 0x0d,
|
||||||
|
0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x3a, 0x3a, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f,
|
||||||
|
0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x61, 0x63,
|
||||||
|
0x2d, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
||||||
|
0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x61, 0x63, 0x2d, 0x74, 0x78, 0x29,
|
||||||
|
0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x31, 0x2c, 0x68, 0x32, 0x2c, 0x68, 0x33, 0x2c,
|
||||||
|
0x68, 0x34, 0x2c, 0x68, 0x35, 0x2c, 0x68, 0x36, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28,
|
||||||
|
0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x2e, 0x38,
|
||||||
|
0x37, 0x35, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x31, 0x2c, 0x68,
|
||||||
|
0x32, 0x2c, 0x68, 0x33, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x31,
|
||||||
|
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d,
|
||||||
|
0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x32, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a,
|
||||||
|
0x20, 0x38, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||||
|
0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f,
|
||||||
|
0x6c, 0x69, 0x64, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d,
|
||||||
|
0x32, 0x29, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x34, 0x2c, 0x68, 0x35, 0x2c, 0x68,
|
||||||
|
0x36, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d,
|
||||||
|
0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x2e, 0x33, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d,
|
||||||
|
0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x31, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f,
|
||||||
|
0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x2e, 0x32, 0x35, 0x72, 0x65, 0x6d,
|
||||||
|
0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x32, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x2e, 0x38, 0x35,
|
||||||
|
0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x33, 0x20, 0x7b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31,
|
||||||
|
0x2e, 0x35, 0x35, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x68, 0x34, 0x20,
|
||||||
|
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65,
|
||||||
|
0x3a, 0x20, 0x31, 0x2e, 0x32, 0x35, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x68, 0x35, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73,
|
||||||
|
0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x68, 0x36, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73,
|
||||||
|
0x69, 0x7a, 0x65, 0x3a, 0x20, 0x2e, 0x38, 0x37, 0x35, 0x72, 0x65, 0x6d, 0x0d, 0x0a, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x31,
|
||||||
|
0x29, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20,
|
||||||
|
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x76, 0x61,
|
||||||
|
0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x32, 0x29, 0x20, 0x21, 0x69, 0x6d,
|
||||||
|
0x70, 0x6f, 0x72, 0x74, 0x61, 0x6e, 0x74, 0x3b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61,
|
||||||
|
0x62, 0x62, 0x72, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x73, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x61, 0x62,
|
||||||
|
0x62, 0x72, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x68, 0x65, 0x6c, 0x70, 0x0d, 0x0a, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x61, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x2c, 0x62, 0x75, 0x74, 0x74,
|
||||||
|
0x6f, 0x6e, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x75,
|
||||||
|
0x74, 0x74, 0x6f, 0x6e, 0x5d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65,
|
||||||
|
0x3d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79,
|
||||||
|
0x70, 0x65, 0x3d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5d, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x72, 0x65,
|
||||||
|
0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a,
|
||||||
|
0x20, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x36, 0x70, 0x78,
|
||||||
|
0x20, 0x31, 0x32, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74,
|
||||||
|
0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x77, 0x68, 0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, 0x6e, 0x6f,
|
||||||
|
0x77, 0x72, 0x61, 0x70, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
|
||||||
|
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d,
|
||||||
|
0x6c, 0x6b, 0x2d, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x74,
|
||||||
|
0x78, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a,
|
||||||
|
0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d,
|
||||||
|
0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x62, 0x6f,
|
||||||
|
0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63,
|
||||||
|
0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28,
|
||||||
|
0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x74, 0x78, 0x29, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x61, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62,
|
||||||
|
0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5b, 0x64, 0x69, 0x73, 0x61,
|
||||||
|
0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65,
|
||||||
|
0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5d, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65,
|
||||||
|
0x64, 0x5d, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x72, 0x65,
|
||||||
|
0x73, 0x65, 0x74, 0x5d, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x2c, 0x69,
|
||||||
|
0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74,
|
||||||
|
0x5d, 0x5b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5d, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75,
|
||||||
|
0x6c, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
|
||||||
|
0x3a, 0x20, 0x2e, 0x35, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x73, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x6e, 0x6f, 0x74, 0x2d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x0d, 0x0a,
|
||||||
|
0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x66, 0x6f, 0x63,
|
||||||
|
0x75, 0x73, 0x2c, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72,
|
||||||
|
0x2c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x62, 0x75,
|
||||||
|
0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
||||||
|
0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5d, 0x3a, 0x66, 0x6f,
|
||||||
|
0x63, 0x75, 0x73, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x62,
|
||||||
|
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x70,
|
||||||
|
0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x5d, 0x3a, 0x66,
|
||||||
|
0x6f, 0x63, 0x75, 0x73, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d,
|
||||||
|
0x72, 0x65, 0x73, 0x65, 0x74, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x2c, 0x69, 0x6e, 0x70,
|
||||||
|
0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5d, 0x3a,
|
||||||
|
0x66, 0x6f, 0x63, 0x75, 0x73, 0x2c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65,
|
||||||
|
0x3d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5d, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
|
||||||
|
0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x6c, 0x6b, 0x2d, 0x32, 0x29,
|
||||||
|
0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x7b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6c, 0x61,
|
||||||
|
0x70, 0x73, 0x65, 0x3a, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x70, 0x73, 0x65, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0d,
|
||||||
|
0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x64, 0x2c, 0x74, 0x68, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73,
|
||||||
|
0x6f, 0x6c, 0x69, 0x64, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67,
|
||||||
|
0x2d, 0x33, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61,
|
||||||
|
0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x0d,
|
||||||
|
0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x68, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28,
|
||||||
|
0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x32, 0x29, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x74, 0x72, 0x3a, 0x6e, 0x74, 0x68, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x28, 0x65, 0x76,
|
||||||
|
0x65, 0x6e, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
|
||||||
|
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d,
|
||||||
|
0x62, 0x67, 0x2d, 0x32, 0x29, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x65, 0x78, 0x74,
|
||||||
|
0x61, 0x72, 0x65, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x2d,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2c, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x2c, 0x74,
|
||||||
|
0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70,
|
||||||
|
0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x36, 0x70, 0x78, 0x20, 0x31, 0x32, 0x70, 0x78,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f,
|
||||||
|
0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61,
|
||||||
|
0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d,
|
||||||
|
0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64,
|
||||||
|
0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x33, 0x29, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64,
|
||||||
|
0x69, 0x75, 0x73, 0x3a, 0x20, 0x34, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a, 0x69, 0x6e, 0x67,
|
||||||
|
0x3a, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x0d, 0x0a, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x69, 0x6d, 0x67, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61,
|
||||||
|
0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0d, 0x0a, 0x7d,
|
||||||
|
0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x64, 0x3e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x7b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20,
|
||||||
|
0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62,
|
||||||
|
0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x30, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74,
|
||||||
|
0x64, 0x3e, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74,
|
||||||
|
0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x30, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x74, 0x64, 0x3e,
|
||||||
|
0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61,
|
||||||
|
0x72, 0x67, 0x69, 0x6e, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a,
|
||||||
|
0x20, 0x30, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e,
|
||||||
|
0x67, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20,
|
||||||
|
0x72, 0x65, 0x64, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61,
|
||||||
|
0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x73, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x64,
|
||||||
|
0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x36, 0x30, 0x30,
|
||||||
|
0x70, 0x78, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64, 0x61, 0x70,
|
||||||
|
0x74, 0x20, 0x74, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64, 0x61,
|
||||||
|
0x70, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x74, 0x65,
|
||||||
|
0x78, 0x74, 0x5d, 0x2c, 0x2e, 0x61, 0x64, 0x61, 0x70, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
||||||
|
0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5d, 0x2c,
|
||||||
|
0x2e, 0x61, 0x64, 0x61, 0x70, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70,
|
||||||
|
0x65, 0x3d, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x5d, 0x2c, 0x2e, 0x61, 0x64, 0x61, 0x70, 0x74,
|
||||||
|
0x20, 0x74, 0x65, 0x78, 0x74, 0x61, 0x72, 0x65, 0x61, 0x2c, 0x2e, 0x61, 0x64, 0x61, 0x70, 0x74,
|
||||||
|
0x20, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64,
|
||||||
|
0x61, 0x70, 0x74, 0x20, 0x74, 0x64, 0x3a, 0x68, 0x61, 0x73, 0x28, 0x69, 0x6e, 0x70, 0x75, 0x74,
|
||||||
|
0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x5d, 0x29,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74,
|
||||||
|
0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64,
|
||||||
|
0x61, 0x70, 0x74, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5b, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x63,
|
||||||
|
0x68, 0x65, 0x63, 0x6b, 0x62, 0x6f, 0x78, 0x5d, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x2e, 0x35, 0x65, 0x6d,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68,
|
||||||
|
0x74, 0x3a, 0x20, 0x31, 0x2e, 0x35, 0x65, 0x6d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64, 0x61, 0x70, 0x74, 0x20, 0x74, 0x61,
|
||||||
|
0x62, 0x6c, 0x65, 0x20, 0x74, 0x64, 0x3a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2d, 0x63, 0x68, 0x69,
|
||||||
|
0x6c, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f,
|
||||||
|
0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x30, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x64,
|
||||||
|
0x61, 0x70, 0x74, 0x20, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x64, 0x3a, 0x6c, 0x61, 0x73,
|
||||||
|
0x74, 0x2d, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x3a, 0x20, 0x30,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x23,
|
||||||
|
0x74, 0x62, 0x6c, 0x6e, 0x61, 0x76, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x3e, 0x73, 0x70, 0x61, 0x6e,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x2d,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x34, 0x30, 0x70, 0x78, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c, 0x6e, 0x61,
|
||||||
|
0x76, 0x20, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||||
|
0x72, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||||
|
0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x20, 0x73, 0x6f,
|
||||||
|
0x6c, 0x69, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
|
||||||
|
0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66,
|
||||||
|
0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74,
|
||||||
|
0x3a, 0x20, 0x62, 0x6f, 0x6c, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64,
|
||||||
|
0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x2e, 0x36, 0x72, 0x65, 0x6d, 0x20, 0x30, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a,
|
||||||
|
0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20,
|
||||||
|
0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x74, 0x78, 0x2d, 0x31, 0x29, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72, 0x61,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x6c, 0x69, 0x6e,
|
||||||
|
0x65, 0x61, 0x72, 0x2d, 0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x20,
|
||||||
|
0x6c, 0x65, 0x66, 0x74, 0x2c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74,
|
||||||
|
0x20, 0x35, 0x30, 0x25, 0x2c, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x32, 0x35,
|
||||||
|
0x35, 0x2c, 0x32, 0x35, 0x35, 0x2c, 0x30, 0x2e, 0x34, 0x29, 0x20, 0x35, 0x30, 0x25, 0x29, 0x20,
|
||||||
|
0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b,
|
||||||
|
0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x30, 0x30,
|
||||||
|
0x25, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61,
|
||||||
|
0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x32, 0x73,
|
||||||
|
0x20, 0x65, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c,
|
||||||
|
0x6e, 0x61, 0x76, 0x20, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63,
|
||||||
|
0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x61, 0x72, 0x2d,
|
||||||
|
0x67, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x28, 0x74, 0x6f, 0x20, 0x6c, 0x65, 0x66, 0x74,
|
||||||
|
0x2c, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d, 0x62, 0x67, 0x2d, 0x32, 0x29, 0x20,
|
||||||
|
0x35, 0x30, 0x25, 0x2c, 0x72, 0x67, 0x62, 0x61, 0x28, 0x32, 0x35, 0x35, 0x2c, 0x32, 0x35, 0x35,
|
||||||
|
0x2c, 0x32, 0x35, 0x35, 0x2c, 0x30, 0x2e, 0x34, 0x29, 0x20, 0x35, 0x30, 0x25, 0x29, 0x20, 0x72,
|
||||||
|
0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
|
||||||
|
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x32, 0x30, 0x30, 0x25,
|
||||||
|
0x20, 0x31, 0x30, 0x30, 0x25, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c,
|
||||||
|
0x6e, 0x61, 0x76, 0x20, 0x61, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x70, 0x6f,
|
||||||
|
0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61,
|
||||||
|
0x6c, 0x6c, 0x20, 0x2e, 0x34, 0x35, 0x73, 0x20, 0x65, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c, 0x6e, 0x61, 0x76, 0x20, 0x61, 0x3a, 0x61, 0x63, 0x74,
|
||||||
|
0x69, 0x76, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67,
|
||||||
|
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x76, 0x61, 0x72, 0x28, 0x2d, 0x2d, 0x6e, 0x63, 0x2d,
|
||||||
|
0x6c, 0x6b, 0x2d, 0x31, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x72, 0x61, 0x6e,
|
||||||
|
0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x2e, 0x31, 0x35, 0x73,
|
||||||
|
0x20, 0x65, 0x61, 0x73, 0x65, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c,
|
||||||
|
0x6e, 0x61, 0x76, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6c, 0x69, 0x73, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20,
|
||||||
|
0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70,
|
||||||
|
0x6c, 0x61, 0x79, 0x3a, 0x20, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x62, 0x6c, 0x6f, 0x63,
|
||||||
|
0x6b, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31,
|
||||||
|
0x30, 0x30, 0x25, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x74, 0x62, 0x6c, 0x6e, 0x61,
|
||||||
|
0x76, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x3e, 0x73, 0x70, 0x61, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e,
|
||||||
|
0x3a, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61,
|
||||||
|
0x72, 0x67, 0x69, 0x6e, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x70, 0x78,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66,
|
||||||
|
0x37, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x77, 0x65,
|
||||||
|
0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3a, 0x20, 0x69, 0x74, 0x61, 0x6c,
|
||||||
|
0x69, 0x63, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79,
|
||||||
|
0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x2e, 0x74,
|
||||||
|
0x64, 0x62, 0x74, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74,
|
||||||
|
0x2d, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x72, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x2d, 0x61, 0x6c,
|
||||||
|
0x69, 0x67, 0x6e, 0x3a, 0x20, 0x6d, 0x69, 0x64, 0x64, 0x6c, 0x65, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x2e, 0x6e, 0x61, 0x76, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3a, 0x20, 0x6c, 0x65, 0x66, 0x74, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20,
|
||||||
|
0x33, 0x37, 0x35, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74,
|
||||||
|
0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x0d, 0x0a, 0x7d,
|
||||||
706
src/webServerConstants/webSerial.h
Normal file
706
src/webServerConstants/webSerial.h
Normal file
@@ -0,0 +1,706 @@
|
|||||||
|
0x3c, 0x21, 0x44, 0x4f, 0x43, 0x54, 0x59, 0x50, 0x45, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d,
|
||||||
|
0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x3c, 0x68, 0x65, 0x61, 0x64,
|
||||||
|
0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68, 0x61,
|
||||||
|
0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x3e, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71,
|
||||||
|
0x75, 0x69, 0x76, 0x3d, 0x22, 0x58, 0x2d, 0x55, 0x41, 0x2d, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74,
|
||||||
|
0x69, 0x62, 0x6c, 0x65, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x49,
|
||||||
|
0x45, 0x3d, 0x65, 0x64, 0x67, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74,
|
||||||
|
0x69, 0x74, 0x6c, 0x65, 0x3e, 0x4e, 0x75, 0x6b, 0x69, 0x48, 0x75, 0x62, 0x20, 0x57, 0x65, 0x62,
|
||||||
|
0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x3d, 0x22,
|
||||||
|
0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
||||||
|
0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x2d, 0x73,
|
||||||
|
0x63, 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73,
|
||||||
|
0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f,
|
||||||
|
0x63, 0x73, 0x73, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64,
|
||||||
|
0x69, 0x76, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x62, 0x6c, 0x6f, 0x63, 0x6b,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a,
|
||||||
|
0x20, 0x30, 0x2e, 0x34, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65, 0x63, 0x6f, 0x72,
|
||||||
|
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x2a, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3a,
|
||||||
|
0x3a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x3a, 0x3a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x69, 0x7a,
|
||||||
|
0x69, 0x6e, 0x67, 0x3a, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f, 0x78, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f,
|
||||||
|
0x72, 0x64, 0x65, 0x72, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a,
|
||||||
|
0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64,
|
||||||
|
0x79, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x2d, 0x62, 0x65, 0x68, 0x61,
|
||||||
|
0x76, 0x69, 0x6f, 0x72, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a,
|
||||||
|
0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61,
|
||||||
|
0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66,
|
||||||
|
0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x2d, 0x61, 0x70, 0x70,
|
||||||
|
0x6c, 0x65, 0x2d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65,
|
||||||
|
0x6d, 0x2d, 0x75, 0x69, 0x2c, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x63, 0x53, 0x79,
|
||||||
|
0x73, 0x74, 0x65, 0x6d, 0x46, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x67, 0x6f, 0x65,
|
||||||
|
0x20, 0x55, 0x49, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x52, 0x6f, 0x62, 0x6f, 0x74, 0x6f, 0x2c, 0x20, 0x22,
|
||||||
|
0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x20, 0x4e, 0x65, 0x75, 0x65, 0x22, 0x2c,
|
||||||
|
0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72,
|
||||||
|
0x6f, 0x75, 0x6e, 0x64, 0x3a, 0x20, 0x23, 0x30, 0x30, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a,
|
||||||
|
0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x61, 0x70,
|
||||||
|
0x70, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70,
|
||||||
|
0x6c, 0x61, 0x79, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x64, 0x69, 0x72,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x72, 0x69, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c,
|
||||||
|
0x61, 0x79, 0x3a, 0x20, 0x67, 0x72, 0x69, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x2e, 0x67, 0x61, 0x70, 0x2d, 0x32, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x72, 0x65,
|
||||||
|
0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
||||||
|
0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x66, 0x6c, 0x65, 0x78, 0x3a, 0x20, 0x31, 0x20, 0x31, 0x20, 0x30, 0x25, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67,
|
||||||
|
0x6e, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d,
|
||||||
|
0x65, 0x6e, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x30, 0x30, 0x25, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c,
|
||||||
|
0x6f, 0x72, 0x3a, 0x20, 0x23, 0x64, 0x34, 0x64, 0x34, 0x64, 0x38, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66,
|
||||||
|
0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f,
|
||||||
|
0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x78, 0x3a, 0x20, 0x68, 0x69, 0x64, 0x64, 0x65,
|
||||||
|
0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77, 0x2d, 0x79, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66,
|
||||||
|
0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x31, 0x34, 0x70, 0x78, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x20, 0x70,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x66, 0x6c, 0x6f, 0x77,
|
||||||
|
0x2d, 0x77, 0x72, 0x61, 0x70, 0x3a, 0x20, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x2d, 0x77, 0x6f, 0x72,
|
||||||
|
0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x74, 0x65, 0x78, 0x74, 0x2d, 0x77, 0x72, 0x61, 0x70, 0x3a, 0x20, 0x77, 0x72, 0x61, 0x70, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x68,
|
||||||
|
0x69, 0x74, 0x65, 0x2d, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3a, 0x20, 0x70, 0x72, 0x65, 0x2d, 0x6c,
|
||||||
|
0x69, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x70, 0x61, 0x6e, 0x65,
|
||||||
|
0x6c, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74,
|
||||||
|
0x69, 0x76, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x20, 0x30,
|
||||||
|
0x2e, 0x35, 0x72, 0x65, 0x6d, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
|
||||||
|
0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x78, 0x2d,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x34, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68,
|
||||||
|
0x3a, 0x20, 0x63, 0x61, 0x6c, 0x63, 0x28, 0x31, 0x30, 0x30, 0x25, 0x20, 0x2d, 0x20, 0x31, 0x72,
|
||||||
|
0x65, 0x6d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x6d, 0x65, 0x64,
|
||||||
|
0x69, 0x75, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74,
|
||||||
|
0x6f, 0x6e, 0x73, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61,
|
||||||
|
0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74,
|
||||||
|
0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
|
||||||
|
0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x65, 0x6e, 0x64, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d,
|
||||||
|
0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x2d,
|
||||||
|
0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72,
|
||||||
|
0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31,
|
||||||
|
0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3a,
|
||||||
|
0x20, 0x72, 0x6f, 0x77, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x2d, 0x67, 0x61, 0x70, 0x3a, 0x20, 0x31,
|
||||||
|
0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x74, 0x6f, 0x70, 0x3a,
|
||||||
|
0x20, 0x30, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x2d, 0x62, 0x6f,
|
||||||
|
0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69,
|
||||||
|
0x6e, 0x67, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x72, 0x65, 0x6d,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63,
|
||||||
|
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x61, 0x31, 0x61, 0x31, 0x61, 0x61, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x75,
|
||||||
|
0x74, 0x74, 0x6f, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, 0x6e,
|
||||||
|
0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x38, 0x70, 0x78, 0x20, 0x31,
|
||||||
|
0x30, 0x70, 0x78, 0x20, 0x38, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a,
|
||||||
|
0x20, 0x6d, 0x65, 0x64, 0x69, 0x75, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6f, 0x75, 0x74, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x73, 0x74,
|
||||||
|
0x79, 0x6c, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20,
|
||||||
|
0x30, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x61, 0x31, 0x61, 0x31, 0x61, 0x61,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
||||||
|
0x20, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x20, 0x62, 0x75, 0x74,
|
||||||
|
0x74, 0x6f, 0x6e, 0x20, 0x73, 0x76, 0x67, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x2e,
|
||||||
|
0x34, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x2e, 0x34, 0x72, 0x65,
|
||||||
|
0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
|
||||||
|
0x73, 0x20, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3a, 0x68, 0x6f, 0x76, 0x65, 0x72, 0x20, 0x7b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61,
|
||||||
|
0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20,
|
||||||
|
0x23, 0x31, 0x38, 0x31, 0x38, 0x31, 0x62, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e,
|
||||||
|
0x77, 0x2d, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30,
|
||||||
|
0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65,
|
||||||
|
0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20,
|
||||||
|
0x30, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x66,
|
||||||
|
0x6c, 0x65, 0x78, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x67, 0x72, 0x6f, 0x77, 0x20, 0x7b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6c, 0x65,
|
||||||
|
0x78, 0x2d, 0x67, 0x72, 0x6f, 0x77, 0x3a, 0x20, 0x31, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x2e, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x3a, 0x20,
|
||||||
|
0x64, 0x72, 0x6f, 0x70, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x28, 0x30, 0x20, 0x34, 0x70,
|
||||||
|
0x78, 0x20, 0x33, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x28, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20,
|
||||||
|
0x2f, 0x20, 0x30, 0x2e, 0x30, 0x37, 0x29, 0x29, 0x20, 0x64, 0x72, 0x6f, 0x70, 0x2d, 0x73, 0x68,
|
||||||
|
0x61, 0x64, 0x6f, 0x77, 0x28, 0x30, 0x20, 0x32, 0x70, 0x78, 0x20, 0x32, 0x70, 0x78, 0x20, 0x72,
|
||||||
|
0x67, 0x62, 0x28, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2f, 0x20, 0x30, 0x2e, 0x30, 0x36, 0x29,
|
||||||
|
0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2d,
|
||||||
|
0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d,
|
||||||
|
0x73, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69,
|
||||||
|
0x6e, 0x65, 0x72, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x74, 0x6f, 0x70, 0x2d, 0x77, 0x69,
|
||||||
|
0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x62, 0x6f,
|
||||||
|
0x74, 0x74, 0x6f, 0x6d, 0x3a, 0x20, 0x31, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x63,
|
||||||
|
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x31, 0x38, 0x31, 0x38, 0x31, 0x62, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70,
|
||||||
|
0x6c, 0x61, 0x79, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74,
|
||||||
|
0x65, 0x6d, 0x73, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66,
|
||||||
|
0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x73, 0x70, 0x61, 0x63, 0x65,
|
||||||
|
0x2d, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20,
|
||||||
|
0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
|
||||||
|
0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x70, 0x75,
|
||||||
|
0x74, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67,
|
||||||
|
0x3a, 0x20, 0x2e, 0x33, 0x37, 0x35, 0x72, 0x65, 0x6d, 0x20, 0x2e, 0x37, 0x35, 0x72, 0x65, 0x6d,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30, 0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23,
|
||||||
|
0x36, 0x62, 0x37, 0x32, 0x38, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69,
|
||||||
|
0x75, 0x73, 0x3a, 0x20, 0x2e, 0x32, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61,
|
||||||
|
0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x6d, 0x6f, 0x6e, 0x6f, 0x73, 0x70, 0x61, 0x63, 0x65, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f,
|
||||||
|
0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x2e, 0x38, 0x37, 0x35, 0x72, 0x65, 0x6d,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c,
|
||||||
|
0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x2e, 0x35, 0x72,
|
||||||
|
0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f,
|
||||||
|
0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x30, 0x64, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
|
||||||
|
0x3a, 0x20, 0x23, 0x66, 0x66, 0x66, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x63,
|
||||||
|
0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30, 0x30,
|
||||||
|
0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74,
|
||||||
|
0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x3a, 0x20, 0x30,
|
||||||
|
0x20, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x20, 0x23, 0x65, 0x35, 0x65, 0x37, 0x65, 0x62, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72,
|
||||||
|
0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66,
|
||||||
|
0x6f, 0x72, 0x6d, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75,
|
||||||
|
0x6e, 0x64, 0x2d, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x75, 0x72,
|
||||||
|
0x73, 0x6f, 0x72, 0x3a, 0x20, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c,
|
||||||
|
0x61, 0x79, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x30,
|
||||||
|
0x30, 0x25, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x63, 0x65,
|
||||||
|
0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65,
|
||||||
|
0x6e, 0x74, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d,
|
||||||
|
0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x2e, 0x32, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64,
|
||||||
|
0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x2e, 0x35, 0x72, 0x65, 0x6d, 0x20, 0x31, 0x2e, 0x35, 0x72,
|
||||||
|
0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20, 0x2e, 0x38, 0x37, 0x35,
|
||||||
|
0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31,
|
||||||
|
0x2e, 0x32, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x66, 0x66,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
||||||
|
0x20, 0x72, 0x67, 0x62, 0x28, 0x32, 0x39, 0x20, 0x37, 0x38, 0x20, 0x32, 0x31, 0x36, 0x29, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x23, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x2d, 0x62,
|
||||||
|
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x73, 0x76, 0x67, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20,
|
||||||
|
0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x6d, 0x6c, 0x2d, 0x34, 0x20, 0x7b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67,
|
||||||
|
0x69, 0x6e, 0x2d, 0x6c, 0x65, 0x66, 0x74, 0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e,
|
||||||
|
0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x3a, 0x20,
|
||||||
|
0x66, 0x6c, 0x65, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x6a, 0x75, 0x73, 0x74, 0x69, 0x66, 0x79, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x65,
|
||||||
|
0x6e, 0x74, 0x3a, 0x20, 0x66, 0x6c, 0x65, 0x78, 0x2d, 0x65, 0x6e, 0x64, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65,
|
||||||
|
0x72, 0x2d, 0x62, 0x6f, 0x74, 0x74, 0x6f, 0x6d, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20,
|
||||||
|
0x31, 0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x72, 0x65,
|
||||||
|
0x6d, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x20,
|
||||||
|
0x2e, 0x37, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x2d, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74,
|
||||||
|
0x3a, 0x20, 0x31, 0x72, 0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, 0x28,
|
||||||
|
0x31, 0x31, 0x33, 0x20, 0x31, 0x31, 0x33, 0x20, 0x31, 0x32, 0x32, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x61, 0x6c, 0x69, 0x67, 0x6e,
|
||||||
|
0x2d, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x3a, 0x20, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72,
|
||||||
|
0x64, 0x65, 0x72, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x72, 0x67, 0x62, 0x28, 0x32,
|
||||||
|
0x34, 0x20, 0x32, 0x34, 0x20, 0x32, 0x37, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x67, 0x61, 0x70, 0x3a, 0x20, 0x30, 0x2e, 0x35, 0x72,
|
||||||
|
0x65, 0x6d, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x72, 0x65, 0x6d, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x68, 0x65,
|
||||||
|
0x69, 0x67, 0x68, 0x74, 0x3a, 0x20, 0x30, 0x2e, 0x33, 0x37, 0x35, 0x72, 0x65, 0x6d, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72,
|
||||||
|
0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20, 0x39, 0x39, 0x39, 0x39,
|
||||||
|
0x70, 0x78, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65,
|
||||||
|
0x2e, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64,
|
||||||
|
0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x32, 0x32, 0x63, 0x35, 0x35, 0x65, 0x3b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65, 0x2e, 0x6f, 0x72,
|
||||||
|
0x61, 0x6e, 0x67, 0x65, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63,
|
||||||
|
0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x35, 0x39, 0x65, 0x30, 0x62, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x2e, 0x62, 0x61, 0x64, 0x67, 0x65, 0x2e, 0x72, 0x65, 0x64, 0x20,
|
||||||
|
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62,
|
||||||
|
0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a,
|
||||||
|
0x20, 0x23, 0x65, 0x66, 0x34, 0x34, 0x34, 0x34, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c,
|
||||||
|
0x65, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x3c,
|
||||||
|
0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20,
|
||||||
|
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x61, 0x70, 0x70, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x3e, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76,
|
||||||
|
0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x73, 0x22,
|
||||||
|
0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x42, 0x75,
|
||||||
|
0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x3a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x3c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78,
|
||||||
|
0x74, 0x22, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x22, 0x20, 0x63,
|
||||||
|
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x73, 0x68,
|
||||||
|
0x61, 0x64, 0x6f, 0x77, 0x22, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65,
|
||||||
|
0x72, 0x3d, 0x22, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69, 0x7a, 0x65, 0x22, 0x20,
|
||||||
|
0x76, 0x61, 0x6c, 0x75, 0x65, 0x3d, 0x22, 0x31, 0x30, 0x30, 0x30, 0x22, 0x3e, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63,
|
||||||
|
0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x73, 0x68,
|
||||||
|
0x61, 0x64, 0x6f, 0x77, 0x22, 0x20, 0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x74,
|
||||||
|
0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x28, 0x29, 0x22, 0x3e,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x76, 0x67, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73,
|
||||||
|
0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e,
|
||||||
|
0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x73, 0x76, 0x67, 0x22, 0x20, 0x77, 0x69,
|
||||||
|
0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x34, 0x22, 0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d,
|
||||||
|
0x22, 0x32, 0x34, 0x22, 0x20, 0x76, 0x69, 0x65, 0x77, 0x42, 0x6f, 0x78, 0x3d, 0x22, 0x30, 0x20,
|
||||||
|
0x30, 0x20, 0x32, 0x34, 0x20, 0x32, 0x34, 0x22, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x3d, 0x22, 0x6e,
|
||||||
|
0x6f, 0x6e, 0x65, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74,
|
||||||
|
0x72, 0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c,
|
||||||
|
0x6f, 0x72, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68,
|
||||||
|
0x3d, 0x22, 0x32, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65,
|
||||||
|
0x63, 0x61, 0x70, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f,
|
||||||
|
0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3d, 0x22, 0x72, 0x6f, 0x75,
|
||||||
|
0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70,
|
||||||
|
0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65,
|
||||||
|
0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x30, 0x20, 0x30, 0x68, 0x32, 0x34, 0x76, 0x32, 0x34, 0x48,
|
||||||
|
0x30, 0x7a, 0x22, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20,
|
||||||
|
0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74,
|
||||||
|
0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x34, 0x20, 0x37, 0x6c, 0x31, 0x36, 0x20, 0x30, 0x22, 0x20,
|
||||||
|
0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74,
|
||||||
|
0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, 0x30, 0x20, 0x31, 0x31, 0x6c, 0x30, 0x20, 0x36, 0x22,
|
||||||
|
0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61,
|
||||||
|
0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, 0x34, 0x20, 0x31, 0x31, 0x6c, 0x30, 0x20, 0x36,
|
||||||
|
0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70,
|
||||||
|
0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x35, 0x20, 0x37, 0x6c, 0x31, 0x20, 0x31, 0x32,
|
||||||
|
0x61, 0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x32, 0x20, 0x32, 0x68, 0x38,
|
||||||
|
0x61, 0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x32, 0x20, 0x2d, 0x32, 0x6c,
|
||||||
|
0x31, 0x20, 0x2d, 0x31, 0x32, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x39, 0x20, 0x37,
|
||||||
|
0x76, 0x2d, 0x33, 0x61, 0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x31, 0x20,
|
||||||
|
0x2d, 0x31, 0x68, 0x34, 0x61, 0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x31,
|
||||||
|
0x20, 0x31, 0x76, 0x33, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f,
|
||||||
|
0x73, 0x76, 0x67, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22,
|
||||||
|
0x72, 0x6f, 0x75, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x22, 0x20,
|
||||||
|
0x6f, 0x6e, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53,
|
||||||
|
0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x3d, 0x21, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x63, 0x72,
|
||||||
|
0x6f, 0x6c, 0x6c, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x76, 0x67, 0x20,
|
||||||
|
0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
|
||||||
|
0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30, 0x2f, 0x73, 0x76,
|
||||||
|
0x67, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x34, 0x22, 0x20, 0x68, 0x65,
|
||||||
|
0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x32, 0x34, 0x22, 0x20, 0x76, 0x69, 0x65, 0x77, 0x42, 0x6f,
|
||||||
|
0x78, 0x3d, 0x22, 0x30, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x32, 0x34, 0x22, 0x20, 0x66, 0x69,
|
||||||
|
0x6c, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65,
|
||||||
|
0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d,
|
||||||
|
0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65,
|
||||||
|
0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22,
|
||||||
|
0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e,
|
||||||
|
0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3d,
|
||||||
|
0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x30, 0x20, 0x30, 0x68, 0x32,
|
||||||
|
0x34, 0x76, 0x32, 0x34, 0x48, 0x30, 0x7a, 0x22, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x3d, 0x22, 0x6e,
|
||||||
|
0x6f, 0x6e, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x35, 0x20, 0x31, 0x33, 0x61,
|
||||||
|
0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x32, 0x20, 0x2d, 0x32, 0x68, 0x31,
|
||||||
|
0x30, 0x61, 0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x32, 0x20, 0x32, 0x76,
|
||||||
|
0x36, 0x61, 0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x2d, 0x32, 0x20, 0x32,
|
||||||
|
0x68, 0x2d, 0x31, 0x30, 0x61, 0x32, 0x20, 0x32, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x2d,
|
||||||
|
0x32, 0x20, 0x2d, 0x32, 0x76, 0x2d, 0x36, 0x7a, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d,
|
||||||
|
0x31, 0x31, 0x20, 0x31, 0x36, 0x61, 0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x31, 0x20, 0x30, 0x20,
|
||||||
|
0x32, 0x20, 0x30, 0x61, 0x31, 0x20, 0x31, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2d, 0x32,
|
||||||
|
0x20, 0x30, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x38, 0x20, 0x31, 0x31, 0x76, 0x2d,
|
||||||
|
0x34, 0x61, 0x34, 0x20, 0x34, 0x20, 0x30, 0x20, 0x31, 0x20, 0x31, 0x20, 0x38, 0x20, 0x30, 0x76,
|
||||||
|
0x34, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x76, 0x67,
|
||||||
|
0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62,
|
||||||
|
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x72, 0x6f, 0x75,
|
||||||
|
0x6e, 0x64, 0x65, 0x64, 0x20, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x22, 0x20, 0x6f, 0x6e, 0x63,
|
||||||
|
0x6c, 0x69, 0x63, 0x6b, 0x3d, 0x22, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
||||||
|
0x73, 0x74, 0x61, 0x6d, 0x70, 0x3d, 0x21, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x69, 0x6d,
|
||||||
|
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73,
|
||||||
|
0x76, 0x67, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||||
|
0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30,
|
||||||
|
0x2f, 0x73, 0x76, 0x67, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x34, 0x22,
|
||||||
|
0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x32, 0x34, 0x22, 0x20, 0x76, 0x69, 0x65,
|
||||||
|
0x77, 0x42, 0x6f, 0x78, 0x3d, 0x22, 0x30, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x32, 0x34, 0x22,
|
||||||
|
0x20, 0x66, 0x69, 0x6c, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x63, 0x75,
|
||||||
|
0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f,
|
||||||
|
0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x22, 0x20, 0x73, 0x74, 0x72,
|
||||||
|
0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x63, 0x61, 0x70, 0x3d, 0x22, 0x72, 0x6f, 0x75,
|
||||||
|
0x6e, 0x64, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a,
|
||||||
|
0x6f, 0x69, 0x6e, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72, 0x6f,
|
||||||
|
0x6b, 0x65, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x30, 0x20,
|
||||||
|
0x30, 0x68, 0x32, 0x34, 0x76, 0x32, 0x34, 0x48, 0x30, 0x7a, 0x22, 0x20, 0x66, 0x69, 0x6c, 0x6c,
|
||||||
|
0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x33, 0x20,
|
||||||
|
0x31, 0x32, 0x61, 0x39, 0x20, 0x39, 0x20, 0x30, 0x20, 0x31, 0x20, 0x30, 0x20, 0x31, 0x38, 0x20,
|
||||||
|
0x30, 0x61, 0x39, 0x20, 0x39, 0x20, 0x30, 0x20, 0x30, 0x20, 0x30, 0x20, 0x2d, 0x31, 0x38, 0x20,
|
||||||
|
0x30, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x70, 0x61, 0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, 0x32, 0x20, 0x37, 0x76, 0x35, 0x6c,
|
||||||
|
0x33, 0x20, 0x33, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73,
|
||||||
|
0x76, 0x67, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69,
|
||||||
|
0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x68, 0x65,
|
||||||
|
0x61, 0x64, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e,
|
||||||
|
0x74, 0x65, 0x6e, 0x74, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3e,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64,
|
||||||
|
0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e,
|
||||||
|
0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x3e, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x66, 0x6f, 0x72, 0x6d, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x66, 0x6c, 0x65, 0x78,
|
||||||
|
0x20, 0x77, 0x2d, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x2d, 0x63, 0x65,
|
||||||
|
0x6e, 0x74, 0x65, 0x72, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x69, 0x6e, 0x70,
|
||||||
|
0x75, 0x74, 0x20, 0x69, 0x64, 0x3d, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x20,
|
||||||
|
0x61, 0x75, 0x74, 0x6f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x3d, 0x22, 0x6f, 0x66,
|
||||||
|
0x66, 0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x22, 0x20, 0x72,
|
||||||
|
0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x3d, 0x22, 0x22, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73,
|
||||||
|
0x3d, 0x22, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x3d,
|
||||||
|
0x22, 0x45, 0x6e, 0x74, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20, 0x68,
|
||||||
|
0x65, 0x72, 0x65, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x64, 0x69, 0x76, 0x20,
|
||||||
|
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x6d, 0x6c, 0x2d, 0x34, 0x22, 0x3e, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x20, 0x69,
|
||||||
|
0x64, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x2d, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
|
||||||
|
0x22, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x22, 0x3e,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73,
|
||||||
|
0x76, 0x67, 0x20, 0x78, 0x6d, 0x6c, 0x6e, 0x73, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
||||||
|
0x2f, 0x77, 0x77, 0x77, 0x2e, 0x77, 0x33, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x32, 0x30, 0x30, 0x30,
|
||||||
|
0x2f, 0x73, 0x76, 0x67, 0x22, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3d, 0x22, 0x32, 0x34, 0x22,
|
||||||
|
0x20, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3d, 0x22, 0x32, 0x34, 0x22, 0x20, 0x76, 0x69, 0x65,
|
||||||
|
0x77, 0x42, 0x6f, 0x78, 0x3d, 0x22, 0x30, 0x20, 0x30, 0x20, 0x32, 0x34, 0x20, 0x32, 0x34, 0x22,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x66, 0x69, 0x6c, 0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x73, 0x74,
|
||||||
|
0x72, 0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6c,
|
||||||
|
0x6f, 0x72, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68,
|
||||||
|
0x3d, 0x22, 0x32, 0x22, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65,
|
||||||
|
0x63, 0x61, 0x70, 0x3d, 0x22, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x74, 0x72,
|
||||||
|
0x6f, 0x6b, 0x65, 0x2d, 0x6c, 0x69, 0x6e, 0x65, 0x6a, 0x6f, 0x69, 0x6e, 0x3d, 0x22, 0x72, 0x6f,
|
||||||
|
0x75, 0x6e, 0x64, 0x22, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x73, 0x74, 0x72,
|
||||||
|
0x6f, 0x6b, 0x65, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x30,
|
||||||
|
0x20, 0x30, 0x68, 0x32, 0x34, 0x76, 0x32, 0x34, 0x48, 0x30, 0x7a, 0x22, 0x20, 0x66, 0x69, 0x6c,
|
||||||
|
0x6c, 0x3d, 0x22, 0x6e, 0x6f, 0x6e, 0x65, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61,
|
||||||
|
0x74, 0x68, 0x20, 0x64, 0x3d, 0x22, 0x4d, 0x31, 0x30, 0x20, 0x31, 0x34, 0x6c, 0x31, 0x31, 0x20,
|
||||||
|
0x2d, 0x31, 0x31, 0x22, 0x20, 0x2f, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x61, 0x74, 0x68, 0x20, 0x64,
|
||||||
|
0x3d, 0x22, 0x4d, 0x32, 0x31, 0x20, 0x33, 0x6c, 0x2d, 0x36, 0x2e, 0x35, 0x20, 0x31, 0x38, 0x61,
|
||||||
|
0x2e, 0x35, 0x35, 0x20, 0x2e, 0x35, 0x35, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31, 0x20, 0x2d, 0x31,
|
||||||
|
0x20, 0x30, 0x6c, 0x2d, 0x33, 0x2e, 0x35, 0x20, 0x2d, 0x37, 0x6c, 0x2d, 0x37, 0x20, 0x2d, 0x33,
|
||||||
|
0x2e, 0x35, 0x61, 0x2e, 0x35, 0x35, 0x20, 0x2e, 0x35, 0x35, 0x20, 0x30, 0x20, 0x30, 0x20, 0x31,
|
||||||
|
0x20, 0x30, 0x20, 0x2d, 0x31, 0x6c, 0x31, 0x38, 0x20, 0x2d, 0x36, 0x2e, 0x35, 0x22, 0x20, 0x2f,
|
||||||
|
0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x2f, 0x73, 0x76, 0x67, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x2f, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f,
|
||||||
|
0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x66, 0x6f, 0x72, 0x6d, 0x3e, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64, 0x69, 0x76,
|
||||||
|
0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,
|
||||||
|
0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x3c, 0x2f,
|
||||||
|
0x64, 0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f,
|
||||||
|
0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x3e, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x64,
|
||||||
|
0x69, 0x76, 0x3e, 0x0d, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x3c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d, 0x22, 0x74, 0x65,
|
||||||
|
0x78, 0x74, 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x3e, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53,
|
||||||
|
0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x69, 0x6d,
|
||||||
|
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x20, 0x3d, 0x20, 0x74, 0x72, 0x75, 0x65, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x75, 0x72, 0x6c, 0x20, 0x3d, 0x20,
|
||||||
|
0x60, 0x77, 0x73, 0x3a, 0x2f, 0x2f, 0x24, 0x7b, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x2e, 0x6c,
|
||||||
|
0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,
|
||||||
|
0x7d, 0x2f, 0x77, 0x73, 0x60, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20,
|
||||||
|
0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x65, 0x61, 0x20,
|
||||||
|
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79,
|
||||||
|
0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x65,
|
||||||
|
0x6e, 0x74, 0x27, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63,
|
||||||
|
0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x20,
|
||||||
|
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79,
|
||||||
|
0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x28, 0x27, 0x2e, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
|
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x27, 0x29, 0x3b, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x41, 0x70, 0x70, 0x28, 0x29,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x41, 0x70, 0x70, 0x28, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d,
|
||||||
|
0x4c, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x69, 0x6e, 0x69, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x29,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x63,
|
||||||
|
0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63,
|
||||||
|
0x74, 0x6f, 0x72, 0x28, 0x27, 0x66, 0x6f, 0x72, 0x6d, 0x27, 0x29, 0x2e, 0x61, 0x64, 0x64, 0x45,
|
||||||
|
0x76, 0x65, 0x6e, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x28, 0x27, 0x73, 0x75,
|
||||||
|
0x62, 0x6d, 0x69, 0x74, 0x27, 0x2c, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
|
||||||
|
0x28, 0x65, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x65, 0x2e, 0x70, 0x72, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x66, 0x61,
|
||||||
|
0x75, 0x6c, 0x74, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x20,
|
||||||
|
0x3d, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c,
|
||||||
|
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x63, 0x6f, 0x6d, 0x6d, 0x61,
|
||||||
|
0x6e, 0x64, 0x27, 0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b,
|
||||||
|
0x65, 0x74, 0x2e, 0x73, 0x65, 0x6e, 0x64, 0x28, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x29,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64,
|
||||||
|
0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65,
|
||||||
|
0x6e, 0x74, 0x42, 0x79, 0x49, 0x64, 0x28, 0x27, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x27,
|
||||||
|
0x29, 0x2e, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x20, 0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f,
|
||||||
|
0x6e, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28,
|
||||||
|
0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e,
|
||||||
|
0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x69, 0x6e,
|
||||||
|
0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x3c, 0x64, 0x69, 0x76, 0x20,
|
||||||
|
0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x64, 0x67, 0x65, 0x20, 0x6f, 0x72, 0x61,
|
||||||
|
0x6e, 0x67, 0x65, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x20, 0x43, 0x6f, 0x6e, 0x6e,
|
||||||
|
0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x2e, 0x2e, 0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x20, 0x3d,
|
||||||
|
0x20, 0x6e, 0x65, 0x77, 0x20, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x28, 0x75,
|
||||||
|
0x72, 0x6c, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65,
|
||||||
|
0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x6f, 0x70, 0x65, 0x6e, 0x20, 0x3d,
|
||||||
|
0x20, 0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x6f, 0x6e, 0x63, 0x6c,
|
||||||
|
0x6f, 0x73, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x3b, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65,
|
||||||
|
0x74, 0x2e, 0x6f, 0x6e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x20, 0x3d, 0x20, 0x6f, 0x6e,
|
||||||
|
0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d,
|
||||||
|
0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20,
|
||||||
|
0x6f, 0x6e, 0x4f, 0x70, 0x65, 0x6e, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0d,
|
||||||
|
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
|
||||||
|
0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48,
|
||||||
|
0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20, 0x27, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73,
|
||||||
|
0x73, 0x3d, 0x22, 0x62, 0x61, 0x64, 0x67, 0x65, 0x20, 0x67, 0x72, 0x65, 0x65, 0x6e, 0x22, 0x3e,
|
||||||
|
0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x20, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64,
|
||||||
|
0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x72, 0x6d,
|
||||||
|
0x69, 0x6e, 0x61, 0x6c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x28, 0x27, 0x43, 0x6f, 0x6e, 0x6e, 0x65,
|
||||||
|
0x63, 0x74, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x27, 0x20, 0x2b, 0x20, 0x75, 0x72, 0x6c, 0x29,
|
||||||
|
0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x6e, 0x43, 0x6c, 0x6f, 0x73, 0x65,
|
||||||
|
0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61,
|
||||||
|
0x74, 0x75, 0x73, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20, 0x3d, 0x20,
|
||||||
|
0x27, 0x3c, 0x64, 0x69, 0x76, 0x20, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x3d, 0x22, 0x62, 0x61, 0x64,
|
||||||
|
0x67, 0x65, 0x20, 0x72, 0x65, 0x64, 0x22, 0x3e, 0x3c, 0x2f, 0x64, 0x69, 0x76, 0x3e, 0x20, 0x44,
|
||||||
|
0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x27, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x73, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75,
|
||||||
|
0x74, 0x28, 0x69, 0x6e, 0x69, 0x74, 0x57, 0x65, 0x62, 0x53, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x2c,
|
||||||
|
0x20, 0x32, 0x30, 0x30, 0x30, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f,
|
||||||
|
0x6e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x29, 0x20,
|
||||||
|
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x72, 0x6d, 0x69,
|
||||||
|
0x6e, 0x61, 0x6c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x28, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x64,
|
||||||
|
0x61, 0x74, 0x61, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x65, 0x72,
|
||||||
|
0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x28, 0x64, 0x61, 0x74, 0x61, 0x29,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28,
|
||||||
|
0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x29,
|
||||||
|
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x6c, 0x65, 0x74, 0x20, 0x6e, 0x6f, 0x77, 0x20, 0x3d, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x44, 0x61,
|
||||||
|
0x74, 0x65, 0x28, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x3d, 0x20, 0x22, 0x5b, 0x22, 0x20, 0x2b, 0x20,
|
||||||
|
0x6e, 0x6f, 0x77, 0x2e, 0x74, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x54, 0x69, 0x6d, 0x65,
|
||||||
|
0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x28, 0x29, 0x20, 0x2b, 0x20, 0x22, 0x5d, 0x20, 0x22, 0x20,
|
||||||
|
0x2b, 0x20, 0x64, 0x61, 0x74, 0x61, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74,
|
||||||
|
0x65, 0x6e, 0x74, 0x41, 0x72, 0x65, 0x61, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d,
|
||||||
|
0x4c, 0x20, 0x2b, 0x3d, 0x20, 0x27, 0x3c, 0x70, 0x3e, 0x27, 0x20, 0x2b, 0x20, 0x64, 0x61, 0x74,
|
||||||
|
0x61, 0x20, 0x2b, 0x20, 0x27, 0x3c, 0x2f, 0x70, 0x3e, 0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53,
|
||||||
|
0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x65,
|
||||||
|
0x61, 0x2e, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x20, 0x3d, 0x20, 0x63, 0x6f,
|
||||||
|
0x6e, 0x74, 0x65, 0x6e, 0x74, 0x41, 0x72, 0x65, 0x61, 0x2e, 0x73, 0x63, 0x72, 0x6f, 0x6c, 0x6c,
|
||||||
|
0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x2f, 0x2f,
|
||||||
|
0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x73, 0x69,
|
||||||
|
0x7a, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x65, 0x6d, 0x6f,
|
||||||
|
0x72, 0x79, 0x20, 0x69, 0x73, 0x73, 0x75, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65,
|
||||||
|
0x20, 0x62, 0x72, 0x6f, 0x77, 0x73, 0x65, 0x72, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x6c, 0x65, 0x74, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65,
|
||||||
|
0x20, 0x3d, 0x20, 0x70, 0x61, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x74, 0x28, 0x64, 0x6f, 0x63, 0x75,
|
||||||
|
0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x67, 0x65, 0x74, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42,
|
||||||
|
0x79, 0x49, 0x64, 0x28, 0x27, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x27, 0x29, 0x2e, 0x76, 0x61,
|
||||||
|
0x6c, 0x75, 0x65, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69,
|
||||||
|
0x66, 0x20, 0x28, 0x69, 0x73, 0x4e, 0x61, 0x4e, 0x28, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53,
|
||||||
|
0x69, 0x7a, 0x65, 0x29, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20,
|
||||||
|
0x3d, 0x20, 0x31, 0x30, 0x30, 0x30, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6c, 0x65,
|
||||||
|
0x74, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x3d, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
||||||
|
0x74, 0x41, 0x72, 0x65, 0x61, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63,
|
||||||
|
0x74, 0x6f, 0x72, 0x41, 0x6c, 0x6c, 0x28, 0x27, 0x70, 0x27, 0x29, 0x3b, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e,
|
||||||
|
0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x20, 0x3e, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53,
|
||||||
|
0x69, 0x7a, 0x65, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x28, 0x6c, 0x65, 0x74, 0x20, 0x69, 0x20, 0x3d,
|
||||||
|
0x20, 0x30, 0x3b, 0x20, 0x69, 0x20, 0x3c, 0x20, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x2e, 0x6c, 0x65,
|
||||||
|
0x6e, 0x67, 0x74, 0x68, 0x20, 0x2d, 0x20, 0x62, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a,
|
||||||
|
0x65, 0x3b, 0x20, 0x69, 0x2b, 0x2b, 0x29, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65,
|
||||||
|
0x6e, 0x74, 0x41, 0x72, 0x65, 0x61, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x68, 0x69,
|
||||||
|
0x6c, 0x64, 0x28, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5b, 0x69, 0x5d, 0x29, 0x3b, 0x0d, 0x0a, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
|
||||||
|
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74,
|
||||||
|
0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x28, 0x29, 0x20, 0x7b,
|
||||||
|
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e,
|
||||||
|
0x74, 0x41, 0x72, 0x65, 0x61, 0x2e, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x54, 0x4d, 0x4c, 0x20,
|
||||||
|
0x3d, 0x20, 0x27, 0x27, 0x3b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x3c, 0x2f,
|
||||||
|
0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x3e, 0x0d, 0x0a, 0x0d, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d,
|
||||||
|
0x6c, 0x3e,
|
||||||
@@ -1,302 +0,0 @@
|
|||||||
|
|
||||||
let wasm;
|
|
||||||
|
|
||||||
const heap = new Array(32).fill(undefined);
|
|
||||||
|
|
||||||
heap.push(undefined, null, true, false);
|
|
||||||
|
|
||||||
function getObject(idx) { return heap[idx]; }
|
|
||||||
|
|
||||||
let heap_next = heap.length;
|
|
||||||
|
|
||||||
function dropObject(idx) {
|
|
||||||
if (idx < 36) return;
|
|
||||||
heap[idx] = heap_next;
|
|
||||||
heap_next = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
function takeObject(idx) {
|
|
||||||
const ret = getObject(idx);
|
|
||||||
dropObject(idx);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true });
|
|
||||||
|
|
||||||
cachedTextDecoder.decode();
|
|
||||||
|
|
||||||
let cachegetUint8Memory0 = null;
|
|
||||||
function getUint8Memory0() {
|
|
||||||
if (cachegetUint8Memory0 === null || cachegetUint8Memory0.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetUint8Memory0;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getStringFromWasm0(ptr, len) {
|
|
||||||
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
|
|
||||||
}
|
|
||||||
|
|
||||||
let cachegetInt32Memory0 = null;
|
|
||||||
function getInt32Memory0() {
|
|
||||||
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
|
|
||||||
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
|
|
||||||
}
|
|
||||||
return cachegetInt32Memory0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const u32CvtShim = new Uint32Array(2);
|
|
||||||
|
|
||||||
const uint64CvtShim = new BigUint64Array(u32CvtShim.buffer);
|
|
||||||
|
|
||||||
function addHeapObject(obj) {
|
|
||||||
if (heap_next === heap.length) heap.push(heap.length + 1);
|
|
||||||
const idx = heap_next;
|
|
||||||
heap_next = heap[idx];
|
|
||||||
|
|
||||||
heap[idx] = obj;
|
|
||||||
return idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
let WASM_VECTOR_LEN = 0;
|
|
||||||
|
|
||||||
let cachedTextEncoder = new TextEncoder('utf-8');
|
|
||||||
|
|
||||||
const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
|
|
||||||
? function (arg, view) {
|
|
||||||
return cachedTextEncoder.encodeInto(arg, view);
|
|
||||||
}
|
|
||||||
: function (arg, view) {
|
|
||||||
const buf = cachedTextEncoder.encode(arg);
|
|
||||||
view.set(buf);
|
|
||||||
return {
|
|
||||||
read: arg.length,
|
|
||||||
written: buf.length
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
function passStringToWasm0(arg, malloc, realloc) {
|
|
||||||
|
|
||||||
if (realloc === undefined) {
|
|
||||||
const buf = cachedTextEncoder.encode(arg);
|
|
||||||
const ptr = malloc(buf.length);
|
|
||||||
getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
|
|
||||||
WASM_VECTOR_LEN = buf.length;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
let len = arg.length;
|
|
||||||
let ptr = malloc(len);
|
|
||||||
|
|
||||||
const mem = getUint8Memory0();
|
|
||||||
|
|
||||||
let offset = 0;
|
|
||||||
|
|
||||||
for (; offset < len; offset++) {
|
|
||||||
const code = arg.charCodeAt(offset);
|
|
||||||
if (code > 0x7F) break;
|
|
||||||
mem[ptr + offset] = code;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (offset !== len) {
|
|
||||||
if (offset !== 0) {
|
|
||||||
arg = arg.slice(offset);
|
|
||||||
}
|
|
||||||
ptr = realloc(ptr, len, len = offset + arg.length * 3);
|
|
||||||
const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
|
|
||||||
const ret = encodeString(arg, view);
|
|
||||||
|
|
||||||
offset += ret.written;
|
|
||||||
}
|
|
||||||
|
|
||||||
WASM_VECTOR_LEN = offset;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
function passArray8ToWasm0(arg, malloc) {
|
|
||||||
const ptr = malloc(arg.length * 1);
|
|
||||||
getUint8Memory0().set(arg, ptr / 1);
|
|
||||||
WASM_VECTOR_LEN = arg.length;
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {Uint8Array} bin
|
|
||||||
* @param {string} dump
|
|
||||||
* @returns {Array<any>}
|
|
||||||
*/
|
|
||||||
export function decode(bin, dump) {
|
|
||||||
var ptr0 = passArray8ToWasm0(bin, wasm.__wbindgen_malloc);
|
|
||||||
var len0 = WASM_VECTOR_LEN;
|
|
||||||
var ptr1 = passStringToWasm0(dump, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
||||||
var len1 = WASM_VECTOR_LEN;
|
|
||||||
var ret = wasm.decode(ptr0, len0, ptr1, len1);
|
|
||||||
return takeObject(ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
export class DecodedAddress {
|
|
||||||
|
|
||||||
static __wrap(ptr) {
|
|
||||||
const obj = Object.create(DecodedAddress.prototype);
|
|
||||||
obj.ptr = ptr;
|
|
||||||
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
__destroy_into_raw() {
|
|
||||||
const ptr = this.ptr;
|
|
||||||
this.ptr = 0;
|
|
||||||
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
free() {
|
|
||||||
const ptr = this.__destroy_into_raw();
|
|
||||||
wasm.__wbg_decodedaddress_free(ptr);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
get address() {
|
|
||||||
try {
|
|
||||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
||||||
wasm.__wbg_get_decodedaddress_address(retptr, this.ptr);
|
|
||||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
||||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
||||||
u32CvtShim[0] = r0;
|
|
||||||
u32CvtShim[1] = r1;
|
|
||||||
const n0 = uint64CvtShim[0];
|
|
||||||
return n0;
|
|
||||||
} finally {
|
|
||||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {BigInt} arg0
|
|
||||||
*/
|
|
||||||
set address(arg0) {
|
|
||||||
uint64CvtShim[0] = arg0;
|
|
||||||
const low0 = u32CvtShim[0];
|
|
||||||
const high0 = u32CvtShim[1];
|
|
||||||
wasm.__wbg_set_decodedaddress_address(this.ptr, low0, high0);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
get function_name() {
|
|
||||||
try {
|
|
||||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
||||||
wasm.decodedaddress_function_name(retptr, this.ptr);
|
|
||||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
||||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
||||||
return getStringFromWasm0(r0, r1);
|
|
||||||
} finally {
|
|
||||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
||||||
wasm.__wbindgen_free(r0, r1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} function_name
|
|
||||||
*/
|
|
||||||
set function_name(function_name) {
|
|
||||||
var ptr0 = passStringToWasm0(function_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
||||||
var len0 = WASM_VECTOR_LEN;
|
|
||||||
wasm.decodedaddress_set_function_name(this.ptr, ptr0, len0);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @returns {string}
|
|
||||||
*/
|
|
||||||
get location() {
|
|
||||||
try {
|
|
||||||
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
|
|
||||||
wasm.decodedaddress_location(retptr, this.ptr);
|
|
||||||
var r0 = getInt32Memory0()[retptr / 4 + 0];
|
|
||||||
var r1 = getInt32Memory0()[retptr / 4 + 1];
|
|
||||||
return getStringFromWasm0(r0, r1);
|
|
||||||
} finally {
|
|
||||||
wasm.__wbindgen_add_to_stack_pointer(16);
|
|
||||||
wasm.__wbindgen_free(r0, r1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* @param {string} location
|
|
||||||
*/
|
|
||||||
set location(location) {
|
|
||||||
var ptr0 = passStringToWasm0(location, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
|
||||||
var len0 = WASM_VECTOR_LEN;
|
|
||||||
wasm.decodedaddress_set_location(this.ptr, ptr0, len0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function load(module, imports) {
|
|
||||||
if (typeof Response === 'function' && module instanceof Response) {
|
|
||||||
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
|
||||||
try {
|
|
||||||
return await WebAssembly.instantiateStreaming(module, imports);
|
|
||||||
|
|
||||||
} catch (e) {
|
|
||||||
if (module.headers.get('Content-Type') != 'application/wasm') {
|
|
||||||
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const bytes = await module.arrayBuffer();
|
|
||||||
return await WebAssembly.instantiate(bytes, imports);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
const instance = await WebAssembly.instantiate(module, imports);
|
|
||||||
|
|
||||||
if (instance instanceof WebAssembly.Instance) {
|
|
||||||
return { instance, module };
|
|
||||||
|
|
||||||
} else {
|
|
||||||
return instance;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function init(input) {
|
|
||||||
if (typeof input === 'undefined') {
|
|
||||||
input = new URL('esp_exception_decoder_rs_bg.wasm', import.meta.url);
|
|
||||||
}
|
|
||||||
const imports = {};
|
|
||||||
imports.wbg = {};
|
|
||||||
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
|
|
||||||
takeObject(arg0);
|
|
||||||
};
|
|
||||||
imports.wbg.__wbg_decodedaddress_new = function(arg0) {
|
|
||||||
var ret = DecodedAddress.__wrap(arg0);
|
|
||||||
return addHeapObject(ret);
|
|
||||||
};
|
|
||||||
imports.wbg.__wbg_new_949bbc1147195c4e = function() {
|
|
||||||
var ret = new Array();
|
|
||||||
return addHeapObject(ret);
|
|
||||||
};
|
|
||||||
imports.wbg.__wbg_push_284486ca27c6aa8b = function(arg0, arg1) {
|
|
||||||
var ret = getObject(arg0).push(getObject(arg1));
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
imports.wbg.__wbindgen_throw = function(arg0, arg1) {
|
|
||||||
throw new Error(getStringFromWasm0(arg0, arg1));
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
|
|
||||||
input = fetch(input);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const { instance, module } = await load(await input, imports);
|
|
||||||
|
|
||||||
wasm = instance.exports;
|
|
||||||
init.__wbindgen_wasm_module = module;
|
|
||||||
|
|
||||||
return wasm;
|
|
||||||
}
|
|
||||||
|
|
||||||
export default init;
|
|
||||||
|
|
||||||
Binary file not shown.
314
stacktrace/esp_stacktrace_decoder_rs.js
Normal file
314
stacktrace/esp_stacktrace_decoder_rs.js
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
let wasm;
|
||||||
|
|
||||||
|
const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );
|
||||||
|
|
||||||
|
if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };
|
||||||
|
|
||||||
|
let cachedUint8ArrayMemory0 = null;
|
||||||
|
|
||||||
|
function getUint8ArrayMemory0() {
|
||||||
|
if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) {
|
||||||
|
cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer);
|
||||||
|
}
|
||||||
|
return cachedUint8ArrayMemory0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getStringFromWasm0(ptr, len) {
|
||||||
|
ptr = ptr >>> 0;
|
||||||
|
return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len));
|
||||||
|
}
|
||||||
|
|
||||||
|
let WASM_VECTOR_LEN = 0;
|
||||||
|
|
||||||
|
const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );
|
||||||
|
|
||||||
|
const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
|
||||||
|
? function (arg, view) {
|
||||||
|
return cachedTextEncoder.encodeInto(arg, view);
|
||||||
|
}
|
||||||
|
: function (arg, view) {
|
||||||
|
const buf = cachedTextEncoder.encode(arg);
|
||||||
|
view.set(buf);
|
||||||
|
return {
|
||||||
|
read: arg.length,
|
||||||
|
written: buf.length
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
function passStringToWasm0(arg, malloc, realloc) {
|
||||||
|
|
||||||
|
if (realloc === undefined) {
|
||||||
|
const buf = cachedTextEncoder.encode(arg);
|
||||||
|
const ptr = malloc(buf.length, 1) >>> 0;
|
||||||
|
getUint8ArrayMemory0().subarray(ptr, ptr + buf.length).set(buf);
|
||||||
|
WASM_VECTOR_LEN = buf.length;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
let len = arg.length;
|
||||||
|
let ptr = malloc(len, 1) >>> 0;
|
||||||
|
|
||||||
|
const mem = getUint8ArrayMemory0();
|
||||||
|
|
||||||
|
let offset = 0;
|
||||||
|
|
||||||
|
for (; offset < len; offset++) {
|
||||||
|
const code = arg.charCodeAt(offset);
|
||||||
|
if (code > 0x7F) break;
|
||||||
|
mem[ptr + offset] = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (offset !== len) {
|
||||||
|
if (offset !== 0) {
|
||||||
|
arg = arg.slice(offset);
|
||||||
|
}
|
||||||
|
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
|
||||||
|
const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len);
|
||||||
|
const ret = encodeString(arg, view);
|
||||||
|
|
||||||
|
offset += ret.written;
|
||||||
|
ptr = realloc(ptr, len, offset, 1) >>> 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
WASM_VECTOR_LEN = offset;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
function passArray8ToWasm0(arg, malloc) {
|
||||||
|
const ptr = malloc(arg.length * 1, 1) >>> 0;
|
||||||
|
getUint8ArrayMemory0().set(arg, ptr / 1);
|
||||||
|
WASM_VECTOR_LEN = arg.length;
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {Uint8Array} bin
|
||||||
|
* @param {string} dump
|
||||||
|
* @returns {Array<any>}
|
||||||
|
*/
|
||||||
|
export function decode(bin, dump) {
|
||||||
|
const ptr0 = passArray8ToWasm0(bin, wasm.__wbindgen_malloc);
|
||||||
|
const len0 = WASM_VECTOR_LEN;
|
||||||
|
const ptr1 = passStringToWasm0(dump, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
const len1 = WASM_VECTOR_LEN;
|
||||||
|
const ret = wasm.decode(ptr0, len0, ptr1, len1);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DecodedAddressFinalization = (typeof FinalizationRegistry === 'undefined')
|
||||||
|
? { register: () => {}, unregister: () => {} }
|
||||||
|
: new FinalizationRegistry(ptr => wasm.__wbg_decodedaddress_free(ptr >>> 0, 1));
|
||||||
|
|
||||||
|
export class DecodedAddress {
|
||||||
|
|
||||||
|
static __wrap(ptr) {
|
||||||
|
ptr = ptr >>> 0;
|
||||||
|
const obj = Object.create(DecodedAddress.prototype);
|
||||||
|
obj.__wbg_ptr = ptr;
|
||||||
|
DecodedAddressFinalization.register(obj, obj.__wbg_ptr, obj);
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
__destroy_into_raw() {
|
||||||
|
const ptr = this.__wbg_ptr;
|
||||||
|
this.__wbg_ptr = 0;
|
||||||
|
DecodedAddressFinalization.unregister(this);
|
||||||
|
return ptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
free() {
|
||||||
|
const ptr = this.__destroy_into_raw();
|
||||||
|
wasm.__wbg_decodedaddress_free(ptr, 0);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns {bigint}
|
||||||
|
*/
|
||||||
|
get address() {
|
||||||
|
const ret = wasm.__wbg_get_decodedaddress_address(this.__wbg_ptr);
|
||||||
|
return BigInt.asUintN(64, ret);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {bigint} arg0
|
||||||
|
*/
|
||||||
|
set address(arg0) {
|
||||||
|
wasm.__wbg_set_decodedaddress_address(this.__wbg_ptr, arg0);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
get function_name() {
|
||||||
|
let deferred1_0;
|
||||||
|
let deferred1_1;
|
||||||
|
try {
|
||||||
|
const ret = wasm.decodedaddress_function_name(this.__wbg_ptr);
|
||||||
|
deferred1_0 = ret[0];
|
||||||
|
deferred1_1 = ret[1];
|
||||||
|
return getStringFromWasm0(ret[0], ret[1]);
|
||||||
|
} finally {
|
||||||
|
wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {string} function_name
|
||||||
|
*/
|
||||||
|
set function_name(function_name) {
|
||||||
|
const ptr0 = passStringToWasm0(function_name, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
const len0 = WASM_VECTOR_LEN;
|
||||||
|
wasm.decodedaddress_set_function_name(this.__wbg_ptr, ptr0, len0);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @returns {string}
|
||||||
|
*/
|
||||||
|
get location() {
|
||||||
|
let deferred1_0;
|
||||||
|
let deferred1_1;
|
||||||
|
try {
|
||||||
|
const ret = wasm.decodedaddress_location(this.__wbg_ptr);
|
||||||
|
deferred1_0 = ret[0];
|
||||||
|
deferred1_1 = ret[1];
|
||||||
|
return getStringFromWasm0(ret[0], ret[1]);
|
||||||
|
} finally {
|
||||||
|
wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @param {string} location
|
||||||
|
*/
|
||||||
|
set location(location) {
|
||||||
|
const ptr0 = passStringToWasm0(location, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
|
||||||
|
const len0 = WASM_VECTOR_LEN;
|
||||||
|
wasm.decodedaddress_set_location(this.__wbg_ptr, ptr0, len0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function __wbg_load(module, imports) {
|
||||||
|
if (typeof Response === 'function' && module instanceof Response) {
|
||||||
|
if (typeof WebAssembly.instantiateStreaming === 'function') {
|
||||||
|
try {
|
||||||
|
return await WebAssembly.instantiateStreaming(module, imports);
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
if (module.headers.get('Content-Type') != 'application/wasm') {
|
||||||
|
console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve Wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const bytes = await module.arrayBuffer();
|
||||||
|
return await WebAssembly.instantiate(bytes, imports);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const instance = await WebAssembly.instantiate(module, imports);
|
||||||
|
|
||||||
|
if (instance instanceof WebAssembly.Instance) {
|
||||||
|
return { instance, module };
|
||||||
|
|
||||||
|
} else {
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function __wbg_get_imports() {
|
||||||
|
const imports = {};
|
||||||
|
imports.wbg = {};
|
||||||
|
imports.wbg.__wbg_decodedaddress_new = function(arg0) {
|
||||||
|
const ret = DecodedAddress.__wrap(arg0);
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
imports.wbg.__wbg_new_78feb108b6472713 = function() {
|
||||||
|
const ret = new Array();
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
imports.wbg.__wbg_push_737cfc8c1432c2c6 = function(arg0, arg1) {
|
||||||
|
const ret = arg0.push(arg1);
|
||||||
|
return ret;
|
||||||
|
};
|
||||||
|
imports.wbg.__wbindgen_init_externref_table = function() {
|
||||||
|
const table = wasm.__wbindgen_export_0;
|
||||||
|
const offset = table.grow(4);
|
||||||
|
table.set(0, undefined);
|
||||||
|
table.set(offset + 0, undefined);
|
||||||
|
table.set(offset + 1, null);
|
||||||
|
table.set(offset + 2, true);
|
||||||
|
table.set(offset + 3, false);
|
||||||
|
;
|
||||||
|
};
|
||||||
|
imports.wbg.__wbindgen_throw = function(arg0, arg1) {
|
||||||
|
throw new Error(getStringFromWasm0(arg0, arg1));
|
||||||
|
};
|
||||||
|
|
||||||
|
return imports;
|
||||||
|
}
|
||||||
|
|
||||||
|
function __wbg_init_memory(imports, memory) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function __wbg_finalize_init(instance, module) {
|
||||||
|
wasm = instance.exports;
|
||||||
|
__wbg_init.__wbindgen_wasm_module = module;
|
||||||
|
cachedUint8ArrayMemory0 = null;
|
||||||
|
|
||||||
|
|
||||||
|
wasm.__wbindgen_start();
|
||||||
|
return wasm;
|
||||||
|
}
|
||||||
|
|
||||||
|
function initSync(module) {
|
||||||
|
if (wasm !== undefined) return wasm;
|
||||||
|
|
||||||
|
|
||||||
|
if (typeof module !== 'undefined') {
|
||||||
|
if (Object.getPrototypeOf(module) === Object.prototype) {
|
||||||
|
({module} = module)
|
||||||
|
} else {
|
||||||
|
console.warn('using deprecated parameters for `initSync()`; pass a single object instead')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const imports = __wbg_get_imports();
|
||||||
|
|
||||||
|
__wbg_init_memory(imports);
|
||||||
|
|
||||||
|
if (!(module instanceof WebAssembly.Module)) {
|
||||||
|
module = new WebAssembly.Module(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
const instance = new WebAssembly.Instance(module, imports);
|
||||||
|
|
||||||
|
return __wbg_finalize_init(instance, module);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function __wbg_init(module_or_path) {
|
||||||
|
if (wasm !== undefined) return wasm;
|
||||||
|
|
||||||
|
|
||||||
|
if (typeof module_or_path !== 'undefined') {
|
||||||
|
if (Object.getPrototypeOf(module_or_path) === Object.prototype) {
|
||||||
|
({module_or_path} = module_or_path)
|
||||||
|
} else {
|
||||||
|
console.warn('using deprecated parameters for the initialization function; pass a single object instead')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof module_or_path === 'undefined') {
|
||||||
|
module_or_path = new URL('esp_stacktrace_decoder_rs_bg.wasm', import.meta.url);
|
||||||
|
}
|
||||||
|
const imports = __wbg_get_imports();
|
||||||
|
|
||||||
|
if (typeof module_or_path === 'string' || (typeof Request === 'function' && module_or_path instanceof Request) || (typeof URL === 'function' && module_or_path instanceof URL)) {
|
||||||
|
module_or_path = fetch(module_or_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
__wbg_init_memory(imports);
|
||||||
|
|
||||||
|
const { instance, module } = await __wbg_load(await module_or_path, imports);
|
||||||
|
|
||||||
|
return __wbg_finalize_init(instance, module);
|
||||||
|
}
|
||||||
|
|
||||||
|
export { initSync };
|
||||||
|
export default __wbg_init;
|
||||||
BIN
stacktrace/esp_stacktrace_decoder_rs_bg.wasm
Normal file
BIN
stacktrace/esp_stacktrace_decoder_rs_bg.wasm
Normal file
Binary file not shown.
@@ -91,6 +91,7 @@
|
|||||||
<optgroup label="Release version">
|
<optgroup label="Release version">
|
||||||
<option label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.elf"></option>
|
<option label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32.elf"></option>
|
||||||
<option label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c3.elf"></option>
|
<option label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c3.elf"></option>
|
||||||
|
<option label="NukiHub ESP32-C5" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c5.elf"></option>
|
||||||
<option label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c6.elf"></option>
|
<option label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32c6.elf"></option>
|
||||||
<option label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.elf"></option>
|
<option label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3.elf"></option>
|
||||||
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3oct.elf"></option>
|
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/nuki_hub_esp32s3oct.elf"></option>
|
||||||
@@ -101,6 +102,7 @@
|
|||||||
<optgroup label="Beta version">
|
<optgroup label="Beta version">
|
||||||
<option class="beta" label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32.elf"></option>
|
<option class="beta" label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32.elf"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c3.elf"></option>
|
<option class="beta" label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c3.elf"></option>
|
||||||
|
<option class="beta" label="NukiHub ESP32-C5" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c5.elf"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c6.elf"></option>
|
<option class="beta" label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32c6.elf"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3.elf"></option>
|
<option class="beta" label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3.elf"></option>
|
||||||
<option class="beta" label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3oct.elf"></option>
|
<option class="beta" label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/beta/nuki_hub_esp32s3oct.elf"></option>
|
||||||
@@ -112,6 +114,7 @@
|
|||||||
<optgroup label="Development version">
|
<optgroup label="Development version">
|
||||||
<option label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32.elf"></option>
|
<option label="NukiHub ESP32" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32.elf"></option>
|
||||||
<option label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c3.elf"></option>
|
<option label="NukiHub ESP32-C3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c3.elf"></option>
|
||||||
|
<option label="NukiHub ESP32-C5" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c5.elf"></option>
|
||||||
<option label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c6.elf"></option>
|
<option label="NukiHub ESP32-C6" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32c6.elf"></option>
|
||||||
<option label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32s3.elf"></option>
|
<option label="NukiHub ESP32-S3" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32s3.elf"></option>
|
||||||
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32s3oct.elf"></option>
|
<option label="NukiHub ESP32-S3 OCTAL PSRAM" value="https://raw.githubusercontent.com/technyon/nuki_hub/binary/ota/master/nuki_hub_esp32s3oct.elf"></option>
|
||||||
@@ -134,7 +137,7 @@
|
|||||||
|
|
||||||
<script type="module">
|
<script type="module">
|
||||||
// Load the WASM lib
|
// Load the WASM lib
|
||||||
import init, {decode as esp_exception_decode} from "./esp_exception_decoder_rs.js";
|
import init, {decode as esp_exception_decode} from "./esp_stacktrace_decoder_rs.js";
|
||||||
|
|
||||||
// Get some references to the DOM
|
// Get some references to the DOM
|
||||||
const stacktrace = document.querySelector('#stacktrace');
|
const stacktrace = document.querySelector('#stacktrace');
|
||||||
|
|||||||
1
updater/partitions_c5.csv
Normal file
1
updater/partitions_c5.csv
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Espressif ESP32 Partition Table
|
||||||
|
@@ -12,6 +12,10 @@ def get_board_name(env):
|
|||||||
board = 'esp32gls10'
|
board = 'esp32gls10'
|
||||||
elif env.get('BOARD') == 'nuki-esp32-s3-oct':
|
elif env.get('BOARD') == 'nuki-esp32-s3-oct':
|
||||||
board = 'esp32s3oct'
|
board = 'esp32s3oct'
|
||||||
|
elif env.get('BOARD') == 'nuki-esp32-s3-nopsram':
|
||||||
|
board = 'esp32s3nopsram'
|
||||||
|
elif env.get('BOARD') == 'nuki-esp32dev-nopsram':
|
||||||
|
board = 'esp32nopsram'
|
||||||
return board
|
return board
|
||||||
|
|
||||||
def create_target_dir(env):
|
def create_target_dir(env):
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ def recursive_purge(dir, pattern):
|
|||||||
elif re.search(pattern, os.path.join(dir, f)):
|
elif re.search(pattern, os.path.join(dir, f)):
|
||||||
os.remove(os.path.join(dir, f))
|
os.remove(os.path.join(dir, f))
|
||||||
|
|
||||||
|
os.system("python ../resources/bin2array/bin2array.py ../icon/favicon-32x32.png -O ../src/webServerConstants/favicon-32x32.h -l 16")
|
||||||
|
os.system("python ../resources/bin2array/bin2array.py ../resources/style.css -O ../src/webServerConstants/style.h -l 16")
|
||||||
|
os.system("python ../resources/bin2array/bin2array.py ../resources/AsyncWebSerial/frontend/index.html -O ../src/webServerConstants/webSerial.h -l 16")
|
||||||
|
|
||||||
if os.path.exists("src/Config.h"):
|
if os.path.exists("src/Config.h"):
|
||||||
with open("../src/Config.h", "rb") as file_a, open("src/Config.h", "rb") as file_b:
|
with open("../src/Config.h", "rb") as file_a, open("src/Config.h", "rb") as file_b:
|
||||||
if file_a.read() != file_b.read():
|
if file_a.read() != file_b.read():
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ default_envs = updater_esp32
|
|||||||
boards_dir = ../boards
|
boards_dir = ../boards
|
||||||
|
|
||||||
[env]
|
[env]
|
||||||
platform = https://github.com/iranl/nuki_hub/raw/refs/heads/binary/platform-espressif32.zip
|
platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.30/platform-espressif32.zip
|
||||||
platform_packages =
|
platform_packages =
|
||||||
framework = arduino, espidf
|
framework = arduino, espidf
|
||||||
board_build.embed_txtfiles =
|
board_build.embed_txtfiles =
|
||||||
@@ -66,19 +66,34 @@ extra_scripts =
|
|||||||
post:pio_package_post.py
|
post:pio_package_post.py
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
-DNUKI_HUB_HTTPS_SERVER
|
||||||
|
|
||||||
|
[env:updater_esp32-nopsram]
|
||||||
|
board = nuki-esp32dev-nopsram
|
||||||
|
extra_scripts =
|
||||||
|
pre:pio_package_pre.py
|
||||||
|
post:pio_package_post.py
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-nopsram"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
|
||||||
[env:updater_esp32-gl-s10]
|
[env:updater_esp32-gl-s10]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = nuki-esp32gls10
|
board = nuki-esp32gls10
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32;sdkconfig.gls10.defaults"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32;sdkconfig.defaults.gls10"
|
||||||
build_flags =
|
build_flags =
|
||||||
${env.build_flags}
|
${env:updater_esp32.build_flags}
|
||||||
-DNUKI_TARGET_GL_S10=y
|
-DNUKI_TARGET_GL_S10=y
|
||||||
|
|
||||||
[env:updater_esp32-c3]
|
[env:updater_esp32-c3]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = esp32-c3-devkitc-02
|
board = esp32-c3-devkitc-02
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
|
||||||
[env:updater_esp32-s3]
|
[env:updater_esp32-s3]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
@@ -86,6 +101,12 @@ board = nuki-esp32-s3
|
|||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-s3"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-s3"
|
||||||
|
|
||||||
|
[env:updater_esp32-s3-nopsram]
|
||||||
|
extends = env:updater_esp32-nopsram
|
||||||
|
board = nuki-esp32-s3-nopsram
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-s3-nopsram"
|
||||||
|
|
||||||
[env:updater_esp32-s3-oct]
|
[env:updater_esp32-s3-oct]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = nuki-esp32-s3-oct
|
board = nuki-esp32-s3-oct
|
||||||
@@ -95,6 +116,16 @@ board_build.cmake_extra_args =
|
|||||||
[env:updater_esp32-c6]
|
[env:updater_esp32-c6]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = esp32-c6-devkitm-1
|
board = esp32-c6-devkitm-1
|
||||||
|
build_flags =
|
||||||
|
${env:updater_esp32.build_flags}
|
||||||
|
-DFORCE_NUKI_HUB_HTTPS_SERVER
|
||||||
|
|
||||||
|
[env:updater_esp32-c5]
|
||||||
|
extends = env:updater_esp32
|
||||||
|
board_build.partitions = partitions_c5.csv
|
||||||
|
board = nuki-esp32-c5
|
||||||
|
board_build.cmake_extra_args =
|
||||||
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-c5"
|
||||||
|
|
||||||
[env:updater_esp32-p4]
|
[env:updater_esp32-p4]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
@@ -102,27 +133,19 @@ board_build.embed_txtfiles =
|
|||||||
board = esp32-p4
|
board = esp32-p4
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-p4"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-p4"
|
||||||
build_flags =
|
|
||||||
${env.build_flags}
|
|
||||||
-DCORE_DEBUG_LEVEL=ARDUHAL_LOG_LEVEL_NONE
|
|
||||||
-DCONFIG_NIMBLE_CPP_LOG_LEVEL=0
|
|
||||||
-DCONFIG_BT_NIMBLE_LOG_LEVEL=0
|
|
||||||
-DCONFIG_ESP_WIFI_ESPNOW_MAX_ENCRYPT_NUM=7
|
|
||||||
-DCONFIG_ESP_WIFI_CACHE_TX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_TX_BUFFER_TYPE=0
|
|
||||||
-DCONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=16
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32
|
|
||||||
-DCONFIG_ESP_WIFI_DYNAMIC_RX_MGMT_BUF=0
|
|
||||||
-DCONFIG_ESP_WIFI_SOFTAP_SUPPORT=y
|
|
||||||
|
|
||||||
[env:updater_esp32-h2]
|
[env:updater_esp32-h2]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = esp32-h2-devkitm-1
|
board = esp32-h2-devkitm-1
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DNUKI_TARGET_H2=y
|
-DNUKI_TARGET_H2=y
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
|
|
||||||
[env:updater_esp32-solo1]
|
[env:updater_esp32-solo1]
|
||||||
extends = env:updater_esp32
|
extends = env:updater_esp32
|
||||||
board = nuki-esp32solo1
|
board = nuki-esp32solo1
|
||||||
board_build.cmake_extra_args =
|
board_build.cmake_extra_args =
|
||||||
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-solo1"
|
-DSDKCONFIG_DEFAULTS="sdkconfig.defaults;sdkconfig.defaults.esp32-solo1"
|
||||||
|
build_flags =
|
||||||
|
${env.build_flags}
|
||||||
@@ -2,5 +2,4 @@ CONFIG_SPIRAM=y
|
|||||||
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
|
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
|
||||||
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
|
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
|
||||||
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT=y
|
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT=y
|
||||||
CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=4096
|
|
||||||
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=50768
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=50768
|
||||||
5
updater/sdkconfig.defaults.esp32-c5
Normal file
5
updater/sdkconfig.defaults.esp32-c5
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
CONFIG_SPIRAM=y
|
||||||
|
CONFIG_SPIRAM_IGNORE_NOTFOUND=y
|
||||||
|
CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC=y
|
||||||
|
CONFIG_BT_NIMBLE_MEM_ALLOC_MODE_DEFAULT=y
|
||||||
|
CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=50768
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user